1818#include " PWGLF/DataModel/LFStrangenessTables.h"
1919#include " PWGMM/Mult/DataModel/Index.h" // for Particles2Tracks table
2020
21+ #include " Common/Core/EventPlaneHelper.h"
2122#include " Common/Core/RecoDecay.h"
2223#include " Common/Core/TrackSelection.h"
2324#include " Common/Core/trackUtilities.h"
@@ -68,7 +69,7 @@ using namespace o2::constants::physics;
6869struct FlowEseTask {
6970 // using EventCandidates = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults, aod::FV0Mults, aod::TPCMults, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0Cs, aod::CentFT0As, aod::Mults>>;
7071 using EventCandidates = soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults, aod::FV0Mults, aod::TPCMults, aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0Cs, aod::CentFT0As, aod::Mults, aod::Qvectors, aod::QvectorFT0CVecs>;
71- using TrackCandidates = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection, aod::pidTPCFullPi, aod::pidTPCFullPr>;
72+ using TrackCandidates = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::TrackSelectionExtension >;
7273 using V0TrackCandidate = aod::V0Datas;
7374
7475 HistogramRegistry histos{
@@ -104,6 +105,9 @@ struct FlowEseTask {
104105 Configurable<float > cfgV0EtaMax{" cfgV0EtaMax" , 0.5 , " maximum rapidity" };
105106 Configurable<float > cfgV0LifeTime{" cfgV0LifeTime" , 30 ., " maximum lambda lifetime" };
106107
108+ Configurable<float > cfgMinPt{" cfgMinPt" , 0.15 , " Minimum transverse momentum for track" };
109+ Configurable<float > cfgMaxEta{" cfgMaxEta" , 0.8 , " Maximum pseudorapidiy for charged track" };
110+
107111 Configurable<bool > cfgQAv0{" cfgQAv0" , false , " QA plot" };
108112
109113 Configurable<int > cfgDaughTPCnclsMin{" cfgDaughTPCnclsMin" , 70 , " minimum fired crossed rows" };
@@ -143,13 +147,14 @@ struct FlowEseTask {
143147
144148 ConfigurableAxis massAxis{" massAxis" , {30 , 1.1 , 1.13 }, " Invariant mass axis" };
145149 ConfigurableAxis ptAxis{" ptAxis" , {VARIABLE_WIDTH, 0.2 , 0.5 , 1.0 , 1.5 , 2.0 , 2.5 , 3.0 , 4.0 , 5.0 , 6.5 , 8.0 , 10.0 , 100.0 }, " Transverse momentum bins" };
150+ ConfigurableAxis ptFullAxis{" ptFullAxis" , {VARIABLE_WIDTH, -5.0 , -4.0 , -3.0 , -2.5 , -2.0 , -1.5 , -1.0 , -0.5 , -0.2 , 0 , 0.2 , 0.5 , 1.0 , 1.5 , 2.0 , 2.5 , 3.0 , 4.0 , 5.0 }, " Transverse momentum bins" };
146151 ConfigurableAxis centAxis{" centAxis" , {VARIABLE_WIDTH, 0 , 5 , 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 100 }, " Centrality interval" };
147152 ConfigurableAxis cosAxis{" cosAxis" , {110 , -1.05 , 1.05 }, " Cosine axis" };
148153 ConfigurableAxis rapAxis{" rapAxis" , {10 , -0.5 , 0.5 }, " Rapidity axis" };
149154 ConfigurableAxis qqAxis{" qqAxis" , {100 , -0.1 , 0.1 }, " qq axis" };
150155 ConfigurableAxis lowerQAxis{" lowerQAxis" , {800 , 0 , 800 }, " result of q2" };
151156 ConfigurableAxis multNumAxis{" multNumAxis" , {300 , 0 , 2700 }, " mult num" };
152- ConfigurableAxis qvecAxis{" qvecAxis" , {300 , -1 , 1 }, " range of Qvector" };
157+ ConfigurableAxis qvecAxis{" qvecAxis" , {300 , -1 , 1 }, " range of Qvector component " };
153158 ConfigurableAxis qvec2Axis{" qvec2Axis" , {600 , 0 , 600 }, " range of Qvector Module" };
154159
155160 static constexpr float kMinAmplitudeThreshold = 1e-5f ;
@@ -158,11 +163,11 @@ struct FlowEseTask {
158163 static constexpr std::array<int , 4 > kCorrLevel = {2 , 3 , 4 , 1 };
159164 static constexpr std::array<float , 10 > kCentBoundaries = {0 .0f , 3 .49f , 4 .93f , 6 .98f , 8 .55f , 9 .87f , 11 .0f , 12 .1f , 13 .1f , 14 .0f };
160165 static constexpr std::array<float , 9 > kCentValues = {2 .5f , 7 .5f , 15 .0f , 25 .0f , 35 .0f , 45 .0f , 55 .0f , 65 .0f , 75 .0f };
161- static constexpr std::array<float , 9 > kCentrality = {0 , 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 };
162166 static constexpr std::array<std::array<double , 2 >, 8 > kLowQvec = {{{121 , 196 }, {110 , 172 }, {93 , 143 }, {74 , 117 }, {58 , 92 }, {43 , 70 }, {31 , 50 }, {21 , 34 }}};
163167 static constexpr float kEtaAcceptance = 0 .8f ;
164168 static constexpr float kCentUpperLimit = 80 .0f ;
165- static constexpr int kCentNum = 8 ;
169+
170+ EventPlaneHelper helperEP;
166171
167172 TF1* fMultPVCutLow = nullptr ;
168173 TF1* fMultPVCutHigh = nullptr ;
@@ -219,17 +224,21 @@ struct FlowEseTask {
219224 AxisSpec epQaAxis = {100 , -1.0 * o2::constants::math::PI, o2::constants::math::PI};
220225
221226 AxisSpec pidAxis = {100 , -10 , 10 };
227+ AxisSpec vertexAxis = {100 , -20 , 20 };
222228
223229 AxisSpec shiftAxis = {10 , 0 , 10 , " shift" };
224230 AxisSpec basisAxis = {20 , 0 , 20 , " basis" };
225231
226232 histos.add (Form (" histQvecV2" ), " " , {HistType::kTH3F , {qvecAxis, qvecAxis, centAxis}});
227233 histos.add (Form (" histMult_Cent" ), " " , {HistType::kTH2F , {multNumAxis, centAxis}});
228234 histos.add (Form (" histQvecCent" ), " " , {HistType::kTH2F , {lowerQAxis, centAxis}});
229- histos.add (Form (" histPrPtCent" ), " " , {HistType::kTHnSparseF , {ptAxis, ptAxis, ptAxis, centAxis}});
230- histos.add (Form (" histPiPtCent" ), " " , {HistType::kTHnSparseF , {ptAxis, ptAxis, ptAxis, centAxis}});
231- histos.add (Form (" histPrBoostedPtCent" ), " " , {HistType::kTHnSparseF , {ptAxis, ptAxis, ptAxis, centAxis}});
232-
235+ histos.add (Form (" histPrPtCent" ), " " , {HistType::kTHnSparseF , {ptFullAxis, ptFullAxis, ptFullAxis, centAxis}});
236+ histos.add (Form (" histPiPtCent" ), " " , {HistType::kTHnSparseF , {ptFullAxis, ptFullAxis, ptFullAxis, centAxis}});
237+ histos.add (Form (" histPrBoostedPtCent" ), " " , {HistType::kTHnSparseF , {ptFullAxis, ptFullAxis, ptFullAxis, centAxis}});
238+ histos.add (Form (" histVertex" ), " " , {HistType::kTHnSparseF , {vertexAxis, vertexAxis, vertexAxis, centAxis}});
239+ histos.add (Form (" histV2" ), " " , {HistType::kTHnSparseF , {centAxis, ptAxis, cosAxis, qvec2Axis}});
240+ histos.add (Form (" histV2_lambda" ), " " , {HistType::kTHnSparseF , {centAxis, ptAxis, cosAxis, qvec2Axis, massAxis}});
241+ histos.add (Form (" histV2_alambda" ), " " , {HistType::kTHnSparseF , {centAxis, ptAxis, cosAxis, qvec2Axis, massAxis}});
233242 for (auto i = 2 ; i < cfgnMods + 2 ; i++) {
234243 histos.add (Form (" psi%d/h_lambda_cos" , i), " " , {HistType::kTHnSparseF , {massAxis, ptAxis, cosAxis, centAxis, epAxis}});
235244 histos.add (Form (" psi%d/h_alambda_cos" , i), " " , {HistType::kTHnSparseF , {massAxis, ptAxis, cosAxis, centAxis, epAxis}});
@@ -238,20 +247,13 @@ struct FlowEseTask {
238247 histos.add (Form (" psi%d/h_lambda_cos2_q2" , i), " " , {HistType::kTH3F , {centAxis, qvec2Axis, cosAxis}});
239248 histos.add (Form (" psi%d/h_alambda_cos2_q2" , i), " " , {HistType::kTH3F , {centAxis, qvec2Axis, cosAxis}});
240249
241- histos.add (Form (" psi%d/h_lambda_cos2_left" , i), " " , {HistType::kTH2F , {centAxis, cosAxis}});
242- histos.add (Form (" psi%d/h_lambda_cos2_mid" , i), " " , {HistType::kTH2F , {centAxis, cosAxis}});
243- histos.add (Form (" psi%d/h_lambda_cos2_right" , i), " " , {HistType::kTH2F , {centAxis, cosAxis}});
244-
245250 if (cfgRapidityDep) {
246251 histos.add (Form (" psi%d/h_lambda_cos2_rap" , i), " " , {HistType::kTHnSparseF , {massAxis, ptAxis, cosAxis, centAxis, rapAxis}});
247252 histos.add (Form (" psi%d/h_alambda_cos2_rap" , i), " " , {HistType::kTHnSparseF , {massAxis, ptAxis, cosAxis, centAxis, rapAxis}});
248253 }
249254
250255 histos.add (Form (" psi%d/h_lambda_cossin" , i), " " , {HistType::kTHnSparseF , {massAxis, ptAxis, cosAxis, centAxis}});
251256 histos.add (Form (" psi%d/h_alambda_cossin" , i), " " , {HistType::kTHnSparseF , {massAxis, ptAxis, cosAxis, centAxis}});
252- histos.add (Form (" psi%d/h_lambda_cossin_left" , i), " " , {HistType::kTH2F , {centAxis, cosAxis}});
253- histos.add (Form (" psi%d/h_lambda_cossin_mid" , i), " " , {HistType::kTH2F , {centAxis, cosAxis}});
254- histos.add (Form (" psi%d/h_lambda_cossin_right" , i), " " , {HistType::kTH2F , {centAxis, cosAxis}});
255257
256258 histos.add (Form (" psi%d/h_lambda_cossin_q2" , i), " " , {HistType::kTH3F , {centAxis, qvec2Axis, cosAxis}});
257259 histos.add (Form (" psi%d/h_alambda_cossin_q2" , i), " " , {HistType::kTH3F , {centAxis, qvec2Axis, cosAxis}});
@@ -526,6 +528,31 @@ struct FlowEseTask {
526528 return -o2::constants::math::PIHalf;
527529 }
528530
531+ template <typename TrackType>
532+ bool selectionTrack (TrackType const & track)
533+ {
534+ if (track.pt () < cfgMinPt)
535+ return false ;
536+ if (std::abs (track.eta ()) > cfgMaxEta)
537+ return false ;
538+ if (!track.passedITSNCls ())
539+ return false ;
540+ if (!track.passedITSChi2NDF ())
541+ return false ;
542+ if (!track.passedITSHits ())
543+ return false ;
544+ if (!track.passedTPCCrossedRowsOverNCls ())
545+ return false ;
546+ if (!track.passedTPCChi2NDF ())
547+ return false ;
548+ if (!track.passedDCAxy ())
549+ return false ;
550+ if (!track.passedDCAz ())
551+ return false ;
552+
553+ return true ;
554+ }
555+
529556 template <typename TCollision>
530557 void fillShiftCorrection (TCollision const & collision, int nmode)
531558 {
@@ -676,13 +703,29 @@ struct FlowEseTask {
676703 }
677704 }
678705
679- template <typename TCollision, typename V0>
680- void fillHistograms (TCollision const & collision, V0 const & V0s, int nmode)
706+ template <typename TCollision, typename V0, typename TrackType >
707+ void fillHistograms (TCollision const & collision, V0 const & V0s, TrackType const & track, int nmode)
681708 {
682709 qvecDetInd = detId * 4 + 3 + (nmode - 2 ) * cfgNQvec * 4 ;
683710 qvecRefAInd = refAId * 4 + 3 + (nmode - 2 ) * cfgNQvec * 4 ;
684711 qvecRefBInd = refBId * 4 + 3 + (nmode - 2 ) * cfgNQvec * 4 ;
685712
713+ for (const auto & trk : track) {
714+ if (!selectionTrack (trk)) {
715+ continue ;
716+ }
717+ if (nmode == kCorrLevel [0 ]) {
718+ histos.fill (HIST (" histV2" ), collision.centFT0C (), trk.pt (),
719+ std::cos (static_cast <float >(nmode) * (trk.phi () - helperEP.GetEventPlane (collision.qvecFT0CReVec ()[0 ], collision.qvecFT0CImVec ()[0 ], nmode))),
720+ std::sqrt (collision.qvecFT0CReVec ()[0 ] * collision.qvecFT0CReVec ()[0 ] + collision.qvecFT0CImVec ()[0 ] * collision.qvecFT0CImVec ()[0 ]) * std::sqrt (collision.sumAmplFT0C ()));
721+ }
722+ }
723+
724+ histos.fill (HIST (" histQvecCent" ), std::sqrt (collision.qvecFT0CReVec ()[0 ] * collision.qvecFT0CReVec ()[0 ] + collision.qvecFT0CImVec ()[0 ] * collision.qvecFT0CImVec ()[0 ]) * std::sqrt (collision.sumAmplFT0C ()), centrality);
725+ histos.fill (HIST (" histQvecV2" ), collision.qvecFT0CReVec ()[0 ], collision.qvecFT0CImVec ()[0 ], collision.centFT0C ());
726+ histos.fill (HIST (" histMult_Cent" ), collision.sumAmplFT0C (), collision.centFT0C ());
727+ histos.fill (HIST (" histVertex" ), collision.posX (), collision.posY (), collision.posZ (), collision.centFT0C ());
728+
686729 for (const auto & v0 : V0s) {
687730 auto postrack = v0.template posTrack_as <TrackCandidates>();
688731 auto negtrack = v0.template negTrack_as <TrackCandidates>();
@@ -720,10 +763,18 @@ struct FlowEseTask {
720763 if (lambdaTag) {
721764 protonVec = ROOT::Math::PxPyPzMVector (v0.pxpos (), v0.pypos (), v0.pzpos (), massPr);
722765 pionVec = ROOT::Math::PxPyPzMVector (v0.pxneg (), v0.pyneg (), v0.pzneg (), massPi);
766+ histos.fill (HIST (" histV2_lambda" ), collision.centFT0C (), v0.pt (),
767+ std::cos (static_cast <float >(nmode) * (v0.phi () - helperEP.GetEventPlane (collision.qvecFT0CReVec ()[0 ], collision.qvecFT0CImVec ()[0 ], nmode))),
768+ std::sqrt (collision.qvecFT0CReVec ()[0 ] * collision.qvecFT0CReVec ()[0 ] + collision.qvecFT0CImVec ()[0 ] * collision.qvecFT0CImVec ()[0 ]) * std::sqrt (collision.sumAmplFT0C ()),
769+ v0.mLambda ());
723770 }
724771 if (aLambdaTag) {
725772 protonVec = ROOT::Math::PxPyPzMVector (v0.pxneg (), v0.pyneg (), v0.pzneg (), massPr);
726773 pionVec = ROOT::Math::PxPyPzMVector (v0.pxpos (), v0.pypos (), v0.pzpos (), massPi);
774+ histos.fill (HIST (" histV2_alambda" ), collision.centFT0C (), v0.pt (),
775+ std::cos (static_cast <float >(nmode) * (v0.phi () - helperEP.GetEventPlane (collision.qvecFT0CReVec ()[0 ], collision.qvecFT0CImVec ()[0 ], nmode))),
776+ std::sqrt (collision.qvecFT0CReVec ()[0 ] * collision.qvecFT0CReVec ()[0 ] + collision.qvecFT0CImVec ()[0 ] * collision.qvecFT0CImVec ()[0 ]) * std::sqrt (collision.sumAmplFT0C ()),
777+ v0.mAntiLambda ());
727778 }
728779 LambdaVec = protonVec + pionVec;
729780 LambdaVec.SetM (massLambda);
@@ -790,37 +841,19 @@ struct FlowEseTask {
790841 qvecMag *= std::sqrt (std::pow (collision.qvecIm ()[3 + (nmode - 2 ) * 28 ], 2 ) + std::pow (collision.qvecRe ()[3 + (nmode - 2 ) * 28 ], 2 ));
791842
792843 if (nmode == kCorrLevel [0 ]) { // //////////
844+ double q2 = std::sqrt (collision.qvecFT0CReVec ()[0 ] * collision.qvecFT0CReVec ()[0 ] + collision.qvecFT0CImVec ()[0 ] * collision.qvecFT0CImVec ()[0 ]) * std::sqrt (collision.sumAmplFT0C ());
793845 if (lambdaTag) {
794- double q2 = std::sqrt (collision.qvecFT0CReVec ()[0 ] * collision.qvecFT0CReVec ()[0 ] + collision.qvecFT0CImVec ()[0 ] * collision.qvecFT0CImVec ()[0 ]) * std::sqrt (collision.sumAmplFT0C ());
795846 histos.fill (HIST (" psi2/h_lambda_cos" ), v0.mLambda (), v0.pt (), angle * weight, centrality, relphi);
796847 histos.fill (HIST (" psi2/h_lambda_cos2" ), v0.mLambda (), v0.pt (), angle * angle, centrality, relphi);
797848 histos.fill (HIST (" psi2/h_lambda_cossin" ), v0.mLambda (), v0.pt (), angle * std::sin (relphi) * weight, centrality);
798849 histos.fill (HIST (" psi2/h_lambda_vncos" ), v0.mLambda (), v0.pt (), qvecMag * std::cos (relphi) * weight, centrality);
799850 histos.fill (HIST (" psi2/h_lambda_vnsin" ), v0.mLambda (), v0.pt (), std::sin (relphi), centrality);
800851
801- histos.fill (HIST (" psi2/h_lambda_cos2_q2" ), centrality, std::sqrt (collision. qvecFT0CReVec ()[ 0 ] * collision. qvecFT0CReVec ()[ 0 ] + collision. qvecFT0CImVec ()[ 0 ] * collision. qvecFT0CImVec ()[ 0 ]) * std::sqrt (collision. sumAmplFT0C ()) , angle * angle);
802- histos.fill (HIST (" psi2/h_lambda_cossin_q2" ), centrality, std::sqrt (collision. qvecFT0CReVec ()[ 0 ] * collision. qvecFT0CReVec ()[ 0 ] + collision. qvecFT0CImVec ()[ 0 ] * collision. qvecFT0CImVec ()[ 0 ]) * std::sqrt (collision. sumAmplFT0C ()) , angle * std::sin (relphi) * weight);
852+ histos.fill (HIST (" psi2/h_lambda_cos2_q2" ), centrality, q2 , angle * angle);
853+ histos.fill (HIST (" psi2/h_lambda_cossin_q2" ), centrality, q2 , angle * std::sin (relphi) * weight);
803854
804855 histos.fill (HIST (" psi2/h_lambda_cossin_cov" ), v0.pt (), angle * angle * angle * std::sin (relphi) * weight, centrality);
805856
806- histos.fill (HIST (" histQvecCent" ), std::sqrt (collision.qvecFT0CReVec ()[0 ] * collision.qvecFT0CReVec ()[0 ] + collision.qvecFT0CImVec ()[0 ] * collision.qvecFT0CImVec ()[0 ]) * std::sqrt (collision.sumAmplFT0C ()), centrality);
807- histos.fill (HIST (" histQvecV2" ), collision.qvecFT0CReVec ()[0 ], collision.qvecFT0CImVec ()[0 ], collision.centFT0C ());
808- histos.fill (HIST (" histMult_Cent" ), collision.sumAmplFT0C (), collision.centFT0C ());
809-
810- for (int i = 0 ; i < kCentNum ; i++) {
811- if (centrality >= kCentrality [i] && centrality < kCentrality [i + 1 ]) {
812- if (q2 < kLowQvec [i][0 ]) {
813- histos.fill (HIST (" psi2/h_lambda_cos2_left" ), centrality, angle * angle);
814- histos.fill (HIST (" psi2/h_lambda_cossin_left" ), centrality, angle * std::sin (relphi) * weight);
815- } else if (q2 >= kLowQvec [i][1 ]) {
816- histos.fill (HIST (" psi2/h_lambda_cos2_right" ), centrality, angle * angle);
817- histos.fill (HIST (" psi2/h_lambda_cossin_right" ), centrality, angle * std::sin (relphi) * weight);
818- } else {
819- histos.fill (HIST (" psi2/h_lambda_cos2_mid" ), centrality, angle * angle);
820- histos.fill (HIST (" psi2/h_lambda_cossin_mid" ), centrality, angle * std::sin (relphi) * weight);
821- }
822- }
823- }
824857 if (cfgRapidityDep) {
825858 histos.fill (HIST (" psi2/h_lambda_cos2_rap" ), v0.mLambda (), v0.pt (), angle * angle, centrality, v0.yLambda (), weight);
826859 }
@@ -870,8 +903,8 @@ struct FlowEseTask {
870903 histos.fill (HIST (" psi2/h_alambda_vncos" ), v0.mAntiLambda (), v0.pt (), qvecMag * std::cos (relphi) * weight, centrality);
871904 histos.fill (HIST (" psi2/h_alambda_vnsin" ), v0.mAntiLambda (), v0.pt (), std::sin (relphi), centrality);
872905
873- histos.fill (HIST (" psi2/h_alambda_cos2_q2" ), centrality, std::sqrt (collision. qvecFT0CReVec ()[ 0 ] * collision. qvecFT0CReVec ()[ 0 ] + collision. qvecFT0CImVec ()[ 0 ] * collision. qvecFT0CImVec ()[ 0 ]) * std::sqrt (collision. sumAmplFT0C ()) , angle * angle);
874- histos.fill (HIST (" psi2/h_alambda_cossin_q2" ), centrality, std::sqrt (collision. qvecFT0CReVec ()[ 0 ] * collision. qvecFT0CReVec ()[ 0 ] + collision. qvecFT0CImVec ()[ 0 ] * collision. qvecFT0CImVec ()[ 0 ]) * std::sqrt (collision. sumAmplFT0C ()) , angle * std::sin (relphi) * weight);
906+ histos.fill (HIST (" psi2/h_alambda_cos2_q2" ), centrality, q2 , angle * angle);
907+ histos.fill (HIST (" psi2/h_alambda_cossin_q2" ), centrality, q2 , angle * std::sin (relphi) * weight);
875908
876909 histos.fill (HIST (" psi2/h_alambda_cossin_cov" ), v0.pt (), angle * angle * angle * std::sin (relphi) * weight, centrality);
877910 if (cfgRapidityDep) {
@@ -983,7 +1016,7 @@ struct FlowEseTask {
9831016 }
9841017
9851018 void processData (EventCandidates::iterator const & collision,
986- TrackCandidates const & /* tracks*/ , aod::V0Datas const & V0s,
1019+ TrackCandidates const & tracks, aod::V0Datas const & V0s,
9871020 aod::BCsWithTimestamps const &)
9881021 {
9891022 if (cfgCentEst == kCorrLevel [3 ]) {
@@ -1024,7 +1057,7 @@ struct FlowEseTask {
10241057 if (cfgQAv0) {
10251058 fillEPQA (collision, i);
10261059 }
1027- fillHistograms (collision, V0s, i);
1060+ fillHistograms (collision, V0s, tracks, i);
10281061 } // FIXME: need to fill different histograms for different harmonic
10291062 }
10301063 PROCESS_SWITCH (FlowEseTask, processData, " Process Event for data" , true );
0 commit comments