@@ -1252,7 +1252,7 @@ struct AnalysisSameEventPairing {
12521252 Configurable<std::string> recSignals{" cfgBarrelMCRecSignals" , " " , " Comma separated list of MC signals (reconstructed)" };
12531253 Configurable<std::string> recSignalsJSON{" cfgMCRecSignalsJSON" , " " , " Comma separated list of MC signals (reconstructed) via JSON" };
12541254 Configurable<bool > skimSignalOnly{" cfgSkimSignalOnly" , false , " Configurable to select only matched candidates" };
1255- Configurable<bool > runMCGenPair{" cfgRunMCGenPair" , false , " Do pairing of true MC particles" };
1255+ // Configurable<bool> runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"};
12561256 } fConfigMC ;
12571257
12581258 struct : ConfigurableGroup {
@@ -1267,6 +1267,7 @@ struct AnalysisSameEventPairing {
12671267 Service<o2::ccdb::BasicCCDBManager> fCCDB ;
12681268
12691269 // Filter filterEventSelected = aod::dqanalysisflags::isEventSelected & uint32_t(1);
1270+ Filter eventFilter = aod::dqanalysisflags::isEventSelected > static_cast <uint32_t >(0 );
12701271
12711272 HistogramManager* fHistMan ;
12721273
@@ -1298,6 +1299,7 @@ struct AnalysisSameEventPairing {
12981299 if (context.mOptions .get <bool >(" processDummy" )) {
12991300 return ;
13001301 }
1302+ bool isMCGen = context.mOptions .get <bool >(" processMCGen" ) || context.mOptions .get <bool >(" processMCGenWithEventSelection" );
13011303 VarManager::SetDefaultVarNames ();
13021304
13031305 fEnableBarrelHistos = context.mOptions .get <bool >(" processAllSkimmed" ) || context.mOptions .get <bool >(" processBarrelOnlySkimmed" ) || context.mOptions .get <bool >(" processBarrelOnlyWithCollSkimmed" );
@@ -1555,12 +1557,16 @@ struct AnalysisSameEventPairing {
15551557 }
15561558 }
15571559
1558- for (auto & sig : fGenMCSignals ) {
1559- if (sig->GetNProngs () == 1 ) {
1560- histNames += Form (" MCTruthGen_%s;" , sig->GetName ()); // TODO: Add these names to a std::vector to avoid using Form in the process function
1561- } else if (sig->GetNProngs () == 2 ) {
1562- histNames += Form (" MCTruthGenPair_%s;" , sig->GetName ());
1563- fHasTwoProngGenMCsignals = true ;
1560+ if (isMCGen) {
1561+ for (auto & sig : fGenMCSignals ) {
1562+ if (sig->GetNProngs () == 1 ) {
1563+ histNames += Form (" MCTruthGen_%s;" , sig->GetName ()); // TODO: Add these names to a std::vector to avoid using Form in the process function
1564+ histNames += Form (" MCTruthGenSel_%s;" , sig->GetName ());
1565+ } else if (sig->GetNProngs () == 2 ) {
1566+ histNames += Form (" MCTruthGenPair_%s;" , sig->GetName ());
1567+ histNames += Form (" MCTruthGenPairSel_%s;" , sig->GetName ());
1568+ fHasTwoProngGenMCsignals = true ;
1569+ }
15641570 }
15651571 }
15661572
@@ -2044,9 +2050,10 @@ struct AnalysisSameEventPairing {
20442050 {
20452051 runSameEventPairing<true , VarManager::kDecayToEE , gkEventFillMapWithCov, gkTrackFillMapWithCov>(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks);
20462052 runSameEventPairing<true , VarManager::kDecayToMuMu , gkEventFillMapWithCov, gkMuonFillMapWithCov>(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks);
2047- if (fConfigMC .runMCGenPair ) {
2053+ // Feature replaced by processMCGen and processMCGenWithEventSelection
2054+ /* if (fConfigMC.runMCGenPair) {
20482055 runMCGen(mcEvents, mcTracks);
2049- }
2056+ }*/
20502057 // runSameEventPairing<true, VarManager::kElectronMuon, gkEventFillMap, gkTrackFillMap>(event, tracks, muons);
20512058 }
20522059
@@ -2055,30 +2062,81 @@ struct AnalysisSameEventPairing {
20552062 MyBarrelTracksWithCovWithAmbiguities const & barrelTracks, ReducedMCEvents const & mcEvents, ReducedMCTracks const & mcTracks)
20562063 {
20572064 runSameEventPairing<true , VarManager::kDecayToEE , gkEventFillMapWithCov, gkTrackFillMapWithCov>(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks);
2058- if (fConfigMC .runMCGenPair ) {
2065+ // Feature replaced by processMCGen and processMCGenWithEventSelection
2066+ /* if (fConfigMC.runMCGenPair) {
20592067 runMCGen(mcEvents, mcTracks);
2060- }
2068+ }*/
20612069 }
20622070
20632071 void processBarrelOnlyWithCollSkimmed (MyEventsVtxCovSelected const & events,
20642072 soa::Join<aod::ReducedTracksAssoc, aod::BarrelTrackCuts, aod::Prefilter> const & barrelAssocs,
20652073 MyBarrelTracksWithCovWithAmbiguitiesWithColl const & barrelTracks, ReducedMCEvents const & mcEvents, ReducedMCTracks const & mcTracks)
20662074 {
20672075 runSameEventPairing<true , VarManager::kDecayToEE , gkEventFillMapWithCov, gkTrackFillMapWithCovWithColl>(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks);
2068- if (fConfigMC .runMCGenPair ) {
2076+ // Feature replaced by processMCGen and processMCGenWithEventSelection
2077+ /* if (fConfigMC.runMCGenPair) {
20692078 runMCGen(mcEvents, mcTracks);
2070- }
2079+ }*/
20712080 }
20722081
20732082 void processMuonOnlySkimmed (MyEventsVtxCovSelected const & events,
20742083 soa::Join<aod::ReducedMuonsAssoc, aod::MuonTrackCuts> const & muonAssocs, MyMuonTracksWithCovWithAmbiguities const & muons, ReducedMCEvents const & mcEvents, ReducedMCTracks const & mcTracks)
20752084 {
20762085 runSameEventPairing<true , VarManager::kDecayToMuMu , gkEventFillMapWithCov, gkMuonFillMapWithCov>(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks);
2077- if (fConfigMC .runMCGenPair ) {
2086+ // Feature replaced by processMCGen and processMCGenWithEventSelection
2087+ /* if (fConfigMC.runMCGenPair) {
20782088 runMCGen(mcEvents, mcTracks);
2089+ }*/
2090+ }
2091+
2092+ void processMCGen (ReducedMCTracks const & mcTracks)
2093+ {
2094+ // loop over mc stack and fill histograms for pure MC truth signals
2095+ // group all the MC tracks which belong to the MC event corresponding to the current reconstructed event
2096+ // auto groupedMCTracks = tracksMC.sliceBy(aod::reducedtrackMC::reducedMCeventId, event.reducedMCevent().globalIndex());
2097+ for (auto & mctrack : mcTracks) {
2098+
2099+ VarManager::FillTrackMC (mcTracks, mctrack);
2100+ // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete.
2101+ // NOTE: However, the working model is that the decisions on MC signals are precomputed during skimming and are stored in the mcReducedFlags member.
2102+ // TODO: Use the mcReducedFlags to select signals
2103+ for (auto & sig : fGenMCSignals ) {
2104+ if (sig->CheckSignal (true , mctrack)) {
2105+ fHistMan ->FillHistClass (Form (" MCTruthGen_%s" , sig->GetName ()), VarManager::fgValues);
2106+ }
2107+ }
20792108 }
20802109 }
20812110
2111+ PresliceUnsorted<ReducedMCTracks> perReducedMcGenEvent = aod::reducedtrackMC::reducedMCeventId;
2112+
2113+ void processMCGenWithEventSelection (soa::Filtered<MyEventsVtxCovSelected> const & events,
2114+ ReducedMCEvents const & /* mcEvents*/ , ReducedMCTracks const & mcTracks)
2115+ {
2116+ for (auto & event : events) {
2117+ if (!event.isEventSelected_bit (0 )) {
2118+ continue ;
2119+ }
2120+ if (!event.has_reducedMCevent ()) {
2121+ continue ;
2122+ }
2123+
2124+ auto groupedMCTracks = mcTracks.sliceBy (perReducedMcGenEvent, event.reducedMCeventId ());
2125+ groupedMCTracks.bindInternalIndicesTo (&mcTracks);
2126+ for (auto & track : groupedMCTracks) {
2127+
2128+ VarManager::FillTrackMC (mcTracks, track);
2129+
2130+ auto track_raw = groupedMCTracks.rawIteratorAt (track.globalIndex ());
2131+ for (auto & sig : fGenMCSignals ) {
2132+ if (sig->CheckSignal (true , track_raw)) {
2133+ fHistMan ->FillHistClass (Form (" MCTruthGenSel_%s" , sig->GetName ()), VarManager::fgValues);
2134+ }
2135+ }
2136+ }
2137+ } // end loop over reconstructed events
2138+ }
2139+
20822140 void processDummy (MyEvents&)
20832141 {
20842142 // do nothing
@@ -2088,6 +2146,8 @@ struct AnalysisSameEventPairing {
20882146 PROCESS_SWITCH (AnalysisSameEventPairing, processBarrelOnlySkimmed, " Run barrel only pairing, with skimmed tracks" , false );
20892147 PROCESS_SWITCH (AnalysisSameEventPairing, processBarrelOnlyWithCollSkimmed, " Run barrel only pairing, with skimmed tracks and with collision information" , false );
20902148 PROCESS_SWITCH (AnalysisSameEventPairing, processMuonOnlySkimmed, " Run muon only pairing, with skimmed tracks" , false );
2149+ PROCESS_SWITCH (AnalysisSameEventPairing, processMCGen, " Loop over MC particle stack and fill generator level histograms" , false );
2150+ PROCESS_SWITCH (AnalysisSameEventPairing, processMCGenWithEventSelection, " Loop over MC particle stack and fill generator level histograms with event selection" , false );
20912151 PROCESS_SWITCH (AnalysisSameEventPairing, processDummy, " Dummy function, enabled only if none of the others are enabled" , false );
20922152};
20932153
0 commit comments