diff --git a/PWGLF/Tasks/QC/systematicsMapping.cxx b/PWGLF/Tasks/QC/systematicsMapping.cxx index b4e2a3a5a29..ea76a528b05 100644 --- a/PWGLF/Tasks/QC/systematicsMapping.cxx +++ b/PWGLF/Tasks/QC/systematicsMapping.cxx @@ -40,10 +40,19 @@ struct SystematicsMapping { ConfigurableAxis invariantMassBins{"invariantMassBins", {100, -0.1f, 0.1f}, "Binning for the invariant mass (GeV/c^2)"}; ConfigurableAxis nsigmaBins{"nsigmaBins", {100, -10.f, 10.f}, "Binning for nSigma"}; // Selection bins - ConfigurableAxis tpcClusterBins{"tpcClusterBins", {5, 70, 100, 120, 135, 150}, "Min TPC clusters for tracks"}; + ConfigurableAxis tpcCrossedRowsBins{"tpcCrossedRowsBins", {5, 70, 100, 120, 135, 150}, "Min TPC clusters for tracks"}; ConfigurableAxis itsClustersBins{"itsClustersBins", {5, 0, 6}, "Min ITS clusters for tracks"}; + ConfigurableAxis dcaBins{"dcaBins", {100, 0.f, 5.f}, "Binning for DCA (cm)"}; + ConfigurableAxis chi2Bins{"chi2Bins", {100, 0.f, 100.f}, "Binning for chi2"}; // Selection configurables Configurable selectionPosZ{"selectionPosZ", 10.f, "Max |z| of the primary vertex"}; + // V0 selection criteria + Configurable v0cospa{"v0cospa", 0.97, "V0 CosPA"}; + Configurable dcav0dau{"dcav0dau", 10, "DCA V0 Daughters"}; + Configurable dcanegtopv{"dcanegtopv", 0.0, "DCA Neg To PV"}; + Configurable dcapostopv{"dcapostopv", 0.0, "DCA Pos To PV"}; + Configurable v0radius{"v0radius", 0.0, "Radius"}; + Configurable etadau{"etadau", 0.8, "Eta Daughters"}; HistogramRegistry registry{"registry"}; @@ -58,28 +67,41 @@ struct SystematicsMapping { const AxisSpec ptAxis{ptBins, "#it{p}_{T} (GeV/c)"}; const AxisSpec etaAxis{etaBins, "#eta"}; const AxisSpec phiAxis{phiBins, "#phi (rad)"}; + const AxisSpec invariantMassAxis{invariantMassBins, "Invariant Mass (GeV/c^{2})"}; + const AxisSpec nsigmaAxisTPC{nsigmaBins, "nSigma TPC"}; + const AxisSpec nsigmaAxisTOF{nsigmaBins, "nSigma TOF"}; + const AxisSpec tpcCrossedRowsAxis{tpcCrossedRowsBins, "TPC crossed rows"}; + const AxisSpec itsClustersAxis{itsClustersBins, "ITS clusters"}; + const AxisSpec dcaXYAxis{dcaBins, "DCAxy (cm)"}; + const AxisSpec dcaZAxis{dcaBins, "DCAz (cm)"}; + const AxisSpec chi2TPCAxis{chi2Bins, "TPC Chi2"}; + const AxisSpec chi2ITSAxis{chi2Bins, "ITS Chi2"}; if (doprocessData) { // First we define the histograms on which we are cutting (tpc clusters, its clusters, ..) - registry.add("K/hTPCClusters", "", HistType::kTH1F, {{100, 0, 200}}); + registry.add("K/hTPCCrossedRows", "", HistType::kTH1F, {{100, 0, 200}}); registry.add("K/hITSClusters", "", HistType::kTH1F, {{10, 0, 10}}); + registry.add("K/hDCAxy", "", HistType::kTH1F, {dcaBins}); + registry.add("K/hDCAz", "", HistType::kTH1F, {dcaBins}); + registry.add("K/hChi2OverNCLsTPC", "", HistType::kTH1F, {chi2Bins}); + registry.add("K/hChi2OverNCLsITS", "", HistType::kTH1F, {chi2Bins}); registry.addClone("K/", "K0s/"); // Add the signal histograms - registry.add("K/SignalPositive", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins, nsigmaBins, tpcClusterBins, itsClustersBins}); - registry.add("K/SignalNegative", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins, nsigmaBins, tpcClusterBins, itsClustersBins}); - registry.add("K0s/Signal", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins, invariantMassBins, tpcClusterBins, itsClustersBins}); + registry.add("K/SignalPositive", "", HistType::kTHnSparseF, {ptAxis, etaAxis, phiAxis, nsigmaAxisTPC, nsigmaAxisTOF, tpcCrossedRowsAxis, itsClustersAxis, dcaXYAxis, dcaZAxis, chi2TPCAxis, chi2ITSAxis}); + registry.add("K/SignalNegative", "", HistType::kTHnSparseF, {ptAxis, etaAxis, phiAxis, nsigmaAxisTPC, nsigmaAxisTOF, tpcCrossedRowsAxis, itsClustersAxis, dcaXYAxis, dcaZAxis, chi2TPCAxis, chi2ITSAxis}); + registry.add("K0s/Signal", "", HistType::kTHnSparseF, {ptAxis, etaAxis, phiAxis, invariantMassBins, nsigmaAxisTPC, nsigmaAxisTOF, tpcCrossedRowsAxis, itsClustersAxis, dcaXYAxis, dcaZAxis, chi2TPCAxis, chi2ITSAxis}); } if (doprocessMc) { - registry.add("K/GeneratedPositive", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins}); - registry.add("K/GeneratedNegative", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins}); - registry.add("K0s/Generated", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins}); + registry.add("K/GeneratedPositive", "", HistType::kTHnSparseF, {ptAxis, etaAxis, phiAxis}); + registry.add("K/GeneratedNegative", "", HistType::kTHnSparseF, {ptAxis, etaAxis, phiAxis}); + registry.add("K0s/Generated", "", HistType::kTHnSparseF, {ptAxis, etaAxis, phiAxis}); } } - using TrackType = soa::Join; + using TrackType = soa::Join; using CollisionType = soa::Join; void processData(CollisionType const& collisions, @@ -94,21 +116,45 @@ struct SystematicsMapping { for (const auto& track : tracks) { if (track.collisionId() != collision.globalIndex()) continue; - registry.fill(HIST("hTPCClusters"), track.tpcNClsFound()); - registry.fill(HIST("hITSClusters"), track.itsNCls()); + registry.fill(HIST("K/hTPCCrossedRows"), track.tpcNClsCrossedRows()); + registry.fill(HIST("K/hITSClusters"), track.itsNCls()); + registry.fill(HIST("K/hDCAxy"), track.dcaXY()); + registry.fill(HIST("K/hDCAz"), track.dcaZ()); + registry.fill(HIST("K/hChi2OverNCLsTPC"), track.tpcChi2NCl()); + registry.fill(HIST("K/hChi2OverNCLsITS"), track.itsChi2NCl()); if (track.sign() > 0) - registry.fill(HIST("K/SignalPositive"), track.pt(), track.eta(), track.phi(), track.tpcNSigmaKa(), track.tpcNClsFound(), track.itsNCls()); + registry.fill(HIST("K/SignalPositive"), track.pt(), track.eta(), track.phi(), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.tpcNClsCrossedRows(), track.itsNCls(), track.dcaXY(), track.dcaZ(), track.tpcChi2NCl(), track.itsChi2NCl()); else - registry.fill(HIST("K/SignalNegative"), track.pt(), track.eta(), track.phi(), track.tpcNSigmaKa(), track.tpcNClsFound(), track.itsNCls()); + registry.fill(HIST("K/SignalNegative"), track.pt(), track.eta(), track.phi(), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.tpcNClsCrossedRows(), track.itsNCls(), track.dcaXY(), track.dcaZ(), track.tpcChi2NCl(), track.itsChi2NCl()); } // K0s loop for (const auto& v0 : v0s) { if (v0.collisionId() != collision.globalIndex()) continue; + const auto& posTrack = v0.posTrack_as(); const auto& negTrack = v0.negTrack_as(); - registry.fill(HIST("K0s/Signal"), v0.pt(), v0.eta(), v0.phi(), v0.mK0Short() - constants::physics::MassK0Short, std::min(posTrack.tpcNClsFound(), negTrack.tpcNClsFound()), std::min(posTrack.itsNCls(), negTrack.itsNCls())); + if (v0.v0radius() < v0radius || + v0.v0cosPA() < v0cospa || + std::abs(posTrack.eta()) > etadau || + std::abs(negTrack.eta()) > etadau) + continue; + registry.fill(HIST("K0s/hTPCCrossedRows"), std::min(posTrack.tpcNClsCrossedRows(), negTrack.tpcNClsCrossedRows())); + registry.fill(HIST("K0s/hITSClusters"), std::min(posTrack.itsNCls(), negTrack.itsNCls())); + registry.fill(HIST("K0s/hDCAxy"), std::min(posTrack.dcaXY(), negTrack.dcaXY())); + registry.fill(HIST("K0s/hDCAz"), std::min(posTrack.dcaZ(), negTrack.dcaZ())); + registry.fill(HIST("K0s/hChi2OverNCLsTPC"), std::min(posTrack.tpcChi2NCl(), negTrack.tpcChi2NCl())); + registry.fill(HIST("K0s/hChi2OverNCLsITS"), std::min(posTrack.itsChi2NCl(), negTrack.itsChi2NCl())); + registry.fill(HIST("K0s/Signal"), v0.pt(), v0.eta(), v0.phi(), v0.mK0Short() - constants::physics::MassK0Short, + std::max(posTrack.tpcNSigmaPi(), negTrack.tpcNSigmaPi()), + std::max(posTrack.tofNSigmaPi(), negTrack.tofNSigmaPi()), + std::min(posTrack.tpcNClsCrossedRows(), negTrack.tpcNClsCrossedRows()), + std::min(posTrack.itsNCls(), negTrack.itsNCls()), + std::min(posTrack.dcaXY(), negTrack.dcaXY()), + std::min(posTrack.dcaZ(), negTrack.dcaZ()), + std::min(posTrack.tpcChi2NCl(), negTrack.tpcChi2NCl()), + std::min(posTrack.itsChi2NCl(), negTrack.itsChi2NCl())); } } }