@@ -53,10 +53,9 @@ struct f0980analysis {
5353 Configurable<float > cfgMaxDCAzToPVcut{" cfgMaxDCAzToPVcut" , 2.0 , " Maximum longitudinal DCA" };
5454 Configurable<float > cfgMinRap{" cfgMinRap" , -0.5 , " Minimum rapidity for pair" };
5555 Configurable<float > cfgMaxRap{" cfgMaxRap" , 0.5 , " Maximum rapidity for pair" };
56- Configurable<bool > cfgFindRT{" cfgFindRT" , false , " boolean for RT analysis" };
5756
5857 // Track selections
59- Configurable<bool > cfgPrimaryTrack{" cfgPrimaryTrack" , true , " Primary track selection" }; // kGoldenChi2 | kDCAxy | kDCAz
58+ Configurable<bool > cfgPrimaryTrack{" cfgPrimaryTrack" , false , " Primary track selection" }; // kGoldenChi2 | kDCAxy | kDCAz
6059 Configurable<bool > cfgGlobalTrack{" cfgGlobalTrack" , false , " Global track selection" }; // kGoldenChi2 | kDCAxy | kDCAz
6160 Configurable<bool > cfgGlobalWoDCATrack{" cfgGlobalWoDCATrack" , true , " Global track selection without DCA" }; // kQualityTracks (kTrackType |
6261 // kTPCNCls | kTPCCrossedRows |
@@ -84,47 +83,85 @@ struct f0980analysis {
8483 ConfigurableAxis pTAxis{" pTAxis" , {VARIABLE_WIDTH, 0.0 , 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.8 , 1.0 , 1.5 , 2.0 , 2.5 , 3.0 , 3.5 , 4.0 , 4.5 , 5.0 , 6.0 , 7.0 , 8.0 , 10.0 , 13.0 , 20.0 }, " Transverse momentum Binning" };
8584 ConfigurableAxis centAxis{" centAxis" , {VARIABLE_WIDTH, 0.0 , 1.0 , 5.0 , 10.0 , 15.0 , 20.0 , 25.0 , 30.0 , 35.0 , 40.0 , 45.0 , 50.0 , 55.0 , 60.0 , 65.0 , 70.0 , 75.0 , 80.0 , 95.0 , 100.0 , 105.0 , 110.0 }, " Centrality Binning" };
8685
86+ Configurable<bool > cfgFindRT{" cfgFindRT" , false , " boolean for RT analysis" };
87+ Configurable<bool > cfgFindEP{" cfgFindEP" , false , " boolean for Event plane analysis" };
88+ Configurable<bool > cfgQAEPLT{" cfgQAEPLT" , false , " Fill QA histograms for Event Plane and Leading Track" };
89+ Configurable<bool > cfgQASelection{" cfgQASelection" , true , " Fill QA histograms for Selection" };
90+ Configurable<bool > cfgQAMCTrue{" cfgQAMCTrue" , false , " Fill QA histograms for MC True Selection" };
91+
8792 void init (o2::framework::InitContext&)
8893 {
8994 std::vector<double > lptBinning = {0 , 5.0 , 13.0 , 20.0 , 50.0 , 1000.0 };
9095
9196 AxisSpec rtAxis = {3 , 0 , 3 };
9297 AxisSpec lptAxis = {lptBinning}; // Minimum leading hadron pT selection
93-
94- AxisSpec pidqaAxis = {60 , -6 , 6 };
95- AxisSpec pTqaAxis = {200 , 0 , 20 };
96- AxisSpec phiqaAxis = {72 , 0 , o2::constants::math::TwoPI}; // Azimuthal angle axis
97-
9898 AxisSpec epAxis = {10 , 0 , o2::constants::math::PI}; // Event Plane
9999 AxisSpec epqaAxis = {200 , -o2::constants::math::PI, o2::constants::math::PI};
100100 AxisSpec epResAxis = {200 , -2 , 2 };
101101
102+ AxisSpec pidqaAxis = {60 , -6 , 6 , " #sigma" };
103+ AxisSpec pTqaAxis = {200 , 0 , 20 , " #it{p}_{T} (GeV/#it{c})" };
104+ AxisSpec phiqaAxis = {72 , 0 , o2::constants::math::TwoPI, " #Phi" }; // Azimuthal angle axis
105+ AxisSpec etaqaAxis = {150 , -2 , 2 , " #eta" }; // Pseudorapidity axis
106+ AxisSpec rapqaAxis = {60 , -1.5 , 1.5 , " #it{y}" }; // Rapidity axis
107+ AxisSpec dcaxyAxis = {200 , -5.0 , 5.0 , " DCA_{xy} (cm)" }; // DCAxy axis
108+ AxisSpec dcazAxis = {200 , -5.0 , 5.0 , " DCA_{z} (cm)" }; // DCAz axis
109+
110+ AxisSpec collCutAxis = {4 , -0.5 , 3.5 , " Collision cut index for MC" };
111+
102112 if (cfgFindRT) {
103- histos.add (" hInvMass_f0980_US " , " unlike invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis, rtAxis, lptAxis}});
104- histos.add (" hInvMass_f0980_LSpp " , " ++ invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis, rtAxis, lptAxis}});
105- histos.add (" hInvMass_f0980_LSmm " , " -- invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis, rtAxis, lptAxis}});
106- } else {
113+ histos.add (" hInvMass_f0980_US_RT " , " unlike invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis, rtAxis, lptAxis}});
114+ histos.add (" hInvMass_f0980_LSpp_RT " , " ++ invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis, rtAxis, lptAxis}});
115+ histos.add (" hInvMass_f0980_LSmm_RT " , " -- invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis, rtAxis, lptAxis}});
116+ } else if (cfgFindEP) {
107117 histos.add (" hInvMass_f0980_US_EPA" , " unlike invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis, epAxis}});
108118 histos.add (" hInvMass_f0980_LSpp_EPA" , " ++ invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis, epAxis}});
109119 histos.add (" hInvMass_f0980_LSmm_EPA" , " -- invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis, epAxis}});
120+ } else {
121+ histos.add (" hInvMass_f0980_US" , " unlike invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis}});
122+ histos.add (" hInvMass_f0980_LSpp" , " ++ invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis}});
123+ histos.add (" hInvMass_f0980_LSmm" , " -- invariant mass" , {HistType::kTHnSparseF , {massAxis, pTAxis, centAxis}});
110124 }
111125
112- histos.add (" QA/EPhist" , " " , {HistType::kTH2F , {centAxis, epqaAxis}});
113- histos.add (" QA/hEPResAB" , " " , {HistType::kTH2F , {centAxis, epResAxis}});
114- histos.add (" QA/hEPResBC" , " " , {HistType::kTH2F , {centAxis, epResAxis}});
115- histos.add (" QA/hEPResAC" , " " , {HistType::kTH2F , {centAxis, epResAxis}});
116-
117- histos.add (" QA/LTpt" , " " , {HistType::kTH3F , {pTqaAxis, centAxis, phiqaAxis}});
118-
119- histos.add (" QA/Nsigma_TPC" , " " , {HistType::kTH2F , {pTqaAxis, pidqaAxis}});
120- histos.add (" QA/Nsigma_TOF" , " " , {HistType::kTH2F , {pTqaAxis, pidqaAxis}});
121- histos.add (" QA/Nsigma_TPC_TOF" , " " , {HistType::kTH2F , {pidqaAxis, pidqaAxis}});
122-
123- if (doprocessMCLight) {
124- histos.add (" MCL/hpT_f0980_GEN" , " generated f0 signals" , HistType::kTH1F , {pTqaAxis});
125- histos.add (" MCL/hpT_f0980_REC" , " reconstructed f0 signals" , HistType::kTH3F , {massAxis, pTqaAxis, centAxis});
126+ if (cfgQAEPLT) {
127+ // Event Plane QA
128+ histos.add (" QA/EPhist" , " " , {HistType::kTH2F , {centAxis, epqaAxis}});
129+ histos.add (" QA/hEPResAB" , " " , {HistType::kTH2F , {centAxis, epResAxis}});
130+ histos.add (" QA/hEPResBC" , " " , {HistType::kTH2F , {centAxis, epResAxis}});
131+ histos.add (" QA/hEPResAC" , " " , {HistType::kTH2F , {centAxis, epResAxis}});
132+ // Leading track pT QA
133+ histos.add (" QA/LTpt" , " " , {HistType::kTH3F , {pTqaAxis, centAxis, phiqaAxis}});
134+ }
135+ if (cfgQASelection) {
136+ // General QA
137+ histos.add (" QA/TrackPt" , " " , {HistType::kTH1F , {pTqaAxis}});
138+ histos.add (" QA/TrackEta" , " " , {HistType::kTH1F , {etaqaAxis}});
139+ histos.add (" QA/TrackPhi" , " " , {HistType::kTH1F , {phiqaAxis}});
140+ // Track selection QA
141+ histos.add (" QA/trkDCAxy_BC" , " DCA_{xy} for pion tracks (before cuts)" , HistType::kTH2F , {pTqaAxis, dcaxyAxis});
142+ histos.add (" QA/trkDCAz_BC" , " DCA_{z} for pion tracks (before cuts)" , HistType::kTH2F , {pTqaAxis, dcazAxis});
143+ histos.add (" QA/trkDCAxy" , " DCA_{xy} for pion tracks (after cuts)" , HistType::kTH2F , {pTqaAxis, dcaxyAxis});
144+ histos.add (" QA/trkDCAz" , " DCA_{z} for pion tracks (after cuts)" , HistType::kTH2F , {pTqaAxis, dcazAxis});
145+ // PID QA
146+ histos.add (" QA/Nsigma_TPC_BC" , " TPC n#sigma^{#pi} (before PID cuts); p_{T} (GeV/c); n#sigma_{TPC}^{#pi}" , {HistType::kTH2F , {pTqaAxis, pidqaAxis}});
147+ histos.add (" QA/Nsigma_TOF_BC" , " TOF n#sigma^{#pi} (before PID cuts); p_{T} (GeV/c); n#sigma_{TOF}^{#pi}" , {HistType::kTH2F , {pTqaAxis, pidqaAxis}});
148+ histos.add (" QA/Nsigma_TPC_TOF_BC" , " " , {HistType::kTH2F , {pidqaAxis, pidqaAxis}});
149+ histos.add (" QA/Nsigma_TPC" , " TPC n#sigma^{#pi} (after PID cuts); p_{T} (GeV/c); n#sigma_{TPC}^{#pi}" , {HistType::kTH2F , {pTqaAxis, pidqaAxis}});
150+ histos.add (" QA/Nsigma_TOF" , " TOF n#sigma^{#pi} (after PID cuts); p_{T} (GeV/c); n#sigma_{TOF}^{#pi}" , {HistType::kTH2F , {pTqaAxis, pidqaAxis}});
151+ histos.add (" QA/Nsigma_TPC_TOF" , " " , {HistType::kTH2F , {pidqaAxis, pidqaAxis}});
126152 }
127153
154+ if (doprocessMCRec) {
155+ histos.add (" MCL/hpT_f0980_REC" , " Reconstructed f0 signals" , HistType::kTH3F , {massAxis, pTqaAxis, centAxis});
156+ }
157+ if (doprocessMCTrue) {
158+ // histos.add("MCL/hpT_f0980_GEN", "Generated f0 signals", HistType::kTH2F, {pTqaAxis, centAxis});
159+ histos.add (" MCL/hpT_f0980_GEN" , " Generated f0 signals; selIdx; p_{T} (GeV/c); Centrality (%)" , HistType::kTH3F , {collCutAxis, pTqaAxis, centAxis});
160+ if (cfgQAMCTrue) {
161+ histos.add (" QAMCTrue/f0_pt_y" , " Generated f0 ; #it{p}_{T} (GeV/#it{c}) ; #it{y}" , HistType::kTH2F , {pTqaAxis, rapqaAxis});
162+ histos.add (" QAMCTrue/f0_pt_cent" , " Generated f0 ; #it{p}_{T} (GeV/#it{c}); Centrality (%)" , HistType::kTH2F , {pTqaAxis, centAxis});
163+ }
164+ }
128165 histos.print ();
129166 }
130167
@@ -221,41 +258,71 @@ struct f0980analysis {
221258 lhphi = trk.phi ();
222259 }
223260 }
261+ if (cfgQAEPLT)
262+ histos.fill (HIST (" QA/LTpt" ), lhpT, collision.cent (), lhphi);
263+ } else if (cfgFindEP) {
264+ if (cfgQAEPLT) {
265+ histos.fill (HIST (" QA/EPhist" ), collision.cent (), collision.evtPl ());
266+ histos.fill (HIST (" QA/hEPResAB" ), collision.cent (), collision.evtPlResAB ());
267+ histos.fill (HIST (" QA/hEPResBC" ), collision.cent (), collision.evtPlResBC ());
268+ histos.fill (HIST (" QA/hEPResAC" ), collision.cent (), collision.evtPlResAC ());
269+ }
224270 }
225- histos.fill (HIST (" QA/EPhist" ), collision.cent (), collision.evtPl ());
226- histos.fill (HIST (" QA/hEPResAB" ), collision.cent (), collision.evtPlResAB ());
227- histos.fill (HIST (" QA/hEPResBC" ), collision.cent (), collision.evtPlResBC ());
228- histos.fill (HIST (" QA/hEPResAC" ), collision.cent (), collision.evtPlResAC ());
229- histos.fill (HIST (" QA/LTpt" ), lhpT, collision.cent (), lhphi);
230271
231272 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzM4D<float >> pion1, pion2, reco;
232273 for (const auto & [trk1, trk2] : combinations (CombinationsStrictlyUpperIndexPolicy (dTracks, dTracks))) {
233-
274+ if (cfgQASelection) {
275+ histos.fill (HIST (" QA/trkDCAxy_BC" ), trk1.pt (), trk1.dcaXY ());
276+ histos.fill (HIST (" QA/trkDCAz_BC" ), trk1.pt (), trk1.dcaZ ());
277+ }
234278 if (!selTrack (trk1) || !selTrack (trk2))
235279 continue ;
236- histos.fill (HIST (" QA/Nsigma_TPC" ), trk1.pt (), trk1.tpcNSigmaPi ());
237- histos.fill (HIST (" QA/Nsigma_TOF" ), trk1.pt (), trk1.tofNSigmaPi ());
238- histos.fill (HIST (" QA/Nsigma_TPC_TOF" ), trk1.tpcNSigmaPi (), trk1.tofNSigmaPi ());
239-
280+ if (cfgQASelection) {
281+ histos.fill (HIST (" QA/trkDCAxy" ), trk1.pt (), trk1.dcaXY ());
282+ histos.fill (HIST (" QA/trkDCAz" ), trk1.pt (), trk1.dcaZ ());
283+
284+ histos.fill (HIST (" QA/Nsigma_TPC_BC" ), trk1.pt (), trk1.tpcNSigmaPi ());
285+ if (trk1.hasTOF ()) {
286+ histos.fill (HIST (" QA/Nsigma_TOF_BC" ), trk1.pt (), trk1.tofNSigmaPi ());
287+ histos.fill (HIST (" QA/Nsigma_TPC_TOF_BC" ), trk1.tpcNSigmaPi (), trk1.tofNSigmaPi ());
288+ }
289+ }
240290 if (!selPion (trk1) || !selPion (trk2))
241291 continue ;
292+ if (cfgQASelection) {
293+ histos.fill (HIST (" QA/Nsigma_TPC" ), trk1.pt (), trk1.tpcNSigmaPi ());
294+ if (trk1.hasTOF ()) {
295+ histos.fill (HIST (" QA/Nsigma_TOF" ), trk1.pt (), trk1.tofNSigmaPi ());
296+ histos.fill (HIST (" QA/Nsigma_TPC_TOF" ), trk1.tpcNSigmaPi (), trk1.tofNSigmaPi ());
297+ }
298+
299+ histos.fill (HIST (" QA/TrackPt" ), trk1.pt ());
300+ histos.fill (HIST (" QA/TrackEta" ), trk1.eta ());
301+ histos.fill (HIST (" QA/TrackPhi" ), trk1.phi ());
302+ }
242303
243304 pion1 = ROOT::Math::PxPyPzMVector (trk1.px (), trk1.py (), trk1.pz (), massPi);
244305 pion2 = ROOT::Math::PxPyPzMVector (trk2.px (), trk2.py (), trk2.pz (), massPi);
245306 reco = pion1 + pion2;
246307 if (reco.Rapidity () > cfgMaxRap || reco.Rapidity () < cfgMinRap)
247308 continue ;
248309
249- relphi = TVector2::Phi_0_2pi (reco.Phi () - collision.evtPl ());
250- if (relphi > o2::constants::math::PI) {
251- relphi -= o2::constants::math::PI;
310+ if (cfgFindEP) {
311+ relphi = TVector2::Phi_0_2pi (reco.Phi () - collision.evtPl ());
312+ if (relphi > o2::constants::math::PI) {
313+ relphi -= o2::constants::math::PI;
314+ }
252315 }
253316
254317 if (trk1.sign () * trk2.sign () < 0 ) {
255318 if (cfgFindRT) {
256- histos.fill (HIST (" hInvMass_f0980_US" ), reco.M (), reco.Pt (), collision.cent (), rtIndex (reco.Phi (), lhphi), lhpT);
319+ histos.fill (HIST (" hInvMass_f0980_US_RT" ), reco.M (), reco.Pt (), collision.cent (), rtIndex (reco.Phi (), lhphi), lhpT);
320+ } else if (cfgFindEP) {
321+ histos.fill (HIST (" hInvMass_f0980_US_EPA" ), reco.M (), reco.Pt (), collision.cent (), relphi);
322+ } else {
323+ histos.fill (HIST (" hInvMass_f0980_US" ), reco.M (), reco.Pt (), collision.cent ());
257324 }
258- histos. fill ( HIST ( " hInvMass_f0980_US_EPA " ), reco. M (), reco. Pt (), collision. cent (), relphi);
325+
259326 if constexpr (IsMC) {
260327 if (std::abs (trk1.pdgCode ()) != kPiPlus || std::abs (trk2.pdgCode ()) != kPiPlus )
261328 continue ;
@@ -267,14 +334,20 @@ struct f0980analysis {
267334 }
268335 } else if (trk1.sign () > 0 && trk2.sign () > 0 ) {
269336 if (cfgFindRT) {
270- histos.fill (HIST (" hInvMass_f0980_LSpp" ), reco.M (), reco.Pt (), collision.cent (), rtIndex (reco.Phi (), lhphi), lhpT);
337+ histos.fill (HIST (" hInvMass_f0980_LSpp_RT" ), reco.M (), reco.Pt (), collision.cent (), rtIndex (reco.Phi (), lhphi), lhpT);
338+ } else if (cfgFindEP) {
339+ histos.fill (HIST (" hInvMass_f0980_LSpp_EPA" ), reco.M (), reco.Pt (), collision.cent (), relphi);
340+ } else {
341+ histos.fill (HIST (" hInvMass_f0980_LSpp" ), reco.M (), reco.Pt (), collision.cent ());
271342 }
272- histos.fill (HIST (" hInvMass_f0980_LSpp_EPA" ), reco.M (), reco.Pt (), collision.cent (), relphi);
273343 } else if (trk1.sign () < 0 && trk2.sign () < 0 ) {
274344 if (cfgFindRT) {
275- histos.fill (HIST (" hInvMass_f0980_LSmm" ), reco.M (), reco.Pt (), collision.cent (), rtIndex (reco.Phi (), lhphi), lhpT);
345+ histos.fill (HIST (" hInvMass_f0980_LSmm_RT" ), reco.M (), reco.Pt (), collision.cent (), rtIndex (reco.Phi (), lhphi), lhpT);
346+ } else if (cfgFindEP) {
347+ histos.fill (HIST (" hInvMass_f0980_LSmm_EPA" ), reco.M (), reco.Pt (), collision.cent (), relphi);
348+ } else {
349+ histos.fill (HIST (" hInvMass_f0980_LSmm" ), reco.M (), reco.Pt (), collision.cent ());
276350 }
277- histos.fill (HIST (" hInvMass_f0980_LSmm_EPA" ), reco.M (), reco.Pt (), collision.cent (), relphi);
278351 }
279352 }
280353 }
@@ -286,15 +359,15 @@ struct f0980analysis {
286359 }
287360 PROCESS_SWITCH (f0980analysis, processData, " Process Event for data" , true );
288361
289- void processMCLight (
290- o2::soa::Join<o2::aod::ResoCollisions, o2::aod::ResoEvtPlCollisions>::iterator const & collision,
291- o2::soa::Join<o2::aod::ResoTracks, o2::aod::ResoMCTracks> const & resotracks)
362+ void processMCRec (o2::soa::Join<o2::aod::ResoCollisions, o2::aod::ResoEvtPlCollisions>::iterator const & collision,
363+ o2::soa::Join<o2::aod::ResoTracks, o2::aod::ResoMCTracks> const & resotracks)
292364 {
293365 fillHistograms<true >(collision, resotracks);
294366 }
295- PROCESS_SWITCH (f0980analysis, processMCLight , " Process Event for MC" , false );
367+ PROCESS_SWITCH (f0980analysis, processMCRec , " Process Event for MC" , false );
296368
297- void processMCTrue (const o2::aod::ResoMCParents& resoParents)
369+ void processMCTrue (o2::soa::Join<o2::aod::ResoCollisions, o2::aod::ResoMCCollisions>::iterator const & resoCollision,
370+ o2::aod::ResoMCParents const & resoParents)
298371 {
299372 for (const auto & part : resoParents) { // loop over all pre-filtered MC particles
300373 if (std::abs (part.pdgCode ()) != 9010221 )
@@ -305,14 +378,29 @@ struct f0980analysis {
305378 continue ;
306379 }
307380 bool pass = false ;
308- if ((std::abs (part.daughterPDG1 ()) == kPiPlus &&
309- std::abs (part.daughterPDG2 ()) == kPiPlus )) {
381+ if ((std::abs (part.daughterPDG1 ()) == kPiPlus && std::abs (part.daughterPDG2 ()) == kPiPlus )) {
310382 pass = true ;
311383 }
312384 if (!pass) // If we have both decay products
313385 continue ;
314386
315- histos.fill (HIST (" MCL/hpT_f0980_GEN" ), part.pt ());
387+ // no event selection
388+ histos.fill (HIST (" MCL/hpT_f0980_GEN" ), 0 , part.pt (), resoCollision.cent ());
389+ // |zvtx|<10 cm
390+ if (resoCollision.isVtxIn10 ()) {
391+ histos.fill (HIST (" MCL/hpT_f0980_GEN" ), 1 , part.pt (), resoCollision.cent ());
392+ }
393+ // |zvtx|<10 cm & TVX trigger
394+ if (resoCollision.isVtxIn10 () && resoCollision.isTriggerTVX ()) {
395+ histos.fill (HIST (" MCL/hpT_f0980_GEN" ), 2 , part.pt (), resoCollision.cent ());
396+ }
397+ if (resoCollision.isInAfterAllCuts ()) {
398+ histos.fill (HIST (" MCL/hpT_f0980_GEN" ), 3 , part.pt (), resoCollision.cent ());
399+ }
400+ if (cfgQAMCTrue) {
401+ histos.fill (HIST (" QAMCTrue/f0_pt_y" ), part.pt (), part.y ());
402+ histos.fill (HIST (" QAMCTrue/f0_pt_cent" ), part.pt (), resoCollision.cent ());
403+ }
316404 }
317405 };
318406 PROCESS_SWITCH (f0980analysis, processMCTrue, " Process Event for MC" , false );
0 commit comments