@@ -76,6 +76,17 @@ constexpr double kTrackPIDSettings[nParticles][nTrkSettings]{
7676 {1 , 0 , 4 , 70 , 4.0 , 0.5 , 100 , 0.50 , 5.0 , 3.0 , -1 , 0 , 100 , 2 ., 2 ., 0 ., 1000 , 70 , 1 },
7777 {1 , 0 , 4 , 75 , 4.0 , 0.5 , 100 , 0.50 , 5.0 , 5.0 , -1 , 0 , 100 , 2 ., 2 ., 0 ., 1000 , 70 , 1 },
7878 {1 , 0 , 4 , 70 , 4.0 , 0.5 , 100 , 0.50 , 5.0 , 5.0 , -1 , 0 , 100 , 2 ., 2 ., 0 ., 1000 , 70 , 1 }};
79+
80+ const int nTrkSettings2 = 3 ;
81+ static const std::vector<std::string> trackPIDsettingsNames2{" useITSnsigma" , " minITSnsigma" , " maxITSnsigma" };
82+ constexpr double kTrackPIDSettings2 [nParticles][nTrkSettings2]{
83+ {1 , -5 , 4 },
84+ {1 , -5 , 4 },
85+ {1 , -5 , 4 },
86+ {1 , -5 , 4 },
87+ {1 , -5 , 4 },
88+ {1 , -5 , 4 }};
89+
7990struct PrimParticles {
8091 TString name;
8192 int pdgCode, charge;
@@ -92,8 +103,6 @@ struct PrimParticles {
92103 }
93104}; // struct PrimParticles
94105// ----------------------------------------------------------------------------------------------------------------
95- std::vector<std::shared_ptr<TH2>> hDeDx;
96- std::vector<std::shared_ptr<TH2>> hNsigmaPt;
97106std::vector<std::shared_ptr<TH2>> hmass;
98107} // namespace
99108// ----------------------------------------------------------------------------------------------------------------
@@ -143,8 +152,9 @@ struct NucleitpcPbPb {
143152
144153 Configurable<LabeledArray<double >> cfgBetheBlochParams{" cfgBetheBlochParams" , {kBetheBlochDefault [0 ], nParticles, nBetheParams, particleNames, betheBlochParNames}, " TPC Bethe-Bloch parameterisation for light nuclei" };
145154 Configurable<LabeledArray<double >> cfgTrackPIDsettings{" cfgTrackPIDsettings" , {kTrackPIDSettings [0 ], nParticles, nTrkSettings, particleNames, trackPIDsettingsNames}, " track selection and PID criteria" };
146- Configurable<bool > cfgFillDeDxWithCut{" cfgFillDeDxWithCut" , true , " Fill with cut beth bloch" };
147- Configurable<bool > cfgFillnsigma{" cfgFillnsigma" , false , " Fill n-sigma histograms" };
155+ Configurable<LabeledArray<double >> cfgTrackPIDsettings2{" cfgTrackPIDsettings2" , {kTrackPIDSettings2 [0 ], nParticles, nTrkSettings2, particleNames, trackPIDsettingsNames2}, " track selection and PID criteria" };
156+ Configurable<bool > cfgFillhspectra{" cfgFillhspectra" , true , " fill data sparsh" };
157+ Configurable<bool > cfgFillQAplots{" cfgFillQAplots" , false , " Fill QA sparsh" };
148158 Configurable<bool > cfgFillmass{" cfgFillmass" , false , " Fill mass histograms" };
149159 Configurable<float > centcut{" centcut" , 80 .0f , " centrality cut" };
150160 Configurable<float > cfgCutRapidity{" cfgCutRapidity" , 0 .5f , " Rapidity range" };
@@ -169,6 +179,13 @@ struct NucleitpcPbPb {
169179 ConfigurableAxis axisrapidity{" axisrapidity" , {100 , -2 , 2 }, " rapidity" };
170180 ConfigurableAxis axismass{" axismass" , {100 , -10 , 10 }, " mass^{2}" };
171181 ConfigurableAxis nsigmaAxis{" nsigmaAxis" , {160 , -20 , 20 }, " n#sigma_{#pi^{+}}" };
182+ ConfigurableAxis speciesBitAxis{" speciesBitAxis" , {8 , -0.5 , 7.5 }, " particle type 0: pion, 1: proton, 2: deuteron, 3: triton, 4:He3, 5:He4" };
183+ ConfigurableAxis axisDCA{" axisDCA" , {400 , -10 ., 10 .}, " DCA axis" };
184+ ConfigurableAxis axisTPCcls{" axisTPCcls" , {400 , 0 ., 200 .}, " TPCcls axis" };
185+ ConfigurableAxis axisITScls{" axisITScls" , {400 , 0 ., 200 .}, " ITScls axis" };
186+ ConfigurableAxis axisITSchi2{" axisITSchi2" , {400 , 0 ., 100 .}, " ITSchi2 axis" };
187+ ConfigurableAxis axisTPCchi2{" axisTPCchi2" , {400 , 0 ., 100 .}, " TPCchi2 axis" };
188+
172189 // CCDB
173190 Service<o2::ccdb::BasicCCDBManager> ccdb;
174191 Configurable<double > bField{" bField" , -999 , " bz field, -999 is automatic" };
@@ -211,31 +228,22 @@ struct NucleitpcPbPb {
211228 }
212229 histos.add (" histeta" , " histeta" , kTH1F , {axiseta});
213230 histos.add (" Tofsignal" , " Tofsignal" , kTH2F , {axisRigidity, {4000 , 0.2 , 1.2 , " #beta" }});
214- histos.add (" histDcaZVsPtData_particle" , " dcaZ vs Pt (particle)" , HistType::kTH2F , {{1000 , 0 , 20 }, {1000 , -2.5 , 2.5 , " dca" }});
215- histos.add (" histDcaXYVsPtData_particle" , " dcaXY vs Pt (particle)" , HistType::kTH2F , {{1000 , 0 , 20 }, {1000 , -2.0 , 2.0 , " dca" }});
216- histos.add (" histDcaZVsPtData_antiparticle" , " dcaZ vs Pt (antiparticle)" , HistType::kTH2F , {{1000 , 0 , 20 }, {1000 , -2.5 , 2.5 , " dca" }});
217- histos.add (" histDcaXYVsPtData_antiparticle" , " dcaXY vs Pt (antiparticle)" , HistType::kTH2F , {{1000 , 0 , 20 }, {1000 , -2.0 , 2.0 , " dca" }});
218- hDeDx.resize (2 * nParticles + 2 );
219- hNsigmaPt.resize (2 * nParticles + 2 );
231+ histos.add (" Tpcsignal" , " Tpcsignal" , kTH2F , {axisRigidity, axisdEdx});
232+
220233 hmass.resize (2 * nParticles + 2 );
221- for (int i = 0 ; i < nParticles + 1 ; i++) {
222- TString histName = i < nParticles ? primaryParticles[i].name : " all" ;
223- if (cfgFillDeDxWithCut) {
224- hDeDx[2 * i] = histos.add <TH2>(Form (" dedx/histdEdx_%s_Cuts" , histName.Data ()), " ;p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}" , HistType::kTH2F , {axisRigidity, axisdEdx});
225- }
226- }
234+
227235 for (int i = 0 ; i < nParticles; i++) {
228236 TString histName = primaryParticles[i].name ;
229- if (cfgFillnsigma) {
230- hNsigmaPt[2 * i] = histos.add <TH2>(Form (" histnsigmaTPC_%s" , histName.Data ()), " ;p_T{TPC} (GeV/#it{c}); TPCnsigma" , HistType::kTH2F , {ptAxis, nsigmaAxis});
231- hNsigmaPt[2 * i + 1 ] = histos.add <TH2>(Form (" histnsigmaTPC_anti_%s" , histName.Data ()), " ;p_T{TPC} (GeV/#it{c}); TPCnsigma" , HistType::kTH2F , {ptAxis, nsigmaAxis});
232- }
233237 if (cfgFillmass) {
234238 hmass[2 * i] = histos.add <TH2>(Form (" histmass_pt/histmass_%s" , histName.Data ()), " ;p_T{TPC} (GeV/#it{c}); mass^{2}" , HistType::kTH2F , {ptAxis, axismass});
235239 hmass[2 * i + 1 ] = histos.add <TH2>(Form (" histmass_ptanti/histmass_%s" , histName.Data ()), " ;p_T{TPC} (GeV/#it{c}); mass^{2}" , HistType::kTH2F , {ptAxis, axismass});
236240 }
237241 }
238242
243+ histos.add <THnSparse>(" hSpectra" , " " , HistType::kTHnSparseF , {speciesBitAxis, ptAxis, nsigmaAxis, {5 , -2.5 , 2.5 }, axisCent, axisRigidity, axisdEdx, axisDCA, axisDCA, nsigmaAxis});
244+
245+ histos.add <THnSparse>(" hQAtest" , " " , HistType::kTHnSparseF , {speciesBitAxis, ptAxis, {5 , -2.5 , 2.5 }, axisTPCcls, axisITScls, axisITSchi2, axisTPCchi2});
246+
239247 if (doprocessMC) {
240248 histomc.add (" histVtxZgen" , " histVtxZgen" , kTH1F , {axisVtxZ});
241249 histomc.add (" ImptParameter" , " ImptParameter" , kTH1F , {axisImpt});
@@ -259,7 +267,7 @@ struct NucleitpcPbPb {
259267 }
260268 }
261269 // ----------------------------------------------------------------------------------------------------------------
262- void findprimaryParticles (aod::TrackAssoc const & tracksByColl, TracksFull const & tracks)
270+ void findprimaryParticles (aod::TrackAssoc const & tracksByColl, TracksFull const & tracks, float cent )
263271 {
264272 for (const auto & trackId : tracksByColl) {
265273 const auto & track = tracks.rawIteratorAt (trackId.trackId ());
@@ -276,6 +284,21 @@ struct NucleitpcPbPb {
276284 if (std::abs (track.eta ()) > cfgCutEta && cfgetaRequire)
277285 continue ;
278286 for (size_t i = 0 ; i < primaryParticles.size (); i++) {
287+
288+ float ptMomn;
289+ setTrackParCov (track, mTrackParCov );
290+ mTrackParCov .setPID (track.pidForTracking ());
291+ ptMomn = (i == he3 || i == he4) ? 2 * mTrackParCov .getPt () : mTrackParCov .getPt ();
292+ int sign = 0 ;
293+ if (track.sign () > 0 ) {
294+ sign = 1 ;
295+ }
296+ if (track.sign () < 0 ) {
297+ sign = -1 ;
298+ } // <- This redeclares a new local variable!
299+ if (cfgFillQAplots) {
300+ histos.fill (HIST (" hQAtest" ), i, ptMomn, sign, track.tpcNClsFound (), track.itsNCls (), track.itsChi2NCl (), track.tpcChi2NCl ());
301+ }
279302 if (std::abs (getRapidity (track, i)) > cfgCutRapidity && cfgRapidityRequire)
280303 continue ;
281304 if (track.tpcNClsFound () < cfgTrackPIDsettings->get (i, " minTPCnCls" ) && cfgTPCNClsfoundRequire)
@@ -299,44 +322,31 @@ struct NucleitpcPbPb {
299322 continue ;
300323 if (getMeanItsClsSize (track) > cfgTrackPIDsettings->get (i, " maxITSclsSize" ) && cfgmaxGetMeanItsClsSizeRequire)
301324 continue ;
302- if ((getRigidity (track) < cfgTrackPIDsettings->get (i, " minRigidity" ) || getRigidity (track) > cfgTrackPIDsettings->get (i, " maxRigidity" )) && cfgRigidityCutRequire)
303- continue ;
304- float ptMomn;
305- setTrackParCov (track, mTrackParCov );
306- mTrackParCov .setPID (track.pidForTracking ());
307- ptMomn = (i == he3 || i == he4) ? 2 * mTrackParCov .getPt () : mTrackParCov .getPt ();
325+
308326 bool insideDCAxy = (std::abs (track.dcaXY ()) <= (cfgTrackPIDsettings->get (i, " maxDcaXY" ) * (0 .0105f + 0 .0350f / std::pow (ptMomn, 1 .1f )))); // o2-linter: disable=magic-number (To be checked)
309327 if ((!(insideDCAxy) || std::abs (track.dcaZ ()) > dcazSigma (ptMomn, cfgTrackPIDsettings->get (i, " maxDcaZ" ))) && cfgDCAwithptRequire)
310328 continue ;
311- if (track.sign () > 0 ) {
312- histos.fill (HIST (" histDcaZVsPtData_particle" ), ptMomn, track.dcaZ ());
313- histos.fill (HIST (" histDcaXYVsPtData_particle" ), ptMomn, track.dcaXY ());
314- }
315- if (track.sign () < 0 ) {
316- histos.fill (HIST (" histDcaZVsPtData_antiparticle" ), ptMomn, track.dcaZ ());
317- histos.fill (HIST (" histDcaXYVsPtData_antiparticle" ), ptMomn, track.dcaXY ());
318- }
329+
319330 float tpcNsigma = getTPCnSigma (track, primaryParticles.at (i));
320331 if ((std::abs (tpcNsigma) > cfgTrackPIDsettings->get (i, " maxTPCnSigma" )) && cfgmaxTPCnSigmaRequire)
321332 continue ;
322333 float itsSigma = getITSnSigma (track, primaryParticles.at (i));
323- if ((std::abs (itsSigma) > cfgITSnsigma) && cfgmaxITSnSigmaRequire)
324- continue ;
325- fillnsigma (track, i);
326- filldedx (track, i);
327- // TOF selection
328- if (!track.hasTOF () && cfgTrackPIDsettings->get (i, " TOFrequiredabove" ) < 1 )
334+
335+ if (itsSigma < cfgTrackPIDsettings2->get (i, " minITSnsigma" ) && cfgTrackPIDsettings2->get (i, " useITSnsigma" ) < 1 )
329336 continue ;
330- float beta{o2::pid::tof::Beta::GetBeta (track)};
331- float charge{1 .f + static_cast <float >(i == he3 || i == he4)};
332- float tofMasses = getRigidity (track) * charge * std::sqrt (1 .f / (beta * beta) - 1 .f );
333- if ((getRigidity (track) > cfgTrackPIDsettings->get (i, " TOFrequiredabove" ) && (tofMasses < cfgTrackPIDsettings->get (i, " minTOFmass" ) || tofMasses > cfgTrackPIDsettings->get (i, " maxTOFmass" ))) && cfgmassRequire)
337+ if (itsSigma > cfgTrackPIDsettings2->get (i, " maxITSnsigma" ) && cfgTrackPIDsettings2->get (i, " useITSnsigma" ) < 1 )
334338 continue ;
339+
335340 fillhmass (track, i);
341+ if (cfgFillhspectra) {
342+ histos.fill (HIST (" hSpectra" ), i, ptMomn, tpcNsigma, sign, cent, getRigidity (track) * track.sign (), track.tpcSignal (), track.dcaZ (), track.dcaXY (), itsSigma);
343+ }
336344 if (cfgRequirebetaplot) {
337345 histos.fill (HIST (" Tofsignal" ), getRigidity (track) * track.sign (), o2::pid::tof::Beta::GetBeta (track));
338346 }
339- filldedx (track, nParticles);
347+ }
348+ if (track.tpcNClsFound () < cfgtpcNClsFound || track.itsNCls () < cfgitsNCls) {
349+ histos.fill (HIST (" Tpcsignal" ), getRigidity (track) * track.sign (), track.tpcSignal ());
340350 }
341351 histos.fill (HIST (" histeta" ), track.eta ());
342352 } // track loop
@@ -365,7 +375,8 @@ struct NucleitpcPbPb {
365375 histos.fill (HIST (" histCentFTOC_cut" ), collision.centFT0C ());
366376 const uint64_t collIdx = collision.globalIndex ();
367377 auto tracksByColl = tracksColl.sliceBy (perCollision, collIdx);
368- findprimaryParticles (tracksByColl, tracks);
378+
379+ findprimaryParticles (tracksByColl, tracks, collision.centFT0C ());
369380 if (!collHasCandidate)
370381 continue ;
371382 }
@@ -473,6 +484,21 @@ struct NucleitpcPbPb {
473484 for (size_t i = 0 ; i < primaryParticles.size (); i++) {
474485 if (std::abs (pdg) != std::abs (particlePdgCodes.at (i)))
475486 continue ;
487+
488+ float ptMomn;
489+ setTrackParCov (track, mTrackParCov );
490+ mTrackParCov .setPID (track.pidForTracking ());
491+ ptMomn = (i == he3 || i == he4) ? 2 * mTrackParCov .getPt () : mTrackParCov .getPt ();
492+ int sign = 0 ;
493+ if (track.sign () > 0 ) {
494+ sign = 1 ;
495+ }
496+ if (track.sign () < 0 ) {
497+ sign = -1 ;
498+ } // <- This redeclares a new local variable!
499+ if (cfgFillQAplots) {
500+ histos.fill (HIST (" hQAtest" ), i, ptMomn, sign, track.tpcNClsFound (), track.itsNCls (), track.itsChi2NCl (), track.tpcChi2NCl ());
501+ }
476502 if (std::abs (getRapidity (track, i)) > cfgCutRapidity && cfgRapidityRequire)
477503 continue ;
478504 if (track.tpcNClsFound () < cfgTrackPIDsettings->get (i, " minTPCnCls" ) && cfgTPCNClsfoundRequire)
@@ -496,43 +522,29 @@ struct NucleitpcPbPb {
496522 continue ;
497523 if (getMeanItsClsSize (track) > cfgTrackPIDsettings->get (i, " maxITSclsSize" ) && cfgmaxGetMeanItsClsSizeRequire)
498524 continue ;
499- if ((getRigidity (track) < cfgTrackPIDsettings->get (i, " minRigidity" ) || getRigidity (track) > cfgTrackPIDsettings->get (i, " maxRigidity" )) && cfgRigidityCutRequire)
500- continue ;
501- float ptMomn;
502- setTrackParCov (track, mTrackParCov );
503- mTrackParCov .setPID (track.pidForTracking ());
504- ptMomn = (i == he3 || i == he4) ? 2 * mTrackParCov .getPt () : mTrackParCov .getPt ();
525+
505526 bool insideDCAxy = (std::abs (track.dcaXY ()) <= (cfgTrackPIDsettings->get (i, " maxDcaXY" ) * (0 .0105f + 0 .0350f / std::pow (ptMomn, 1 .1f )))); // o2-linter: disable=magic-number (To be checked)
506527 if ((!(insideDCAxy) || std::abs (track.dcaZ ()) > dcazSigma (ptMomn, cfgTrackPIDsettings->get (i, " maxDcaZ" ))) && cfgDCAwithptRequire)
507528 continue ;
508- if (track.sign () > 0 ) {
509- histos.fill (HIST (" histDcaZVsPtData_particle" ), ptMomn, track.dcaZ ());
510- histos.fill (HIST (" histDcaXYVsPtData_particle" ), ptMomn, track.dcaXY ());
511- }
512- if (track.sign () < 0 ) {
513- histos.fill (HIST (" histDcaZVsPtData_antiparticle" ), ptMomn, track.dcaZ ());
514- histos.fill (HIST (" histDcaXYVsPtData_antiparticle" ), ptMomn, track.dcaXY ());
515- }
529+
516530 float tpcNsigma = getTPCnSigma (track, primaryParticles.at (i));
517531 if ((std::abs (tpcNsigma) > cfgTrackPIDsettings->get (i, " maxTPCnSigma" )) && cfgmaxTPCnSigmaRequire)
518532 continue ;
519533 float itsSigma = getITSnSigma (track, primaryParticles.at (i));
520- if ((std::abs (itsSigma) > cfgITSnsigma) && cfgmaxITSnSigmaRequire)
521- continue ;
522- fillnsigma (track, i);
523- filldedx (track, i);
524- if (!track.hasTOF () && cfgTrackPIDsettings->get (i, " TOFrequiredabove" ) < 1 )
534+
535+ if (itsSigma < cfgTrackPIDsettings2->get (i, " minITSnsigma" ) && cfgTrackPIDsettings2->get (i, " useITSnsigma" ) < 1 )
525536 continue ;
526- float beta{o2::pid::tof::Beta::GetBeta (track)};
527- float charge{1 .f + static_cast <float >(i == he3 || i == he4)};
528- float tofMasses = getRigidity (track) * charge * std::sqrt (1 .f / (beta * beta) - 1 .f );
529- if ((getRigidity (track) > cfgTrackPIDsettings->get (i, " TOFrequiredabove" ) && (tofMasses < cfgTrackPIDsettings->get (i, " minTOFmass" ) || tofMasses > cfgTrackPIDsettings->get (i, " maxTOFmass" ))) && cfgmassRequire)
537+ if (itsSigma > cfgTrackPIDsettings2->get (i, " maxITSnsigma" ) && cfgTrackPIDsettings2->get (i, " useITSnsigma" ) < 1 )
530538 continue ;
539+
531540 fillhmass (track, i);
541+ if (cfgFillhspectra) {
542+ histos.fill (HIST (" hSpectra" ), i, ptMomn, tpcNsigma, sign, collision.centFT0C (), getRigidity (track) * track.sign (), track.tpcSignal (), track.dcaZ (), track.dcaXY (), itsSigma);
543+ }
532544 if (cfgRequirebetaplot) {
533545 histos.fill (HIST (" Tofsignal" ), getRigidity (track) * track.sign (), o2::pid::tof::Beta::GetBeta (track));
534546 }
535- filldedx (track, nParticles);
547+
536548 /* ----------------------------------------------------------------------------------------------------------------*/
537549 float ptReco;
538550 mTrackParCov .setPID (track.pidForTracking ());
@@ -631,42 +643,8 @@ struct NucleitpcPbPb {
631643 }
632644 // ----------------------------------------------------------------------------------------------------------------
633645 template <class T >
634- void filldedx (T const & track, int species)
635- {
636- const float rigidity = getRigidity (track);
637- if (track.tpcNClsFound () < cfgtpcNClsFound || track.itsNCls () < cfgitsNCls)
638- return ;
639- if (cfgFillDeDxWithCut) {
640- hDeDx[2 * species]->Fill (track.sign () * rigidity, track.tpcSignal ());
641- }
642- }
643- // ----------------------------------------------------------------------------------------------------------------
644- template <class T >
645- void fillnsigma (T const & track, int species)
646- {
647- if (track.tpcNClsFound () < cfgtpcNClsFound || track.itsNCls () < cfgitsNCls)
648- return ;
649- if (cfgFillnsigma) {
650- int i = species;
651- const float tpcNsigma = getTPCnSigma (track, primaryParticles.at (i));
652- float ptMomn;
653- setTrackParCov (track, mTrackParCov );
654- mTrackParCov .setPID (track.pidForTracking ());
655- ptMomn = (i == he3 || i == he4) ? 2 * mTrackParCov .getPt () : mTrackParCov .getPt ();
656- if (track.sign () > 0 ) {
657- hNsigmaPt[2 * species]->Fill (ptMomn, tpcNsigma);
658- }
659- if (track.sign () < 0 ) {
660- hNsigmaPt[2 * species + 1 ]->Fill (ptMomn, tpcNsigma);
661- }
662- }
663- }
664- // ----------------------------------------------------------------------------------------------------------------
665- template <class T >
666646 void fillhmass (T const & track, int species)
667647 {
668- if (track.tpcNClsFound () < cfgtpcNClsFound || track.itsNCls () < cfgitsNCls)
669- return ;
670648 if (!track.hasTOF () || !cfgFillmass)
671649 return ;
672650 float beta{o2::pid::tof::Beta::GetBeta (track)};
0 commit comments