From 54b6fde937d9ec186d68a55b257853dba152f195 Mon Sep 17 00:00:00 2001 From: Jaideep Tanwar <141036812+jtanwar2212@users.noreply.github.com> Date: Thu, 19 Jun 2025 18:43:47 +0530 Subject: [PATCH 1/5] Update nucleitpcpbpb.cxx --- PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx | 189 +++++++++++++++------------ 1 file changed, 105 insertions(+), 84 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx index 090f57589bc..6bc5feb8cee 100644 --- a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx +++ b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx @@ -10,13 +10,8 @@ // or submit itself to any jurisdiction. /// /// \file nucleitpcpbpb.cxx -/// -/// \brief This task use global tracks and used for primary selection analysis using TPC detector. -/// It currently contemplates 6 particle types: -/// pion, Proton, Deuteron, Triton, Helium3, Alpha -/// -/// \author Jaideep Tanwar -/// \since Jan. 20, 2025 +/// \brief nuclei analysis +/// \author Jaideep Tanwar /// #include #include @@ -30,6 +25,8 @@ #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "Common/Core/PID/TPCPIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "Common/Core/PID/PIDTOF.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" @@ -42,12 +39,11 @@ #include "DetectorsBase/GeometryManager.h" #include "DetectorsBase/Propagator.h" #include "CCDB/BasicCCDBManager.h" -#include "DCAFitter/DCAFitterN.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using CollisionsFull = soa::Join; -using TracksFull = soa::Join; +using TracksFull = soa::Join; //--------------------------------------------------------------------------------------------------------------------------------- namespace { @@ -65,15 +61,15 @@ constexpr double betheBlochDefault[nParticles][nBetheParams]{ {5.393020, 7.859534, 0.004048, 2.323197, 1.609307, 0.09}, // triton {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}, // helion {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}}; // alpha -const int nTrkSettings = 16; -static const std::vector trackPIDsettingsNames{"useBBparams", "minITSnCls", "minTPCnCls", "maxTPCchi2", "maxITSchi2", "minRigidity", "maxRigidity", "maxTPCnSigma", "TOFrequiredabove", "minTOFmass", "maxTOFmass", "maxDcaXY", "maxDcaZ", "minITSclsSize", "maxITSclsSize", "minTPCnClsCrossedRows"}; +const int nTrkSettings = 18; +static const std::vector trackPIDsettingsNames{"useBBparams", "minITSnCls", "minITSnClscos", "minTPCnCls", "maxTPCchi2","minTPCchi2", "maxITSchi2", "minRigidity", "maxRigidity", "maxTPCnSigma", "TOFrequiredabove", "minTOFmass", "maxTOFmass", "maxDcaXY", "maxDcaZ", "minITSclsSize", "maxITSclsSize", "minTPCnClsCrossedRows"}; constexpr double trackPIDsettings[nParticles][nTrkSettings]{ - {0, 0, 60, 3.0, 100, 0.15, 1.2, 2.5, -1, 0, 100, 2., 2., 0., 1000, 70}, - {1, 0, 70, 2.5, 100, 0.20, 4.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, - {1, 0, 70, 5.0, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, - {1, 0, 70, 5.0, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, - {1, 0, 75, 1.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, - {1, 0, 70, 1.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}}; + {0, 0, 4, 60, 4.0, 0.5, 100, 0.15, 1.2, 2.5, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 4, 70, 4.0, 0.5, 100, 0.20, 4.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 4, 70, 4.0, 0.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 4, 70, 4.0, 0.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 4, 75, 4.0, 0.5, 100, 0.50, 5.0, 5.0, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 4, 70, 4.0, 0.5, 100, 0.50, 5.0, 5.0, -1, 0, 100, 2., 2., 0., 1000, 70}}; struct PrimParticles { TString name; int pdgCode, charge; @@ -117,9 +113,12 @@ struct NucleitpcPbPb { Configurable cfgTPCNClsfoundRequire{"cfgTPCNClsfoundRequire", true, "Require TPCNClsfound Cut"}; Configurable cfgTPCNClsCrossedRowsRequire{"cfgTPCNClsCrossedRowsRequire", true, "Require TPCNClsCrossedRows Cut"}; Configurable cfgmaxTPCchi2Require{"cfgmaxTPCchi2Require", true, "Require maxTPCchi2 Cut"}; - Configurable cfgminITSnClsRequire{"cfgminITSnClsRequire", true, "Require minITSnCls Cut"}; + Configurable cfgminTPCchi2Require{"cfgminTPCchi2Require", true, "Require minTPCchi2 Cut"}; + Configurable cfgminITSnClsRequire{"cfgminITSnClsRequire", false, "Require minITSnCls Cut"}; + Configurable cfgminITSnClscosRequire{"cfgminITSnClscosRequire", true, "Require minITSnCls / cosh(eta) Cut"}; Configurable cfgmaxITSchi2Require{"cfgmaxITSchi2Require", true, "Require maxITSchi2 Cut"}; Configurable cfgmaxTPCnSigmaRequire{"cfgmaxTPCnSigmaRequire", true, "Require maxTPCnSigma Cut"}; + Configurable cfgmaxITSnSigmaRequire{"cfgmaxITSnSigmaRequire", true, "Require maxITSnSigma Cut for helium"}; Configurable cfgminGetMeanItsClsSizeRequire{"cfgminGetMeanItsClsSizeRequire", true, "Require minGetMeanItsClsSize Cut"}; Configurable cfgmaxGetMeanItsClsSizeRequire{"cfgmaxGetMeanItsClsSizeRequire", true, "Require maxGetMeanItsClsSize Cut"}; Configurable cfgRigidityCutRequire{"cfgRigidityCutRequire", true, "Require Rigidity Cut"}; @@ -129,17 +128,17 @@ struct NucleitpcPbPb { Configurable cfgTwicemass{"cfgTwicemass", true, "multiply mass by its charge"}; Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], nParticles, nBetheParams, particleNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; Configurable> cfgTrackPIDsettings{"cfgTrackPIDsettings", {trackPIDsettings[0], nParticles, nTrkSettings, particleNames, trackPIDsettingsNames}, "track selection and PID criteria"}; - Configurable cfgFillDeDxWithoutCut{"cfgFillDeDxWithoutCut", false, "Fill without cut beth bloch"}; - Configurable cfgFillDeDxWithCut{"cfgFillDeDxWithCut", false, "Fill with cut beth bloch"}; - Configurable cfgFillnsigma{"cfgFillnsigma", true, "Fill n-sigma histograms"}; + Configurable cfgFillDeDxWithCut{"cfgFillDeDxWithCut", true, "Fill with cut beth bloch"}; + Configurable cfgFillnsigma{"cfgFillnsigma", false, "Fill n-sigma histograms"}; Configurable cfgFillmass{"cfgFillmass", false, "Fill mass histograms"}; Configurable centcut{"centcut", 80.0f, "centrality cut"}; Configurable cfgCutRapidity{"cfgCutRapidity", 0.5f, "Rapidity range"}; Configurable cfgZvertex{"cfgZvertex", 10, "Min Z Vertex"}; + Configurable cfgITSnsigma{"cfgITSnsigma", 5, "Max ITS nsigma value"}; Configurable cfgtpcNClsFound{"cfgtpcNClsFound", 100.0f, "min. no. of tpcNClsFound"}; Configurable cfgitsNCls{"cfgitsNCls", 2.0f, "min. no. of itsNCls"}; - - // CCDB + o2::track::TrackParametrizationWithError mTrackParCov; + //CCDB Service ccdb; Configurable bField{"bField", -999, "bz field, -999 is automatic"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -148,6 +147,7 @@ struct NucleitpcPbPb { Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; Configurable pidPath{"pidPath", "", "Path to the PID response object"}; + std::vector primaryParticles; std::vector primVtx, cents; bool collHasCandidate, collPassedEvSel; @@ -171,13 +171,13 @@ struct NucleitpcPbPb { const AxisSpec axisMagField{10, -10., 10., "magnetic field"}; const AxisSpec axisNev{3, 0., 3., "Number of events"}; const AxisSpec axisRigidity{4000, -10., 10., "#it{p}^{TPC}/#it{z}"}; - const AxisSpec axisdEdx{2000, 0, 2000, "d#it{E}/d#it{x}"}; + const AxisSpec axisdEdx{4000, 0, 4000, "d#it{E}/d#it{x}"}; const AxisSpec axisCent{100, 0, 100, "centrality"}; const AxisSpec axisVtxZ{100, -20, 20, "z"}; const AxisSpec ptAxis{200, 0, 20, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec axiseta{100, -1, 1, "eta"}; const AxisSpec axisrapidity{100, -2, 2, "rapidity"}; - const AxisSpec axismass{100, 0, 20, "mass^{2}"}; + const AxisSpec axismass{100, -10, 10, "mass^{2}"}; AxisSpec nsigmaAxis = {160, -20, 20, "n#sigma_{#pi^{+}}"}; // create histograms histos.add("histeta", "histeta", kTH1F, {axiseta}); @@ -194,14 +194,11 @@ struct NucleitpcPbPb { histos.add("histCentFT0M", "histCentFT0M", kTH1F, {axisCent}); hDeDx.resize(2 * nParticles + 2); hNsigmaPt.resize(2 * nParticles + 2); - hmass.resize(2 * nParticles + 2); + hmass.resize(2 * nParticles + 2); for (int i = 0; i < nParticles + 1; i++) { TString histName = i < nParticles ? primaryParticles[i].name : "all"; - if (cfgFillDeDxWithoutCut) { - hDeDx[2 * i] = histos.add(Form("dedx/histdEdx_%s", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); - } if (cfgFillDeDxWithCut) { - hDeDx[2 * i + 1] = histos.add(Form("dedx/histdEdx_%s_Cuts", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); + hDeDx[2 * i] = histos.add(Form("dedx/histdEdx_%s_Cuts", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); } } for (int i = 0; i < nParticles; i++) { @@ -219,10 +216,8 @@ struct NucleitpcPbPb { //---------------------------------------------------------------------------------------------------------------- void findprimaryParticles(aod::TrackAssoc const& tracksByColl, TracksFull const& tracks) { - // track loop, store daughter candidates in std::vector for (const auto& trackId : tracksByColl) { const auto& track = tracks.rawIteratorAt(trackId.trackId()); - filldedx(track, nParticles); if (!track.isPVContributor() && cfgUsePVcontributors) continue; if (!track.hasITS() && cfgITSrequire) @@ -240,13 +235,17 @@ struct NucleitpcPbPb { continue; if (track.tpcNClsFound() < cfgTrackPIDsettings->get(i, "minTPCnCls") && cfgTPCNClsfoundRequire) continue; - double min_value = 0.8; - if (((track.tpcNClsCrossedRows() < cfgTrackPIDsettings->get(i, "minTPCnClsCrossedRows")) || track.tpcNClsCrossedRows() < min_value * track.tpcNClsFindable()) && cfgTPCNClsCrossedRowsRequire) + if (((track.tpcNClsCrossedRows() < cfgTrackPIDsettings->get(i, "minTPCnClsCrossedRows")) || track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable()) && cfgTPCNClsCrossedRowsRequire) // o2-linter: disable=magic-number (To be checked) continue; if (track.tpcChi2NCl() > cfgTrackPIDsettings->get(i, "maxTPCchi2") && cfgmaxTPCchi2Require) continue; + if (track.tpcChi2NCl() < cfgTrackPIDsettings->get(i, "minTPCchi2") && cfgminTPCchi2Require) + continue; if (track.itsNCls() < cfgTrackPIDsettings->get(i, "minITSnCls") && cfgminITSnClsRequire) continue; + double cosheta = std::cosh(track.eta()); + if ((track.itsNCls()/cosheta) < cfgTrackPIDsettings->get(i, "minITSnClscos") && cfgminITSnClscosRequire) + continue; if (track.itsChi2NCl() > cfgTrackPIDsettings->get(i, "maxITSchi2") && cfgmaxITSchi2Require) continue; if (getMeanItsClsSize(track) < cfgTrackPIDsettings->get(i, "minITSclsSize") && cfgminGetMeanItsClsSizeRequire) @@ -255,29 +254,42 @@ struct NucleitpcPbPb { continue; if ((getRigidity(track) < cfgTrackPIDsettings->get(i, "minRigidity") || getRigidity(track) > cfgTrackPIDsettings->get(i, "maxRigidity")) && cfgRigidityCutRequire) continue; - if ((cfgTrackPIDsettings->get(i, "TOFrequiredabove") >= 0 && getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (track.mass() < cfgTrackPIDsettings->get(i, "minTOFmass") || track.mass() > cfgTrackPIDsettings->get(i, "maxTOFmass"))) && cfgmassRequire) - continue; - bool insideDCAxy = (std::abs(track.dcaXY()) <= (cfgTrackPIDsettings->get(i, "maxDcaXY") * (0.0105f + 0.0350f / std::pow(track.pt(), 1.1f)))); - if ((!(insideDCAxy) || std::abs(track.dcaZ()) > cfgTrackPIDsettings->get(i, "maxDcaZ")) && cfgDCAwithptRequire) - continue; - if ((std::abs(track.dcaXY()) > cfgTrackPIDsettings->get(i, "maxDcaXY") || std::abs(track.dcaZ()) > cfgTrackPIDsettings->get(i, "maxDcaZ")) && cfgDCAnopt) + float pt_momn; + setTrackParCov(track, mTrackParCov); + mTrackParCov.setPID(track.pidForTracking()); + pt_momn = (i == 4 || i == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); + bool insideDCAxy = (std::abs(track.dcaXY()) <= (cfgTrackPIDsettings->get(i, "maxDcaXY") * (0.0105f + 0.0350f / std::pow(pt_momn, 1.1f)))); + if ((!(insideDCAxy) || std::abs(track.dcaZ()) > DCAzSigma( pt_momn, cfgTrackPIDsettings->get(i, "maxDcaZ"))) && cfgDCAwithptRequire) continue; if (track.sign() > 0) { - histos.fill(HIST("histDcaZVsPtData_particle"), track.pt(), track.dcaZ()); - histos.fill(HIST("histDcaXYVsPtData_particle"), track.pt(), track.dcaXY()); + histos.fill(HIST("histDcaZVsPtData_particle"), pt_momn, track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_particle"), pt_momn, track.dcaXY()); } if (track.sign() < 0) { - histos.fill(HIST("histDcaZVsPtData_antiparticle"), track.pt(), track.dcaZ()); - histos.fill(HIST("histDcaXYVsPtData_antiparticle"), track.pt(), track.dcaXY()); + histos.fill(HIST("histDcaZVsPtData_antiparticle"), pt_momn, track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_antiparticle"), pt_momn, track.dcaXY()); } - fillnsigma(track, i); - if (std::abs(getTPCnSigma(track, primaryParticles.at(i))) > cfgTrackPIDsettings->get(i, "maxTPCnSigma") && cfgmaxTPCnSigmaRequire) + float tpcNsigma = getTPCnSigma(track, primaryParticles.at(i)); + if ((std::abs(tpcNsigma) > cfgTrackPIDsettings->get(i, "maxTPCnSigma")) && cfgmaxTPCnSigmaRequire) + continue; + float itsSigma = getITSnSigma(track, primaryParticles.at(i)); + if ((std::abs(itsSigma) > cfgITSnsigma) && cfgmaxITSnSigmaRequire) continue; + fillnsigma(track, i); filldedx(track, i); + //TOF selection + if (!track.hasTOF() && cfgTrackPIDsettings->get(i, "TOFrequiredabove") < 1) + continue; + float beta{o2::pid::tof::Beta::GetBeta(track)}; + float charge{1.f + static_cast(i == 4 || i == 5)}; + float tofMasses = getRigidity(track) * charge * std::sqrt(1.f / (beta * beta) - 1.f); + if ((getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (tofMasses < cfgTrackPIDsettings->get(i, "minTOFmass") || tofMasses > cfgTrackPIDsettings->get(i, "maxTOFmass"))) && cfgmassRequire) + continue; fillhmass(track, i); } histos.fill(HIST("histeta"), track.eta()); - } // track loop + filldedx(track, nParticles); + } // track loop } //---------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------- @@ -358,7 +370,6 @@ struct NucleitpcPbPb { if (collPassedEvSel) { histos.fill(HIST("histNev"), 1.5); histos.fill(HIST("histVtxZ"), collision.posZ()); - // histos.fill(HIST("histCentFT0A"), collision.centFT0A()); histos.fill(HIST("histCentFT0C"), collision.centFT0C()); histos.fill(HIST("histCentFT0M"), collision.centFT0M()); } @@ -370,13 +381,10 @@ struct NucleitpcPbPb { void filldedx(T const& track, int species) { const float rigidity = getRigidity(track); - if (cfgFillDeDxWithoutCut) { - hDeDx[2 * species]->Fill(track.sign() * rigidity, track.tpcSignal()); - } if (track.tpcNClsFound() < cfgtpcNClsFound || track.itsNCls() < cfgitsNCls) return; if (cfgFillDeDxWithCut) { - hDeDx[2 * species + 1]->Fill(track.sign() * rigidity, track.tpcSignal()); + hDeDx[2 * species]->Fill(track.sign() * rigidity, track.tpcSignal()); } } //---------------------------------------------------------------------------------------------------------------- @@ -388,19 +396,15 @@ struct NucleitpcPbPb { if (cfgFillnsigma) { int i = species; const float tpcNsigma = getTPCnSigma(track, primaryParticles.at(i)); - double momn; - int speciesHe3 = 4; - int speciesHe4 = 5; - if (species == speciesHe3 || species == speciesHe4) { - momn = 2 * track.pt(); - } else { - momn = track.pt(); - } + float pt_momn; + setTrackParCov(track, mTrackParCov); + mTrackParCov.setPID(track.pidForTracking()); + pt_momn = (i == 4 || i == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); if (track.sign() > 0) { - hNsigmaPt[2 * species]->Fill(momn, tpcNsigma); + hNsigmaPt[2 * species]->Fill(pt_momn, tpcNsigma); } if (track.sign() < 0) { - hNsigmaPt[2 * species + 1]->Fill(momn, tpcNsigma); + hNsigmaPt[2 * species]->Fill(pt_momn, tpcNsigma); } } } @@ -410,32 +414,31 @@ struct NucleitpcPbPb { { if (track.tpcNClsFound() < cfgtpcNClsFound || track.itsNCls() < cfgitsNCls) return; - if (cfgFillmass) { - double mass; - int speciesHe3 = 4; - int speciesHe4 = 5; - if ((species == speciesHe3 || species == speciesHe4) && cfgTwicemass) { - mass = 2 * track.mass(); - } else { - mass = track.mass(); - } - double momn; - if (species == speciesHe3 || species == speciesHe4) { - momn = 2 * track.pt(); - } else { - momn = track.pt(); - } - if (track.sign() > 0) { - hmass[2 * species]->Fill(momn, mass * mass); - } - if (track.sign() < 0) { - hmass[2 * species + 1]->Fill(momn, mass * mass); - } + if (!track.hasTOF() || !cfgFillmass) + return; + float beta{o2::pid::tof::Beta::GetBeta(track)}; + if (beta <= 0.f || beta >= 1.f) + return; + float charge = (species == 4 || species == 5) ? 2.f : 1.f; + float p = getRigidity(track); // assuming this is the momentum from inner TPC + float massTOF = p * charge * std::sqrt(1.f / (beta * beta) - 1.f); + // get PDG mass + float pdgMass = particleMasses[species]; + float massDiff = massTOF - pdgMass; + float pt_momn; + setTrackParCov(track, mTrackParCov); + mTrackParCov.setPID(track.pidForTracking()); + pt_momn = (species == 4 || species == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); + if (track.sign() > 0) { + hmass[2 * species]->Fill(pt_momn, massDiff * massDiff); + } else if (track.sign() < 0) { + hmass[2 * species + 1]->Fill(pt_momn, massDiff * massDiff); } } + //---------------------------------------------------------------------------------------------------------------- template - float getTPCnSigma(T const& track, PrimParticles const& particle) + float getTPCnSigma(T const& track, PrimParticles & particle) { const float rigidity = getRigidity(track); if (!track.hasTPC()) @@ -460,6 +463,19 @@ struct NucleitpcPbPb { } //---------------------------------------------------------------------------------------------------------------- template +float getITSnSigma(T const& track, PrimParticles & particle) +{ + if (!track.hasITS()) + return -999; + o2::aod::ITSResponse itsResponse; + if (particle.name == "helion") + return itsResponse.nSigmaITS(track); + + return -999; // fallback if no match +} + + //---------------------------------------------------------------------------------------------------------------- + template float getMeanItsClsSize(T const& track) { int sum = 0, n = 0; @@ -480,6 +496,11 @@ struct NucleitpcPbPb { bool hePID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; return hePID ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); } + float DCAzSigma(double pt, float dcasigma) + { + float invPt = 1.f/pt; + return (5.00000e-04 + 8.73690e-03 * invPt + 9.62329e-04 * invPt * invPt) * dcasigma; // o2-linter: disable=magic-number (To be checked) + } //---------------------------------------------------------------------------------------------------------------- template float getRapidity(T const& track, int species) From b29b39a7f3eab142bac42ef0f65deefa376a38e7 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Thu, 19 Jun 2025 13:14:56 +0000 Subject: [PATCH 2/5] Please consider the following formatting changes --- PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx | 103 ++++++++++++++------------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx index 6bc5feb8cee..b833a4cf0de 100644 --- a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx +++ b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx @@ -11,34 +11,37 @@ /// /// \file nucleitpcpbpb.cxx /// \brief nuclei analysis -/// \author Jaideep Tanwar +/// \author Jaideep Tanwar /// -#include -#include -#include -#include -#include -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" +#include "Common/Core/PID/PIDTOF.h" +#include "Common/Core/PID/TPCPIDResponse.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" -#include "Common/Core/PID/TPCPIDResponse.h" -#include "Common/DataModel/PIDResponseITS.h" -#include "Common/Core/PID/PIDTOF.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/CollisionAssociationTables.h" -#include "ReconstructionDataFormats/Track.h" -#include "DataFormatsTPC/BetheBlochAleph.h" -#include "DataFormatsParameters/GRPObject.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsTPC/BetheBlochAleph.h" #include "DetectorsBase/GeometryManager.h" #include "DetectorsBase/Propagator.h" -#include "CCDB/BasicCCDBManager.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/Track.h" + +#include +#include + +#include +#include +#include using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -62,7 +65,7 @@ constexpr double betheBlochDefault[nParticles][nBetheParams]{ {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}, // helion {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}}; // alpha const int nTrkSettings = 18; -static const std::vector trackPIDsettingsNames{"useBBparams", "minITSnCls", "minITSnClscos", "minTPCnCls", "maxTPCchi2","minTPCchi2", "maxITSchi2", "minRigidity", "maxRigidity", "maxTPCnSigma", "TOFrequiredabove", "minTOFmass", "maxTOFmass", "maxDcaXY", "maxDcaZ", "minITSclsSize", "maxITSclsSize", "minTPCnClsCrossedRows"}; +static const std::vector trackPIDsettingsNames{"useBBparams", "minITSnCls", "minITSnClscos", "minTPCnCls", "maxTPCchi2", "minTPCchi2", "maxITSchi2", "minRigidity", "maxRigidity", "maxTPCnSigma", "TOFrequiredabove", "minTOFmass", "maxTOFmass", "maxDcaXY", "maxDcaZ", "minITSclsSize", "maxITSclsSize", "minTPCnClsCrossedRows"}; constexpr double trackPIDsettings[nParticles][nTrkSettings]{ {0, 0, 4, 60, 4.0, 0.5, 100, 0.15, 1.2, 2.5, -1, 0, 100, 2., 2., 0., 1000, 70}, {1, 0, 4, 70, 4.0, 0.5, 100, 0.20, 4.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, @@ -138,7 +141,7 @@ struct NucleitpcPbPb { Configurable cfgtpcNClsFound{"cfgtpcNClsFound", 100.0f, "min. no. of tpcNClsFound"}; Configurable cfgitsNCls{"cfgitsNCls", 2.0f, "min. no. of itsNCls"}; o2::track::TrackParametrizationWithError mTrackParCov; - //CCDB + // CCDB Service ccdb; Configurable bField{"bField", -999, "bz field, -999 is automatic"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -194,11 +197,11 @@ struct NucleitpcPbPb { histos.add("histCentFT0M", "histCentFT0M", kTH1F, {axisCent}); hDeDx.resize(2 * nParticles + 2); hNsigmaPt.resize(2 * nParticles + 2); - hmass.resize(2 * nParticles + 2); + hmass.resize(2 * nParticles + 2); for (int i = 0; i < nParticles + 1; i++) { TString histName = i < nParticles ? primaryParticles[i].name : "all"; if (cfgFillDeDxWithCut) { - hDeDx[2 * i] = histos.add(Form("dedx/histdEdx_%s_Cuts", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); + hDeDx[2 * i] = histos.add(Form("dedx/histdEdx_%s_Cuts", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); } } for (int i = 0; i < nParticles; i++) { @@ -244,7 +247,7 @@ struct NucleitpcPbPb { if (track.itsNCls() < cfgTrackPIDsettings->get(i, "minITSnCls") && cfgminITSnClsRequire) continue; double cosheta = std::cosh(track.eta()); - if ((track.itsNCls()/cosheta) < cfgTrackPIDsettings->get(i, "minITSnClscos") && cfgminITSnClscosRequire) + if ((track.itsNCls() / cosheta) < cfgTrackPIDsettings->get(i, "minITSnClscos") && cfgminITSnClscosRequire) continue; if (track.itsChi2NCl() > cfgTrackPIDsettings->get(i, "maxITSchi2") && cfgmaxITSchi2Require) continue; @@ -255,11 +258,11 @@ struct NucleitpcPbPb { if ((getRigidity(track) < cfgTrackPIDsettings->get(i, "minRigidity") || getRigidity(track) > cfgTrackPIDsettings->get(i, "maxRigidity")) && cfgRigidityCutRequire) continue; float pt_momn; - setTrackParCov(track, mTrackParCov); - mTrackParCov.setPID(track.pidForTracking()); - pt_momn = (i == 4 || i == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); + setTrackParCov(track, mTrackParCov); + mTrackParCov.setPID(track.pidForTracking()); + pt_momn = (i == 4 || i == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); bool insideDCAxy = (std::abs(track.dcaXY()) <= (cfgTrackPIDsettings->get(i, "maxDcaXY") * (0.0105f + 0.0350f / std::pow(pt_momn, 1.1f)))); - if ((!(insideDCAxy) || std::abs(track.dcaZ()) > DCAzSigma( pt_momn, cfgTrackPIDsettings->get(i, "maxDcaZ"))) && cfgDCAwithptRequire) + if ((!(insideDCAxy) || std::abs(track.dcaZ()) > DCAzSigma(pt_momn, cfgTrackPIDsettings->get(i, "maxDcaZ"))) && cfgDCAwithptRequire) continue; if (track.sign() > 0) { histos.fill(HIST("histDcaZVsPtData_particle"), pt_momn, track.dcaZ()); @@ -273,23 +276,23 @@ struct NucleitpcPbPb { if ((std::abs(tpcNsigma) > cfgTrackPIDsettings->get(i, "maxTPCnSigma")) && cfgmaxTPCnSigmaRequire) continue; float itsSigma = getITSnSigma(track, primaryParticles.at(i)); - if ((std::abs(itsSigma) > cfgITSnsigma) && cfgmaxITSnSigmaRequire) + if ((std::abs(itsSigma) > cfgITSnsigma) && cfgmaxITSnSigmaRequire) continue; fillnsigma(track, i); filldedx(track, i); - //TOF selection - if (!track.hasTOF() && cfgTrackPIDsettings->get(i, "TOFrequiredabove") < 1) + // TOF selection + if (!track.hasTOF() && cfgTrackPIDsettings->get(i, "TOFrequiredabove") < 1) continue; float beta{o2::pid::tof::Beta::GetBeta(track)}; float charge{1.f + static_cast(i == 4 || i == 5)}; - float tofMasses = getRigidity(track) * charge * std::sqrt(1.f / (beta * beta) - 1.f); + float tofMasses = getRigidity(track) * charge * std::sqrt(1.f / (beta * beta) - 1.f); if ((getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (tofMasses < cfgTrackPIDsettings->get(i, "minTOFmass") || tofMasses > cfgTrackPIDsettings->get(i, "maxTOFmass"))) && cfgmassRequire) continue; fillhmass(track, i); } histos.fill(HIST("histeta"), track.eta()); filldedx(track, nParticles); - } // track loop + } // track loop } //---------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------- @@ -397,9 +400,9 @@ struct NucleitpcPbPb { int i = species; const float tpcNsigma = getTPCnSigma(track, primaryParticles.at(i)); float pt_momn; - setTrackParCov(track, mTrackParCov); + setTrackParCov(track, mTrackParCov); mTrackParCov.setPID(track.pidForTracking()); - pt_momn = (i == 4 || i == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); + pt_momn = (i == 4 || i == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); if (track.sign() > 0) { hNsigmaPt[2 * species]->Fill(pt_momn, tpcNsigma); } @@ -420,15 +423,15 @@ struct NucleitpcPbPb { if (beta <= 0.f || beta >= 1.f) return; float charge = (species == 4 || species == 5) ? 2.f : 1.f; - float p = getRigidity(track); // assuming this is the momentum from inner TPC + float p = getRigidity(track); // assuming this is the momentum from inner TPC float massTOF = p * charge * std::sqrt(1.f / (beta * beta) - 1.f); // get PDG mass float pdgMass = particleMasses[species]; float massDiff = massTOF - pdgMass; float pt_momn; - setTrackParCov(track, mTrackParCov); + setTrackParCov(track, mTrackParCov); mTrackParCov.setPID(track.pidForTracking()); - pt_momn = (species == 4 || species == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); + pt_momn = (species == 4 || species == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); if (track.sign() > 0) { hmass[2 * species]->Fill(pt_momn, massDiff * massDiff); } else if (track.sign() < 0) { @@ -438,7 +441,7 @@ struct NucleitpcPbPb { //---------------------------------------------------------------------------------------------------------------- template - float getTPCnSigma(T const& track, PrimParticles & particle) + float getTPCnSigma(T const& track, PrimParticles& particle) { const float rigidity = getRigidity(track); if (!track.hasTPC()) @@ -463,16 +466,16 @@ struct NucleitpcPbPb { } //---------------------------------------------------------------------------------------------------------------- template -float getITSnSigma(T const& track, PrimParticles & particle) -{ - if (!track.hasITS()) - return -999; - o2::aod::ITSResponse itsResponse; - if (particle.name == "helion") - return itsResponse.nSigmaITS(track); + float getITSnSigma(T const& track, PrimParticles& particle) + { + if (!track.hasITS()) + return -999; + o2::aod::ITSResponse itsResponse; + if (particle.name == "helion") + return itsResponse.nSigmaITS(track); - return -999; // fallback if no match -} + return -999; // fallback if no match + } //---------------------------------------------------------------------------------------------------------------- template @@ -498,7 +501,7 @@ float getITSnSigma(T const& track, PrimParticles & particle) } float DCAzSigma(double pt, float dcasigma) { - float invPt = 1.f/pt; + float invPt = 1.f / pt; return (5.00000e-04 + 8.73690e-03 * invPt + 9.62329e-04 * invPt * invPt) * dcasigma; // o2-linter: disable=magic-number (To be checked) } //---------------------------------------------------------------------------------------------------------------- From 0dab1b0d29db5ff832405393aa0af20aabefe028 Mon Sep 17 00:00:00 2001 From: Jaideep Tanwar <141036812+jtanwar2212@users.noreply.github.com> Date: Tue, 24 Jun 2025 18:39:06 +0530 Subject: [PATCH 3/5] Update nucleitpcpbpb.cxx --- PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx | 49 +++++++++++++++++----------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx index b833a4cf0de..590cfbccc82 100644 --- a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx +++ b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx @@ -162,6 +162,8 @@ struct NucleitpcPbPb { { mRunNumber = 0; dBz = 0; + int He3 = 4; + int He4 = 5; rand.SetSeed(0); ccdb->setURL(ccdbUrl); ccdb->setCaching(true); @@ -257,20 +259,20 @@ struct NucleitpcPbPb { continue; if ((getRigidity(track) < cfgTrackPIDsettings->get(i, "minRigidity") || getRigidity(track) > cfgTrackPIDsettings->get(i, "maxRigidity")) && cfgRigidityCutRequire) continue; - float pt_momn; + float ptMomn; setTrackParCov(track, mTrackParCov); mTrackParCov.setPID(track.pidForTracking()); - pt_momn = (i == 4 || i == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); - bool insideDCAxy = (std::abs(track.dcaXY()) <= (cfgTrackPIDsettings->get(i, "maxDcaXY") * (0.0105f + 0.0350f / std::pow(pt_momn, 1.1f)))); - if ((!(insideDCAxy) || std::abs(track.dcaZ()) > DCAzSigma(pt_momn, cfgTrackPIDsettings->get(i, "maxDcaZ"))) && cfgDCAwithptRequire) + ptMomn = (i == He3 || i == He4) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); + 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) + if ((!(insideDCAxy) || std::abs(track.dcaZ()) > DCAzSigma(ptMomn, cfgTrackPIDsettings->get(i, "maxDcaZ"))) && cfgDCAwithptRequire) continue; if (track.sign() > 0) { - histos.fill(HIST("histDcaZVsPtData_particle"), pt_momn, track.dcaZ()); - histos.fill(HIST("histDcaXYVsPtData_particle"), pt_momn, track.dcaXY()); + histos.fill(HIST("histDcaZVsPtData_particle"), ptMomn, track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_particle"), ptMomn, track.dcaXY()); } if (track.sign() < 0) { - histos.fill(HIST("histDcaZVsPtData_antiparticle"), pt_momn, track.dcaZ()); - histos.fill(HIST("histDcaXYVsPtData_antiparticle"), pt_momn, track.dcaXY()); + histos.fill(HIST("histDcaZVsPtData_antiparticle"), ptMomn, track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_antiparticle"), ptMomn, track.dcaXY()); } float tpcNsigma = getTPCnSigma(track, primaryParticles.at(i)); if ((std::abs(tpcNsigma) > cfgTrackPIDsettings->get(i, "maxTPCnSigma")) && cfgmaxTPCnSigmaRequire) @@ -284,7 +286,7 @@ struct NucleitpcPbPb { if (!track.hasTOF() && cfgTrackPIDsettings->get(i, "TOFrequiredabove") < 1) continue; float beta{o2::pid::tof::Beta::GetBeta(track)}; - float charge{1.f + static_cast(i == 4 || i == 5)}; + float charge{1.f + static_cast(i == He3 || i == He4)}; float tofMasses = getRigidity(track) * charge * std::sqrt(1.f / (beta * beta) - 1.f); if ((getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (tofMasses < cfgTrackPIDsettings->get(i, "minTOFmass") || tofMasses > cfgTrackPIDsettings->get(i, "maxTOFmass"))) && cfgmassRequire) continue; @@ -399,15 +401,15 @@ struct NucleitpcPbPb { if (cfgFillnsigma) { int i = species; const float tpcNsigma = getTPCnSigma(track, primaryParticles.at(i)); - float pt_momn; + float ptMomn; setTrackParCov(track, mTrackParCov); mTrackParCov.setPID(track.pidForTracking()); - pt_momn = (i == 4 || i == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); + ptMomn = (i == He3 || i == He4) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); if (track.sign() > 0) { - hNsigmaPt[2 * species]->Fill(pt_momn, tpcNsigma); + hNsigmaPt[2 * species]->Fill(ptMomn, tpcNsigma); } if (track.sign() < 0) { - hNsigmaPt[2 * species]->Fill(pt_momn, tpcNsigma); + hNsigmaPt[2 * species]->Fill(ptMomn, tpcNsigma); } } } @@ -422,20 +424,20 @@ struct NucleitpcPbPb { float beta{o2::pid::tof::Beta::GetBeta(track)}; if (beta <= 0.f || beta >= 1.f) return; - float charge = (species == 4 || species == 5) ? 2.f : 1.f; + float charge = (species == He3 || species == He4) ? 2.f : 1.f; float p = getRigidity(track); // assuming this is the momentum from inner TPC float massTOF = p * charge * std::sqrt(1.f / (beta * beta) - 1.f); // get PDG mass float pdgMass = particleMasses[species]; float massDiff = massTOF - pdgMass; - float pt_momn; + float ptMomn; setTrackParCov(track, mTrackParCov); mTrackParCov.setPID(track.pidForTracking()); - pt_momn = (species == 4 || species == 5) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); + ptMomn = (species == He3 || species == He4) ? 2 * mTrackParCov.getPt() : mTrackParCov.getPt(); if (track.sign() > 0) { - hmass[2 * species]->Fill(pt_momn, massDiff * massDiff); + hmass[2 * species]->Fill(ptMomn, massDiff * massDiff); } else if (track.sign() < 0) { - hmass[2 * species + 1]->Fill(pt_momn, massDiff * massDiff); + hmass[2 * species + 1]->Fill(ptMomn, massDiff * massDiff); } } @@ -471,9 +473,18 @@ struct NucleitpcPbPb { if (!track.hasITS()) return -999; o2::aod::ITSResponse itsResponse; + if (particle.name == "pion") + return itsResponse.nSigmaITS(track); + if (particle.name == "proton") + return itsResponse.nSigmaITS(track); + if (particle.name == "deuteron") + return itsResponse.nSigmaITS(track); + if (particle.name == "triton") + return itsResponse.nSigmaITS(track); if (particle.name == "helion") return itsResponse.nSigmaITS(track); - + if (particle.name == "alpha") + return itsResponse.nSigmaITS(track); return -999; // fallback if no match } From 857844d1680008e7cdfd22dd3fa15e6ff51b8ae8 Mon Sep 17 00:00:00 2001 From: Jaideep Tanwar <141036812+jtanwar2212@users.noreply.github.com> Date: Tue, 24 Jun 2025 18:46:33 +0530 Subject: [PATCH 4/5] Update nucleitpcpbpb.cxx --- PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx index 590cfbccc82..282e4aa7d6e 100644 --- a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx +++ b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx @@ -157,13 +157,13 @@ struct NucleitpcPbPb { int mRunNumber, occupancy; float dBz, momn; TRandom3 rand; + int He3 = 4; + int He4 = 5; //---------------------------------------------------------------------------------------------------------------- void init(InitContext const&) { mRunNumber = 0; dBz = 0; - int He3 = 4; - int He4 = 5; rand.SetSeed(0); ccdb->setURL(ccdbUrl); ccdb->setCaching(true); From 9f6d57532be73fd03e2e8fa92e86fe2c219eb84d Mon Sep 17 00:00:00 2001 From: Jaideep Tanwar <141036812+jtanwar2212@users.noreply.github.com> Date: Thu, 26 Jun 2025 18:21:58 +0530 Subject: [PATCH 5/5] Update nucleitpcpbpb.cxx --- PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx index 282e4aa7d6e..110afcc0a19 100644 --- a/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx +++ b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx @@ -157,8 +157,8 @@ struct NucleitpcPbPb { int mRunNumber, occupancy; float dBz, momn; TRandom3 rand; - int He3 = 4; - int He4 = 5; + float He3 = 4; + float He4 = 5; //---------------------------------------------------------------------------------------------------------------- void init(InitContext const&) {