@@ -166,24 +166,16 @@ class FemtoDreamCollisionSelection
166166 // / \return whether or not the collisions fulfills the specified selections
167167 template <typename C>
168168 bool isPileUpCollisionPbPb (C const & col,
169- bool noSameBunchPileup, bool isGoodZvtxFT0vsPV,
170- bool isGoodITSLayersAll, bool noCollInRofStandard,
171- bool noHighMultCollInPrevRof, bool noCollInTimeRangeStandard,
172- bool /* isVertexITSTPC*/ ,
169+ bool noSameBunchPileup, bool isGoodITSLayersAll,
173170 int tpcOccupancyMin, int tpcOccupancyMax)
174171 {
175172 const auto occupancy = col.trackOccupancyInTimeRange ();
176173 if ((occupancy < tpcOccupancyMin || occupancy > tpcOccupancyMax)) {
177174 return false ;
178175 }
179176 if ((noSameBunchPileup && !col.selection_bit (aod::evsel::kNoSameBunchPileup ))
180- || (isGoodZvtxFT0vsPV && !col.selection_bit (aod::evsel::kIsGoodZvtxFT0vsPV ))
181177 || (isGoodITSLayersAll && !col.selection_bit (aod::evsel::kIsGoodITSLayersAll ))
182- || (noCollInRofStandard && !col.selection_bit (aod::evsel::kNoCollInRofStandard ))
183- || (noHighMultCollInPrevRof && !col.selection_bit (aod::evsel::kNoHighMultCollInPrevRof ))
184- || (noCollInTimeRangeStandard && !col.selection_bit (aod::evsel::kNoCollInTimeRangeStandard ))
185- // || (isVertexITSTPC && !col.selection_bit(aod::evsel::kIsVertexITSTPC))
186- ) {
178+ ) {
187179 return false ;
188180 }
189181
@@ -209,6 +201,23 @@ class FemtoDreamCollisionSelection
209201 }
210202 }
211203
204+ // / Initializes histograms for qn bin
205+ // / \param registry Histogram registry to be passed
206+ void initQn (HistogramRegistry* registry, int mumQnBins = 10 )
207+ {
208+ mHistogramQn = registry;
209+ mHistogramQn ->add (" Event/centFT0CBefore" , " ; cent" , kTH1F , {{10 , 0 , 100 }});
210+ mHistogramQn ->add (" Event/centFT0CAfter" , " ; cent" , kTH1F , {{10 , 0 , 100 }});
211+ mHistogramQn ->add (" Event/centVsqn" , " ; cent; qn" , kTH2F , {{10 , 0 , 100 }, {100 , 0 , 1000 }});
212+ mHistogramQn ->add (" Event/centVsqnVsSpher" , " ; cent; qn; Sphericity" , kTH3F , {{10 , 0 , 100 }, {100 , 0 , 1000 }, {100 , 0 , 1 }});
213+ mHistogramQn ->add (" Event/qnBin" , " ; qnBin; entries" , kTH1F , {{20 , 0 , 20 }});
214+
215+ for (int iqn (0 ); iqn < mumQnBins; ++iqn) {
216+ mHistogramQn ->add ((" Qn/mult_" + std::to_string (iqn)).c_str (), " ; cent; c22" , kTH1F , {{100 , 0 , 3500 }});
217+ }
218+ return ;
219+ }
220+
212221 // / Initializes histograms for the flow calculation
213222 // / \param registry Histogram registry to be passed
214223 void initFlow (HistogramRegistry* registry, bool doQnSeparation, int mumQnBins = 10 , int binPt = 100 , int binEta = 32 )
@@ -222,19 +231,13 @@ class FemtoDreamCollisionSelection
222231 mImQ2thisEvt = new TH2D (" ImQ2thisEvt" , " " , binPt, 0 ., 5 ., binEta, -0.8 , 0.8 );
223232 mMQthisEvt = new TH2D (" MQthisEvt" , " " , binPt, 0 ., 5 ., binEta, -0.8 , 0.8 );
224233 mMQWeightthisEvt = new TH2D (" MQWeightthisEvt" , " " , binPt, 0 ., 5 ., binEta, -0.8 , 0.8 );
225- mHistogramQn = registry;
226- mHistogramQn ->add (" Event/centFT0CBefore" , " ; cent" , kTH1F , {{10 , 0 , 100 }});
227- mHistogramQn ->add (" Event/centFT0CAfter" , " ; cent" , kTH1F , {{10 , 0 , 100 }});
228- mHistogramQn ->add (" Event/centVsqn" , " ; cent; qn" , kTH2F , {{10 , 0 , 100 }, {100 , 0 , 1000 }});
229- mHistogramQn ->add (" Event/centVsqnVsSpher" , " ; cent; qn; Sphericity" , kTH3F , {{10 , 0 , 100 }, {100 , 0 , 1000 }, {100 , 0 , 1 }});
230- mHistogramQn ->add (" Event/qnBin" , " ; qnBin; entries" , kTH1F , {{20 , 0 , 20 }});
231234
235+ mHistogramQn = registry;
232236 mHistogramQn ->add <TProfile>(" Event/profileC22" , " ; cent; c22" , kTProfile , {{10 , 0 , 100 }});
233237 mHistogramQn ->add <TProfile>(" Event/profileC24" , " ; cent; c24" , kTProfile , {{10 , 0 , 100 }});
234238 if (doQnSeparation){
235239 for (int iqn (0 ); iqn < mumQnBins; ++iqn) {
236240 mHistogramQn ->add <TProfile>((" Qn/profileC22_" + std::to_string (iqn)).c_str (), " ; cent; c22" , kTProfile , {{10 , 0 , 100 }});
237- mHistogramQn ->add ((" Qn/mult_" + std::to_string (iqn)).c_str (), " ; cent; c22" , kTH1F , {{100 , 0 , 3500 }});
238241 }
239242 }
240243 return ;
@@ -325,9 +328,9 @@ class FemtoDreamCollisionSelection
325328
326329 // / \todo to be implemented!
327330 // / \return the 1-d qn-vector separator to 2-d
328- std::vector<std::vector<float >> getQnBinSeparator2D (std::vector<float > flat)
331+ std::vector<std::vector<float >> getQnBinSeparator2D (std::vector<float > flat, const int numQnBins = 10 )
329332 {
330- constexpr size_t nBins = 11 ;
333+ size_t nBins = numQnBins+ 1 ;
331334
332335 if (flat.empty () || flat.size () % nBins != 0 ) {
333336 LOGP (error, " ConfQnBinSeparator size = {} is not divisible by {}" ,
@@ -348,23 +351,21 @@ class FemtoDreamCollisionSelection
348351
349352 // / \todo to be implemented!
350353 // / Get the bin number of qn-vector(FT0C) of an event
351- // / \tparam T type of the collision
352- // / \param col Collision
353354 // / \param centBinWidth centrality bin width, example: per 1%, per 10% ...
354355 // / \return bin number of qn-vector of the event
355- template <typename T>
356- int myqnBin (T const & col, float centMax, std::vector<float > qnBinSeparator, float fSpher , float fMult , float centBinWidth = 1 .f)
356+ int myqnBin (float centrality, float centMax, std::vector<float > qnBinSeparator, bool doFillHisto, float fSpher , float qn, const int numQnBins, float mult, float centBinWidth = 1 .f)
357357 {
358- auto twoDSeparator = getQnBinSeparator2D (qnBinSeparator);
358+ auto twoDSeparator = getQnBinSeparator2D (qnBinSeparator, numQnBins );
359359 if (twoDSeparator.empty () || twoDSeparator[0 ][0 ] == -999 .) {
360360 LOGP (warning, " ConfQnBinSeparator not set, using default fallback!" );
361361 return -999 ; // safe fallback
362362 }
363363
364- mHistogramQn ->fill (HIST (" Event/centFT0CBefore" ), col.centFT0C ());
364+ if (doFillHisto)
365+ mHistogramQn ->fill (HIST (" Event/centFT0CBefore" ), centrality);
366+
365367 int qnBin = -999 ;
366- float qn = computeqnVec (col);
367- int mycentBin = static_cast <int >(col.centFT0C () / centBinWidth);
368+ int mycentBin = static_cast <int >(centrality / centBinWidth);
368369 if (mycentBin >= static_cast <int >(centMax / centBinWidth))
369370 return qnBin;
370371
@@ -379,47 +380,52 @@ class FemtoDreamCollisionSelection
379380 continue ;
380381 }
381382 }
382-
383- mHistogramQn ->fill (HIST (" Event/centFT0CAfter" ), col.centFT0C ());
384- mHistogramQn ->fill (HIST (" Event/centVsqn" ), col.centFT0C (), qn);
385- mHistogramQn ->fill (HIST (" Event/centVsqnVsSpher" ), col.centFT0C (), qn, fSpher );
386- mHistogramQn ->fill (HIST (" Event/qnBin" ), qnBin);
387- if (qnBin >= 0 && qnBin < 10 ){
388- switch (qnBin) {
389- case 0 :
390- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 0" ), fMult );
391- break ;
392- case 1 :
393- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 1" ), fMult );
394- break ;
395- case 2 :
396- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 2" ), fMult );
397- break ;
398- case 3 :
399- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 3" ), fMult );
400- break ;
401- case 4 :
402- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 4" ), fMult );
403- break ;
404- case 5 :
405- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 5" ), fMult );
406- break ;
407- case 6 :
408- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 6" ), fMult );
409- break ;
410- case 7 :
411- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 7" ), fMult );
412- break ;
413- case 8 :
414- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 8" ), fMult );
415- break ;
416- case 9 :
417- mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 9" ), fMult );
418- break ;
419- default :
420- return qnBin; // invalid qn bin
421- }
383+
384+ mQnBin = qnBin;
385+
386+ if (doFillHisto){
387+ mHistogramQn ->fill (HIST (" Event/centFT0CAfter" ), centrality);
388+ mHistogramQn ->fill (HIST (" Event/centVsqn" ), centrality, qn);
389+ mHistogramQn ->fill (HIST (" Event/centVsqnVsSpher" ), centrality, qn, fSpher );
390+ mHistogramQn ->fill (HIST (" Event/qnBin" ), qnBin);
391+ if (qnBin >= 0 && qnBin < numQnBins){
392+ switch (qnBin) {
393+ case 0 :
394+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 0" ), mult);
395+ break ;
396+ case 1 :
397+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 1" ), mult);
398+ break ;
399+ case 2 :
400+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 2" ), mult);
401+ break ;
402+ case 3 :
403+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 3" ), mult);
404+ break ;
405+ case 4 :
406+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 4" ), mult);
407+ break ;
408+ case 5 :
409+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 5" ), mult);
410+ break ;
411+ case 6 :
412+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 6" ), mult);
413+ break ;
414+ case 7 :
415+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 7" ), mult);
416+ break ;
417+ case 8 :
418+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 8" ), mult);
419+ break ;
420+ case 9 :
421+ mHistogramQn ->fill (HIST (" Qn/mult_" ) + HIST (" 9" ), mult);
422+ break ;
423+ default :
424+ return qnBin; // invalid qn bin
425+ }
426+ }
422427 }
428+
423429 return qnBin;
424430 }
425431
@@ -430,11 +436,11 @@ class FemtoDreamCollisionSelection
430436 // / \tparam T2 type of the tracks
431437 // / \param tracks All tracks
432438 template <typename T1, typename T2>
433- void fillCumulants (T1 const & col, T2 const & tracks, float fHarmonic =2 .f)
439+ bool fillCumulants (T1 const & col, T2 const & tracks, float fHarmonic =2 .f)
434440 {
435441 int numOfTracks = col.numContrib ();
436442 if (numOfTracks < 3 )
437- return ;
443+ return false ;
438444
439445 mReQthisEvt ->Reset ();
440446 mImQthisEvt ->Reset ();
@@ -459,7 +465,7 @@ class FemtoDreamCollisionSelection
459465 mMQthisEvt ->Fill (pt, eta);
460466 mMQWeightthisEvt ->Fill (pt, eta, weight);
461467 }
462- return ;
468+ return true ;
463469 }
464470
465471 // / \todo to be implemented!
@@ -468,9 +474,12 @@ class FemtoDreamCollisionSelection
468474 // / \param doQnSeparation to fill flow in divied qn bins
469475 // / \param qnBin should be <int> in 0-9
470476 // / \param fEtaGap eta gap for flow cumulant
471- template <typename T >
472- void doCumulants (T const & col, bool doQnSeparation = false , int qnBin = - 999 , int mumQnBinNum = 10 , float fEtaGap = 0 .3f , int binPt = 100 , int binEta = 32 )
477+ template <typename T1, typename T2 >
478+ void doCumulants (T1 const & col, T2 const & tracks, float centrality, bool doQnSeparation = false , int numQnBins = 10 , float fEtaGap = 0 .3f , int binPt = 100 , int binEta = 32 )
473479 {
480+ if (!fillCumulants (col, tracks))
481+ return ;
482+
474483 if (mMQthisEvt ->Integral (1 , binPt, 1 , binEta) < 2 )
475484 return ;
476485
@@ -495,38 +504,38 @@ class FemtoDreamCollisionSelection
495504 TComplex negEtaQ = TComplex (negEtaRe, negEtaIm);
496505 TComplex negEtaQStar = TComplex::Conjugate (negEtaQ);
497506
498- mHistogramQn ->get <TProfile>(HIST (" Event/profileC22" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
499- if (doQnSeparation && qnBin >= 0 && qnBin < mumQnBinNum ){
500- switch (qnBin ) {
507+ mHistogramQn ->get <TProfile>(HIST (" Event/profileC22" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
508+ if (doQnSeparation && mQnBin >= 0 && mQnBin < numQnBins ){
509+ switch (mQnBin ) {
501510 case 0 :
502- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 0" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
511+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 0" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
503512 break ;
504513 case 1 :
505- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 1" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
514+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 1" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
506515 break ;
507516 case 2 :
508- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 2" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
517+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 2" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
509518 break ;
510519 case 3 :
511- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 3" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
520+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 3" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
512521 break ;
513522 case 4 :
514- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 4" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
523+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 4" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
515524 break ;
516525 case 5 :
517- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 5" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
526+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 5" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
518527 break ;
519528 case 6 :
520- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 6" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
529+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 6" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
521530 break ;
522531 case 7 :
523- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 7" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
532+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 7" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
524533 break ;
525534 case 8 :
526- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 8" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
535+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 8" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
527536 break ;
528537 case 9 :
529- mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 9" ))->Fill (col. centFT0C () , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
538+ mHistogramQn ->get <TProfile>(HIST (" Qn/profileC22_" ) + HIST (" 9" ))->Fill (centrality , (negEtaQ*posEtaQStar).Re ()/(negEtaMQ*posEtaMQ), (negEtaMQ*posEtaMQ));
530539 break ;
531540 default :
532541 return ; // invalid qn bin
@@ -547,6 +556,7 @@ class FemtoDreamCollisionSelection
547556 float mZvtxMax = 999 .f; // /< Maximal deviation from nominal z-vertex (cm)
548557 float mMinSphericity = 0 .f;
549558 float mSphericityPtmin = 0 .f;
559+ int mQnBin = -999 ;
550560 HistogramRegistry* mHistogramQn = nullptr ; // /< For flow cumulant output
551561 TH2D* mReQthisEvt = nullptr ; // /< For flow cumulant in an event
552562 TH2D* mImQthisEvt = nullptr ; // /< For flow cumulant in an event
0 commit comments