@@ -5253,6 +5253,146 @@ void VarManager::FillZDC(T const& zdc, float* values)
52535253 values[kTimeZPC ] = zdc.timeZPC ();
52545254}
52555255
5256+ // Helper to detect if type has amplitudeFT0A method (ReducedFIT table)
5257+ template <typename T, typename = void >
5258+ struct has_amplitudeFT0A : std::false_type {
5259+ };
5260+
5261+ template <typename T>
5262+ struct has_amplitudeFT0A <T, std::void_t <decltype (std::declval<T>().amplitudeFT0A())>> : std::true_type {
5263+ };
5264+
5265+ // Unified FillFIT version for both BC objects and ReducedFIT table objects
5266+ template <typename T>
5267+ void VarManager::FillFIT (T const & obj, float * values)
5268+ {
5269+ if (!values) {
5270+ values = fgValues;
5271+ }
5272+
5273+ // Check if this is a BC object (has has_foundFT0 method) or ReducedFIT table object (has amplitudeFT0A method)
5274+ if constexpr (has_amplitudeFT0A<T>::value) {
5275+ // This is a ReducedFIT table object - read all columns directly
5276+ values[kAmplitudeFT0A ] = obj.amplitudeFT0A ();
5277+ values[kAmplitudeFT0C ] = obj.amplitudeFT0C ();
5278+ values[kTimeFT0A ] = obj.timeFT0A ();
5279+ values[kTimeFT0C ] = obj.timeFT0C ();
5280+ values[kTriggerMaskFT0 ] = obj.triggerMaskFT0 ();
5281+ values[kNFiredChannelsFT0A ] = obj.nFiredChannelsFT0A ();
5282+ values[kNFiredChannelsFT0C ] = obj.nFiredChannelsFT0C ();
5283+ values[kAmplitudeFDDA ] = obj.amplitudeFDDA ();
5284+ values[kAmplitudeFDDC ] = obj.amplitudeFDDC ();
5285+ values[kTimeFDDA ] = obj.timeFDDA ();
5286+ values[kTimeFDDC ] = obj.timeFDDC ();
5287+ values[kTriggerMaskFDD ] = obj.triggerMaskFDD ();
5288+ values[kNFiredChannelsFDDA ] = obj.nFiredChannelsFDDA ();
5289+ values[kNFiredChannelsFDDC ] = obj.nFiredChannelsFDDC ();
5290+ values[kAmplitudeFV0A ] = obj.amplitudeFV0A ();
5291+ values[kTimeFV0A ] = obj.timeFV0A ();
5292+ values[kTriggerMaskFV0A ] = obj.triggerMaskFV0A ();
5293+ values[kNFiredChannelsFV0A ] = obj.nFiredChannelsFV0A ();
5294+ values[kBGFT0Apf ] = obj.bgFT0Apf ();
5295+ values[kBGFT0Cpf ] = obj.bgFT0Cpf ();
5296+ values[kBBFT0Apf ] = obj.bbFT0Apf ();
5297+ values[kBBFT0Cpf ] = obj.bbFT0Cpf ();
5298+ values[kBGFV0Apf ] = obj.bgFV0Apf ();
5299+ values[kBBFV0Apf ] = obj.bbFV0Apf ();
5300+ values[kBGFDDApf ] = obj.bgFDDApf ();
5301+ values[kBGFDDCpf ] = obj.bgFDDCpf ();
5302+ values[kBBFDDApf ] = obj.bbFDDApf ();
5303+ values[kBBFDDCpf ] = obj.bbFDDCpf ();
5304+ values[kDistClosestBcTOR ] = obj.distClosestBcTOR ();
5305+ values[kDistClosestBcTSC ] = obj.distClosestBcTSC ();
5306+ values[kDistClosestBcTVX ] = obj.distClosestBcTVX ();
5307+ values[kDistClosestBcV0A ] = obj.distClosestBcV0A ();
5308+ values[kDistClosestBcT0A ] = obj.distClosestBcT0A ();
5309+ } else {
5310+ // This is a BC object - access FIT detectors via BC associations
5311+ // Initialize all FIT variables to default values first
5312+ values[kAmplitudeFT0A ] = -1 .f ;
5313+ values[kAmplitudeFT0C ] = -1 .f ;
5314+ values[kTimeFT0A ] = -999 .f ;
5315+ values[kTimeFT0C ] = -999 .f ;
5316+ values[kTriggerMaskFT0 ] = 0 ;
5317+ values[kNFiredChannelsFT0A ] = 0 ;
5318+ values[kNFiredChannelsFT0C ] = 0 ;
5319+ values[kAmplitudeFDDA ] = -1 .f ;
5320+ values[kAmplitudeFDDC ] = -1 .f ;
5321+ values[kTimeFDDA ] = -999 .f ;
5322+ values[kTimeFDDC ] = -999 .f ;
5323+ values[kTriggerMaskFDD ] = 0 ;
5324+ values[kNFiredChannelsFDDA ] = 0 ;
5325+ values[kNFiredChannelsFDDC ] = 0 ;
5326+ values[kAmplitudeFV0A ] = -1 .f ;
5327+ values[kTimeFV0A ] = -999 .f ;
5328+ values[kTriggerMaskFV0A ] = 0 ;
5329+ values[kNFiredChannelsFV0A ] = 0 ;
5330+ values[kBGFT0Apf ] = 0 .f ;
5331+ values[kBGFT0Cpf ] = 0 .f ;
5332+ values[kBBFT0Apf ] = 0 .f ;
5333+ values[kBBFT0Cpf ] = 0 .f ;
5334+ values[kBGFV0Apf ] = 0 .f ;
5335+ values[kBBFV0Apf ] = 0 .f ;
5336+ values[kBGFDDApf ] = 0 .f ;
5337+ values[kBGFDDCpf ] = 0 .f ;
5338+ values[kBBFDDApf ] = 0 .f ;
5339+ values[kBBFDDCpf ] = 0 .f ;
5340+ values[kDistClosestBcTOR ] = 999 .f ;
5341+ values[kDistClosestBcTSC ] = 999 .f ;
5342+ values[kDistClosestBcTVX ] = 999 .f ;
5343+ values[kDistClosestBcV0A ] = 999 .f ;
5344+ values[kDistClosestBcT0A ] = 999 .f ;
5345+
5346+ // Fill FT0 information from BC
5347+ if (obj.has_foundFT0 ()) {
5348+ auto ft0 = obj.foundFT0 ();
5349+ values[kAmplitudeFT0A ] = 0 .f ;
5350+ for (auto const & amp : ft0.amplitudeA ()) {
5351+ values[kAmplitudeFT0A ] += amp;
5352+ }
5353+ values[kAmplitudeFT0C ] = 0 .f ;
5354+ for (auto const & amp : ft0.amplitudeC ()) {
5355+ values[kAmplitudeFT0C ] += amp;
5356+ }
5357+ values[kTimeFT0A ] = ft0.timeA ();
5358+ values[kTimeFT0C ] = ft0.timeC ();
5359+ values[kTriggerMaskFT0 ] = ft0.triggerMask ();
5360+ values[kNFiredChannelsFT0A ] = ft0.amplitudeA ().size ();
5361+ values[kNFiredChannelsFT0C ] = ft0.amplitudeC ().size ();
5362+ }
5363+
5364+ // Fill FV0A information from BC
5365+ if (obj.has_foundFV0 ()) {
5366+ auto fv0a = obj.foundFV0 ();
5367+ values[kAmplitudeFV0A ] = 0 .f ;
5368+ for (auto const & amp : fv0a.amplitude ()) {
5369+ values[kAmplitudeFV0A ] += amp;
5370+ }
5371+ values[kTimeFV0A ] = fv0a.time ();
5372+ values[kTriggerMaskFV0A ] = fv0a.triggerMask ();
5373+ values[kNFiredChannelsFV0A ] = fv0a.amplitude ().size ();
5374+ }
5375+
5376+ // Fill FDD information from BC
5377+ if (obj.has_foundFDD ()) {
5378+ auto fdd = obj.foundFDD ();
5379+ values[kAmplitudeFDDA ] = 0 .f ;
5380+ for (auto const & amp : fdd.chargeA ()) {
5381+ values[kAmplitudeFDDA ] += amp;
5382+ }
5383+ values[kAmplitudeFDDC ] = 0 .f ;
5384+ for (auto const & amp : fdd.chargeC ()) {
5385+ values[kAmplitudeFDDC ] += amp;
5386+ }
5387+ values[kTimeFDDA ] = fdd.timeA ();
5388+ values[kTimeFDDC ] = fdd.timeC ();
5389+ values[kTriggerMaskFDD ] = fdd.triggerMask ();
5390+ values[kNFiredChannelsFDDA ] = fdd.chargeA ().size ();
5391+ values[kNFiredChannelsFDDC ] = fdd.chargeC ().size ();
5392+ }
5393+ }
5394+ }
5395+
52565396template <typename TBCs, typename TFT0s, typename TFDDs, typename TFV0As>
52575397void VarManager::FillFIT (uint64_t midbc, std::vector<std::pair<uint64_t , int64_t >>& bcMap, TBCs const & bcs, TFT0s const & /* ft0s*/ , TFDDs const & /* fdds*/ , TFV0As const & /* fv0as*/ , float * values)
52585398{
@@ -5435,49 +5575,6 @@ void VarManager::FillFIT(uint64_t midbc, std::vector<std::pair<uint64_t, int64_t
54355575 // access to CTP trigger information which may not be available in all cases.
54365576}
54375577
5438- template <typename T>
5439- void VarManager::FillFIT (const T& obj, float * values)
5440- {
5441- if (!values) {
5442- values = fgValues;
5443- }
5444-
5445- // Fill from ReducedFIT table object - simple read of all columns
5446- values[kAmplitudeFT0A ] = obj.amplitudeFT0A ();
5447- values[kAmplitudeFT0C ] = obj.amplitudeFT0C ();
5448- values[kTimeFT0A ] = obj.timeFT0A ();
5449- values[kTimeFT0C ] = obj.timeFT0C ();
5450- values[kTriggerMaskFT0 ] = obj.triggerMaskFT0 ();
5451- values[kNFiredChannelsFT0A ] = obj.nFiredChannelsFT0A ();
5452- values[kNFiredChannelsFT0C ] = obj.nFiredChannelsFT0C ();
5453- values[kAmplitudeFDDA ] = obj.amplitudeFDDA ();
5454- values[kAmplitudeFDDC ] = obj.amplitudeFDDC ();
5455- values[kTimeFDDA ] = obj.timeFDDA ();
5456- values[kTimeFDDC ] = obj.timeFDDC ();
5457- values[kTriggerMaskFDD ] = obj.triggerMaskFDD ();
5458- values[kNFiredChannelsFDDA ] = obj.nFiredChannelsFDDA ();
5459- values[kNFiredChannelsFDDC ] = obj.nFiredChannelsFDDC ();
5460- values[kAmplitudeFV0A ] = obj.amplitudeFV0A ();
5461- values[kTimeFV0A ] = obj.timeFV0A ();
5462- values[kTriggerMaskFV0A ] = obj.triggerMaskFV0A ();
5463- values[kNFiredChannelsFV0A ] = obj.nFiredChannelsFV0A ();
5464- values[kBBFT0Apf ] = obj.bbFT0Apf ();
5465- values[kBGFT0Apf ] = obj.bgFT0Apf ();
5466- values[kBBFT0Cpf ] = obj.bbFT0Cpf ();
5467- values[kBGFT0Cpf ] = obj.bgFT0Cpf ();
5468- values[kBBFV0Apf ] = obj.bbFV0Apf ();
5469- values[kBGFV0Apf ] = obj.bgFV0Apf ();
5470- values[kBBFDDApf ] = obj.bbFDDApf ();
5471- values[kBGFDDApf ] = obj.bgFDDApf ();
5472- values[kBBFDDCpf ] = obj.bbFDDCpf ();
5473- values[kBGFDDCpf ] = obj.bgFDDCpf ();
5474- values[kDistClosestBcTOR ] = obj.distClosestBcTOR ();
5475- values[kDistClosestBcTSC ] = obj.distClosestBcTSC ();
5476- values[kDistClosestBcTVX ] = obj.distClosestBcTVX ();
5477- values[kDistClosestBcV0A ] = obj.distClosestBcV0A ();
5478- values[kDistClosestBcT0A ] = obj.distClosestBcT0A ();
5479- }
5480-
54815578template <typename T1, typename T2>
54825579void VarManager::FillDileptonHadron (T1 const & dilepton, T2 const & hadron, float * values, float hadronMass)
54835580{
0 commit comments