@@ -150,11 +150,20 @@ struct ZdcQVectors {
150150 O2_DEFINE_CONFIGURABLE (cfgTrackSelsEta, float , 0.8 , " eta cut" );
151151
152152 O2_DEFINE_CONFIGURABLE (cfgCCDBdir_Shift, std::string, " Users/c/ckoster/ZDC/LHC23_PbPb_pass5/Shift" , " CCDB directory for Shift ZDC" );
153+ Configurable<std::vector<int >> cfgSelVec{" cfgSelVec" , std::vector<int >{1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 1 }, " Put 1 for every event selection from SelectionCriteria that is used in flowSP" };
154+ Configurable<std::vector<double >> cfgEvSelsMultPv{" cfgEvSelsMultPv" , std::vector<double >{2223.49 , -75.1444 , 0.963572 , -0.00570399 , 1.34877e-05 , 3790.99 , -137.064 , 2.13044 , -0.017122 , 5.82834e-05 }, " Multiplicity cuts (PV) first 5 parameters cutLOW last 5 cutHIGH (Default is +-2sigma pass5) " };
155+ Configurable<std::vector<double >> cfgEvSelsMult{" cfgEvSelsMult" , std::vector<double >{1301.56 , -41.4615 , 0.478224 , -0.00239449 , 4.46966e-06 , 2967.6 , -102.927 , 1.47488 , -0.0106534 , 3.28622e-05 }, " Multiplicity cuts (Global) first 5 parameters cutLOW last 5 cutHIGH (Default is +-2sigma pass5) " };
156+
153157
154158 // define my.....
155159 // Filter collisionFilter = nabs(aod::collision::posZ) <;
156- using UsedCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentFV0As, aod::CentNGlobals>;
160+
161+ using UsedCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentFV0As, aod::CentNGlobals>;
157162 using BCsRun3 = soa::Join<aod::BCs, aod::Timestamps, aod::BcSels, aod::Run3MatchedToBCSparse>;
163+ Filter trackFilter = nabs(aod::track::eta) < cfgTrackSelsEta && aod::track::pt > cfgTrackSelsPtmin&& aod::track::pt < cfgTrackSelsPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t )true )) && nabs(aod::track::dcaXY) < cfgTrackSelsDCAxy&& nabs(aod::track::dcaZ) < cfgTrackSelsDCAz;
164+ using UnfilteredTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, aod::TracksDCA>;
165+ using UsedTracks = soa::Filtered<UnfilteredTracks>;
166+
158167
159168 enum SelectionCriteria {
160169 evSel_FilteredEvent,
@@ -172,6 +181,7 @@ struct ZdcQVectors {
172181 evSel_kIsGoodITSLayer0123,
173182 evSel_RCTFlagsZDC,
174183 evSel_CentCuts,
184+ evSel_MultCut,
175185 nEventSelections
176186 };
177187
@@ -185,6 +195,15 @@ struct ZdcQVectors {
185195 // Define output
186196 HistogramRegistry registry{" Registry" };
187197
198+ // Event selection cuts
199+ std::unique_ptr<TF1 > fPhiCutLow = nullptr ;
200+ std::unique_ptr<TF1 > fPhiCutHigh = nullptr ;
201+ std::unique_ptr<TF1 > fMultPVCutLow = nullptr ;
202+ std::unique_ptr<TF1 > fMultPVCutHigh = nullptr ;
203+ std::unique_ptr<TF1 > fMultCutLow = nullptr ;
204+ std::unique_ptr<TF1 > fMultCutHigh = nullptr ;
205+ std::unique_ptr<TF1 > fMultMultPVCut = nullptr ;
206+
188207 Service<ccdb::BasicCCDBManager> ccdb;
189208
190209 // keep track of calibration histos for each given step and iteration
@@ -247,6 +266,7 @@ struct ZdcQVectors {
247266 registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_CentCuts + 1 , " Cenrality range" );
248267 registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kIsGoodITSLayersAll + 1 , " kIsGoodITSLayersAll" );
249268 registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_kIsGoodITSLayer0123 + 1 , " kIsGoodITSLayer0123" );
269+ registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_MultCut + 1 , " Mult & MultPV" );
250270 registry.get <TH1 >(HIST (" hEventCount" ))->GetXaxis ()->SetBinLabel (evSel_isSelectedZDC + 1 , " isSelected" );
251271
252272 if (!cfgFillNothing) {
@@ -364,6 +384,28 @@ struct ZdcQVectors {
364384 registry.addClone (" recentering/before/" , " recentering/after/" );
365385 registry.addClone (" QA/before/" , " QA/after/" );
366386 }
387+
388+ fMultPVCutLow = std::make_unique<TF1 >(" fMultPVCutLow" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x" , 0 , 100 );
389+ fMultPVCutHigh = std::make_unique<TF1 >(" fMultPVCutHigh" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x" , 0 , 100 );
390+ fMultCutLow = std::make_unique<TF1 >(" fMultCutLow" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x" , 0 , 100 );
391+ fMultCutHigh = std::make_unique<TF1 >(" fMultCutHigh" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x" , 0 , 100 );
392+
393+ std::vector<double > paramsMultPVCut = cfgEvSelsMultPv;
394+ std::vector<double > paramsMultCut = cfgEvSelsMult;
395+
396+ uint64_t nParams = 10 ;
397+
398+ if (paramsMultPVCut.size () < nParams) {
399+ LOGF (fatal, " cfg.cEvSelsMultPv not set properly.. size = %d (should be 10) --> Check your config files!" , paramsMultPVCut.size ());
400+ } else if (paramsMultCut.size () < nParams) {
401+ LOGF (fatal, " cfg.cEvSelsMult not set properly.. size = %d (should be 10) --> Check your config files!" , paramsMultCut.size ());
402+ } else {
403+ fMultPVCutLow ->SetParameters (paramsMultPVCut[0 ], paramsMultPVCut[1 ], paramsMultPVCut[2 ], paramsMultPVCut[3 ], paramsMultPVCut[4 ]);
404+ fMultPVCutHigh ->SetParameters (paramsMultPVCut[5 ], paramsMultPVCut[6 ], paramsMultPVCut[7 ], paramsMultPVCut[8 ], paramsMultPVCut[9 ]);
405+ fMultCutLow ->SetParameters (paramsMultCut[0 ], paramsMultCut[1 ], paramsMultCut[2 ], paramsMultCut[3 ], paramsMultCut[4 ]);
406+ fMultCutHigh ->SetParameters (paramsMultCut[5 ], paramsMultCut[6 ], paramsMultCut[7 ], paramsMultCut[8 ], paramsMultCut[9 ]);
407+ }
408+
367409 }
368410
369411 double rescaleTimestamp (uint64_t timestamp, int runnumber)
@@ -426,8 +468,8 @@ struct ZdcQVectors {
426468 }
427469 }
428470
429- template <typename TCollision, typename TBunchCrossing>
430- uint16_t eventSelected (TCollision collision, TBunchCrossing bunchCrossing)
471+ template <typename TCollision, typename TBunchCrossing>
472+ uint16_t eventSelected (TCollision collision, TBunchCrossing bunchCrossing, bool & isEventSelected, const int & multTrk )
431473 {
432474 uint16_t selectionBits = 0 ;
433475 bool selected;
@@ -441,72 +483,124 @@ struct ZdcQVectors {
441483 if (selected) {
442484 selectionBits |= static_cast <uint16_t >(0x1u << evSel_Zvtx);
443485 fillCutAnalysis (collision, bunchCrossing, evSel_Zvtx);
486+ } else if (cfgSelVec.value [evSel_Zvtx]) {
487+ isEventSelected = false ;
444488 }
445489
446490 selected = collision.sel8 ();
447491 if (selected) {
448492 selectionBits |= static_cast <uint16_t >(0x1u << evSel_sel8);
449493 fillCutAnalysis (collision, bunchCrossing, evSel_sel8);
494+ } else if (cfgSelVec.value [evSel_sel8]) {
495+ isEventSelected = false ;
450496 }
451497
452498 auto occupancy = collision.trackOccupancyInTimeRange ();
453499 selected = occupancy <= EvSel.cfgMaxOccupancy ;
454500 if (selected) {
455501 selectionBits |= static_cast <uint16_t >(0x1u << evSel_occupancy);
456502 fillCutAnalysis (collision, bunchCrossing, evSel_occupancy);
503+ } else if (cfgSelVec.value [evSel_occupancy]) {
504+ isEventSelected = false ;
457505 }
458506
459507 selected = collision.selection_bit (o2::aod::evsel::kNoSameBunchPileup );
460508 if (selected) {
461509 selectionBits |= static_cast <uint16_t >(0x1u << evSel_kNoSameBunchPileup);
462510 fillCutAnalysis (collision, bunchCrossing, evSel_kNoSameBunchPileup);
511+ } else if (cfgSelVec.value [evSel_kNoSameBunchPileup]) {
512+ isEventSelected = false ;
463513 }
464514
465515 selected = collision.selection_bit (o2::aod::evsel::kIsGoodZvtxFT0vsPV );
466516 if (selected) {
467517 selectionBits |= static_cast <uint16_t >(0x1u << evSel_kIsGoodZvtxFT0vsPV);
468518 fillCutAnalysis (collision, bunchCrossing, evSel_kIsGoodZvtxFT0vsPV);
519+ } else if (cfgSelVec.value [evSel_kIsGoodZvtxFT0vsPV]) {
520+ isEventSelected = false ;
469521 }
470522
471523 selected = collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard );
472524 if (selected) {
473525 selectionBits |= static_cast <uint16_t >(0x1u << evSel_kNoCollInTimeRangeStandard);
474526 fillCutAnalysis (collision, bunchCrossing, evSel_kNoCollInTimeRangeStandard);
527+ } else if (cfgSelVec.value [evSel_kNoCollInTimeRangeStandard]) {
528+ isEventSelected = false ;
475529 }
476530
477531 selected = collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeNarrow );
478532 if (selected) {
479533 selectionBits |= static_cast <uint16_t >(0x1u << evSel_kNoCollInTimeRangeNarrow);
480534 fillCutAnalysis (collision, bunchCrossing, evSel_kNoCollInTimeRangeNarrow);
535+ } else if (cfgSelVec.value [evSel_kNoCollInTimeRangeNarrow]) {
536+ isEventSelected = false ;
481537 }
482538
483539 selected = collision.selection_bit (o2::aod::evsel::kIsVertexITSTPC );
484540 if (selected) {
485541 selectionBits |= static_cast <uint16_t >(0x1u << evSel_kIsVertexITSTPC);
486542 fillCutAnalysis (collision, bunchCrossing, evSel_kIsVertexITSTPC);
543+ } else if (cfgSelVec.value [evSel_kIsVertexITSTPC]) {
544+ isEventSelected = false ;
487545 }
488546
489547 selected = collision.selection_bit (o2::aod::evsel::kIsGoodITSLayersAll );
490548 if (selected) {
491549 selectionBits |= static_cast <uint16_t >(0x1u << evSel_kIsGoodITSLayersAll);
492550 fillCutAnalysis (collision, bunchCrossing, evSel_kIsGoodITSLayersAll);
551+ } else if (cfgSelVec.value [evSel_kIsGoodITSLayersAll]) {
552+ isEventSelected = false ;
493553 }
494554
495555 selected = collision.selection_bit (o2::aod::evsel::kIsGoodITSLayer0123 );
496556 if (selected) {
497557 selectionBits |= static_cast <uint16_t >(0x1u << evSel_kIsGoodITSLayer0123);
498558 fillCutAnalysis (collision, bunchCrossing, evSel_kIsGoodITSLayer0123);
559+ } else if (cfgSelVec.value [evSel_kIsGoodITSLayer0123]) {
560+ isEventSelected = false ;
499561 }
500562
501563 selected = rctChecker (collision);
502564 if (selected) {
503565 selectionBits |= static_cast <uint16_t >(0x1u << evSel_RCTFlagsZDC);
504566 fillCutAnalysis (collision, bunchCrossing, evSel_RCTFlagsZDC);
567+ } else if (cfgSelVec.value [evSel_RCTFlagsZDC]) {
568+ isEventSelected = false ;
569+ }
570+
571+ float vtxz = -999 ;
572+ if (collision.numContrib () > 1 ) {
573+ vtxz = collision.posZ ();
574+ float zRes = std::sqrt (collision.covZZ ());
575+ float minzRes = 0.25 ;
576+ int maxNumContrib = 20 ;
577+ if (zRes > minzRes && collision.numContrib () < maxNumContrib)
578+ vtxz = -999 ;
579+ }
580+
581+ auto multNTracksPV = collision.multNTracksPV ();
582+ selected = true ;
583+
584+ if (vtxz > cfgVtxZ || vtxz < -cfgVtxZ)
585+ selected = false ;
586+ if (multNTracksPV < fMultPVCutLow ->Eval (collision.centFT0C ()))
587+ selected = false ;
588+ if (multNTracksPV > fMultPVCutHigh ->Eval (collision.centFT0C ()))
589+ selected = false ;
590+ if (multTrk < fMultCutLow ->Eval (collision.centFT0C ()))
591+ selected = false ;
592+ if (multTrk > fMultCutHigh ->Eval (collision.centFT0C ()))
593+ selected = false ;
594+
595+ if (selected) {
596+ selectionBits |= static_cast <uint16_t >(0x1u << evSel_MultCut);
597+ fillCutAnalysis (collision, bunchCrossing, evSel_MultCut);
598+ } else if (cfgSelVec.value [evSel_MultCut]) {
599+ isEventSelected = false ;
505600 }
506601
507602 // Fill for centrality estimators!
508603 fillCutAnalysis (collision, bunchCrossing, nEventSelections);
509-
510604 return selectionBits;
511605 }
512606
@@ -694,7 +788,8 @@ struct ZdcQVectors {
694788
695789 void process (UsedCollisions::iterator const & collision,
696790 BCsRun3 const & /* bcs*/ ,
697- aod::Zdcs const & /* zdcs*/ )
791+ aod::Zdcs const & /* zdcs*/ ,
792+ UsedTracks const & tracks)
698793 {
699794 // for Q-vector calculation
700795 // A[0] & C[1]
@@ -797,10 +892,14 @@ struct ZdcQVectors {
797892 }
798893 registry.fill (HIST (" hEventCount" ), evSel_isSelectedZDC);
799894
800- uint16_t eventSelectionFlags = eventSelected (collision, foundBC.zdc ());
895+ // Use this bool to check for given set of event selections of Q-vectors would be selected
896+ // Enable plotting only if event would be selected
897+ bool isEventSelected = true ;
898+
899+ uint16_t eventSelectionFlags = eventSelected (collision, foundBC.zdc (), isEventSelected, tracks.size ());
801900
802901 // ALWAYS use these event selections
803- if (cent < EvSel.cfgCentMin || cent > EvSel.cfgCentMax || !collision. sel8 () || std::abs (collision.posZ ()) > cfgVtxZ) {
902+ if (cent < EvSel.cfgCentMin || cent > EvSel.cfgCentMax || std::abs (collision.posZ ()) > cfgVtxZ || !collision. sel8 () ) {
804903 // event not selected
805904 cal.isSelected = false ;
806905 spTableZDC (runnumber, cents, v, foundBC.timestamp (), 0 , 0 , 0 , 0 , cal.isSelected , eventSelectionFlags);
@@ -835,7 +934,7 @@ struct ZdcQVectors {
835934 // load the calibrations for the mean v
836935 loadCalibrations<kMeanv >(cfgMeanv.value , timestamp);
837936
838- if (!cfgFillNothing) {
937+ if (!cfgFillNothing && isEventSelected ) {
839938 registry.get <TProfile>(HIST (" vmean/hvertex_vx" ))->Fill (Form (" %d" , runnumber), v[0 ]);
840939 registry.get <TProfile>(HIST (" vmean/hvertex_vy" ))->Fill (Form (" %d" , runnumber), v[1 ]);
841940 registry.get <TProfile>(HIST (" vmean/hvertex_vz" ))->Fill (Form (" %d" , runnumber), v[2 ]);
@@ -879,7 +978,7 @@ struct ZdcQVectors {
879978 calibtower++;
880979 }
881980
882- if (cfgFillHistRegistry && !cfgFillNothing) {
981+ if (cfgFillHistRegistry && !cfgFillNothing && isEventSelected ) {
883982 for (int i = 0 ; i < nTowersPerSide; i++) {
884983 float bincenter = i + .5 ;
885984 registry.fill (HIST (" QA/ZNA_Energy" ), bincenter, eZN[i]);
@@ -940,7 +1039,7 @@ struct ZdcQVectors {
9401039 }
9411040 }
9421041
943- if (cfgFillHistRegistry && !cfgFillNothing) {
1042+ if (cfgFillHistRegistry && !cfgFillNothing && isEventSelected ) {
9441043 registry.get <TProfile>(HIST (" QA/before/ZNA_Qx" ))->Fill (Form (" %d" , runnumber), q[0 ]);
9451044 registry.get <TProfile>(HIST (" QA/before/ZNA_Qy" ))->Fill (Form (" %d" , runnumber), q[1 ]);
9461045 registry.get <TProfile>(HIST (" QA/before/ZNC_Qx" ))->Fill (Form (" %d" , runnumber), q[2 ]);
@@ -991,7 +1090,7 @@ struct ZdcQVectors {
9911090 corrQxC.push_back (getCorrection<THnSparse, kRec >(names[0 ][2 ].Data (), it, 1 ));
9921091 corrQyC.push_back (getCorrection<THnSparse, kRec >(names[0 ][3 ].Data (), it, 1 ));
9931092
994- if (cfgFillHistRegistry && !cfgFillNothing) {
1093+ if (cfgFillHistRegistry && !cfgFillNothing && isEventSelected ) {
9951094 registry.get <TH2 >(HIST (" recentering/QXA_vs_iteration" ))->Fill (pb + 1 , q[0 ] - std::accumulate (corrQxA.begin (), corrQxA.end (), 0.0 ));
9961095 registry.get <TH2 >(HIST (" recentering/QYA_vs_iteration" ))->Fill (pb + 1 , q[1 ] - std::accumulate (corrQyA.begin (), corrQyA.end (), 0.0 ));
9971096 registry.get <TH2 >(HIST (" recentering/QXC_vs_iteration" ))->Fill (pb + 1 , q[2 ] - std::accumulate (corrQxC.begin (), corrQxC.end (), 0.0 ));
@@ -1005,7 +1104,7 @@ struct ZdcQVectors {
10051104 corrQxC.push_back (getCorrection<TProfile, kRec >(names[step - 1 ][2 ].Data (), it, step));
10061105 corrQyC.push_back (getCorrection<TProfile, kRec >(names[step - 1 ][3 ].Data (), it, step));
10071106
1008- if (cfgFillHistRegistry && !cfgFillNothing) {
1107+ if (cfgFillHistRegistry && !cfgFillNothing && isEventSelected ) {
10091108 registry.get <TH2 >(HIST (" recentering/QXA_vs_iteration" ))->Fill (pb + 1 , q[0 ] - std::accumulate (corrQxA.begin (), corrQxA.end (), 0.0 ));
10101109 registry.get <TH2 >(HIST (" recentering/QYA_vs_iteration" ))->Fill (pb + 1 , q[1 ] - std::accumulate (corrQyA.begin (), corrQyA.end (), 0.0 ));
10111110 registry.get <TH2 >(HIST (" recentering/QXC_vs_iteration" ))->Fill (pb + 1 , q[2 ] - std::accumulate (corrQxC.begin (), corrQxC.end (), 0.0 ));
@@ -1021,7 +1120,7 @@ struct ZdcQVectors {
10211120 corrQxC.push_back (getCorrection<TProfile, kTimestamp >(namesTS[2 ].Data (), it, 6 ));
10221121 corrQyC.push_back (getCorrection<TProfile, kTimestamp >(namesTS[3 ].Data (), it, 6 ));
10231122
1024- if (cfgFillHistRegistry && !cfgFillNothing) {
1123+ if (cfgFillHistRegistry && !cfgFillNothing && isEventSelected ) {
10251124 registry.get <TH2 >(HIST (" recentering/QXA_vs_iteration" ))->Fill (pb + 1 , q[0 ] - std::accumulate (corrQxA.begin (), corrQxA.end (), 0.0 ));
10261125 registry.get <TH2 >(HIST (" recentering/QYA_vs_iteration" ))->Fill (pb + 1 , q[1 ] - std::accumulate (corrQyA.begin (), corrQyA.end (), 0.0 ));
10271126 registry.get <TH2 >(HIST (" recentering/QXC_vs_iteration" ))->Fill (pb + 1 , q[2 ] - std::accumulate (corrQxC.begin (), corrQxC.end (), 0.0 ));
0 commit comments