Skip to content

Commit 769587b

Browse files
committed
Add tune on data process path
1 parent e3f2a31 commit 769587b

File tree

2 files changed

+55
-6
lines changed

2 files changed

+55
-6
lines changed

Common/TableProducer/PID/pidTPCModule.h

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -530,9 +530,13 @@ class pidTPCModule
530530
};
531531

532532
//__________________________________________________
533-
template <typename TCCDB, typename TCCDBApi, typename TBCs, typename TCollisions, typename TTracks, typename TProducts>
534-
void process(TCCDB& ccdb, TCCDBApi& ccdbApi, TBCs const& bcs, TCollisions const& cols, TTracks const& tracks, TProducts& products)
533+
template <typename TCCDB, typename TCCDBApi, typename TBCs, typename TCollisions, typename TTracks, typename TMCParticles, typename TProducts>
534+
void process(TCCDB& ccdb, TCCDBApi& ccdbApi, TBCs const& bcs, TCollisions const& cols, TTracks const& tracks, TMCParticles const& mcParticles, TProducts& products)
535535
{
536+
if constexpr (soa::is_table<TMCParticles>) {
537+
gRandom->SetSeed(0); // Ensure unique seed from UUID for each process call
538+
}
539+
536540
// preparatory step: we need the multiplicities for each collision
537541
std::vector<int> pidmults;
538542
long totalTPCtracks = 0;
@@ -660,7 +664,8 @@ class pidTPCModule
660664
}
661665
}
662666

663-
const auto& bc = trk.has_collision() ? cols.iteratorAt(trk.collisionId()).template bc_as<aod::BCsWithTimestamps>() : bcs.begin();
667+
auto collision = cols.rawIteratorAt(trk.collisionId());
668+
const auto& bc = trk.has_collision() ? cols.rawIteratorAt(trk.collisionId()).template bc_as<aod::BCsWithTimestamps>() : bcs.begin();
664669
if (useCCDBParam && pidTPCopts.ccdbTimestamp.value == 0 && !ccdb->isCachedObjectValid(pidTPCopts.ccdbPath.value, bc.timestamp())) { // Updating parametrisation only if the initial timestamp is 0
665670
if (pidTPCopts.recoPass.value == "") {
666671
LOGP(info, "Retrieving latest TPC response object for timestamp {}:", bc.timestamp());
@@ -681,6 +686,44 @@ class pidTPCModule
681686
response->PrintAll();
682687
}
683688

689+
// if this is a MC process function, go for MC tune on data processing
690+
if constexpr (soa::is_table<TMCParticles>) {
691+
// Perform TuneOnData sampling for MC dE/dx
692+
float mcTunedTPCSignal = 0.;
693+
if (!trk.hasTPC()) {
694+
mcTunedTPCSignal = -999.f;
695+
} else {
696+
if (pidTPCopts.skipTPCOnly) {
697+
if (!trk.hasITS() && !trk.hasTRD() && !trk.hasTOF()) {
698+
mcTunedTPCSignal = -999.f;
699+
}
700+
}
701+
int pid = getPIDIndex(trk.mcParticle().pdgCode());
702+
703+
auto expSignal = response->GetExpectedSignal(trk, pid);
704+
auto expSigma = response->GetExpectedSigma(cols.iteratorAt(trk.collisionId()), pidmults[trk.collisionId()], trk, pid);
705+
if (expSignal < 0. || expSigma < 0.) { // if expectation invalid then give undefined signal
706+
mcTunedTPCSignal = -999.f;
707+
}
708+
float bg = trk.tpcInnerParam() / o2::track::pid_constants::sMasses[pid]; // estimated beta-gamma for network cutoff
709+
710+
if (pidTPCopts.useNetworkCorrection && speciesNetworkFlags[pid] && trk.has_collision() && bg > pidTPCopts.networkBetaGammaCutoff) {
711+
auto mean = network_prediction[2 * (count_tracks + tracksForNet_size * pid)] * expSignal; // Absolute mean, i.e. the mean dE/dx value of the data in that slice, not the mean of the NSigma distribution
712+
auto sigma = (network_prediction[2 * (count_tracks + tracksForNet_size * pid) + 1] - network_prediction[2 * (count_tracks + tracksForNet_size * pid)]) * expSignal;
713+
if (mean < 0.f || sigma < 0.f) {
714+
mcTunedTPCSignal = -999.f;
715+
} else {
716+
mcTunedTPCSignal = gRandom->Gaus(mean, sigma);
717+
}
718+
} else {
719+
mcTunedTPCSignal = gRandom->Gaus(expSignal, expSigma);
720+
}
721+
}
722+
tpcSignalToEvaluatePID = mcTunedTPCSignal; // pass this for further eval
723+
if (pidTPCopts.enableTuneOnDataTable)
724+
products.tableTuneOnData(mcTunedTPCSignal);
725+
}
726+
684727
auto makePidTablesDefault = [&trk, &tpcSignalToEvaluatePID, &cols, &pidmults, &network_prediction, &count_tracks, &tracksForNet_size, this](const int flagFull, auto& tableFull, const int flagTiny, auto& tableTiny, const o2::track::PID::ID pid) {
685728
makePidTables(flagFull, tableFull, flagTiny, tableTiny, pid, tpcSignalToEvaluatePID, trk, cols, pidmults[trk.collisionId()], network_prediction, count_tracks, tracksForNet_size);
686729
};

Common/TableProducer/PID/pidTPCService.cxx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,22 @@ struct pidTPCService {
8181

8282
void processTracks(soa::Join<aod::Collisions, aod::EvSels> const& collisions, soa::Join<aod::Tracks, aod::TracksExtra> const& tracks, aod::BCsWithTimestamps const& bcs)
8383
{
84-
pidTPC.process(ccdb, ccdbApi, bcs, collisions, tracks, products);
84+
pidTPC.process(ccdb, ccdbApi, bcs, collisions, tracks, static_cast<TObject*>(nullptr), products);
85+
}
86+
87+
void processTracksMC(soa::Join<aod::Collisions, aod::EvSels> const& collisions, soa::Join<aod::Tracks, aod::TracksExtra, aod::McTrackLabels> const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles)
88+
{
89+
pidTPC.process(ccdb, ccdbApi, bcs, collisions, tracks, mcParticles, products);
8590
}
8691

8792
void processTracksIU(soa::Join<aod::Collisions, aod::EvSels> const& collisions, soa::Join<aod::TracksIU, aod::TracksCovIU, aod::TracksExtra> const& tracks, aod::BCsWithTimestamps const& bcs)
8893
{
89-
pidTPC.process(ccdb, ccdbApi, bcs, collisions, tracks, products);
94+
pidTPC.process(ccdb, ccdbApi, bcs, collisions, tracks, static_cast<TObject*>(nullptr), products);
9095
}
9196

9297
PROCESS_SWITCH(pidTPCService, processTracks, "Process Tracks", false);
93-
PROCESS_SWITCH(pidTPCService, processTracksIU, "Process TracksIU", true);
98+
PROCESS_SWITCH(pidTPCService, processTracksMC, "Process Tracks in MC (enables tune-on-data)", false);
99+
PROCESS_SWITCH(pidTPCService, processTracksIU, "Process TracksIU (experimental)", true);
94100
};
95101

96102
//****************************************************************************************

0 commit comments

Comments
 (0)