1616
1717#include < CCDB/BasicCCDBManager.h>
1818#include " TRandom3.h"
19+ #include " TF1.h"
1920#include < vector>
2021#include < string>
2122
3738#include " Common/DataModel/CollisionAssociationTables.h"
3839#include " PWGCF/Core/CorrelationContainer.h"
3940#include " PWGCF/Core/PairCuts.h"
41+ #include " PWGCF/GenericFramework/Core/GFWPowerArray.h"
42+ #include " PWGCF/GenericFramework/Core/GFW.h"
43+ #include " PWGCF/GenericFramework/Core/GFWCumulant.h"
44+ #include " PWGCF/GenericFramework/Core/GFWWeights.h"
4045#include " DataFormatsParameters/GRPObject.h"
4146#include " DataFormatsParameters/GRPMagField.h"
4247
@@ -64,6 +69,10 @@ struct DiHadronCor {
6469 O2_DEFINE_CONFIGURABLE (cfgCutPtMin, float , 0 .2f , " minimum accepted track pT" )
6570 O2_DEFINE_CONFIGURABLE (cfgCutPtMax, float , 10 .0f , " maximum accepted track pT" )
6671 O2_DEFINE_CONFIGURABLE (cfgCutEta, float , 0 .8f , " Eta cut" )
72+ O2_DEFINE_CONFIGURABLE (cfgCutChi2prTPCcls, float , 2 .5f , " max chi2 per TPC clusters" )
73+ O2_DEFINE_CONFIGURABLE (cfgCutTPCclu, float , 70 .0f , " minimum TPC clusters" )
74+ O2_DEFINE_CONFIGURABLE (cfgCutITSclu, float , 5 .0f , " minimum ITS clusters" )
75+ O2_DEFINE_CONFIGURABLE (cfgCutDCAz, float , 2 .0f , " max DCA to vertex z" )
6776 O2_DEFINE_CONFIGURABLE (cfgCutMerging, float , 0.0 , " Merging cut on track merge" )
6877 O2_DEFINE_CONFIGURABLE (cfgSelCollByNch, bool , true , " Select collisions by Nch or centrality" )
6978 O2_DEFINE_CONFIGURABLE (cfgCutMultMin, int , 0 , " Minimum multiplicity for collision" )
@@ -77,6 +86,20 @@ struct DiHadronCor {
7786 O2_DEFINE_CONFIGURABLE (cfgCentEstimator, int , 0 , " 0:FT0C; 1:FT0CVariant1; 2:FT0M; 3:FT0A" )
7887 O2_DEFINE_CONFIGURABLE (cfgCentFT0CMin, float , 0 .0f , " Minimum centrality (FT0C) to cut events in filter" )
7988 O2_DEFINE_CONFIGURABLE (cfgCentFT0CMax, float , 100 .0f , " Maximum centrality (FT0C) to cut events in filter" )
89+ O2_DEFINE_CONFIGURABLE (cfgUseAdditionalEventCut, bool , false , " Use additional event cut on mult correlations" )
90+ O2_DEFINE_CONFIGURABLE (cfgUseTentativeEventCounter, bool , false , " After sel8(), count events regardless of real event selection" )
91+ O2_DEFINE_CONFIGURABLE (cfgEvSelkNoSameBunchPileup, bool , false , " rejects collisions which are associated with the same found-by-T0 bunch crossing" )
92+ O2_DEFINE_CONFIGURABLE (cfgEvSelkIsGoodZvtxFT0vsPV, bool , false , " removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution" )
93+ O2_DEFINE_CONFIGURABLE (cfgEvSelkNoCollInTimeRangeStandard, bool , false , " no collisions in specified time range" )
94+ O2_DEFINE_CONFIGURABLE (cfgEvSelkIsGoodITSLayersAll, bool , true , " cut time intervals with dead ITS staves" )
95+ O2_DEFINE_CONFIGURABLE (cfgEvSelkNoCollInRofStandard, bool , false , " no other collisions in this Readout Frame with per-collision multiplicity above threshold" )
96+ O2_DEFINE_CONFIGURABLE (cfgEvSelkNoHighMultCollInPrevRof, bool , false , " veto an event if FT0C amplitude in previous ITS ROF is above threshold" )
97+ O2_DEFINE_CONFIGURABLE (cfgEvSelMultCorrelation, bool , true , " Multiplicity correlation cut" )
98+ O2_DEFINE_CONFIGURABLE (cfgEvSelV0AT0ACut, bool , true , " V0A T0A 5 sigma cut" )
99+ O2_DEFINE_CONFIGURABLE (cfgEvSelOccupancy, bool , true , " Occupancy cut" )
100+ O2_DEFINE_CONFIGURABLE (cfgCutOccupancyHigh, int , 2000 , " High cut on TPC occupancy" )
101+ O2_DEFINE_CONFIGURABLE (cfgCutOccupancyLow, int , 0 , " Low cut on TPC occupancy" )
102+ O2_DEFINE_CONFIGURABLE (cfgEfficiency, std::string, " " , " CCDB path to efficiency object" )
80103
81104 SliceCache cache;
82105 SliceCache cacheNch;
@@ -99,7 +122,13 @@ struct DiHadronCor {
99122
100123 // make the filters and cuts.
101124 Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVtxZ) && (aod::evsel::sel8) == true && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax);
102- Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t ) true ));
125+ Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t ) true )) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz);
126+
127+ // Corrections
128+ TH1D* mEfficiency = nullptr ;
129+ GFWWeights* mAcceptance = nullptr ;
130+ TObjArray* mAcceptanceList = nullptr ;
131+ bool correctionsLoaded = false ;
103132
104133 // Define the outputs
105134 OutputObj<CorrelationContainer> same{" sameEvent" };
@@ -121,6 +150,15 @@ struct DiHadronCor {
121150 MixedEvent = 3
122151 };
123152
153+ // Additional Event selection cuts - Copy from flowGenericFramework.cxx
154+ TF1* fMultPVCutLow = nullptr ;
155+ TF1* fMultPVCutHigh = nullptr ;
156+ TF1* fMultCutLow = nullptr ;
157+ TF1* fMultCutHigh = nullptr ;
158+ TF1* fMultMultPVCut = nullptr ;
159+ TF1* fT0AV0AMean = nullptr ;
160+ TF1* fT0AV0ASigma = nullptr ;
161+
124162 using AodCollisions = soa::Filtered<soa::Join<aod::Collisions, aod::EvSel, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentFV0As, aod::Mults>>; // aod::CentFT0Cs
125163 using AodTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, aod::TracksExtra>>;
126164
@@ -138,12 +176,56 @@ struct DiHadronCor {
138176
139177 LOGF (info, " Starting init" );
140178
179+ // Event Counter
180+ registry.add (" hEventCountSpecific" , " Number of Event;; Count" , {HistType::kTH1D , {{10 , 0 , 10 }}});
181+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (1 , " after sel8" );
182+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (2 , " kNoSameBunchPileup" );
183+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (3 , " kIsGoodZvtxFT0vsPV" );
184+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (4 , " kNoCollInTimeRangeStandard" );
185+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (5 , " kIsGoodITSLayersAll" );
186+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (6 , " kNoCollInRofStandard" );
187+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (7 , " kNoHighMultCollInPrevRof" );
188+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (8 , " occupancy" );
189+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (9 , " MultCorrelation" );
190+ registry.get <TH1>(HIST (" hEventCountSpecific" ))->GetXaxis ()->SetBinLabel (10 , " cfgEvSelV0AT0ACut" );
191+ if (cfgUseTentativeEventCounter) {
192+ registry.add (" hEventCountTentative" , " Number of Event;; Count" , {HistType::kTH1D , {{10 , 0 , 10 }}});
193+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (1 , " after sel8" );
194+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (2 , " kNoSameBunchPileup" );
195+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (3 , " kIsGoodZvtxFT0vsPV" );
196+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (4 , " kNoCollInTimeRangeStandard" );
197+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (5 , " kIsGoodITSLayersAll" );
198+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (6 , " kNoCollInRofStandard" );
199+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (7 , " kNoHighMultCollInPrevRof" );
200+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (8 , " occupancy" );
201+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (9 , " MultCorrelation" );
202+ registry.get <TH1>(HIST (" hEventCountTentative" ))->GetXaxis ()->SetBinLabel (10 , " cfgEvSelV0AT0ACut" );
203+ }
204+
205+ if (cfgUseAdditionalEventCut) {
206+ fMultPVCutLow = new TF1 (" fMultPVCutLow" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)" , 0 , 100 );
207+ fMultPVCutLow ->SetParameters (3257.29 , -121.848 , 1.98492 , -0.0172128 , 6.47528e-05 , 154.756 , -1.86072 , -0.0274713 , 0.000633499 , -3.37757e-06 );
208+ fMultPVCutHigh = new TF1 (" fMultPVCutHigh" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)" , 0 , 100 );
209+ fMultPVCutHigh ->SetParameters (3257.29 , -121.848 , 1.98492 , -0.0172128 , 6.47528e-05 , 154.756 , -1.86072 , -0.0274713 , 0.000633499 , -3.37757e-06 );
210+
211+ fMultCutLow = new TF1 (" fMultCutLow" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)" , 0 , 100 );
212+ fMultCutLow ->SetParameters (1654.46 , -47.2379 , 0.449833 , -0.0014125 , 150.773 , -3.67334 , 0.0530503 , -0.000614061 , 3.15956e-06 );
213+ fMultCutHigh = new TF1 (" fMultCutHigh" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)" , 0 , 100 );
214+ fMultCutHigh ->SetParameters (1654.46 , -47.2379 , 0.449833 , -0.0014125 , 150.773 , -3.67334 , 0.0530503 , -0.000614061 , 3.15956e-06 );
215+
216+ fT0AV0AMean = new TF1 (" fT0AV0AMean" , " [0]+[1]*x" , 0 , 200000 );
217+ fT0AV0AMean ->SetParameters (-1601.0581 , 9.417652e-01 );
218+ fT0AV0ASigma = new TF1 (" fT0AV0ASigma" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x" , 0 , 200000 );
219+ fT0AV0ASigma ->SetParameters (463.4144 , 6.796509e-02 , -9.097136e-07 , 7.971088e-12 , -2.600581e-17 );
220+ }
221+
141222 // Make histograms to check the distributions after cuts
142223 registry.add (" deltaEta_deltaPhi_same" , " " , {HistType::kTH2D , {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution
143224 registry.add (" deltaEta_deltaPhi_mixed" , " " , {HistType::kTH2D , {axisDeltaPhi, axisDeltaEta}});
144225 registry.add (" Phi" , " Phi" , {HistType::kTH1D , {axisPhi}});
145226 registry.add (" Eta" , " Eta" , {HistType::kTH1D , {axisEta}});
146227 registry.add (" pT" , " pT" , {HistType::kTH1D , {axisPtTrigger}});
228+ registry.add (" pTCorrected" , " pTCorrected" , {HistType::kTH1D , {axisPtTrigger}});
147229 registry.add (" Nch" , " N_{ch}" , {HistType::kTH1D , {axisMultiplicity}});
148230 registry.add (" Nch_used" , " N_{ch}" , {HistType::kTH1D , {axisMultiplicity}}); // histogram to see how many events are in the same and mixed event
149231 std::string hCentTitle = " Centrality distribution, Estimator " + std::to_string (cfgCentEstimator);
@@ -210,6 +292,39 @@ struct DiHadronCor {
210292 return cent;
211293 }
212294
295+ template <typename TTrack>
296+ bool trackSelected (TTrack track)
297+ {
298+ return ((track.tpcNClsFound () >= cfgCutTPCclu) && (track.itsNCls () >= cfgCutITSclu));
299+ }
300+
301+ void loadCorrections (uint64_t timestamp)
302+ {
303+ if (correctionsLoaded)
304+ return ;
305+ if (cfgEfficiency.value .empty () == false ) {
306+ mEfficiency = ccdb->getForTimeStamp <TH1D>(cfgEfficiency, timestamp);
307+ if (mEfficiency == nullptr ) {
308+ LOGF (fatal, " Could not load efficiency histogram for trigger particles from %s" , cfgEfficiency.value .c_str ());
309+ }
310+ LOGF (info, " Loaded efficiency histogram from %s (%p)" , cfgEfficiency.value .c_str (), (void *)mEfficiency );
311+ }
312+ correctionsLoaded = true ;
313+ }
314+
315+ bool setCurrentParticleWeights (float & weight_nue, float pt)
316+ {
317+ float eff = 1 .;
318+ if (mEfficiency )
319+ eff = mEfficiency ->GetBinContent (mEfficiency ->FindBin (pt));
320+ else
321+ eff = 1.0 ;
322+ if (eff == 0 )
323+ return false ;
324+ weight_nue = 1 . / eff;
325+ return true ;
326+ }
327+
213328 // fill multiple histograms
214329 template <typename TCollision, typename TTracks>
215330 void fillYield (TCollision collision, TTracks tracks) // function to fill the yield and etaphi histograms.
@@ -220,10 +335,16 @@ struct DiHadronCor {
220335 registry.fill (HIST (" Nch" ), tracks.size ());
221336 registry.fill (HIST (" zVtx" ), collision.posZ ());
222337
338+ float weff1 = 1 ;
223339 for (auto const & track1 : tracks) {
340+ if (!trackSelected (track1))
341+ continue ;
342+ if (!setCurrentParticleWeights (weff1, track1.pt ()))
343+ continue ;
224344 registry.fill (HIST (" Phi" ), RecoDecay::constrainAngle (track1.phi (), 0.0 ));
225345 registry.fill (HIST (" Eta" ), track1.eta ());
226346 registry.fill (HIST (" pT" ), track1.pt ());
347+ registry.fill (HIST (" pTCorrected" ), track1.pt (), weff1);
227348 }
228349 }
229350
@@ -263,15 +384,26 @@ struct DiHadronCor {
263384
264385 int fSampleIndex = gRandom ->Uniform (0 , cfgSampleSize);
265386
387+ float weff1 = 1 ;
388+ float weff2 = 1 ;
266389 // loop over all tracks
267390 for (auto const & track1 : tracks1) {
268391
392+ if (!trackSelected (track1))
393+ continue ;
394+ if (!setCurrentParticleWeights (weff1, track1.pt ()))
395+ continue ;
269396 if (system == SameEvent) {
270397 registry.fill (HIST (" Trig_hist" ), fSampleIndex , posZ, track1.pt ());
271398 }
272399
273400 for (auto const & track2 : tracks2) {
274401
402+ if (!trackSelected (track2))
403+ continue ;
404+ if (!setCurrentParticleWeights (weff2, track2.pt ()))
405+ continue ;
406+
275407 if (track1.pt () <= track2.pt ())
276408 continue ; // skip if the trigger pt is less than the associate pt
277409
@@ -314,15 +446,90 @@ struct DiHadronCor {
314446 }
315447 }
316448
449+ template <typename TCollision>
450+ bool eventSelected (TCollision collision, const int multTrk, const float centrality, const bool fillCounter)
451+ {
452+ registry.fill (HIST (" hEventCountSpecific" ), 0.5 );
453+ if (cfgEvSelkNoSameBunchPileup && !collision.selection_bit (o2::aod::evsel::kNoSameBunchPileup )) {
454+ // rejects collisions which are associated with the same "found-by-T0" bunch crossing
455+ // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof
456+ return 0 ;
457+ }
458+ if (fillCounter && cfgEvSelkNoSameBunchPileup)
459+ registry.fill (HIST (" hEventCountSpecific" ), 1.5 );
460+ if (cfgEvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit (o2::aod::evsel::kIsGoodZvtxFT0vsPV )) {
461+ // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference
462+ // use this cut at low multiplicities with caution
463+ return 0 ;
464+ }
465+ if (fillCounter && cfgEvSelkIsGoodZvtxFT0vsPV)
466+ registry.fill (HIST (" hEventCountSpecific" ), 2.5 );
467+ if (cfgEvSelkNoCollInTimeRangeStandard && !collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard )) {
468+ // no collisions in specified time range
469+ return 0 ;
470+ }
471+ if (fillCounter && cfgEvSelkNoCollInTimeRangeStandard)
472+ registry.fill (HIST (" hEventCountSpecific" ), 3.5 );
473+ if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit (o2::aod::evsel::kIsGoodITSLayersAll )) {
474+ // from Jan 9 2025 AOT meeting
475+ // cut time intervals with dead ITS staves
476+ return 0 ;
477+ }
478+ if (fillCounter && cfgEvSelkIsGoodITSLayersAll)
479+ registry.fill (HIST (" hEventCountSpecific" ), 4.5 );
480+ if (cfgEvSelkNoCollInRofStandard && !collision.selection_bit (o2::aod::evsel::kNoCollInRofStandard )) {
481+ // no other collisions in this Readout Frame with per-collision multiplicity above threshold
482+ return 0 ;
483+ }
484+ if (fillCounter && cfgEvSelkNoCollInRofStandard)
485+ registry.fill (HIST (" hEventCountSpecific" ), 5.5 );
486+ if (cfgEvSelkNoHighMultCollInPrevRof && !collision.selection_bit (o2::aod::evsel::kNoHighMultCollInPrevRof )) {
487+ // veto an event if FT0C amplitude in previous ITS ROF is above threshold
488+ return 0 ;
489+ }
490+ if (fillCounter && cfgEvSelkNoHighMultCollInPrevRof)
491+ registry.fill (HIST (" hEventCountSpecific" ), 6.5 );
492+ auto occupancy = collision.trackOccupancyInTimeRange ();
493+ if (cfgEvSelOccupancy && (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh))
494+ return 0 ;
495+ if (fillCounter && cfgEvSelOccupancy)
496+ registry.fill (HIST (" hEventCountSpecific" ), 7.5 );
497+
498+ auto multNTracksPV = collision.multNTracksPV ();
499+ if (cfgEvSelMultCorrelation) {
500+ if (multNTracksPV < fMultPVCutLow ->Eval (centrality))
501+ return 0 ;
502+ if (multNTracksPV > fMultPVCutHigh ->Eval (centrality))
503+ return 0 ;
504+ if (multTrk < fMultCutLow ->Eval (centrality))
505+ return 0 ;
506+ if (multTrk > fMultCutHigh ->Eval (centrality))
507+ return 0 ;
508+ }
509+ if (fillCounter && cfgEvSelMultCorrelation)
510+ registry.fill (HIST (" hEventCountSpecific" ), 8.5 );
511+
512+ // V0A T0A 5 sigma cut
513+ if (cfgEvSelV0AT0ACut && (std::fabs (collision.multFV0A () - fT0AV0AMean ->Eval (collision.multFT0A ())) > 5 * fT0AV0ASigma ->Eval (collision.multFT0A ())))
514+ return 0 ;
515+ if (fillCounter && cfgEvSelV0AT0ACut)
516+ registry.fill (HIST (" hEventCountSpecific" ), 9.5 );
517+
518+ return 1 ;
519+ }
520+
317521 void processSame (AodCollisions::iterator const & collision, AodTracks const & tracks, aod::BCsWithTimestamps const &)
318522 {
319523
320524 auto bc = collision.bc_as <aod::BCsWithTimestamps>();
525+ float cent = getCentrality (collision);
526+ if (cfgUseAdditionalEventCut && !eventSelected (collision, tracks.size (), cent, true ))
527+ return ;
321528
322529 registry.fill (HIST (" eventcount" ), SameEvent); // because its same event i put it in the 1 bin
323530
531+ loadCorrections (bc.timestamp ());
324532 fillYield (collision, tracks);
325- float cent = getCentrality (collision);
326533
327534 if (cfgSelCollByNch && (tracks.size () < cfgCutMultMin || tracks.size () >= cfgCutMultMax)) {
328535 return ;
@@ -354,6 +561,7 @@ struct DiHadronCor {
354561 for (auto const & [collision1, tracks1, collision2, tracks2] : pair) {
355562 registry.fill (HIST (" eventcount" ), MixedEvent); // fill the mixed event in the 3 bin
356563 auto bc = collision1.bc_as <aod::BCsWithTimestamps>();
564+ loadCorrections (bc.timestamp ());
357565
358566 if (cfgSelCollByNch && (tracks1.size () < cfgCutMultMin || tracks1.size () >= cfgCutMultMax))
359567 continue ;
@@ -363,6 +571,10 @@ struct DiHadronCor {
363571
364572 float cent1 = getCentrality (collision1);
365573 float cent2 = getCentrality (collision2);
574+ if (cfgUseAdditionalEventCut && !eventSelected (collision1, tracks1.size (), cent1, false ))
575+ continue ;
576+ if (cfgUseAdditionalEventCut && !eventSelected (collision2, tracks2.size (), cent2, false ))
577+ continue ;
366578
367579 if (!cfgSelCollByNch && (cent1 < cfgCutCentMin || cent1 >= cfgCutCentMax))
368580 continue ;
0 commit comments