@@ -101,6 +101,7 @@ struct FlowTask {
101101 Configurable<LabeledArray<double >> cfgPtPtGaps{" cfgPtPtGaps" , {LongArrayDouble[0 ], 4 , 2 , {" subevent 1" , " subevent 2" , " subevent 3" , " subevent 4" }, {" etamin" , " etamax" }}, " {etamin,etamax} for all ptpt-subevents" };
102102 O2_DEFINE_CONFIGURABLE (cfgEtaGapPtPtEnabled, bool , false , " switch of subevent pt-pt correlations" )
103103 Configurable<LabeledArray<float >> cfgTrackCuts{" cfgTrackCuts" , {TrackCutArray[0 ], 7 , 2 , {" chi2 per TPCcls" , " TPC cluster" , " TPC crossed rows" , " ITS cluster" , " DCAz" , " DCAxy Nsigma" , " DCAz Nsigma(override)" }, {" Nch" , " Observable" }}, " separate Nch and observable track selections" };
104+ std::array<std::array<float , 2 >, 7 > trackCuts{};
104105 enum TrackCut {
105106 // enum for labelledArray track selection
106107 kChi2prTPCcls = 0 , // max chi2 per TPC clusters
@@ -244,6 +245,13 @@ struct FlowTask {
244245 std::vector<std::shared_ptr<TProfile2D>> listNptV2;
245246 std::vector<std::shared_ptr<TH2 >> listPtX;
246247 O2_DEFINE_CONFIGURABLE (cfgManualCk, bool , false , " Produce pt-pt variance" )
248+ O2_DEFINE_CONFIGURABLE (cfgNewPtContainer, bool , false , " Switch to new version of flowPtContainer. This switch will be removed after validation of new container." )
249+ Configurable<GFWRegions> cfgNpcRegions{" cfgNpcRegions" , {{" refN" , " refP" , " refMid" , " refFull" }, {-0.8 , 0.4 , -0.4 , -0.8 }, {-0.4 , 0.8 , 0.4 , 0.8 }, {0 , 0 , 0 , 0 }, {1 , 1 , 1 , 1 }}, " Configurations for GFW regions" };
250+ Configurable<GFWCorrConfigs> cfgNpcPtVnCorrConfig{" cfgNpcPtVnCorrConfig" , {{" refP {pt} refN {pt}" , " refP {2} refMid {pt} refN {-2}" , " refP {2} refMid {pt pt} refN {-2}" , " refFull {pt}" , " refFull {pt pt}" , " refFull {pt pt pt}" , " refFull {pt pt pt pt}" , " refP {pt} refMid {pt} refN {pt}" }, {" ChGapPtPt" , " ChGap22pt" , " ChGap22ptpt" , " ChFullPt" , " ChFullPtPt" , " ChFullPtPtPt" , " ChFullPtPtPtPt" , " ChGapPtPtPtABC" }, {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }}, " Configurations for vn-pt correlations based on new version flowPtContainer" };
251+ Configurable<std::vector<std::string>> cfgNpcGFWCorr{" cfgNpcGFWCorr" , std::vector<std::string>{" refN {2} refP {-2}" , " refN {3} refP {-3}" }, " GFW corrconfig for new version flowPtContainer" };
252+ GFWRegions npcRegions;
253+ GFWCorrConfigs npcPtVnCorrConfig;
254+ GFW npcGfw;
247255 } cfgAdditionObs;
248256
249257 ConfigurableAxis axisPt{" axisPt" , {VARIABLE_WIDTH , 0.2 , 0.25 , 0.3 , 0.35 , 0.4 , 0.45 , 0.5 , 0.55 , 0.6 , 0.65 , 0.7 , 0.75 , 0.8 , 0.85 , 0.9 , 0.95 , 1 , 1.1 , 1.2 , 1.3 , 1.4 , 1.5 , 1.6 , 1.7 , 1.8 , 1.9 , 2 , 2.2 , 2.4 , 2.6 , 2.8 , 3 , 3.5 , 4 , 5 , 6 , 8 , 10 }, " pt axis for histograms" };
@@ -667,14 +675,42 @@ struct FlowTask {
667675 // Mask 1: vn-[pT], 3: vn-[pT^2], 7: vn-[pT^3], 15: vn-[pT^4]
668676 gfwConfigs.SetpTCorrMasks (cfgUserPtVnCorrConfig->GetpTCorrMasks ());
669677 gfwConfigs.Print ();
670- fFCpt ->setUseCentralMoments (cfgUseCentralMoments);
671- fFCpt ->setUseGapMethod (true );
672678 if (!cfgUserIO.cfgUserPtVnEvWeightEnabled )
673679 fFCpt ->setEventWeight (EventWeight::UnityWeight);
674680 else
675681 fFCpt ->setEventWeight (EventWeight::TupleWeight);
676- fFCpt ->initialise (axisIndependent, cfgMpar, gfwConfigs, cfgNbootstrap);
677- if (cfgEtaGapPtPtEnabled) {
682+ if (cfgAdditionObs.cfgNewPtContainer ) {
683+ cfgAdditionObs.npcRegions .SetNames (cfgAdditionObs.cfgNpcRegions ->GetNames ());
684+ cfgAdditionObs.npcRegions .SetEtaMin (cfgAdditionObs.cfgNpcRegions ->GetEtaMin ());
685+ cfgAdditionObs.npcRegions .SetEtaMax (cfgAdditionObs.cfgNpcRegions ->GetEtaMax ());
686+ cfgAdditionObs.npcRegions .SetpTDifs (cfgAdditionObs.cfgNpcRegions ->GetpTDifs ());
687+ cfgAdditionObs.npcRegions .SetBitmasks (cfgAdditionObs.cfgNpcRegions ->GetBitmasks ());
688+ cfgAdditionObs.npcPtVnCorrConfig .SetCorrs (cfgAdditionObs.cfgNpcPtVnCorrConfig ->GetCorrs ());
689+ cfgAdditionObs.npcPtVnCorrConfig .SetHeads (cfgAdditionObs.cfgNpcPtVnCorrConfig ->GetHeads ());
690+ cfgAdditionObs.npcPtVnCorrConfig .SetpTDifs (cfgAdditionObs.cfgNpcPtVnCorrConfig ->GetpTDifs ());
691+ cfgAdditionObs.npcPtVnCorrConfig .SetpTCorrMasks (cfgAdditionObs.cfgNpcPtVnCorrConfig ->GetpTCorrMasks ());
692+ cfgAdditionObs.npcRegions .Print ();
693+ cfgAdditionObs.npcPtVnCorrConfig .Print ();
694+ fFCpt ->initialise (axisIndependent, cfgAdditionObs.npcRegions , cfgAdditionObs.npcPtVnCorrConfig , cfgNbootstrap);
695+
696+ for (int region = 0 ; region < cfgAdditionObs.npcRegions .GetSize (); ++region) {
697+ cfgAdditionObs.npcGfw .AddRegion (cfgAdditionObs.npcRegions .GetNames ()[region], cfgAdditionObs.npcRegions .GetEtaMin ()[region],
698+ cfgAdditionObs.npcRegions .GetEtaMax ()[region], 1 ,
699+ cfgAdditionObs.npcRegions .GetBitmasks ()[region]);
700+ }
701+ std::vector<std::string> npcGFWCorr = cfgAdditionObs.cfgNpcGFWCorr ;
702+ if (!npcGFWCorr.empty ()) {
703+ for (uint i = 0 ; i < npcGFWCorr.size (); i++) {
704+ cfgAdditionObs.npcGfw .GetCorrelatorConfig (npcGFWCorr.at (i).c_str ());
705+ }
706+ }
707+ cfgAdditionObs.npcGfw .CreateRegions ();
708+ } else {
709+ fFCpt ->setUseCentralMoments (cfgUseCentralMoments);
710+ fFCpt ->setUseGapMethod (true );
711+ fFCpt ->initialise (axisIndependent, cfgMpar, gfwConfigs, cfgNbootstrap);
712+ }
713+ if (!cfgAdditionObs.cfgNewPtContainer && cfgEtaGapPtPtEnabled) {
678714 for (int i = 0 ; i < 4 ; ++i) { // o2-linter: disable=magic-number (maximum of 4 subevents)
679715 if (cfgPtPtGaps->getData ()[i][0 ] < -1 . || cfgPtPtGaps->getData ()[i][1 ] < -1 .)
680716 continue ;
@@ -756,31 +792,44 @@ struct FlowTask {
756792 funcV4->SetParameters (0.008845 , 0.000259668 , -3.24435e-06 , 4.54837e-08 , -6.01825e-10 );
757793 }
758794
759- if (cfgTrackCuts->getData ()[kDCAxyNSigma ][kTrCutObs ]) {
795+ readMatrix (cfgTrackCuts->getData (), trackCuts);
796+ if (trackCuts[kDCAxyNSigma ][kTrCutObs ]) {
760797 cfgFuncParas.fPtDepDCAxy = new TF1 (" ptDepDCAxy" , Form (" [0]*%s" , cfgFuncParas.cfgDCAxyFunc ->c_str ()), 0.001 , 1000 );
761- cfgFuncParas.fPtDepDCAxy ->SetParameter (0 , cfgTrackCuts-> getData () [kDCAxyNSigma ][kTrCutObs ]);
762- LOGF (info, " DCAxy pt-dependence function: %s" , Form (" %0.1f * %s" , cfgTrackCuts-> getData () [kDCAxyNSigma ][kTrCutObs ], cfgFuncParas.cfgDCAxyFunc ->c_str ()));
798+ cfgFuncParas.fPtDepDCAxy ->SetParameter (0 , trackCuts [kDCAxyNSigma ][kTrCutObs ]);
799+ LOGF (info, " DCAxy pt-dependence function: %s" , Form (" %0.1f * %s" , trackCuts [kDCAxyNSigma ][kTrCutObs ], cfgFuncParas.cfgDCAxyFunc ->c_str ()));
763800 }
764- if (cfgTrackCuts-> getData () [kDCAxyNSigma ][kTrCutNch ]) {
801+ if (trackCuts [kDCAxyNSigma ][kTrCutNch ]) {
765802 cfgFuncParas.fPtDepDCAxyForNch = new TF1 (" ptDepDCAxyForNch" , Form (" [0]*%s" , cfgFuncParas.cfgDCAxyFunc ->c_str ()), 0.001 , 1000 );
766- cfgFuncParas.fPtDepDCAxyForNch ->SetParameter (0 , cfgTrackCuts-> getData () [kDCAxyNSigma ][kTrCutNch ]);
767- LOGF (info, " DCAxy pt-dependence function for Nch: %s" , Form (" %0.1f * %s" , cfgTrackCuts-> getData () [kDCAxyNSigma ][kTrCutNch ], cfgFuncParas.cfgDCAxyFunc ->c_str ()));
803+ cfgFuncParas.fPtDepDCAxyForNch ->SetParameter (0 , trackCuts [kDCAxyNSigma ][kTrCutNch ]);
804+ LOGF (info, " DCAxy pt-dependence function for Nch: %s" , Form (" %0.1f * %s" , trackCuts [kDCAxyNSigma ][kTrCutNch ], cfgFuncParas.cfgDCAxyFunc ->c_str ()));
768805 }
769- if (cfgTrackCuts-> getData () [kDCAzNSigma ][kTrCutObs ]) {
806+ if (trackCuts [kDCAzNSigma ][kTrCutObs ]) {
770807 cfgFuncParas.fPtDepDCAz = new TF1 (" ptDepDCAz" , Form (" [0]*%s" , cfgFuncParas.cfgDCAzFunc ->c_str ()), 0.001 , 1000 );
771- cfgFuncParas.fPtDepDCAz ->SetParameter (0 , cfgTrackCuts-> getData () [kDCAzNSigma ][kTrCutObs ]);
772- LOGF (info, " DCAz pt-dependence function: %s" , Form (" %0.1f * %s" , cfgTrackCuts-> getData () [kDCAzNSigma ][kTrCutObs ], cfgFuncParas.cfgDCAzFunc ->c_str ()));
808+ cfgFuncParas.fPtDepDCAz ->SetParameter (0 , trackCuts [kDCAzNSigma ][kTrCutObs ]);
809+ LOGF (info, " DCAz pt-dependence function: %s" , Form (" %0.1f * %s" , trackCuts [kDCAzNSigma ][kTrCutObs ], cfgFuncParas.cfgDCAzFunc ->c_str ()));
773810 }
774- if (cfgTrackCuts-> getData () [kDCAzNSigma ][kTrCutNch ]) {
811+ if (trackCuts [kDCAzNSigma ][kTrCutNch ]) {
775812 cfgFuncParas.fPtDepDCAzForNch = new TF1 (" ptDepDCAzForNch" , Form (" [0]*%s" , cfgFuncParas.cfgDCAzFunc ->c_str ()), 0.001 , 1000 );
776- cfgFuncParas.fPtDepDCAzForNch ->SetParameter (0 , cfgTrackCuts-> getData () [kDCAzNSigma ][kTrCutNch ]);
777- LOGF (info, " DCAz pt-dependence function for Nch: %s" , Form (" %0.1f * %s" , cfgTrackCuts-> getData () [kDCAzNSigma ][kTrCutNch ], cfgFuncParas.cfgDCAzFunc ->c_str ()));
813+ cfgFuncParas.fPtDepDCAzForNch ->SetParameter (0 , trackCuts [kDCAzNSigma ][kTrCutNch ]);
814+ LOGF (info, " DCAz pt-dependence function for Nch: %s" , Form (" %0.1f * %s" , trackCuts [kDCAzNSigma ][kTrCutNch ], cfgFuncParas.cfgDCAzFunc ->c_str ()));
778815 }
779816 if (!cfgEvSelRCTflags.value .empty ()) {
780817 rctChecker.init (cfgEvSelRCTflags.value .c_str ()); // override initialzation
781818 }
782819 }
783820
821+ template <typename T, typename P>
822+ void readMatrix (Array2D<T> const & mat, P& array)
823+ {
824+ for (auto i = 0 ; i < static_cast <int >(mat.rows ); ++i) {
825+ for (auto j = 0 ; j < static_cast <int >(mat.cols ); ++j) {
826+ array[i][j] = mat (i, j);
827+ }
828+ }
829+
830+ return ;
831+ }
832+
784833 void createOutputObjectsForRun (int runNumber)
785834 {
786835 const AxisSpec axisPhi{60 , 0.0 , constants::math::TwoPI, " #varphi" };
@@ -1119,21 +1168,21 @@ struct FlowTask {
11191168 template <typename TTrack>
11201169 bool trackSelected (const TTrack& track)
11211170 {
1122- if (cfgTrackCuts-> getData () [kDCAxyNSigma ][kTrCutObs ] && (std::fabs (track.dcaXY ()) > cfgFuncParas.fPtDepDCAxy ->Eval (track.pt ())))
1171+ if (trackCuts [kDCAxyNSigma ][kTrCutObs ] && cfgFuncParas. fPtDepDCAxy != nullptr && (std::fabs (track.dcaXY ()) > cfgFuncParas.fPtDepDCAxy ->Eval (track.pt ())))
11231172 return false ;
1124- if (cfgTrackCuts-> getData () [kDCAzNSigma ][kTrCutObs ] && (std::fabs (track.dcaZ ()) > cfgFuncParas.fPtDepDCAz ->Eval (track.pt ())))
1173+ if (trackCuts [kDCAzNSigma ][kTrCutObs ] && cfgFuncParas. fPtDepDCAz != nullptr && (std::fabs (track.dcaZ ()) > cfgFuncParas.fPtDepDCAz ->Eval (track.pt ())))
11251174 return false ;
1126- return ((track.tpcNClsFound () >= cfgTrackCuts-> getData () [kTPCclu ][kTrCutObs ]) && (track.tpcNClsCrossedRows () >= cfgTrackCuts-> getData () [kTPCCrossedRows ][kTrCutObs ]) && (track.itsNCls () >= cfgTrackCuts-> getData () [kITSclu ][kTrCutObs ]) && (track.tpcChi2NCl () < cfgTrackCuts-> getData () [kChi2prTPCcls ][kTrCutObs ]) && (std::fabs (track.dcaZ ()) < cfgTrackCuts-> getData () [kDCAz ][kTrCutObs ]));
1175+ return ((track.tpcNClsFound () >= trackCuts [kTPCclu ][kTrCutObs ]) && (track.tpcNClsCrossedRows () >= trackCuts [kTPCCrossedRows ][kTrCutObs ]) && (track.itsNCls () >= trackCuts [kITSclu ][kTrCutObs ]) && (track.tpcChi2NCl () < trackCuts [kChi2prTPCcls ][kTrCutObs ]) && (std::fabs (track.dcaZ ()) < trackCuts [kDCAz ][kTrCutObs ]));
11271176 }
11281177
11291178 template <typename TTrack>
11301179 bool trackSelectedForNch (const TTrack& track)
11311180 {
1132- if (cfgTrackCuts-> getData () [kDCAxyNSigma ][kTrCutNch ] && (std::fabs (track.dcaXY ()) > cfgFuncParas.fPtDepDCAxyForNch ->Eval (track.pt ())))
1181+ if (trackCuts [kDCAxyNSigma ][kTrCutNch ] && cfgFuncParas. fPtDepDCAxyForNch != nullptr && (std::fabs (track.dcaXY ()) > cfgFuncParas.fPtDepDCAxyForNch ->Eval (track.pt ())))
11331182 return false ;
1134- if (cfgTrackCuts-> getData () [kDCAzNSigma ][kTrCutNch ] && (std::fabs (track.dcaZ ()) > cfgFuncParas.fPtDepDCAzForNch ->Eval (track.pt ())))
1183+ if (trackCuts [kDCAzNSigma ][kTrCutNch ] && cfgFuncParas. fPtDepDCAzForNch != nullptr && (std::fabs (track.dcaZ ()) > cfgFuncParas.fPtDepDCAzForNch ->Eval (track.pt ())))
11351184 return false ;
1136- return ((track.tpcNClsFound () >= cfgTrackCuts-> getData () [kTPCclu ][kTrCutNch ]) && (track.tpcNClsCrossedRows () >= cfgTrackCuts-> getData () [kTPCCrossedRows ][kTrCutNch ]) && (track.itsNCls () >= cfgTrackCuts-> getData () [kITSclu ][kTrCutNch ]) && (track.tpcChi2NCl () < cfgTrackCuts-> getData () [kChi2prTPCcls ][kTrCutNch ]) && (std::fabs (track.dcaZ ()) < cfgTrackCuts-> getData () [kDCAz ][kTrCutNch ]));
1185+ return ((track.tpcNClsFound () >= trackCuts [kTPCclu ][kTrCutNch ]) && (track.tpcNClsCrossedRows () >= trackCuts [kTPCCrossedRows ][kTrCutNch ]) && (track.itsNCls () >= trackCuts [kITSclu ][kTrCutNch ]) && (track.tpcChi2NCl () < trackCuts [kChi2prTPCcls ][kTrCutNch ]) && (std::fabs (track.dcaZ ()) < trackCuts [kDCAz ][kTrCutNch ]));
11371186 }
11381187
11391188 template <typename TTrack>
@@ -1264,6 +1313,9 @@ struct FlowTask {
12641313 fGFW ->Clear ();
12651314 fFCpt ->clearVector ();
12661315 cfgAdditionObs.nPt .clear ();
1316+ if (cfgAdditionObs.cfgNewPtContainer ) {
1317+ cfgAdditionObs.npcGfw .Clear ();
1318+ }
12671319 if (cfgGetInteractionRate) {
12681320 initHadronicRate (bc);
12691321 double hadronicRate = mRateFetcher .fetch (ccdb.service , bc.timestamp (), mRunNumber , " ZNC hadronic" ) * 1 .e -3 ; //
@@ -1443,10 +1495,20 @@ struct FlowTask {
14431495 fGFW ->Fill (track.eta (), fPtAxis ->FindBin (track.pt ()) - 1 , track.phi (), wacc * weff, 2 );
14441496 if (withinPtPOI && withinPtRef)
14451497 fGFW ->Fill (track.eta (), fPtAxis ->FindBin (track.pt ()) - 1 , track.phi (), wacc * weff, 4 );
1446- if (cfgUsePtRef && withinPtRef)
1447- fillPtSums<kReco >(track, weff);
1448- if (!cfgUsePtRef && withinPtPOI)
1449- fillPtSums<kReco >(track, weff);
1498+ if (cfgAdditionObs.cfgNewPtContainer ) {
1499+ fFCpt ->fill (track.eta (), weff, track.pt (), 1 );
1500+ if (withinPtRef)
1501+ cfgAdditionObs.npcGfw .Fill (track.eta (), fPtAxis ->FindBin (track.pt ()) - 1 , track.phi (), wacc * weff, 1 );
1502+ if (withinPtPOI)
1503+ cfgAdditionObs.npcGfw .Fill (track.eta (), fPtAxis ->FindBin (track.pt ()) - 1 , track.phi (), wacc * weff, 2 );
1504+ if (withinPtPOI && withinPtRef)
1505+ cfgAdditionObs.npcGfw .Fill (track.eta (), fPtAxis ->FindBin (track.pt ()) - 1 , track.phi (), wacc * weff, 4 );
1506+ } else {
1507+ if (cfgUsePtRef && withinPtRef)
1508+ fillPtSums<kReco >(track, weff);
1509+ if (!cfgUsePtRef && withinPtPOI)
1510+ fillPtSums<kReco >(track, weff);
1511+ }
14501512 }
14511513 registry.fill (HIST (" hTrackCorrection2d" ), nTracksUncorrected, nTracksCorrected);
14521514 if (cfgUseNch && cfgUseNchCorrected) {
@@ -1548,7 +1610,11 @@ struct FlowTask {
15481610 fillFC<kReco >(corrconfigs.at (l_ind), independent, lRandom);
15491611 }
15501612 // Filling pt Container
1551- fillPtContainers<kReco >(independent, lRandom);
1613+ if (cfgAdditionObs.cfgNewPtContainer ) {
1614+ fFCpt ->fillPtProfiles (cfgAdditionObs.npcGfw , independent, lRandom);
1615+ } else {
1616+ fillPtContainers<kReco >(independent, lRandom);
1617+ }
15521618 }
15531619 PROCESS_SWITCH (FlowTask, processData, " Process analysis for non-derived data" , true );
15541620
0 commit comments