diff --git a/PWGLF/Tasks/Nuspex/dedxPidAnalysis.cxx b/PWGLF/Tasks/Nuspex/dedxPidAnalysis.cxx index 4c9fbb78d4b..5fbd8dc2682 100644 --- a/PWGLF/Tasks/Nuspex/dedxPidAnalysis.cxx +++ b/PWGLF/Tasks/Nuspex/dedxPidAnalysis.cxx @@ -49,7 +49,8 @@ using PIDTracks = soa::Join< aod::Tracks, aod::TracksExtra, aod::TrackSelectionExtension, aod::TracksDCA, aod::TrackSelection, aod::pidTOFFullPi, aod::pidTOFFullPr, aod::pidTOFFullEl, aod::pidTOFbeta, aod::pidTPCPi, aod::pidTPCPr, aod::pidTPCEl>; -using SelectedCollisions = soa::Join; +using SelectedCollisions = soa::Join; using BCsRun3 = soa::Join; static constexpr int NCentHists{10}; @@ -78,21 +79,35 @@ struct DedxPidAnalysis { bool fillHist = false; - enum V0SelectionMode { + enum MultSelectionMode : int { + NoMultiplicity = 0, + MultFV0A = 1, + MultFT0M = 2, + MultFDDM = 3, + MultTracklets = 4, + MultTPC = 5, + MultNTracksPV = 6, + MultNTracksPVeta1 = 7, + CentralityFT0C = 8, + CentralityFT0M = 9, + CentralityFV0A = 10 + }; + + enum V0SelectionMode : int { V0TPC = 1, V0TOF = 2, V0TPCTOF = 3 }; - enum NINELSelectionMode { + enum NINELSelectionMode : int { NoSelINEL = 1, SelINELgt0 = 2, SelINELgt1 = 3 }; - enum MomentumMode { + enum MomentumMode : int { TpcInnerParam = 1, TotalMomentum = 2 }; @@ -185,6 +200,7 @@ struct DedxPidAnalysis { Configurable v0SelectionMode{"v0SelectionMode", 3, "V0 Selection base on TPC: 1, TOF:2 ,Both:3"}; Configurable momentumMode{"momentumMode", 2, "1: TPC inner param, 2: Total momentum p"}; Configurable v0TypeSelection{"v0TypeSelection", 1, "select on a certain V0 type (leave negative if no selection desired)"}; + Configurable multiplicityEstimator{"multiplicityEstimator", 9, "Flag to use a multiplicity estimator; No multiplicity: 0, MultFV0A: 1, MultFT0M: 2, MultFDDM: 3 ,MultTracklets: 4,MultTPC: 5,MultNTracksPV: 6 ,MultNTracksPVeta1: 7,CentralityFT0C: 8 ,CentralityFT0M: 9, CentralityFV0A: 10"}; Configurable lowParam1{"lowParam1", 0.119297, "First parameter for low phi cut"}; Configurable lowParam2{"lowParam2", 0.000379693, "Second parameter for low phi cut"}; Configurable highParam1{"highParam1", 0.16685, "First parameter for high phi cut"}; @@ -209,6 +225,7 @@ struct DedxPidAnalysis { Configurable> calibrationFactorNeg{"calibrationFactorNeg", {50.4011, 50.4764, 50.186, 49.2955, 48.8222, 49.4273, 49.9292, 50.0556}, "negative calibration factors"}; Configurable> calibrationFactorPos{"calibrationFactorPos", {50.5157, 50.6359, 50.3198, 49.3345, 48.9197, 49.4931, 50.0188, 50.1406}, "positive calibration factors"}; ConfigurableAxis binP{"binP", {VARIABLE_WIDTH, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0}, ""}; + ConfigurableAxis centBins{"centBins", {100, 0, 100}, "Binning for centralidad"}; // phi cut fits TF1* fphiCutHigh = nullptr; @@ -300,6 +317,55 @@ struct DedxPidAnalysis { AxisSpec etaAxis{8, -0.8, 0.8, "#eta"}; AxisSpec pAxis = {binP, "#it{p}/Z (GeV/c)"}; AxisSpec pAxisTrack = {binP, "#it{p} (GeV/c)"}; + AxisSpec centAxis{centBins, "Undefined multiplicity estimator"}; + switch (multiplicityEstimator) { + case MultSelectionMode::NoMultiplicity: // No multiplicity + LOGF(info, "No multiplicity estimator applied"); + break; + case MultSelectionMode::MultFV0A: // MultFV0A + centAxis.title = "MultFV0A"; + LOGF(info, "MultFV0A estimator applied"); + break; + case MultSelectionMode::MultFT0M: // MultFT0M + centAxis.title = "MultFT0M"; + LOGF(info, "MultFT0M estimator applied"); + break; + case MultSelectionMode::MultFDDM: // MultFDDM + centAxis.title = "MultFDDM"; + LOGF(info, " MultFDDM estimator applied"); + break; + case MultSelectionMode::MultTracklets: // MultTracklets + centAxis.title = "MultTracklets"; + LOGF(info, "MultTracklets estimator applied"); + break; + case MultSelectionMode::MultTPC: // MultTPC + centAxis.title = "MultTPC"; + LOGF(info, "MultTPC estimator applied"); + break; + case MultSelectionMode::MultNTracksPV: // MultNTracksPV + centAxis.title = "MultNTracksPV"; + LOGF(info, "MultNTracksPV estimator applied"); + break; + case MultSelectionMode::MultNTracksPVeta1: // MultNTracksPVeta1 + centAxis.title = "MultNTracksPVeta1"; + LOGF(info, "MultNTracksPVeta1 estimator applied"); + break; + case MultSelectionMode::CentralityFT0C: // Centrality FT0C + centAxis.title = "Centrality FT0C"; + LOGF(info, "Centrality FT0C estimator applied"); + break; + case MultSelectionMode::CentralityFT0M: // Centrality FT0M + centAxis.title = "Centrality FT0M"; + LOGF(info, "Centrality FT0M estimator applied"); + break; + case MultSelectionMode::CentralityFV0A: // Centrality FV0A + centAxis.title = "Centrality FV0A"; + LOGF(info, "Centrality FV0A estimator applied"); + break; + default: + LOG(fatal) << "Unrecognized option for multiplicity " << multiplicityEstimator; + } + fphiCutLow = new TF1("StandardPhiCutLow", Form("%f/x/x+pi/18.0-%f", lowParam1.value, lowParam2.value), 0, 50); @@ -555,7 +621,7 @@ struct DedxPidAnalysis { registryDeDx.add("histRecVtxZData", "collision z position", HistType::kTH1F, {{100, -20.0, +20.0, "z_{vtx} (cm)"}}); // Event Counter by centrality - registryDeDx.add("histCentrality", "collision centrality", HistType::kTH1F, {{100, 0.0, 100, "cent"}}); + registryDeDx.add("histCentrality", "Centrality", HistType::kTH1F, {centAxis}); // Event Counter registryDeDx.add("evsel", "events selected", HistType::kTH1F, {{6, 0.5, 6.5, ""}}); @@ -1229,7 +1295,46 @@ struct DedxPidAnalysis { return true; } - + // Get Multiplicity + template + float getMultiplicity(const T& collision) + { + switch (multiplicityEstimator) { + case MultSelectionMode::NoMultiplicity: // No multiplicity + return 50.f; // to check if its filled + break; + case MultSelectionMode::MultFV0A: // MultFV0M + return collision.multZeqFV0A(); + break; + case MultSelectionMode::MultFT0M: + return collision.multZeqFT0A() + collision.multZeqFT0C(); + break; + case MultSelectionMode::MultFDDM: // MultFDDM + return collision.multZeqFDDA() + collision.multZeqFDDC(); + break; + case MultSelectionMode::MultTracklets: // MultTracklets + return 0.f; // Undefined in Run3 + break; + case MultSelectionMode::MultTPC: // MultTPC + return collision.multTPC(); + break; + case MultSelectionMode::MultNTracksPV: // MultNTracksPV + return collision.multZeqNTracksPV(); + break; + case MultSelectionMode::MultNTracksPVeta1: // MultNTracksPVeta1 + return collision.multNTracksPVeta1(); + break; + case MultSelectionMode::CentralityFT0C: // Centrality FT0C + return collision.centFT0C(); + break; + case MultSelectionMode::CentralityFT0M: // Centrality FT0M + return collision.centFT0M(); + break; + default: + LOG(fatal) << "Unknown multiplicity estimator: " << multiplicityEstimator; + return 0.f; + } + } // Process Data void process(SelectedCollisions::iterator const& collision, BCsRun3 const& /**/, aod::V0Datas const& fullV0s, PIDTracks const& tracks) @@ -1277,7 +1382,7 @@ struct DedxPidAnalysis { const uint64_t timeStamp{foundBC.timestamp()}; const int magField{getMagneticField(timeStamp)}; - float centrality = collision.centFT0C(); + float centrality = getMultiplicity(collision); if (centrality < CentClasses[0] || centrality > CentClasses[10]) return;