diff --git a/PWGMM/Mult/Tasks/heavy-ion-mult.cxx b/PWGMM/Mult/Tasks/heavy-ion-mult.cxx index d0598205f3b..09d92844a6b 100644 --- a/PWGMM/Mult/Tasks/heavy-ion-mult.cxx +++ b/PWGMM/Mult/Tasks/heavy-ion-mult.cxx @@ -30,6 +30,7 @@ #include "Common/CCDB/EventSelectionParams.h" #include "Common/Core/TrackSelection.h" #include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" #include "CommonConstants/MathConstants.h" @@ -48,6 +49,8 @@ using namespace o2::framework::expressions; using namespace o2::aod::track; using CollisionDataTable = soa::Join; +using CollisionDataTableCorrelation = soa::Join; +using CollisionDataTableCentFT0C = soa::Join; using TrackDataTable = soa::Join; using FilTrackDataTable = soa::Filtered; using CollisionMCTrueTable = aod::McCollisions; @@ -68,6 +71,10 @@ static constexpr TrackSelectionFlags::flagtype trackSelectionDCA = static constexpr TrackSelectionFlags::flagtype trackSelectionDCAXYonly = TrackSelectionFlags::kDCAxy; +static constexpr int CentHistArray{15}; +std::shared_ptr h1MultHistCentFT0C[CentHistArray]; +std::shared_ptr h1EtaHistCentFT0C[CentHistArray]; + AxisSpec axisEvent{4, -0.5, 3.5, "#Event"}; AxisSpec axisVtxZ{800, -20, 20, "Vertex Z"}; AxisSpec axisDCA = {601, -3.01, 3.01}; @@ -75,6 +82,7 @@ AxisSpec axisPT = {1000, -0.05, 49.95}; AxisSpec axisEta{200, -5, 5, "#eta"}; AxisSpec axisPhi{629, 0, 2 * M_PI, "#phi"}; AxisSpec axisMCEvent_ambiguity{6, -0.5, 5.5, "reco collisions per true collision"}; +AxisSpec axisCent{101, -0.5, 100.5, "#Cent"}; struct HeavyIonMultiplicity { @@ -86,16 +94,20 @@ struct HeavyIonMultiplicity { Configurable VtxRange{"vertex-range", 10.0f, "Vertex Z range to consider"}; Configurable dcaZ{"dcaZ", 0.2f, "Custom DCA Z cut (ignored if negative)"}; ConfigurableAxis multHistBin{"MultDistBinning", {501, -0.5, 500.5}, ""}; + ConfigurableAxis FT0multHistBin{"FT0MultDistBinning", {501, -0.5, 500.5}, ""}; + Configurable> CentInterval{"CentInterval", {0., 5., 10., 20., 40., 60., 80., 100.}, "Centrality Intervals"}; void init(InitContext const&) { AxisSpec axisMult = {multHistBin}; + AxisSpec axisFT0Mult = {FT0multHistBin}; histos.add("EventHist", "EventHist", kTH1D, {axisEvent}, false); histos.add("VtxZHist", "VtxZHist", kTH1D, {axisVtxZ}, false); if (doprocessData) { histos.add("MultHist", "MultHist", kTH1D, {axisMult}, true); histos.add("MultHist_Inelgt0", "MultHist_Inelgt0", kTH1D, {axisMult}, true); + histos.add("MultHist_removeEta0tracks", "MultHist_removeEta0tracks", kTH1D, {axisMult}, true); histos.add("EtaHist", "EtaHist", kTH1D, {axisEta}, true); histos.add("PhiHist", "PhiHist", kTH1D, {axisPhi}, true); histos.add("EtaVsVtxZHist", "EtaVsVtxZHist", kTH2D, {axisEta, axisVtxZ}, false); @@ -124,6 +136,23 @@ struct HeavyIonMultiplicity { histos.add("MCGenMultHist_Inelgt0", "MCGenMultHist_Inelgt0", kTH1D, {axisMult}, true); histos.add("MCGenVsRecMultHist_Inelgt0", "MCGenVsRecMultHist_Inelgt0", kTH2D, {axisMult, axisMult}, true); } + + if (doprocessDataCentFT0C) { + histos.add("CentPercentileHist", "CentPercentileHist", kTH1D, {axisCent}, false); + auto centinterval = static_cast>(CentInterval); + for (int i = 0; i < static_cast(centinterval.size() - 1); ++i) { + h1MultHistCentFT0C[i] = histos.add(Form("MultHist%d", i + 1), Form("MultHist%d", i + 1), kTH1D, {axisMult}, true); + h1EtaHistCentFT0C[i] = histos.add(Form("EtaHist%d", i + 1), Form("EtaHist%d", i + 1), kTH1D, {axisEta}, true); + } + } + + if (doprocessCorrelation) { + histos.add("GlobalMult_vs_FT0A", "GlobalMult_vs_FT0A", kTH2F, {axisFT0Mult, axisMult}, true); + histos.add("GlobalMult_vs_FT0C", "GlobalMult_vs_FT0C", kTH2F, {axisFT0Mult, axisMult}, true); + histos.add("GlobalMult_vs_FT0", "GlobalMult_vs_FT0", kTH2F, {axisFT0Mult, axisMult}, true); + histos.add("GlobalMult_vs_FV0", "GlobalMult_vs_FV0", kTH2F, {axisFT0Mult, axisMult}, true); + histos.add("GlobalMult_vs_NumPVContributor", "GlobalMult_vs_NumPVContributor", kTH2F, {axisMult, axisMult}, true); + } } expressions::Filter trackSelectionProperMixed = ncheckbit(aod::track::detectorMap, (uint8_t)o2::aod::track::ITS) && @@ -136,6 +165,7 @@ struct HeavyIonMultiplicity { void processData(CollisionDataTable::iterator const& collision, FilTrackDataTable const& tracks) { auto NchTracks = 0; + auto Nch_removeEta0tracks = 0; bool Inelgt0 = false; histos.fill(HIST("EventHist"), 0); if (collision.sel8()) { @@ -153,9 +183,15 @@ struct HeavyIonMultiplicity { histos.fill(HIST("DCAXYHist"), track.dcaXY()); histos.fill(HIST("DCAZHist"), track.dcaZ()); histos.fill(HIST("pTHist"), track.pt()); + + // Remove |eta| < 0.05 tracks as suggested in QC meeting + if (!(std::abs(track.eta()) < 0.05)) { + Nch_removeEta0tracks++; + } } } histos.fill(HIST("MultHist"), NchTracks); + histos.fill(HIST("MultHist_removeEta0tracks"), Nch_removeEta0tracks); if (NchTracks > 0) { Inelgt0 = true; } @@ -244,6 +280,64 @@ struct HeavyIonMultiplicity { } } PROCESS_SWITCH(HeavyIonMultiplicity, processMC, "process MC", false); + + void processDataCentFT0C(CollisionDataTableCentFT0C::iterator const& collision, FilTrackDataTable const& tracks) + { + bool hasCentrality = false; + float cent = -1; + auto centinterval = static_cast>(CentInterval); + int NchTracks[CentHistArray]; + for (int i = 0; i < CentHistArray; i++) { + NchTracks[i] = 0; + } + hasCentrality = CollisionDataTableCentFT0C::template contains(); + histos.fill(HIST("EventHist"), 0); + if (collision.sel8()) { + histos.fill(HIST("EventHist"), 1); + if (std::abs(collision.posZ()) < VtxRange) { + histos.fill(HIST("EventHist"), 2); + histos.fill(HIST("VtxZHist"), collision.posZ()); + if (hasCentrality) { + cent = collision.centFT0C(); + histos.fill(HIST("CentPercentileHist"), cent); + for (auto& track : tracks) { + if (std::abs(track.eta()) < etaRange) { + for (int i = 0; i < static_cast(centinterval.size() - 1); ++i) { + if (cent > centinterval[i] && cent <= centinterval[i + 1]) { + NchTracks[i]++; + h1EtaHistCentFT0C[i]->Fill(track.eta()); + } + } + } + } + for (int i = 0; i < static_cast(centinterval.size() - 1); ++i) { + h1MultHistCentFT0C[i]->Fill(NchTracks[i]); + } + } + } + } + } + PROCESS_SWITCH(HeavyIonMultiplicity, processDataCentFT0C, "process data CentFT0C", false); + + void processCorrelation(CollisionDataTableCorrelation::iterator const& collision, FilTrackDataTable const& tracks) + { + auto NchTracks = 0; + if (collision.sel8()) { + if (std::abs(collision.posZ()) < VtxRange) { + for (auto& track : tracks) { + if (std::abs(track.eta()) < etaRange) { + NchTracks++; + } + } + histos.fill(HIST("GlobalMult_vs_FT0A"), collision.multFT0A(), NchTracks); + histos.fill(HIST("GlobalMult_vs_FT0C"), collision.multFT0C(), NchTracks); + histos.fill(HIST("GlobalMult_vs_FT0"), collision.multFT0A() + collision.multFT0C(), NchTracks); + histos.fill(HIST("GlobalMult_vs_FV0"), collision.multFV0A(), NchTracks); + histos.fill(HIST("GlobalMult_vs_NumPVContributor"), collision.numContrib(), NchTracks); + } + } + } + PROCESS_SWITCH(HeavyIonMultiplicity, processCorrelation, "do correlation between FT0/FV0 Mult vs GlobalMult", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)