3636#include < Framework/OutputObjHeader.h>
3737#include < Framework/runDataProcessing.h>
3838
39+ #include < TF1.h>
3940#include < TMath.h>
4041
4142#include < chrono>
@@ -110,15 +111,68 @@ struct EseTableProducer {
110111 bool correctionsLoaded = false ;
111112 } cfg;
112113
114+ TF1* fMultPVCutLow = nullptr ;
115+ TF1* fMultPVCutHigh = nullptr ;
116+ TF1* fMultCutLow = nullptr ;
117+ TF1* fMultCutHigh = nullptr ;
118+ TF1* fMultPVGlobalCutHigh = nullptr ;
119+ TF1* fMultGlobalV0ACutLow = nullptr ;
120+ TF1* fMultGlobalV0ACutHigh = nullptr ;
121+ TF1* fMultGlobalT0ACutLow = nullptr ;
122+ TF1* fMultGlobalT0ACutHigh = nullptr ;
123+
124+ TF1* fPtDepDCAxy = nullptr ;
125+
126+ float vtxZlow = -10.0 , vtxZup = 10.0 ;
127+ int nchbins = 300 ;
128+ float nchlow = 0 ;
129+ float nchup = 3000 ;
130+ std::vector<double > multGlobalCorrCutPars;
131+ std::vector<double > multPVCorrCutPars;
132+ std::vector<double > multGlobalPVCorrCutPars;
133+ std::vector<double > multGlobalV0ACutPars;
134+ std::vector<double > multGlobalT0ACutPars;
135+
113136 Configurable<float > cfgVtxZ{" cfgVtxZ" , 10 .0f , " max z vertex position" };
114137 Configurable<float > cfgEta{" cfgEta" , 0 .8f , " max eta" };
115138 Configurable<float > cfgPtmin{" cfgPtmin" , 0 .2f , " min pt" };
116- Configurable<float > cfgPtmax{" cfgPtmax" , 5 .0f , " max pt" };
139+ Configurable<float > cfgPtmax{" cfgPtmax" , 3 .0f , " max pt" };
117140 Configurable<float > cfgChi2PrITSCls{" cfgChi2PrITSCls" , 4 .0f , " max chi2 per ITS cluster" };
118141 Configurable<float > cfgChi2PrTPCCls{" cfgChi2PrTPCCls" , 2 .5f , " max chi2 per TPC cluster" };
119142 Configurable<float > cfgDCAz{" cfgDCAz" , 2 .0f , " max DCAz cut" };
143+ Configurable<bool > cfgDoOccupancySel{" cfgDoOccupancySel" , true , " enable occupancy selection" };
144+ Configurable<int > cfgOccupancySelection{" cfgOccupancySelection" , 2000 , " Max occupancy selection, -999 to disable" };
145+ Configurable<bool > cfgUseAdditionalEventCut{" cfgUseAdditionalEventCut" , false , " Use additional event cut on mult correlations" };
146+ Configurable<bool > cfgMultCut{" cfgMultCut" , true , " Use additional event cut on mult correlations" };
147+ Configurable<bool > cfgTVXinTRD{" cfgTVXinTRD" , true , " Use kTVXinTRD (reject TRD triggered events)" };
148+ Configurable<bool > cfgNoSameBunchPileupCut{" cfgNoSameBunchPileupCut" , true , " kNoSameBunchPileupCut" };
149+ Configurable<bool > cfgIsGoodZvtxFT0vsPV{" cfgIsGoodZvtxFT0vsPV" , true , " kIsGoodZvtxFT0vsPV" };
150+ Configurable<bool > cfgNoCollInTimeRangeStandard{" cfgNoCollInTimeRangeStandard" , true , " kNoCollInTimeRangeStandard" };
151+ Configurable<bool > cfgIsVertexITSTPC{" cfgIsVertexITSTPC" , true , " Selects collisions with at least one ITS-TPC track" };
152+ Configurable<bool > cfgIsGoodITSLayersAll{" cfgIsGoodITSLayersAll" , true , " kIsGoodITSLayersAll" };
120153 Configurable<std::string> cfgEfficiency{" cfgEfficiency" , " " , " CCDB path to efficiency object" };
121154
155+ // Cut Configurables
156+ Configurable<std::vector<double >> cfgMultGlobalCutPars{" cfgMultGlobalCutPars" , std::vector<double >{2272.16 , -76.6932 , 1.01204 , -0.00631545 , 1.59868e-05 , 136.336 , -4.97006 , 0.121199 , -0.0015921 , 7.66197e-06 }, " Global vs FT0C multiplicity cut parameter values" };
157+ Configurable<std::vector<double >> cfgMultPVCutPars{" cfgMultPVCutPars" , std::vector<double >{3074.43 , -106.192 , 1.46176 , -0.00968364 , 2.61923e-05 , 182.128 , -7.43492 , 0.193901 , -0.00256715 , 1.22594e-05 }, " PV vs FT0C multiplicity cut parameter values" };
158+ Configurable<std::vector<double >> cfgMultGlobalPVCutPars{" cfgMultGlobalPVCutPars" , std::vector<double >{-0.223013 , 0.715849 , 0.664242 , 0.0829653 , -0.000503733 , 1.21185e-06 }, " Global vs PV multiplicity cut parameter values" };
159+ Configurable<std::string> cfgMultCorrHighCutFunction{" cfgMultCorrHighCutFunction" , " [0] + [1]*x + [2]*x*x + [3]*x*x*x + [4]*x*x*x*x + 3.*([5] + [6]*x + [7]*x*x + [8]*x*x*x + [9]*x*x*x*x)" , " Functional for multiplicity correlation cut" };
160+ Configurable<std::string> cfgMultCorrLowCutFunction{" cfgMultCorrLowCutFunction" , " [0] + [1]*x + [2]*x*x + [3]*x*x*x + [4]*x*x*x*x - 3.*([5] + [6]*x + [7]*x*x + [8]*x*x*x + [9]*x*x*x*x)" , " Functional for multiplicity correlation cut" };
161+ Configurable<std::string> cfgMultGlobalPVCorrCutFunction{" cfgMultGlobalPVCorrCutFunction" , " [0] + [1]*x + 3*([2] + [3]*x + [4]*x*x + [5]*x*x*x)" , " Functional for global vs pv multiplicity correlation cut" };
162+ struct : ConfigurableGroup {
163+ Configurable<std::string> cfgMultGlobalASideCorrCutFunction{" cfgMultGlobalASideCorrCutFunction" , " [0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + [10]*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)" , " Functional for global vs V0A multiplicity low correlation cut" };
164+ Configurable<std::vector<double >> cfgMultGlobalV0ACutPars{" cfgMultGlobalV0ACutPars" , std::vector<double >{567.785 , 172.715 , 0.77888 , -0.00693466 , 1.40564e-05 , 679.853 , 66.8068 , -0.444332 , 0.00115002 , -4.92064e-07 }, " Global vs FV0A multiplicity cut parameter values" };
165+ Configurable<std::vector<double >> cfgMultGlobalT0ACutPars{" cfgMultGlobalT0ACutPars" , std::vector<double >{241.618 , 61.8402 , 0.348049 , -0.00306078 , 6.20357e-06 , 315.235 , 29.1491 , -0.188639 , 0.00044528 , -9.08912e-08 }, " Global vs FT0A multiplicity cut parameter values" };
166+ Configurable<float > cfgGlobalV0ALowSigma{" cfgGlobalV0ALowSigma" , -3 .0f , " Number of sigma deviations below expected value in global vs V0A correlation" };
167+ Configurable<float > cfgGlobalV0AHighSigma{" cfgGlobalV0AHighSigma" , 4 .0f , " Number of sigma deviations above expected value in global vs V0A correlation" };
168+ Configurable<float > cfgGlobalT0ALowSigma{" cfgGlobalT0ALowSigma" , -3 .0f , " Number of sigma deviations below expected value in global vs T0A correlation" };
169+ Configurable<float > cfgGlobalT0AHighSigma{" cfgGlobalT0AHighSigma" , 4 .0f , " Number of sigma deviations above expected value in global vs T0A correlation" };
170+ } cfgGlobalAsideCorrCuts;
171+ Configurable<std::string> cfgDCAxy{" cfgDCAxy" , " (0.0026+0.005/(x^1.01))" , " Functional form of pt-dependent DCAxy cut" };
172+ Configurable<float > cfgDCAxyNSigma{" cfgDCAxyNSigma" , 7 .0f , " Cut on number of sigma deviations from expected DCA in the transverse direction" };
173+
174+ //
175+
122176 // o2::framework::expressions::Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ;
123177 o2::framework::expressions::Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == static_cast <uint8_t >(true ))) && (aod::track::itsChi2NCl < cfgChi2PrITSCls) && (aod::track::tpcChi2NCl < cfgChi2PrTPCCls) && nabs(aod::track::dcaZ) < cfgDCAz;
124178
@@ -127,8 +181,23 @@ struct EseTableProducer {
127181
128182 void init (o2::framework::InitContext&)
129183 {
130-
131184 LOGF (info, " ESETable::init()" );
185+ EseTableProducer::vtxZlow = -cfgVtxZ;
186+ EseTableProducer::vtxZup = cfgVtxZ;
187+ EseTableProducer::multPVCorrCutPars = cfgMultPVCutPars;
188+ EseTableProducer::multGlobalCorrCutPars = cfgMultGlobalCutPars;
189+ EseTableProducer::multGlobalV0ACutPars = cfgGlobalAsideCorrCuts.cfgMultGlobalV0ACutPars ;
190+ EseTableProducer::multGlobalT0ACutPars = cfgGlobalAsideCorrCuts.cfgMultGlobalT0ACutPars ;
191+ EseTableProducer::multGlobalPVCorrCutPars = cfgMultGlobalPVCutPars;
192+
193+ AxisSpec t0cAxis = {1000 , 0 , 10000 , " N_{ch} (T0C)" };
194+ AxisSpec t0aAxis = {300 , 0 , 30000 , " N_{ch} (T0A)" };
195+ AxisSpec v0aAxis = {800 , 0 , 80000 , " N_{ch} (V0A)" };
196+ std::vector<double > nchbinning;
197+ int nchskip = (nchup - nchlow) / nchbins;
198+ for (int i = 0 ; i <= nchbins; ++i) {
199+ nchbinning.push_back (nchskip * i + nchlow + 0.5 );
200+ }
132201
133202 registry.add (" hEventCounter" , " event status;event status;entries" , {HistType::kTH1F , {{4 , 0.0 , 4.0 }}});
134203 registry.add (" hESEstat" , " ese status;ese status;entries" , {HistType::kTH1F , {{4 , 0.0 , 4.0 }}});
@@ -151,6 +220,52 @@ struct EseTableProducer {
151220 weightsFFit->setResolution (cfgnResolution);
152221 weightsFFit->setQnType (veccfg);
153222 weightsFFit->init ();
223+
224+ fPtDepDCAxy = new TF1 (" ptDepDCAxy" , Form (" [0]*%s" , cfgDCAxy->c_str ()), 0.001 , 100 );
225+ fPtDepDCAxy ->SetParameter (0 , cfgDCAxyNSigma);
226+ LOGF (info, " DCAxy pt-dependence function: %s" , Form (" [0]*%s" , cfgDCAxy->c_str ()));
227+ if (cfgUseAdditionalEventCut) {
228+ fMultPVCutLow = new TF1 (" fMultPVCutLow" , cfgMultCorrLowCutFunction->c_str (), 0 , 100 );
229+ fMultPVCutLow ->SetParameters (&(EseTableProducer::multPVCorrCutPars[0 ]));
230+ fMultPVCutHigh = new TF1 (" fMultPVCutHigh" , cfgMultCorrHighCutFunction->c_str (), 0 , 100 );
231+ fMultPVCutHigh ->SetParameters (&(EseTableProducer::multPVCorrCutPars[0 ]));
232+ fMultCutLow = new TF1 (" fMultCutLow" , cfgMultCorrLowCutFunction->c_str (), 0 , 100 );
233+ fMultCutLow ->SetParameters (&(EseTableProducer::multGlobalCorrCutPars[0 ]));
234+ fMultCutHigh = new TF1 (" fMultCutHigh" , cfgMultCorrHighCutFunction->c_str (), 0 , 100 );
235+ fMultCutHigh ->SetParameters (&(EseTableProducer::multGlobalCorrCutPars[0 ]));
236+ fMultPVGlobalCutHigh = new TF1 (" fMultPVGlobalCutHigh" , cfgMultGlobalPVCorrCutFunction->c_str (), 0 , nchbinning.back ());
237+ fMultPVGlobalCutHigh ->SetParameters (&(EseTableProducer::multGlobalPVCorrCutPars[0 ]));
238+
239+ LOGF (info, " Global V0A function: %s in range 0-%g" , cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->c_str (), v0aAxis.binEdges .back ());
240+ fMultGlobalV0ACutLow = new TF1 (" fMultGlobalV0ACutLow" , cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->c_str (), 0 , v0aAxis.binEdges .back ());
241+ for (std::size_t i = 0 ; i < EseTableProducer::multGlobalV0ACutPars.size (); ++i)
242+ fMultGlobalV0ACutLow ->SetParameter (i, EseTableProducer::multGlobalV0ACutPars[i]);
243+ fMultGlobalV0ACutLow ->SetParameter (EseTableProducer::multGlobalV0ACutPars.size (), cfgGlobalAsideCorrCuts.cfgGlobalV0ALowSigma );
244+ for (int i = 0 ; i < fMultGlobalV0ACutLow ->GetNpar (); ++i)
245+ LOGF (info, " fMultGlobalV0ACutLow par %d = %g" , i, fMultGlobalV0ACutLow ->GetParameter (i));
246+
247+ fMultGlobalV0ACutHigh = new TF1 (" fMultGlobalV0ACutHigh" , cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->c_str (), 0 , v0aAxis.binEdges .back ());
248+ for (std::size_t i = 0 ; i < EseTableProducer::multGlobalV0ACutPars.size (); ++i)
249+ fMultGlobalV0ACutHigh ->SetParameter (i, EseTableProducer::multGlobalV0ACutPars[i]);
250+ fMultGlobalV0ACutHigh ->SetParameter (EseTableProducer::multGlobalV0ACutPars.size (), cfgGlobalAsideCorrCuts.cfgGlobalV0AHighSigma );
251+ for (int i = 0 ; i < fMultGlobalV0ACutHigh ->GetNpar (); ++i)
252+ LOGF (info, " fMultGlobalV0ACutHigh par %d = %g" , i, fMultGlobalV0ACutHigh ->GetParameter (i));
253+
254+ LOGF (info, " Global T0A function: %s" , cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->c_str ());
255+ fMultGlobalT0ACutLow = new TF1 (" fMultGlobalT0ACutLow" , cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->c_str (), 0 , t0aAxis.binEdges .back ());
256+ for (std::size_t i = 0 ; i < EseTableProducer::multGlobalT0ACutPars.size (); ++i)
257+ fMultGlobalT0ACutLow ->SetParameter (i, EseTableProducer::multGlobalT0ACutPars[i]);
258+ fMultGlobalT0ACutLow ->SetParameter (EseTableProducer::multGlobalT0ACutPars.size (), cfgGlobalAsideCorrCuts.cfgGlobalT0ALowSigma );
259+ for (int i = 0 ; i < fMultGlobalT0ACutLow ->GetNpar (); ++i)
260+ LOGF (info, " fMultGlobalT0ACutLow par %d = %g" , i, fMultGlobalT0ACutLow ->GetParameter (i));
261+
262+ fMultGlobalT0ACutHigh = new TF1 (" fMultGlobalT0ACutHigh" , cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->c_str (), 0 , t0aAxis.binEdges .back ());
263+ for (std::size_t i = 0 ; i < EseTableProducer::multGlobalT0ACutPars.size (); ++i)
264+ fMultGlobalT0ACutHigh ->SetParameter (i, EseTableProducer::multGlobalT0ACutPars[i]);
265+ fMultGlobalT0ACutHigh ->SetParameter (EseTableProducer::multGlobalT0ACutPars.size (), cfgGlobalAsideCorrCuts.cfgGlobalT0AHighSigma );
266+ for (int i = 0 ; i < fMultGlobalT0ACutHigh ->GetNpar (); ++i)
267+ LOGF (info, " fMultGlobalT0ACutHigh par %d = %g" , i, fMultGlobalT0ACutHigh ->GetParameter (i));
268+ }
154269 }
155270
156271 void initCCDB (aod::BCsWithTimestamps::iterator const & bc)
@@ -329,16 +444,111 @@ struct EseTableProducer {
329444 }
330445 PROCESS_SWITCH (EseTableProducer, processESE, " process q vectors to calculate reduced q-vector" , true );
331446
332- void processMeanPt (soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentNTPVs, aod::CentNGlobals, aod::CentMFTs>::iterator const & collision, aod::BCsWithTimestamps const &, GFWTracks const & tracks)
447+ struct XAxis {
448+ float centrality;
449+ int64_t multiplicity;
450+ };
451+
452+ template <typename TCollision>
453+ bool eventSelected (TCollision collision, const int & multTrk, const float & centrality)
333454 {
455+ if (cfgTVXinTRD) {
456+ if (collision.alias_bit (kTVXinTRD )) {
457+ return 0 ;
458+ }
459+ }
460+ if (cfgNoSameBunchPileupCut) {
461+ if (!collision.selection_bit (o2::aod::evsel::kNoSameBunchPileup )) {
462+ return 0 ;
463+ }
464+ }
465+ if (cfgIsGoodZvtxFT0vsPV) {
466+ if (!collision.selection_bit (o2::aod::evsel::kIsGoodZvtxFT0vsPV )) {
467+ return 0 ;
468+ }
469+ }
470+ if (cfgNoCollInTimeRangeStandard) {
471+ if (!collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard )) {
472+ return 0 ;
473+ }
474+ }
475+
476+ if (cfgIsVertexITSTPC) {
477+ if (!collision.selection_bit (o2::aod::evsel::kIsVertexITSTPC )) {
478+ return 0 ;
479+ }
480+ }
481+
482+ if (cfgIsGoodITSLayersAll) {
483+ if (!collision.selection_bit (o2::aod::evsel::kIsGoodITSLayersAll )) {
484+ return 0 ;
485+ }
486+ }
487+
488+ float vtxz = -999 ;
489+ if (collision.numContrib () > 1 ) {
490+ vtxz = collision.posZ ();
491+ float zRes = std::sqrt (collision.covZZ ());
492+ float minZRes = 0.25 ;
493+ int minNContrib = 20 ;
494+ if (zRes > minZRes && collision.numContrib () < minNContrib)
495+ vtxz = -999 ;
496+ }
497+ auto multNTracksPV = collision.multNTracksPV ();
498+
499+ if (vtxz > EseTableProducer::vtxZup || vtxz < EseTableProducer::vtxZlow)
500+ return 0 ;
501+
502+ if (cfgMultCut) {
503+ if (multNTracksPV < fMultPVCutLow ->Eval (centrality))
504+ return 0 ;
505+ if (multNTracksPV > fMultPVCutHigh ->Eval (centrality))
506+ return 0 ;
507+ if (multTrk < fMultCutLow ->Eval (centrality))
508+ return 0 ;
509+ if (multTrk > fMultCutHigh ->Eval (centrality))
510+ return 0 ;
511+ if (multTrk > fMultPVGlobalCutHigh ->Eval (collision.multNTracksPV ()))
512+ return 0 ;
513+
514+ if (!(cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->empty ()) && static_cast <double >(collision.multFV0A ()) < fMultGlobalV0ACutLow ->Eval (multTrk))
515+ return 0 ;
516+ if (!(cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->empty ()) && static_cast <double >(collision.multFV0A ()) > fMultGlobalV0ACutHigh ->Eval (multTrk))
517+ return 0 ;
518+ if (!(cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->empty ()) && static_cast <double >(collision.multFT0A ()) < fMultGlobalT0ACutLow ->Eval (multTrk))
519+ return 0 ;
520+ if (!(cfgGlobalAsideCorrCuts.cfgMultGlobalASideCorrCutFunction ->empty ()) && static_cast <double >(collision.multFT0A ()) > fMultGlobalT0ACutHigh ->Eval (multTrk))
521+ return 0 ;
522+ }
523+ return 1 ;
524+ }
334525
335- std::vector<float > meanPt{-1 };
526+ void processMeanPt (soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::CentFT0Cs, aod::CentFT0CVariant1s, aod::CentFT0Ms, aod::CentNTPVs, aod::CentNGlobals, aod::CentMFTs>::iterator const & collision, aod::BCsWithTimestamps const &, GFWTracks const & tracks)
527+ {
528+ std::vector<float > meanPt{-999 };
336529 std::vector<float > meanPtShape{-1 };
337530 if (collision.posZ () < -cfgVtxZ || collision.posZ () > cfgVtxZ) {
338531 meanPts (meanPt);
339532 meanPtShapes (meanPtShape);
340533 return ;
341534 }
535+ if (!collision.sel8 ()) {
536+ meanPts (meanPt);
537+ meanPtShapes (meanPtShape);
538+ return ;
539+ }
540+ if (cfgDoOccupancySel) {
541+ int occupancy = collision.trackOccupancyInTimeRange ();
542+ if (occupancy < 0 || occupancy > cfgOccupancySelection) {
543+ meanPts (meanPt);
544+ meanPtShapes (meanPtShape);
545+ return ;
546+ }
547+ }
548+
549+ const XAxis xaxis{collision.centFT0C (), tracks.size ()};
550+ if (cfgUseAdditionalEventCut && !eventSelected (collision, xaxis.multiplicity , xaxis.centrality ))
551+ return ;
342552
343553 registry.fill (HIST (" hMeanPtStat" ), 0.5 );
344554 const auto centrality = collision.centFT0C ();
@@ -363,7 +573,6 @@ struct EseTableProducer {
363573 }
364574 }
365575 }
366-
367576 meanPts (meanPt);
368577 meanPtShapes (meanPtShape);
369578 }
0 commit comments