@@ -1245,6 +1245,8 @@ class VarManager : public TObject
12451245 template <typename TBCs, typename TFT0s, typename TFDDs, typename TFV0As>
12461246 static void 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 = nullptr );
12471247 template <typename T>
1248+ static void FillFIT (const T& fit, float * values = nullptr );
1249+ template <typename T>
12481250 static void FillBdtScore (const T& bdtScore, float * values = nullptr );
12491251
12501252 static void SetCalibrationObject (CalibObjects calib, TObject* obj)
@@ -5352,6 +5354,139 @@ void VarManager::FillFIT(uint64_t midbc, std::vector<std::pair<uint64_t, int64_t
53525354 // Full implementation would need the complete BC range similar to PWGUD processFITInfo
53535355}
53545356
5357+ template <typename T>
5358+ void VarManager::FillFIT (const T& obj, float * values)
5359+ {
5360+ if (!values) {
5361+ values = fgValues;
5362+ }
5363+
5364+ // Initialize all FIT variables to default values
5365+ values[kAmplitudeFT0A ] = -1 .f ;
5366+ values[kAmplitudeFT0C ] = -1 .f ;
5367+ values[kTimeFT0A ] = -999 .f ;
5368+ values[kTimeFT0C ] = -999 .f ;
5369+ values[kTriggerMaskFT0 ] = 0 ;
5370+ values[kNFiredChannelsFT0A ] = 0 ;
5371+ values[kNFiredChannelsFT0C ] = 0 ;
5372+ values[kAmplitudeFDDA ] = -1 .f ;
5373+ values[kAmplitudeFDDC ] = -1 .f ;
5374+ values[kTimeFDDA ] = -999 .f ;
5375+ values[kTimeFDDC ] = -999 .f ;
5376+ values[kTriggerMaskFDD ] = 0 ;
5377+ values[kNFiredChannelsFDDA ] = 0 ;
5378+ values[kNFiredChannelsFDDC ] = 0 ;
5379+ values[kAmplitudeFV0A ] = -1 .f ;
5380+ values[kTimeFV0A ] = -999 .f ;
5381+ values[kTriggerMaskFV0A ] = 0 ;
5382+ values[kNFiredChannelsFV0A ] = 0 ;
5383+ values[kBBFT0Apf ] = 0 ;
5384+ values[kBGFT0Apf ] = 0 ;
5385+ values[kBBFT0Cpf ] = 0 ;
5386+ values[kBGFT0Cpf ] = 0 ;
5387+ values[kBBFV0Apf ] = 0 ;
5388+ values[kBGFV0Apf ] = 0 ;
5389+ values[kBBFDDApf ] = 0 ;
5390+ values[kBGFDDApf ] = 0 ;
5391+ values[kBBFDDCpf ] = 0 ;
5392+ values[kBGFDDCpf ] = 0 ;
5393+ values[kDistClosestBcTOR ] = 999 ;
5394+ values[kDistClosestBcTSC ] = 999 ;
5395+ values[kDistClosestBcTVX ] = 999 ;
5396+ values[kDistClosestBcV0A ] = 999 ;
5397+ values[kDistClosestBcT0A ] = 999 ;
5398+
5399+ // Check if this is a ReducedFIT object (has amplitudeFT0A() method) or a BC object (has has_foundFT0() method)
5400+ // Use if constexpr with requires clause or SFINAE to distinguish between the two types
5401+ // For now, we'll use a simpler approach: try to call methods that exist on each type
5402+
5403+ if constexpr (requires { obj.amplitudeFT0A (); }) {
5404+ // This is a ReducedFIT object - fill from reduced DQ data model
5405+ values[kAmplitudeFT0A ] = obj.amplitudeFT0A ();
5406+ values[kAmplitudeFT0C ] = obj.amplitudeFT0C ();
5407+ values[kTimeFT0A ] = obj.timeFT0A ();
5408+ values[kTimeFT0C ] = obj.timeFT0C ();
5409+ values[kTriggerMaskFT0 ] = obj.triggerMaskFT0 ();
5410+ values[kNFiredChannelsFT0A ] = obj.nFiredChannelsFT0A ();
5411+ values[kNFiredChannelsFT0C ] = obj.nFiredChannelsFT0C ();
5412+ values[kAmplitudeFDDA ] = obj.amplitudeFDDA ();
5413+ values[kAmplitudeFDDC ] = obj.amplitudeFDDC ();
5414+ values[kTimeFDDA ] = obj.timeFDDA ();
5415+ values[kTimeFDDC ] = obj.timeFDDC ();
5416+ values[kTriggerMaskFDD ] = obj.triggerMaskFDD ();
5417+ values[kNFiredChannelsFDDA ] = obj.nFiredChannelsFDDA ();
5418+ values[kNFiredChannelsFDDC ] = obj.nFiredChannelsFDDC ();
5419+ values[kAmplitudeFV0A ] = obj.amplitudeFV0A ();
5420+ values[kTimeFV0A ] = obj.timeFV0A ();
5421+ values[kTriggerMaskFV0A ] = obj.triggerMaskFV0A ();
5422+ values[kNFiredChannelsFV0A ] = obj.nFiredChannelsFV0A ();
5423+ values[kBBFT0Apf ] = obj.bbFT0Apf ();
5424+ values[kBGFT0Apf ] = obj.bgFT0Apf ();
5425+ values[kBBFT0Cpf ] = obj.bbFT0Cpf ();
5426+ values[kBGFT0Cpf ] = obj.bgFT0Cpf ();
5427+ values[kBBFV0Apf ] = obj.bbFV0Apf ();
5428+ values[kBGFV0Apf ] = obj.bgFV0Apf ();
5429+ values[kBBFDDApf ] = obj.bbFDDApf ();
5430+ values[kBGFDDApf ] = obj.bgFDDApf ();
5431+ values[kBBFDDCpf ] = obj.bbFDDCpf ();
5432+ values[kBGFDDCpf ] = obj.bgFDDCpf ();
5433+ values[kDistClosestBcTOR ] = obj.distClosestBcTOR ();
5434+ values[kDistClosestBcTSC ] = obj.distClosestBcTSC ();
5435+ values[kDistClosestBcTVX ] = obj.distClosestBcTVX ();
5436+ values[kDistClosestBcV0A ] = obj.distClosestBcV0A ();
5437+ values[kDistClosestBcT0A ] = obj.distClosestBcT0A ();
5438+ } else if constexpr (requires { obj.has_foundFT0 (); }) {
5439+ // This is a BC object - fill from raw FIT detectors
5440+ // Fill FT0 information
5441+ if (obj.has_foundFT0 ()) {
5442+ auto ft0 = obj.foundFT0 ();
5443+ values[kTimeFT0A ] = ft0.timeA ();
5444+ values[kTimeFT0C ] = ft0.timeC ();
5445+ const auto & ampsA = ft0.amplitudeA ();
5446+ const auto & ampsC = ft0.amplitudeC ();
5447+ values[kAmplitudeFT0A ] = 0 .f ;
5448+ for (auto amp : ampsA)
5449+ values[kAmplitudeFT0A ] += amp;
5450+ values[kAmplitudeFT0C ] = 0 .f ;
5451+ for (auto amp : ampsC)
5452+ values[kAmplitudeFT0C ] += amp;
5453+ values[kNFiredChannelsFT0A ] = ft0.channelA ().size ();
5454+ values[kNFiredChannelsFT0C ] = ft0.channelC ().size ();
5455+ values[kTriggerMaskFT0 ] = ft0.triggerMask ();
5456+ }
5457+
5458+ // Fill FV0A information
5459+ if (obj.has_foundFV0 ()) {
5460+ auto fv0a = obj.foundFV0 ();
5461+ values[kTimeFV0A ] = fv0a.time ();
5462+ const auto & amps = fv0a.amplitude ();
5463+ values[kAmplitudeFV0A ] = 0 .f ;
5464+ for (auto amp : amps)
5465+ values[kAmplitudeFV0A ] += amp;
5466+ values[kNFiredChannelsFV0A ] = fv0a.channel ().size ();
5467+ values[kTriggerMaskFV0A ] = fv0a.triggerMask ();
5468+ }
5469+
5470+ // Fill FDD information
5471+ if (obj.has_foundFDD ()) {
5472+ auto fdd = obj.foundFDD ();
5473+ values[kTimeFDDA ] = fdd.timeA ();
5474+ values[kTimeFDDC ] = fdd.timeC ();
5475+ const auto & ampsA = fdd.chargeA ();
5476+ const auto & ampsC = fdd.chargeC ();
5477+ values[kAmplitudeFDDA ] = 0 .f ;
5478+ for (auto amp : ampsA)
5479+ values[kAmplitudeFDDA ] += amp;
5480+ values[kAmplitudeFDDC ] = 0 .f ;
5481+ for (auto amp : ampsC)
5482+ values[kAmplitudeFDDC ] += amp;
5483+ values[kNFiredChannelsFDDA ] = fdd.channelA ().size ();
5484+ values[kNFiredChannelsFDDC ] = fdd.channelC ().size ();
5485+ values[kTriggerMaskFDD ] = fdd.triggerMask ();
5486+ }
5487+ }
5488+ }
5489+
53555490template <typename T1, typename T2>
53565491void VarManager::FillDileptonHadron (T1 const & dilepton, T2 const & hadron, float * values, float hadronMass)
53575492{
0 commit comments