@@ -1009,11 +1009,26 @@ struct AnalysisSameEventPairing {
10091009 uint32_t mcDecision = static_cast <uint32_t >(0 );
10101010 bool isCorrectAssoc_leg1 = false ;
10111011 bool isCorrectAssoc_leg2 = false ;
1012- dielectronList.reserve (1 );
1013- dielectronsExtraList.reserve (1 );
1012+
1013+ int64_t reserveSize = 0 ;
1014+ for (auto const & event : events) {
1015+ if (event.isEventSelected_bit (0 )) {
1016+ auto groupedAssocs = assocs.sliceBy (preslice, event.globalIndex ());
1017+ size_t nGood = 0 ;
1018+ for (auto const & t : groupedAssocs) {
1019+ if (t.isBarrelSelected_raw ()) {
1020+ nGood++;
1021+ }
1022+ }
1023+ reserveSize += nGood * (nGood - 1 ) / 2 ;
1024+ }
1025+ }
1026+
1027+ dielectronList.reserve (reserveSize);
1028+ dielectronsExtraList.reserve (reserveSize);
10141029
10151030 if (fConfigOptions .flatTables .value ) {
1016- dielectronAllList.reserve (1 );
1031+ dielectronAllList.reserve (reserveSize );
10171032 }
10181033
10191034 for (const auto & event : events) {
@@ -1075,10 +1090,8 @@ struct AnalysisSameEventPairing {
10751090 if (fPropTrack ) {
10761091 VarManager::FillPairCollision<VarManager::kDecayToEE , gkTrackFillMap>(event, t1, t2);
10771092 }
1078- /* TODO: Reimplement Pair vertexing when secondary vertexing is available
1079- if constexpr (TTwoProngFitter) {
1080- // VarManager::FillPairVertexing<VarManager::kDecayToEE, gkEventFillMap, gkTrackFillMap>(event, t1, t2, fConfigOptions.propToPCA);
1081- }*/
1093+
1094+ VarManager::FillPairVertexingAlice3<VarManager::kDecayToEE , gkEventFillMap, gkTrackFillMap>(event, t1, t2, true );
10821095 if (!fConfigMC .skimSignalOnly || (fConfigMC .skimSignalOnly && mcDecision > 0 )) {
10831096 dielectronList (event.globalIndex (), VarManager::fgValues[VarManager::kMass ],
10841097 VarManager::fgValues[VarManager::kPt ], VarManager::fgValues[VarManager::kEta ], VarManager::fgValues[VarManager::kPhi ],
@@ -1188,7 +1201,6 @@ struct AnalysisSameEventPairing {
11881201
11891202 void runMCGenWithGrouping (MyEventsVtxCovSelected const & events, ReducedA3MCEvents const & /* mcEvents*/ , ReducedA3MCTracks const & mcTracks)
11901203 {
1191- [[maybe_unused]] uint32_t mcDecision = 0 ;
11921204 int isig = 0 ;
11931205
11941206 for (const auto & mctrack : mcTracks) {
@@ -1229,11 +1241,9 @@ struct AnalysisSameEventPairing {
12291241 }
12301242 }
12311243 auto track_raw = mcTracks.rawIteratorAt (track.globalIndex ());
1232- mcDecision = 0 ;
12331244 isig = 0 ;
12341245 for (const auto & sig : fGenMCSignals ) {
12351246 if (sig->CheckSignal (true , track_raw)) {
1236- mcDecision |= (static_cast <uint32_t >(1 ) << isig);
12371247 fHistMan ->FillHistClass (Form (" MCTruthGenSel_%s" , sig->GetName ()), VarManager::fgValues);
12381248 MCTruthTableEffi (VarManager::fgValues[VarManager::kMCPt ], VarManager::fgValues[VarManager::kMCEta ], VarManager::fgValues[VarManager::kMCY ], VarManager::fgValues[VarManager::kMCPhi ], VarManager::fgValues[VarManager::kMCVz ], VarManager::fgValues[VarManager::kMCVtxZ ], VarManager::fgValues[VarManager::kMultFT0A ], VarManager::fgValues[VarManager::kMultFT0C ], VarManager::fgValues[VarManager::kCentFT0M ], VarManager::fgValues[VarManager::kVtxNcontribReal ]);
12391249 }
@@ -1279,14 +1289,12 @@ struct AnalysisSameEventPairing {
12791289 auto t1_raw = mcTracks.rawIteratorAt (t1.globalIndex ());
12801290 auto t2_raw = mcTracks.rawIteratorAt (t2.globalIndex ());
12811291 if (t1_raw.reducedA3MCEventId () == t2_raw.reducedA3MCEventId ()) {
1282- mcDecision = 0 ;
12831292 isig = 0 ;
12841293 for (const auto & sig : fGenMCSignals ) {
12851294 if (sig->GetNProngs () != TWO_PRONG ) { // NOTE: 2-prong signals required here
12861295 continue ;
12871296 }
12881297 if (sig->CheckSignal (true , t1_raw, t2_raw)) {
1289- mcDecision |= (static_cast <uint32_t >(1 ) << isig);
12901298 VarManager::FillPairMC<VarManager::kDecayToEE >(t1, t2);
12911299 if (fUseMCGenAccCut ) {
12921300 if (!fMCGenAccCut .IsSelected (VarManager::fgValues)) {
@@ -1315,10 +1323,6 @@ struct AnalysisSameEventPairing {
13151323
13161324 void processMCGen (soa::Filtered<MyEventsVtxCovSelected> const & events, ReducedA3MCEvents const & /* mcEvents*/ , ReducedA3MCTracks const & mcTracks)
13171325 {
1318- // Fill Generated histograms taking into account all generated tracks
1319- [[maybe_unused]] uint32_t mcDecision = 0 ;
1320- int isig = 0 ;
1321-
13221326 for (const auto & mctrack : mcTracks) {
13231327 VarManager::FillTrackMC (mcTracks, mctrack);
13241328 // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete.
@@ -1341,25 +1345,18 @@ struct AnalysisSameEventPairing {
13411345 }
13421346 VarManager::FillEventAlice3<gkEventFillMap>(event, VarManager::fgValues);
13431347 VarManager::FillEventAlice3<VarManager::ObjTypes::ReducedEventMC>(event.reducedA3MCEvent (), VarManager::fgValues);
1344- // auto groupedMCTracks = mcTracks.sliceBy(perReducedMcGenEvent, event.reducedA3MCEventId());
1345- // groupedMCTracks.bindInternalIndicesTo(&mcTracks);
1346- // for (const auto& track : groupedMCTracks) {
1348+
13471349 for (const auto & track : mcTracks) {
13481350 if (track.reducedA3MCEventId () != event.reducedA3MCEventId ()) {
13491351 continue ;
13501352 }
13511353 VarManager::FillTrackMC (mcTracks, track);
13521354 auto track_raw = mcTracks.rawIteratorAt (track.globalIndex ());
1353- // auto track_raw = groupedMCTracks.rawIteratorAt(track.globalIndex());
1354- mcDecision = 0 ;
1355- isig = 0 ;
13561355 for (const auto & sig : fGenMCSignals ) {
13571356 if (sig->CheckSignal (true , track_raw)) {
1358- mcDecision |= (static_cast <uint32_t >(1 ) << isig);
13591357 fHistMan ->FillHistClass (Form (" MCTruthGenSel_%s" , sig->GetName ()), VarManager::fgValues);
13601358 MCTruthTableEffi (VarManager::fgValues[VarManager::kMCPt ], VarManager::fgValues[VarManager::kMCEta ], VarManager::fgValues[VarManager::kMCY ], VarManager::fgValues[VarManager::kMCPhi ], VarManager::fgValues[VarManager::kMCVz ], VarManager::fgValues[VarManager::kMCVtxZ ], VarManager::fgValues[VarManager::kMultFT0A ], VarManager::fgValues[VarManager::kMultFT0C ], VarManager::fgValues[VarManager::kCentFT0M ], VarManager::fgValues[VarManager::kVtxNcontribReal ]);
13611359 }
1362- isig++;
13631360 }
13641361 }
13651362 } // end loop over reconstructed events
@@ -1399,17 +1396,13 @@ struct AnalysisSameEventPairing {
13991396 auto t1_raw = mcTracks.rawIteratorAt (t1.globalIndex ());
14001397 auto t2_raw = mcTracks.rawIteratorAt (t2.globalIndex ());
14011398 if (t1_raw.reducedA3MCEventId () == t2_raw.reducedA3MCEventId ()) {
1402- mcDecision = 0 ;
1403- isig = 0 ;
14041399 for (const auto & sig : fGenMCSignals ) {
14051400 if (sig->GetNProngs () != TWO_PRONG ) { // NOTE: 2-prong signals required here
14061401 continue ;
14071402 }
14081403 if (sig->CheckSignal (true , t1_raw, t2_raw)) {
1409- mcDecision |= (static_cast <uint32_t >(1 ) << isig);
14101404 fHistMan ->FillHistClass (Form (" MCTruthGenPairSel_%s" , sig->GetName ()), VarManager::fgValues);
14111405 }
1412- isig++;
14131406 }
14141407 }
14151408 }
@@ -1419,9 +1412,6 @@ struct AnalysisSameEventPairing {
14191412
14201413 void processMCGenWithGrouping (soa::Filtered<MyEventsVtxCovSelected> const & events, ReducedA3MCEvents const & /* mcEvents*/ , ReducedA3MCTracks const & mcTracks)
14211414 {
1422- [[maybe_unused]] uint32_t mcDecision = 0 ;
1423- int isig = 0 ;
1424-
14251415 for (const auto & mctrack : mcTracks) {
14261416 VarManager::FillTrackMC (mcTracks, mctrack);
14271417 // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete.
@@ -1448,15 +1438,11 @@ struct AnalysisSameEventPairing {
14481438 }
14491439 VarManager::FillTrackMC (mcTracks, track);
14501440 auto track_raw = mcTracks.rawIteratorAt (track.globalIndex ());
1451- mcDecision = 0 ;
1452- isig = 0 ;
14531441 for (const auto & sig : fGenMCSignals ) {
14541442 if (sig->CheckSignal (true , track_raw)) {
1455- mcDecision |= (static_cast <uint32_t >(1 ) << isig);
14561443 fHistMan ->FillHistClass (Form (" MCTruthGenSel_%s" , sig->GetName ()), VarManager::fgValues);
14571444 MCTruthTableEffi (VarManager::fgValues[VarManager::kMCPt ], VarManager::fgValues[VarManager::kMCEta ], VarManager::fgValues[VarManager::kMCY ], VarManager::fgValues[VarManager::kMCPhi ], VarManager::fgValues[VarManager::kMCVz ], VarManager::fgValues[VarManager::kMCVtxZ ], VarManager::fgValues[VarManager::kMultFT0A ], VarManager::fgValues[VarManager::kMultFT0C ], VarManager::fgValues[VarManager::kCentFT0M ], VarManager::fgValues[VarManager::kVtxNcontribReal ]);
14581445 }
1459- isig++;
14601446 }
14611447 }
14621448 } // end loop over reconstructed events
@@ -1491,17 +1477,13 @@ struct AnalysisSameEventPairing {
14911477 auto t1_raw = groupedMCTracks.rawIteratorAt (t1.globalIndex ());
14921478 auto t2_raw = groupedMCTracks.rawIteratorAt (t2.globalIndex ());
14931479 if (t1_raw.reducedA3MCEventId () == t2_raw.reducedA3MCEventId ()) {
1494- mcDecision = 0 ;
1495- isig = 0 ;
14961480 for (const auto & sig : fGenMCSignals ) {
14971481 if (sig->GetNProngs () != TWO_PRONG ) { // NOTE: 2-prong signals required here
14981482 continue ;
14991483 }
15001484 if (sig->CheckSignal (true , t1_raw, t2_raw)) {
1501- mcDecision |= (static_cast <uint32_t >(1 ) << isig);
15021485 fHistMan ->FillHistClass (Form (" MCTruthGenPairSel_%s" , sig->GetName ()), VarManager::fgValues);
15031486 }
1504- isig++;
15051487 }
15061488 }
15071489 }
@@ -2029,10 +2011,7 @@ struct AnalysisAsymmetricPairing {
20292011 } // end loop over MC signals
20302012
20312013 VarManager::FillPairAlice3<VarManager::kDecayToKPi , gkTrackFillMapWithCov>(t1, t2);
2032- /* TODO: Reimplement when secondary vertexing is available
2033- if constexpr (TTwoProngFitter) {
2034- VarManager::FillPairVertexing<VarManager::kDecayToKPi, gkEventFillMapWithCov, gkTrackFillMapWithCov>(event, t1, t2, fConfigPropToPCA);
2035- }*/
2014+ VarManager::FillPairVertexingAlice3<VarManager::kDecayToKPi , gkEventFillMapWithCov, gkTrackFillMapWithCov>(event, t1, t2, true );
20362015
20372016 // Fill histograms
20382017 bool isAmbi = false ;
@@ -2180,7 +2159,8 @@ struct AnalysisAsymmetricPairing {
21802159 }
21812160
21822161 // Function to run same event triplets (e.g. D+->K-pi+pi+)
2183- void runThreeProng (MyEventsVtxCovSelected const & events, PresliceUnsorted<MyBarrelAssocs>& preslice, MyBarrelAssocs const & /* assocs*/ , MyBarrelTracksWithCovWithAmbiguities const & tracks, ReducedA3MCEvents const & /* mcEvents*/ , ReducedA3MCTracks const & /* mcTracks*/ , VarManager::PairCandidateType tripletType)
2162+ template <bool TThreeProngFitter, typename TEvents, typename TTrackAssocs, typename TTracks>
2163+ void runThreeProng (TEvents const & events, PresliceUnsorted<TTrackAssocs>& preslice, TTrackAssocs const & /* assocs*/ , TTracks const & tracks, ReducedA3MCEvents const & /* mcEvents*/ , ReducedA3MCTracks const & /* mcTracks*/ , VarManager::PairCandidateType tripletType)
21842164 {
21852165 for (const auto & event : events) {
21862166 if (!event.isEventSelected_bit (0 )) {
@@ -2206,12 +2186,12 @@ struct AnalysisAsymmetricPairing {
22062186 // Based on triplet type, make suitable combinations of the partitions
22072187 if (tripletType == VarManager::kTripleCandidateToPKPi ) {
22082188 for (const auto & [a1, a2, a3] : combinations (soa::CombinationsFullIndexPolicy (groupedLegAAssocs, groupedLegBAssocs, groupedLegCAssocs))) {
2209- readTriplet (a1, a2, a3, tracks, event, tripletType);
2189+ readTriplet<TThreeProngFitter> (a1, a2, a3, tracks, event, tripletType);
22102190 }
22112191 } else if (tripletType == VarManager::kTripleCandidateToKPiPi ) {
22122192 for (const auto & a1 : groupedLegAAssocs) {
22132193 for (const auto & [a2, a3] : combinations (groupedLegBAssocs, groupedLegCAssocs)) {
2214- readTriplet (a1, a2, a3, tracks, event, tripletType);
2194+ readTriplet<TThreeProngFitter> (a1, a2, a3, tracks, event, tripletType);
22152195 }
22162196 }
22172197 } else {
@@ -2220,8 +2200,8 @@ struct AnalysisAsymmetricPairing {
22202200 } // end event loop
22212201 }
22222202
2223- // Helper function to process triplet
2224- void readTriplet (MyBarrelAssocs::iterator const & a1, MyBarrelAssocs::iterator const & a2, MyBarrelAssocs::iterator const & a3, MyBarrelTracksWithCovWithAmbiguities const & /* tracks*/ , MyEventsVtxCovSelected::iterator const & /* event*/ , VarManager::PairCandidateType tripletType)
2203+ template < bool TThreeProngFitter, typename TTrackAssoc, typename TTracks, typename TEvent>
2204+ void readTriplet (TTrackAssoc const & a1, TTrackAssoc const & a2, TTrackAssoc const & a3, TTracks const & /* tracks*/ , TEvent const & event, VarManager::PairCandidateType tripletType)
22252205 {
22262206 uint32_t mcDecision = 0 ;
22272207
@@ -2256,9 +2236,9 @@ struct AnalysisAsymmetricPairing {
22562236 // Find common track cuts all candidates pass
22572237 threeTrackCommonFilter |= a1.isBarrelSelected_raw () & a2.isBarrelSelected_raw () & a3.isBarrelSelected_raw () & fCommonTrackCutMask ;
22582238
2259- auto t1 = a1.template reducedA3track_as <MyBarrelTracksWithCovWithAmbiguities >();
2260- auto t2 = a2.template reducedA3track_as <MyBarrelTracksWithCovWithAmbiguities >();
2261- auto t3 = a3.template reducedA3track_as <MyBarrelTracksWithCovWithAmbiguities >();
2239+ auto t1 = a1.template reducedA3track_as <TTracks >();
2240+ auto t2 = a2.template reducedA3track_as <TTracks >();
2241+ auto t3 = a3.template reducedA3track_as <TTracks >();
22622242
22632243 // Avoid self-pairs
22642244 if (t1 == t2 || t1 == t3 || t2 == t3) {
@@ -2299,10 +2279,9 @@ struct AnalysisAsymmetricPairing {
22992279 } // end loop over MC signals
23002280
23012281 VarManager::FillTriple (t1, t2, t3, VarManager::fgValues, tripletType);
2302- /* TODO: Reimplement when secondary vertexing is available
23032282 if constexpr (TThreeProngFitter) {
2304- VarManager::FillTripletVertexing <gkEventFillMapWithCov, gkTrackFillMapWithCov>(event, t1, t2, t3, tripletType);
2305- }*/
2283+ VarManager::FillTripletVertexingALICE3 <gkEventFillMapWithCov, gkTrackFillMapWithCov>(event, t1, t2, t3, tripletType);
2284+ }
23062285
23072286 // Fill histograms
23082287 bool isAmbi = false ;
@@ -2368,7 +2347,15 @@ struct AnalysisAsymmetricPairing {
23682347 MyBarrelTracksWithCovWithAmbiguities const & barrelTracks,
23692348 ReducedA3MCEvents const & mcEvents, ReducedA3MCTracks const & mcTracks)
23702349 {
2371- runThreeProng (events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks, VarManager::kTripleCandidateToKPiPi );
2350+ runThreeProng<true >(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks, VarManager::kTripleCandidateToKPiPi );
2351+ }
2352+
2353+ void processProtonKaonPionSkimmed (MyEventsVtxCovSelected const & events,
2354+ MyBarrelAssocs const & barrelAssocs,
2355+ MyBarrelTracksWithCovWithAmbiguities const & barrelTracks,
2356+ ReducedA3MCEvents const & mcEvents, ReducedA3MCTracks const & mcTracks)
2357+ {
2358+ runThreeProng<true >(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks, VarManager::kTripleCandidateToPKPi );
23722359 }
23732360
23742361 void processMCGen (ReducedA3MCTracks const & mcTracks)
@@ -2426,6 +2413,7 @@ struct AnalysisAsymmetricPairing {
24262413
24272414 PROCESS_SWITCH (AnalysisAsymmetricPairing, processKaonPionSkimmed, " Run kaon pion pairing, with skimmed tracks" , false );
24282415 PROCESS_SWITCH (AnalysisAsymmetricPairing, processKaonPionPionSkimmed, " Run kaon pion pion triplets, with skimmed tracks" , false );
2416+ PROCESS_SWITCH (AnalysisAsymmetricPairing, processProtonKaonPionSkimmed, " Run proton kaon pion triplets, with skimmed tracks" , false );
24292417 PROCESS_SWITCH (AnalysisAsymmetricPairing, processMCGen, " Loop over MC particle stack and fill generator level histograms" , false );
24302418 PROCESS_SWITCH (AnalysisAsymmetricPairing, processMCGenWithEventSelection, " Loop over MC particle stack and fill generator level histograms" , false );
24312419 PROCESS_SWITCH (AnalysisAsymmetricPairing, processDummy, " Dummy function, enabled only if none of the others are enabled" , true );
0 commit comments