Skip to content

Commit aaf800e

Browse files
minjungkim12claude
andcommitted
[PWGDQ] Refactor FIT handling to use VarManager::FillFIT()
- Add template overload of VarManager::FillFIT() to handle both ReducedFIT (analysis workflows) and BC objects (tableMaker) - Refactor tableMaker_withAssoc.cxx to use VarManager::FillFIT() instead of duplicating FIT filling logic - Addresses review comments from @iarsene on PR #13773 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent a18e2c6 commit aaf800e

File tree

2 files changed

+137
-43
lines changed

2 files changed

+137
-43
lines changed

PWGDQ/Core/VarManager.h

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
53555490
template <typename T1, typename T2>
53565491
void VarManager::FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* values, float hadronMass)
53575492
{

PWGDQ/TableProducer/tableMaker_withAssoc.cxx

Lines changed: 2 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -868,49 +868,8 @@ struct TableMaker {
868868
if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) {
869869
// The DQRapidityGapFilter contains the index of the bc we want to get FIT info from
870870
auto newbc = bcs.rawIteratorAt(collision.newBcIndex());
871-
// Fill FIT information from newbc
872-
if (newbc.has_foundFT0()) {
873-
auto ft0 = newbc.foundFT0();
874-
VarManager::fgValues[VarManager::kTimeFT0A] = ft0.timeA();
875-
VarManager::fgValues[VarManager::kTimeFT0C] = ft0.timeC();
876-
const auto& ampsA = ft0.amplitudeA();
877-
const auto& ampsC = ft0.amplitudeC();
878-
VarManager::fgValues[VarManager::kAmplitudeFT0A] = 0.f;
879-
for (auto amp : ampsA)
880-
VarManager::fgValues[VarManager::kAmplitudeFT0A] += amp;
881-
VarManager::fgValues[VarManager::kAmplitudeFT0C] = 0.f;
882-
for (auto amp : ampsC)
883-
VarManager::fgValues[VarManager::kAmplitudeFT0C] += amp;
884-
VarManager::fgValues[VarManager::kNFiredChannelsFT0A] = ft0.channelA().size();
885-
VarManager::fgValues[VarManager::kNFiredChannelsFT0C] = ft0.channelC().size();
886-
VarManager::fgValues[VarManager::kTriggerMaskFT0] = ft0.triggerMask();
887-
}
888-
if (newbc.has_foundFV0()) {
889-
auto fv0a = newbc.foundFV0();
890-
VarManager::fgValues[VarManager::kTimeFV0A] = fv0a.time();
891-
const auto& amps = fv0a.amplitude();
892-
VarManager::fgValues[VarManager::kAmplitudeFV0A] = 0.f;
893-
for (auto amp : amps)
894-
VarManager::fgValues[VarManager::kAmplitudeFV0A] += amp;
895-
VarManager::fgValues[VarManager::kNFiredChannelsFV0A] = fv0a.channel().size();
896-
VarManager::fgValues[VarManager::kTriggerMaskFV0A] = fv0a.triggerMask();
897-
}
898-
if (newbc.has_foundFDD()) {
899-
auto fdd = newbc.foundFDD();
900-
VarManager::fgValues[VarManager::kTimeFDDA] = fdd.timeA();
901-
VarManager::fgValues[VarManager::kTimeFDDC] = fdd.timeC();
902-
const auto& ampsA = fdd.chargeA();
903-
const auto& ampsC = fdd.chargeC();
904-
VarManager::fgValues[VarManager::kAmplitudeFDDA] = 0.f;
905-
for (auto amp : ampsA)
906-
VarManager::fgValues[VarManager::kAmplitudeFDDA] += amp;
907-
VarManager::fgValues[VarManager::kAmplitudeFDDC] = 0.f;
908-
for (auto amp : ampsC)
909-
VarManager::fgValues[VarManager::kAmplitudeFDDC] += amp;
910-
VarManager::fgValues[VarManager::kNFiredChannelsFDDA] = fdd.channelA().size();
911-
VarManager::fgValues[VarManager::kNFiredChannelsFDDC] = fdd.channelC().size();
912-
VarManager::fgValues[VarManager::kTriggerMaskFDD] = fdd.triggerMask();
913-
}
871+
// Fill FIT information from newbc using VarManager::FillFIT()
872+
VarManager::FillFIT(newbc);
914873
}
915874
}
916875
if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionMultExtra) > 0 && (TTrackFillMap & VarManager::ObjTypes::Track) > 0 && (TTrackFillMap & VarManager::ObjTypes::TrackDCA) > 0) {

0 commit comments

Comments
 (0)