diff --git a/Common/DataModel/Multiplicity.h b/Common/DataModel/Multiplicity.h index f6bad9d7e87..850301789dc 100644 --- a/Common/DataModel/Multiplicity.h +++ b/Common/DataModel/Multiplicity.h @@ -71,6 +71,7 @@ DECLARE_SOA_COLUMN(MultNTracksTPCOnly, multNTracksTPCOnly, int); //! DECLARE_SOA_COLUMN(MultNTracksITSTPC, multNTracksITSTPC, int); //! DECLARE_SOA_COLUMN(MultAllTracksTPCOnly, multAllTracksTPCOnly, int); //! DECLARE_SOA_COLUMN(MultAllTracksITSTPC, multAllTracksITSTPC, int); //! +DECLARE_SOA_COLUMN(MultNTracksGlobal, multNTracksGlobal, int); //! DECLARE_SOA_COLUMN(BCNumber, bcNumber, int); //! @@ -107,6 +108,10 @@ DECLARE_SOA_TABLE(MultsExtra, "AOD", "MULTEXTRA", //! mult::MultNTracksITSOnly, mult::MultNTracksTPCOnly, mult::MultNTracksITSTPC, mult::MultAllTracksTPCOnly, mult::MultAllTracksITSTPC, mult::BCNumber); + +// for QA purposes +DECLARE_SOA_TABLE(MultsGlobal, "AOD", "MULTGLOBAL", //! counters that use Track Selection (optional) + mult::MultNTracksGlobal); DECLARE_SOA_TABLE(MultSelections, "AOD", "MULTSELECTIONS", //! evsel::Selection); // for derived data / QA studies using MultExtra = MultsExtra::iterator; diff --git a/Common/TableProducer/mcCollsExtra.cxx b/Common/TableProducer/mcCollsExtra.cxx index ad185fd749b..ad0d4662008 100644 --- a/Common/TableProducer/mcCollsExtra.cxx +++ b/Common/TableProducer/mcCollsExtra.cxx @@ -97,6 +97,7 @@ struct mcCollisionExtra { if (biggestNContribs < collision.numContrib()) { biggestNContribs = collision.numContrib(); bestCollisionIndex = collision.globalIndex(); + bestCollisionCentFT0C = collision.centFT0C(); } } mcCollsExtra(collisions.size(), bestCollisionIndex, bestCollisionCentFT0C); diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index e8364fc185f..96fffe926d4 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -19,6 +19,7 @@ #include "iostream" #include "Framework/ASoAHelpers.h" #include "Framework/O2DatabasePDGPlugin.h" +#include "Common/DataModel/TrackSelectionTables.h" using namespace o2; using namespace o2::framework; @@ -64,6 +65,7 @@ struct MultiplicityTableTaskIndexed { Produces multSelections; Produces tableMultZeq; Produces tableExtraMc; + Produces multsGlobal; // For vertex-Z corrections in calibration Service ccdb; @@ -549,8 +551,25 @@ struct MultiplicityTableTaskIndexed { tableExtraMc(multFT0A, multFT0C, multBarrelEta05, multBarrelEta08, multBarrelEta10); } + void processGlobalTrackingCounters(aod::Collision const& collisions, + soa::Join const& tracks) + { + // counter from Igor + int nGlobalTracks = 0; + for (auto& track : tracks) { + if (fabs(track.eta()) < 0.8 && track.tpcNClsFound() >= 80 && track.tpcNClsCrossedRows() >= 100) { + if (track.isGlobalTrack()) { + nGlobalTracks++; + } + } + } + multsGlobal(nGlobalTracks); + } + PROCESS_SWITCH(MultiplicityTableTaskIndexed, processRun2, "Produce Run 2 multiplicity tables", false); PROCESS_SWITCH(MultiplicityTableTaskIndexed, processRun3, "Produce Run 3 multiplicity tables", true); + PROCESS_SWITCH(MultiplicityTableTaskIndexed, processGlobalTrackingCounters, "Produce Run 3 global counters", false); PROCESS_SWITCH(MultiplicityTableTaskIndexed, processMC, "Produce MC multiplicity tables", false); }; diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index 39e2cf6c7cf..43c64993919 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -9,6 +9,8 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +#include "map" + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -38,7 +40,6 @@ struct EventSelectionQaTask { Configurable nOrbitsConf{"nOrbits", 10000, "number of orbits"}; Configurable refBC{"refBC", 1238, "reference bc"}; Configurable isLowFlux{"isLowFlux", 1, "1 - low flux (pp, pPb), 0 - high flux (PbPb)"}; - Configurable flagMonitorBcInTF{"flagMonitorBcInTF", 1, "0 - no, 1 - yes"}; uint64_t minGlobalBC = 0; Service ccdb; @@ -263,12 +264,6 @@ struct EventSelectionQaTask { histos.add("hMultT0MVsNcontribAcc", "", kTH2F, {axisMultT0M, axisNcontrib}); // before ITS RO Frame border cut histos.add("hMultT0MVsNcontribCut", "", kTH2F, {axisMultT0M, axisNcontrib}); // after ITS RO Frame border cut - if (flagMonitorBcInTF) { - AxisSpec axisBCinTF{128 * nBCsPerOrbit + 1 + 10, -0.5, 128 * nBCsPerOrbit + 0.5 + 10, "bc in TF"}; - histos.add("hNcontribVsBcInTF", ";bc in TF; n vertex contributors", kTH1F, {axisBCinTF}); - histos.add("hNcontribAfterCutsVsBcInTF", ";bc in TF; n vertex contributors", kTH1F, {axisBCinTF}); - } - // MC histograms histos.add("hGlobalBcColMC", "", kTH1F, {axisGlobalBCs}); histos.add("hBcColMC", "", kTH1F, {axisBCs}); @@ -405,18 +400,11 @@ struct EventSelectionQaTask { auto trackletsGrouped = tracklets->sliceByCached(aod::track::collisionId, col.globalIndex(), cache); int nTracklets = trackletsGrouped.size(); - float multT0A = 0; - float multT0C = 0; float multFDA = 0; float multFDC = 0; - if (bc.has_ft0()) { - for (auto amplitude : bc.ft0().amplitudeA()) { - multT0A += amplitude; - } - for (auto amplitude : bc.ft0().amplitudeC()) { - multT0C += amplitude; - } - } + float multT0A = bc.has_ft0() ? bc.ft0().sumAmpA() : -999.f; + float multT0C = bc.has_ft0() ? bc.ft0().sumAmpC() : -999.f; + if (bc.has_fdd()) { for (auto amplitude : bc.fdd().chargeA()) { multFDA += amplitude; @@ -545,23 +533,90 @@ struct EventSelectionQaTask { tsSOR = grpecs->getTimeStart(); // ms tsEOR = grpecs->getTimeEnd(); // ms - // Temporary workaround for 22q (due to ZDC bc shifts) - // o2::ccdb::CcdbApi ccdb_api; - // ccdb_api.init("http://alice-ccdb.cern.ch"); - // std::map metadataRCT, headers; - // headers = ccdb_api.retrieveHeaders(Form("RCT/Info/RunInformation/%i", runNumber), metadataRCT, -1); - // tsSOR = atol(headers["SOR"].c_str()); - // tsEOR = atol(headers["EOR"].c_str()); - // uint32_t nOrbitsPerTF = 128; LOGP(info, "nOrbitsPerTF={} tsSOR={} ms tsEOR={} ms", nOrbitsPerTF, tsSOR, tsEOR); // calculate SOR and EOR orbits int64_t orbitSOR = (tsSOR * 1000 - tsOrbitReset) / o2::constants::lhc::LHCOrbitMUS; int64_t orbitEOR = (tsEOR * 1000 - tsOrbitReset) / o2::constants::lhc::LHCOrbitMUS; + // temporary map of TF start orbit shifts (affected all runs < LHC22o) + std::map mapOrbitShift; + mapOrbitShift[517619] = 109; + mapOrbitShift[517620] = 109; + mapOrbitShift[517623] = 109; + mapOrbitShift[517677] = 127; + mapOrbitShift[517678] = 127; + mapOrbitShift[517679] = 127; + mapOrbitShift[517685] = 127; + mapOrbitShift[517690] = 127; + mapOrbitShift[517693] = 127; + mapOrbitShift[517737] = 127; + mapOrbitShift[517748] = 127; + mapOrbitShift[517751] = 127; + mapOrbitShift[517753] = 127; + mapOrbitShift[517758] = 127; + mapOrbitShift[517767] = 127; + mapOrbitShift[518541] = 40; + mapOrbitShift[518543] = 92; + mapOrbitShift[518546] = 124; + mapOrbitShift[518547] = 47; + mapOrbitShift[519041] = 59; + mapOrbitShift[519043] = 59; + mapOrbitShift[519045] = 59; + mapOrbitShift[519497] = 86; + mapOrbitShift[519498] = 86; + mapOrbitShift[519499] = 86; + mapOrbitShift[519502] = 86; + mapOrbitShift[519503] = 86; + mapOrbitShift[519504] = 86; + mapOrbitShift[519506] = 86; + mapOrbitShift[519507] = 86; + mapOrbitShift[519903] = 62; + mapOrbitShift[519904] = 62; + mapOrbitShift[519905] = 62; + mapOrbitShift[519906] = 62; + mapOrbitShift[520259] = 76; + mapOrbitShift[520294] = 76; + mapOrbitShift[520471] = 46; + mapOrbitShift[520472] = 46; + mapOrbitShift[520473] = 46; + mapOrbitShift[523142] = 127; + mapOrbitShift[523148] = 127; + mapOrbitShift[523182] = 127; + mapOrbitShift[523186] = 127; + mapOrbitShift[523298] = 28; + mapOrbitShift[523306] = 28; + mapOrbitShift[523308] = 28; + mapOrbitShift[523309] = 28; + mapOrbitShift[523397] = 110; + mapOrbitShift[523399] = 110; + mapOrbitShift[523401] = 110; + mapOrbitShift[523441] = 117; + mapOrbitShift[523541] = 103; + mapOrbitShift[523559] = 103; + mapOrbitShift[523669] = 39; + mapOrbitShift[523671] = 39; + mapOrbitShift[523677] = 39; + mapOrbitShift[523728] = 113; + mapOrbitShift[523731] = 113; + mapOrbitShift[523779] = 41; + mapOrbitShift[523783] = 41; + mapOrbitShift[523786] = 41; + mapOrbitShift[523788] = 41; + mapOrbitShift[523789] = 41; + mapOrbitShift[523792] = 41; + mapOrbitShift[523797] = 41; + mapOrbitShift[523821] = 36; + mapOrbitShift[523897] = 38; + + int orbitShift = 0; + if (auto search = mapOrbitShift.find(runNumber); search != mapOrbitShift.end()) { + orbitShift = search->second; + } + // adjust to the nearest TF edge - orbitSOR = orbitSOR / nOrbitsPerTF * nOrbitsPerTF; // was with - 1; - orbitEOR = orbitEOR / nOrbitsPerTF * nOrbitsPerTF; // was with - 1; + orbitSOR = orbitSOR / nOrbitsPerTF * nOrbitsPerTF + orbitShift; + orbitEOR = orbitEOR / nOrbitsPerTF * nOrbitsPerTF + orbitShift; // set nOrbits and minOrbit used for orbit-axis binning nOrbits = orbitEOR - orbitSOR; @@ -569,13 +624,14 @@ struct EventSelectionQaTask { // first bc of the first orbit (should coincide with TF start) bcSOR = orbitSOR * nBCsPerOrbit; + // duration of TF in bcs nBCsPerTF = nOrbitsPerTF * nBCsPerOrbit; } // create orbit-axis histograms on the fly with binning based on info from GRP if GRP is available // otherwise default minOrbit and nOrbits will be used - const AxisSpec axisOrbits{nOrbits / static_cast(nOrbitsPerTF) /*128*/, 0., static_cast(nOrbits), ""}; + const AxisSpec axisOrbits{static_cast(nOrbits / nOrbitsPerTF), 0., static_cast(nOrbits), ""}; histos.add("hOrbitAll", "", kTH1F, {axisOrbits}); histos.add("hOrbitCol", "", kTH1F, {axisOrbits}); histos.add("hOrbitAcc", "", kTH1F, {axisOrbits}); @@ -586,6 +642,10 @@ struct EventSelectionQaTask { histos.add("hOrbitZDC", "", kTH1F, {axisOrbits}); histos.add("hOrbitColMC", "", kTH1F, {axisOrbits}); + const AxisSpec axisBCinTF{static_cast(nBCsPerTF), 0, static_cast(nBCsPerTF), "bc in TF"}; + histos.add("hNcontribVsBcInTF", ";bc in TF; n vertex contributors", kTH1F, {axisBCinTF}); + histos.add("hNcontribAfterCutsVsBcInTF", ";bc in TF; n vertex contributors", kTH1F, {axisBCinTF}); + double minSec = floor(tsSOR / 1000.); double maxSec = ceil(tsEOR / 1000.); const AxisSpec axisSeconds{static_cast(maxSec - minSec), minSec, maxSec, "seconds"}; @@ -992,12 +1052,9 @@ struct EventSelectionQaTask { histos.fill(HIST("hNcontribCol"), nContributors); - // monitor nContributors vs bc in timeframe: - if (flagMonitorBcInTF) { - int64_t bcInTF = (globalBC - bcSOR) % nBCsPerTF; - histos.fill(HIST("hNcontribVsBcInTF"), bcInTF, nContributors); - histos.fill(HIST("hNcontribAfterCutsVsBcInTF"), bcInTF, nContributorsAfterEtaTPCCuts); - } + int64_t bcInTF = (globalBC - bcSOR) % nBCsPerTF; + histos.fill(HIST("hNcontribVsBcInTF"), bcInTF, nContributors); + histos.fill(HIST("hNcontribAfterCutsVsBcInTF"), bcInTF, nContributorsAfterEtaTPCCuts); const auto& foundBC = col.foundBC_as(); @@ -1021,16 +1078,9 @@ struct EventSelectionQaTask { histos.fill(HIST("hTimeZACcol"), znDif, znSum); // FT0 - float multT0A = 0; - float multT0C = 0; - if (foundBC.has_ft0()) { - for (auto amplitude : foundBC.ft0().amplitudeA()) { - multT0A += amplitude; - } - for (auto amplitude : foundBC.ft0().amplitudeC()) { - multT0C += amplitude; - } - } + float multT0A = foundBC.has_ft0() ? foundBC.ft0().sumAmpA() : -999.f; + float multT0C = foundBC.has_ft0() ? foundBC.ft0().sumAmpC() : -999.f; + // FV0 float multV0A = 0; if (foundBC.has_fv0a()) { diff --git a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx index 1cee9c4c460..71fb9a22eb4 100644 --- a/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx +++ b/DPG/Tasks/AOTTrack/V0Cascades/perfK0sResolution.cxx @@ -21,14 +21,15 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/Tools/TrackTuner.h" using namespace o2; using namespace o2::track; using namespace o2::framework; using namespace o2::framework::expressions; -using PIDTracks = soa::Join; -using PIDTracksIU = soa::Join; +using PIDTracks = soa::Join; +using PIDTracksIUMC = soa::Join; using SelectedCollisions = soa::Join; struct perfK0sResolution { @@ -41,6 +42,7 @@ struct perfK0sResolution { ConfigurableAxis etaBins{"etaBins", {2, -1.f, 1.f}, "eta binning"}; ConfigurableAxis etaBinsDauthers{"etaBinsDauthers", {100, -1.f, 1.f}, "eta binning for daughters"}; ConfigurableAxis phiBins{"phiBins", {100, 0.f, 6.28f}, "phi binning"}; + ConfigurableAxis relpTResBins{"relpTResBins", {200, 0.f, 0.5f}, "rel. pT resolution binning"}; // Selection criteria Configurable v0setting_cospa{"v0setting_cospa", 0.995, "V0 CosPA"}; // shoudl be double in future @@ -50,7 +52,7 @@ struct perfK0sResolution { Configurable v0setting_radius{"v0setting_radius", 0.9, "V0 Radius"}; Configurable v0setting_rapidity{"v0setting_rapidity", 0.5, "rapidity"}; - Configurable v0lifetime{"v0lifetime", 3., "n ctau"}; + Configurable nV0lifetime{"nV0lifetime", 3., "n ctau"}; Configurable nMaxTPCNsigma{"nMaxTPCNsigma", 10., "Maximum TPC nsigma for pions"}; Configurable itsIbSelectionPos{"itsIbSelectionPos", 0, "Flag for the ITS IB selection on positive daughters: -1 no ITS IB, 0 no selection, 1 ITS IB"}; Configurable itsIbSelectionNeg{"itsIbSelectionNeg", 0, "Flag for the ITS IB IB selection on negative daughters: -1 no ITS IB, 0 no selection, 1 ITS IB"}; @@ -66,6 +68,7 @@ struct perfK0sResolution { Configurable useMultidimHisto{"useMultidimHisto", false, "use multidimentional histograms"}; Configurable enableTPCPlot{"enableTPCPlot", false, "Enable the TPC plot"}; Configurable computeInvMassFromDaughters{"computeInvMassFromDaughters", false, "Compute the invariant mass from the daughters"}; + Configurable requireTrueK0s{"requireTrueK0s", false, "require rec. v0 to be true K0s"}; // Configurable for event selection Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; @@ -74,31 +77,44 @@ struct perfK0sResolution { HistogramRegistry rK0sResolution{"K0sResolution", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry rK0sDauResolution{"K0sDauResolution", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + Service ccdb; + + // for TrackTuner only (MC smearing) + o2::parameters::GRPMagField* grpmag = nullptr; + o2::base::MatLayerCylSet* lut = nullptr; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + TrackTuner trackTunerObj; + + Configurable useTrackTuner{"useTrackTuner", false, "Apply Improver/DCA corrections to MC"}; + Configurable trackTunerParams{"trackTunerParams", "debugInfo=0|updateTrackCovMat=0|updateCurvature=1|updatePulls=0|isInputFileFromCCDB=1|pathInputFile=Users/m/mfaggin/test/inputsTrackTuner/PbPb2022|nameInputFile=trackTuner_DataLHC22sPass5_McLHC22l1b2_run529397.root|usePvRefitCorrections=0|oneOverPtCurrent=1|oneOverPtUpgr=1.2", "TrackTuner parameter initialization (format: =|=)"}; + OutputObj trackTunedTracks{TH1D("trackTunedTracks", "", 4, 0.5, 4.5), OutputObjHandlingPolicy::AnalysisObject}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + + int runNumber = -1; + void init(InitContext const&) { - const AxisSpec eventAxis{10, 0, 10, "Events"}; + const AxisSpec statAxis{5, 0, 5, "Stats"}; const AxisSpec mAxis{mBins, "#it{m} (GeV/#it{c}^{2})"}; const AxisSpec pTAxis{pTBins, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec pTResAxis{pTResBins, "#Delta#it{p}_{T} (GeV/#it{c})"}; const AxisSpec pTResRelAxis{pTResRelBins, "(#it{p}_{T}^{rec} - #it{p}_{T}^{MC})/#it{p}_{T}^{MC}"}; const AxisSpec invpTResAxis{invpTResBins, "1/#it{p}_{T}-1/#it{p}_{T}^{MC} (GeV/#it{c})^{-1}"}; + const AxisSpec relpTResAxis{relpTResBins, "#sigma(#it{p}_{T})/#it{p}_{T}"}; const AxisSpec etaAxis{etaBins, "#eta"}; const AxisSpec etaAxisPosD{etaBinsDauthers, "#eta pos."}; const AxisSpec etaAxisNegD{etaBinsDauthers, "#eta neg."}; const AxisSpec phiAxis{phiBins, "#phi"}; const AxisSpec trueK0Axis{2, -0.5, 1.5, "True K0"}; - int nProc = 0; - if (doprocessData) { - LOG(info) << "processData enabled"; - nProc++; - } - if (doprocessMC) { - LOG(info) << "processMC enabled"; - nProc++; + rK0sResolution.add("h1_stats", "h1_stats", {HistType::kTH1F, {statAxis}}); + TString hStatsLabels[5] = {"Selected Events", "All V0s", "Selected V0s", "Daughters have MC particles", "Daughters corr. rec."}; + for (Int_t n = 1; n <= rK0sResolution.get(HIST("h1_stats"))->GetNbinsX(); n++) { + rK0sResolution.get(HIST("h1_stats"))->GetXaxis()->SetBinLabel(n, hStatsLabels[n - 1]); } - rK0sResolution.add("h1_events", "h1_events", {HistType::kTH1F, {eventAxis}}); if (doprocessMC) { rK0sDauResolution.add("h2_massPosPtRes", "h2_massPosPtRes", {HistType::kTH2F, {mAxis, pTResAxis}}); rK0sDauResolution.add("h2_massNegPtRes", "h2_massNegPtRes", {HistType::kTH2F, {mAxis, pTResAxis}}); @@ -112,6 +128,9 @@ struct perfK0sResolution { rK0sDauResolution.add("h2_genPxNegPxRes", "h2_genPxNegPxRes", {HistType::kTH2F, {pTResRelAxis, pTAxis}}); rK0sDauResolution.add("h2_genPyNegPyRes", "h2_genPyNegPyRes", {HistType::kTH2F, {pTResRelAxis, pTAxis}}); rK0sDauResolution.add("h2_genPzNegPzRes", "h2_genPzNegPzRes", {HistType::kTH2F, {pTResRelAxis, pTAxis}}); + + rK0sDauResolution.add("h2_PosRelPtRes", "h2_PosRelPtRes", {HistType::kTH2F, {pTAxis, relpTResAxis}}); + rK0sDauResolution.add("h2_NegRelPtRes", "h2_NegRelPtRes", {HistType::kTH2F, {pTAxis, relpTResAxis}}); } rK0sResolution.add("h2_masspT", "h2_masspT", {HistType::kTH2F, {mAxis, pTAxis}}); rK0sResolution.add("h2_masseta", "h2_masseta", {HistType::kTH2F, {mAxis, etaAxis}}); @@ -127,6 +146,38 @@ struct perfK0sResolution { if (enableTPCPlot) { rK0sDauResolution.add("h3_tpc_vs_pid_hypothesis", "h3_tpc_vs_pid_hypothesis", {HistType::kTH3F, {{200, -10.f, 10.f, "#it{p}/Z (GeV/#it{c})"}, {1000, 0, 1000.f, "dE/dx (a.u.)"}, {10, -0.5, 9.5f, "PID hypothesis"}}}); } + + /// TrackTuner initialization + if (useTrackTuner) { + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); + std::string outputStringParams = trackTunerObj.configParams(trackTunerParams); + trackTunerObj.getDcaGraphs(); + // QA is done in tuneTrackParams method + trackTunedTracks->SetTitle(outputStringParams.c_str()); + trackTunedTracks->GetXaxis()->SetBinLabel(1, "all tracks"); + trackTunedTracks->GetXaxis()->SetBinLabel(2, "tracks tuned (no negative detXY)"); + trackTunedTracks->GetXaxis()->SetBinLabel(3, "untouched tracks due to negative detXY"); + trackTunedTracks->GetXaxis()->SetBinLabel(4, "original detXY<0"); + } + } + + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + if (runNumber == bc.runNumber()) { + return; + } + grpmag = ccdb->getForTimeStamp(grpmagPath, bc.timestamp()); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath; + } + LOG(info) << "Setting magnetic field to current " << grpmag->getL3Current() << " A for run " << bc.runNumber() << " from its GRPMagField CCDB object"; + o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + runNumber = bc.runNumber(); } template @@ -139,7 +190,7 @@ struct perfK0sResolution { if (v0.v0radius() < v0setting_radius) { return false; } - if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * pid_constants::sMasses[PID::K0] > 2.684 * v0lifetime) { + if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * pid_constants::sMasses[PID::K0] > 2.684 * nV0lifetime) { return false; } @@ -315,15 +366,16 @@ struct perfK0sResolution { void processData(soa::Filtered::iterator const& collision, soa::Filtered const& fullV0s, - PIDTracks const& tracks) + PIDTracks const&) { - rK0sResolution.fill(HIST("h1_events"), 0.5); + rK0sResolution.fill(HIST("h1_stats"), 0.5); for (auto& v0 : fullV0s) { - rK0sResolution.fill(HIST("h1_events"), 1.5); + rK0sResolution.fill(HIST("h1_stats"), 1.5); const auto& posTrack = v0.posTrack_as(); const auto& negTrack = v0.negTrack_as(); if (!acceptV0(v0, negTrack, posTrack, collision)) continue; + rK0sResolution.fill(HIST("h1_stats"), 2.5); float mass = v0.mK0Short(); if (computeInvMassFromDaughters) { @@ -346,53 +398,123 @@ struct perfK0sResolution { } PROCESS_SWITCH(perfK0sResolution, processData, "Process data", true); - void processMC(soa::Filtered::iterator const& collision, soa::Filtered> const& fullV0s, - soa::Join const& tracks, aod::McParticles const&) + // Running variables + o2::dataformats::VertexBase mVtx; + o2::dataformats::DCA mDcaInfoCovPos; + o2::dataformats::DCA mDcaInfoCovNeg; + o2::track::TrackParametrizationWithError mTrackParCovPos; + o2::track::TrackParametrizationWithError mTrackParCovNeg; + + template + void tuneV0(TV0 const& v0, + TV0Track const& posTrack, + TV0Track const& negTrack, + aod::McParticles const&, + aod::BCsWithTimestamps const& bcs) + { + initCCDB(bcs.begin()); + trackTunedTracks->Fill(1, 2); // tune 2 tracks + setTrackParCov(posTrack, mTrackParCovPos); + setTrackParCov(negTrack, mTrackParCovNeg); + mTrackParCovPos.setPID(posTrack.pidForTracking()); + mTrackParCovNeg.setPID(negTrack.pidForTracking()); + mDcaInfoCovPos.set(999, 999, 999, 999, 999); + mDcaInfoCovNeg.set(999, 999, 999, 999, 999); + auto mcParticlePos = posTrack.mcParticle(); + auto mcParticleNeg = negTrack.mcParticle(); + + // LOG(info) << "Inside tuneTrack: before calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); + trackTunerObj.tuneTrackParams(mcParticlePos, mTrackParCovPos, matCorr, &mDcaInfoCovPos, trackTunedTracks); + trackTunerObj.tuneTrackParams(mcParticleNeg, mTrackParCovNeg, matCorr, &mDcaInfoCovNeg, trackTunedTracks); + // LOG(info) << "Inside tuneTrack: after calling tuneTrackParams trackParCov.getY(): " << mTrackParCovPos.getY(); + // trackTunedTracks->Fill(1, 2); + mVtx.setPos({v0.x(), v0.y(), v0.z()}); + mVtx.setCov(v0.positionCovMat()[0], v0.positionCovMat()[1], v0.positionCovMat()[2], v0.positionCovMat()[3], v0.positionCovMat()[4], v0.positionCovMat()[5]); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCovPos, 2.f, matCorr, &mDcaInfoCovPos); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCovNeg, 2.f, matCorr, &mDcaInfoCovNeg); + } + + bool daughtersHaveMCParticles = false; + bool daughtersCorrRec = false; + + void processMC(soa::Filtered::iterator const& collision, + soa::Filtered> const& fullV0s, + PIDTracksIUMC const&, + aod::McParticles const& mcParticles, + aod::BCsWithTimestamps const& bcs) { - rK0sResolution.fill(HIST("h1_events"), 0.5); + rK0sResolution.fill(HIST("h1_stats"), 0.5); for (auto& v0 : fullV0s) { - rK0sResolution.fill(HIST("h1_events"), 1.5); - const auto& posTrack = v0.posTrack_as>(); - const auto& negTrack = v0.negTrack_as>(); + rK0sResolution.fill(HIST("h1_stats"), 1.5); + const auto& posTrack = v0.posTrack_as(); + const auto& negTrack = v0.negTrack_as(); if (!acceptV0(v0, negTrack, posTrack, collision)) continue; - if (!posTrack.has_mcParticle()) { - continue; - } - if (!negTrack.has_mcParticle()) { - continue; + rK0sResolution.fill(HIST("h1_stats"), 2.5); + + if (posTrack.has_mcParticle() && negTrack.has_mcParticle()) { + daughtersHaveMCParticles = true; + rK0sResolution.fill(HIST("h1_stats"), 3.5); + if (posTrack.mcParticle().pdgCode() == 211 && negTrack.mcParticle().pdgCode() == -211) { + daughtersCorrRec = true; + rK0sResolution.fill(HIST("h1_stats"), 4.5); + } } - if (posTrack.mcParticle().pdgCode() != 211 || negTrack.mcParticle().pdgCode() != -211) { - continue; + + if (useTrackTuner && daughtersHaveMCParticles) { + tuneV0(v0, posTrack, negTrack, mcParticles, bcs); } + float mass = v0.mK0Short(); + if (computeInvMassFromDaughters) { mass = RecoDecay::m(std::array{std::array{posTrack.px(), posTrack.py(), posTrack.pz()}, std::array{negTrack.px(), negTrack.py(), negTrack.pz()}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}); } + if (useTrackTuner && daughtersHaveMCParticles) { + std::array pPos{0., 0., 0.}; + std::array pNeg{0., 0., 0.}; + mTrackParCovPos.getPxPyPzGlo(pPos); + mTrackParCovNeg.getPxPyPzGlo(pNeg); + mass = RecoDecay::m(std::array{std::array{pPos[0], pPos[1], pPos[2]}, + std::array{pNeg[0], pNeg[1], pNeg[2]}}, + std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}); + } + const bool isTrueK0s = (v0.has_mcParticle() && v0.mcParticle().pdgCode() == 310); - rK0sDauResolution.fill(HIST("h2_genPtPosPtRes"), (v0.positivept() - posTrack.mcParticle().pt()) / posTrack.mcParticle().pt(), posTrack.mcParticle().pt()); - rK0sDauResolution.fill(HIST("h2_genPxPosPxRes"), (v0.pxpos() - posTrack.mcParticle().px()) / posTrack.mcParticle().px(), posTrack.mcParticle().px()); - rK0sDauResolution.fill(HIST("h2_genPyPosPyRes"), (v0.pypos() - posTrack.mcParticle().py()) / posTrack.mcParticle().py(), posTrack.mcParticle().py()); - rK0sDauResolution.fill(HIST("h2_genPzPosPzRes"), (v0.pzpos() - posTrack.mcParticle().pz()) / posTrack.mcParticle().pz(), posTrack.mcParticle().pz()); - - rK0sDauResolution.fill(HIST("h2_genPtNegPtRes"), (v0.negativept() - negTrack.mcParticle().pt()) / negTrack.mcParticle().pt(), negTrack.mcParticle().pt()); - rK0sDauResolution.fill(HIST("h2_genPxNegPxRes"), (v0.pxneg() - negTrack.mcParticle().px()) / negTrack.mcParticle().px(), negTrack.mcParticle().px()); - rK0sDauResolution.fill(HIST("h2_genPyNegPyRes"), (v0.pyneg() - negTrack.mcParticle().py()) / negTrack.mcParticle().py(), negTrack.mcParticle().py()); - rK0sDauResolution.fill(HIST("h2_genPzNegPzRes"), (v0.pzneg() - negTrack.mcParticle().pz()) / negTrack.mcParticle().pz(), negTrack.mcParticle().pz()); - - rK0sDauResolution.fill(HIST("h2_massPosPtRes"), mass, v0.positivept() - posTrack.mcParticle().pt()); - rK0sDauResolution.fill(HIST("h2_massNegPtRes"), mass, v0.negativept() - negTrack.mcParticle().pt()); + if (!isTrueK0s && requireTrueK0s) { + continue; + } + + // QA of correctly reconstructed V0 daughters + if (daughtersCorrRec) { + rK0sDauResolution.fill(HIST("h2_genPtPosPtRes"), (v0.positivept() - posTrack.mcParticle().pt()) / posTrack.mcParticle().pt(), posTrack.mcParticle().pt()); + rK0sDauResolution.fill(HIST("h2_genPxPosPxRes"), (v0.pxpos() - posTrack.mcParticle().px()) / posTrack.mcParticle().px(), posTrack.mcParticle().px()); + rK0sDauResolution.fill(HIST("h2_genPyPosPyRes"), (v0.pypos() - posTrack.mcParticle().py()) / posTrack.mcParticle().py(), posTrack.mcParticle().py()); + rK0sDauResolution.fill(HIST("h2_genPzPosPzRes"), (v0.pzpos() - posTrack.mcParticle().pz()) / posTrack.mcParticle().pz(), posTrack.mcParticle().pz()); + + rK0sDauResolution.fill(HIST("h2_genPtNegPtRes"), (v0.negativept() - negTrack.mcParticle().pt()) / negTrack.mcParticle().pt(), negTrack.mcParticle().pt()); + rK0sDauResolution.fill(HIST("h2_genPxNegPxRes"), (v0.pxneg() - negTrack.mcParticle().px()) / negTrack.mcParticle().px(), negTrack.mcParticle().px()); + rK0sDauResolution.fill(HIST("h2_genPyNegPyRes"), (v0.pyneg() - negTrack.mcParticle().py()) / negTrack.mcParticle().py(), negTrack.mcParticle().py()); + rK0sDauResolution.fill(HIST("h2_genPzNegPzRes"), (v0.pzneg() - negTrack.mcParticle().pz()) / negTrack.mcParticle().pz(), negTrack.mcParticle().pz()); + + rK0sDauResolution.fill(HIST("h2_massPosPtRes"), mass, v0.positivept() - posTrack.mcParticle().pt()); + rK0sDauResolution.fill(HIST("h2_massNegPtRes"), mass, v0.negativept() - negTrack.mcParticle().pt()); + if (useMultidimHisto) { + rK0sResolution.fill(HIST("thn_mass"), mass, v0.pt(), v0.eta(), v0.phi(), posTrack.eta(), negTrack.eta(), + 1. / v0.positivept() - 1. / posTrack.mcParticle().pt(), + 1. / v0.negativept() - 1. / negTrack.mcParticle().pt(), + isTrueK0s); + } + } + + // QA of seleted V0s + rK0sDauResolution.fill(HIST("h2_PosRelPtRes"), v0.positivept(), RecoDecay::sqrtSumOfSquares(v0.covMatPosDau()[9], v0.covMatPosDau()[14]), v0.positivept()); + rK0sDauResolution.fill(HIST("h2_NegRelPtRes"), v0.negativept(), RecoDecay::sqrtSumOfSquares(v0.covMatNegDau()[9], v0.covMatNegDau()[14]), v0.positivept()); rK0sResolution.fill(HIST("h2_masspT"), mass, v0.pt()); rK0sResolution.fill(HIST("h2_masseta"), mass, v0.eta()); rK0sResolution.fill(HIST("h2_massphi"), mass, v0.phi()); - if (useMultidimHisto) { - rK0sResolution.fill(HIST("thn_mass"), mass, v0.pt(), v0.eta(), v0.phi(), posTrack.eta(), negTrack.eta(), - 1. / v0.positivept() - 1. / posTrack.mcParticle().pt(), - 1. / v0.negativept() - 1. / negTrack.mcParticle().pt(), - isTrueK0s); - } } } PROCESS_SWITCH(perfK0sResolution, processMC, "Process MC", false); diff --git a/DPG/Tasks/AOTTrack/qaEventTrack.cxx b/DPG/Tasks/AOTTrack/qaEventTrack.cxx index a9f41f904d5..c19a8494492 100644 --- a/DPG/Tasks/AOTTrack/qaEventTrack.cxx +++ b/DPG/Tasks/AOTTrack/qaEventTrack.cxx @@ -61,6 +61,9 @@ struct qaEventTrack { // options to select specific events Configurable selectGoodEvents{"selectGoodEvents", true, "select good events"}; + // option to apply a timeframe cut + Configurable tfCut{"tfCut", false, "applies timeframe cut"}; + // options to select only specific tracks Configurable trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; Configurable selectCharge{"selectCharge", 0, "select charge +1 or -1 (0 means no selection)"}; @@ -624,6 +627,9 @@ struct qaEventTrack { if (selectGoodEvents && !(isRun3 ? collision.sel8() : collision.sel7())) { // currently only sel8 is defined for run3 return false; } + if (tfCut && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + return false; + } if constexpr (doFill) { histos.fill(HIST("Events/recoEff"), 2); } diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h index 200e1215298..9675ab710a3 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h @@ -22,10 +22,16 @@ #include #include "TMath.h" #include "PWGCF/FemtoUniverse/DataModel/FemtoDerived.h" +#include "PWGCF/FemtoUniverse/Core/FemtoUniverseFemtoContainer.h" +#include "PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h" +#include "PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h" #include "Framework/HistogramRegistry.h" using namespace o2; +using namespace o2::analysis::femtoUniverse; using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::soa; namespace o2::analysis { @@ -55,8 +61,11 @@ class FemtoUniverseDetaDphiStar if constexpr (mPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && mPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kTrack) { std::string dirName = static_cast(dirNames[0]); - histdetadpi[0][0] = mHistogramRegistry->add((dirName + static_cast(histNames[0][0])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); - histdetadpi[0][1] = mHistogramRegistry->add((dirName + static_cast(histNames[1][0])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpisame[0][0] = mHistogramRegistry->add((dirName + static_cast(histNamesSame[0][0])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpisame[0][1] = mHistogramRegistry->add((dirName + static_cast(histNamesSame[1][0])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[0][0] = mHistogramRegistry->add((dirName + static_cast(histNamesMixed[0][0])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[0][1] = mHistogramRegistry->add((dirName + static_cast(histNamesMixed[1][0])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + if (plotForEveryRadii) { for (int i = 0; i < 9; i++) { histdetadpiRadii[0][i] = mHistogramRegistryQA->add((dirName + static_cast(histNamesRadii[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); @@ -66,8 +75,11 @@ class FemtoUniverseDetaDphiStar if constexpr (mPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && mPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kV0) { for (int i = 0; i < 2; i++) { std::string dirName = static_cast(dirNames[1]); - histdetadpi[i][0] = mHistogramRegistry->add((dirName + static_cast(histNames[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); - histdetadpi[i][1] = mHistogramRegistry->add((dirName + static_cast(histNames[1][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpisame[i][0] = mHistogramRegistry->add((dirName + static_cast(histNamesSame[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpisame[i][1] = mHistogramRegistry->add((dirName + static_cast(histNamesSame[1][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[i][0] = mHistogramRegistry->add((dirName + static_cast(histNamesMixed[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[i][1] = mHistogramRegistry->add((dirName + static_cast(histNamesMixed[1][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + if (plotForEveryRadii) { for (int j = 0; j < 9; j++) { histdetadpiRadii[i][j] = mHistogramRegistryQA->add((dirName + static_cast(histNamesRadii[i][j])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); @@ -78,8 +90,10 @@ class FemtoUniverseDetaDphiStar if constexpr (mPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && mPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kPhi) { for (int i = 0; i < 2; i++) { std::string dirName = static_cast(dirNames[2]); - histdetadpi[i][0] = mHistogramRegistry->add((dirName + static_cast(histNames[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); - histdetadpi[i][1] = mHistogramRegistry->add((dirName + static_cast(histNames[1][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpisame[i][0] = mHistogramRegistry->add((dirName + static_cast(histNamesSame[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpisame[i][1] = mHistogramRegistry->add((dirName + static_cast(histNamesSame[1][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[i][0] = mHistogramRegistry->add((dirName + static_cast(histNamesMixed[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[i][1] = mHistogramRegistry->add((dirName + static_cast(histNamesMixed[1][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); if (plotForEveryRadii) { for (int j = 0; j < 9; j++) { histdetadpiRadii[i][j] = mHistogramRegistryQA->add((dirName + static_cast(histNamesRadii[i][j])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); @@ -90,8 +104,11 @@ class FemtoUniverseDetaDphiStar if constexpr (mPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && mPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kD0) { for (int i = 0; i < 2; i++) { std::string dirName = static_cast(dirNames[3]); - histdetadpi[i][0] = mHistogramRegistry->add((dirName + static_cast(histNames[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); - histdetadpi[i][1] = mHistogramRegistry->add((dirName + static_cast(histNames[1][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpisame[i][0] = mHistogramRegistry->add((dirName + static_cast(histNamesSame[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpisame[i][1] = mHistogramRegistry->add((dirName + static_cast(histNamesSame[1][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[i][0] = mHistogramRegistry->add((dirName + static_cast(histNamesMixed[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[i][1] = mHistogramRegistry->add((dirName + static_cast(histNamesMixed[1][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + if (plotForEveryRadii) { for (int j = 0; j < 9; j++) { histdetadpiRadii[i][j] = mHistogramRegistryQA->add((dirName + static_cast(histNamesRadii[i][j])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); @@ -102,7 +119,7 @@ class FemtoUniverseDetaDphiStar } /// Check if pair is close or not template - bool isClosePair(Part const& part1, Part const& part2, Parts const& particles, float lmagfield) + bool isClosePair(Part const& part1, Part const& part2, Parts const& particles, float lmagfield, uint8_t ChosenEventType) { magfield = lmagfield; @@ -115,11 +132,24 @@ class FemtoUniverseDetaDphiStar } auto deta = part1.eta() - part2.eta(); auto dphiAvg = AveragePhiStar(part1, part2, 0); - histdetadpi[0][0]->Fill(deta, dphiAvg); + if (ChosenEventType == femtoUniverseContainer::EventType::same) { + histdetadpisame[0][0]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femtoUniverseContainer::EventType::mixed) { + histdetadpimixed[0][0]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } + if (pow(dphiAvg, 2) / pow(deltaPhiMax, 2) + pow(deta, 2) / pow(deltaEtaMax, 2) < 1.) { return true; } else { - histdetadpi[0][1]->Fill(deta, dphiAvg); + if (ChosenEventType == femtoUniverseContainer::EventType::same) { + histdetadpisame[0][1]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femtoUniverseContainer::EventType::mixed) { + histdetadpimixed[0][1]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } return false; } @@ -137,11 +167,24 @@ class FemtoUniverseDetaDphiStar auto daughter = particles.begin() + indexOfDaughter; auto deta = part1.eta() - daughter.eta(); auto dphiAvg = AveragePhiStar(part1, *daughter, i); - histdetadpi[i][0]->Fill(deta, dphiAvg); + if (ChosenEventType == femtoUniverseContainer::EventType::same) { + histdetadpisame[i][0]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femtoUniverseContainer::EventType::mixed) { + histdetadpimixed[i][0]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } + if (pow(dphiAvg, 2) / pow(deltaPhiMax, 2) + pow(deta, 2) / pow(deltaEtaMax, 2) < 1.) { pass = true; } else { - histdetadpi[i][1]->Fill(deta, dphiAvg); + if (ChosenEventType == femtoUniverseContainer::EventType::same) { + histdetadpisame[i][1]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femtoUniverseContainer::EventType::mixed) { + histdetadpimixed[i][1]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } } } return pass; @@ -160,11 +203,24 @@ class FemtoUniverseDetaDphiStar auto deta = part1.eta() - daughter.eta(); auto dphiAvg = CalculateDphiStar(part1, *daughter); dphiAvg = TVector2::Phi_mpi_pi(dphiAvg); - histdetadpi[i][0]->Fill(deta, dphiAvg); + if (ChosenEventType == femtoUniverseContainer::EventType::same) { + histdetadpisame[i][0]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femtoUniverseContainer::EventType::mixed) { + histdetadpimixed[i][0]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } + if ((fabs(dphiAvg) < CutDeltaPhStar) && (fabs(deta) < CutDeltaEta)) { pass = true; // pair is close } else { - histdetadpi[i][1]->Fill(deta, dphiAvg); + if (ChosenEventType == femtoUniverseContainer::EventType::same) { + histdetadpisame[i][1]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femtoUniverseContainer::EventType::mixed) { + histdetadpimixed[i][1]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } } } return pass; @@ -183,11 +239,24 @@ class FemtoUniverseDetaDphiStar auto deta = part1.eta() - daughter.eta(); auto dphiAvg = CalculateDphiStar(part1, *daughter); dphiAvg = TVector2::Phi_mpi_pi(dphiAvg); - histdetadpi[i][0]->Fill(deta, dphiAvg); + if (ChosenEventType == femtoUniverseContainer::EventType::same) { + histdetadpisame[i][0]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femtoUniverseContainer::EventType::mixed) { + histdetadpimixed[i][0]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } + if ((fabs(dphiAvg) < CutDeltaPhStar) && (fabs(deta) < CutDeltaEta)) { pass = true; // pair is close } else { - histdetadpi[i][1]->Fill(deta, dphiAvg); + if (ChosenEventType == femtoUniverseContainer::EventType::same) { + histdetadpisame[i][1]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femtoUniverseContainer::EventType::mixed) { + histdetadpimixed[i][1]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } } } return pass; @@ -202,8 +271,11 @@ class FemtoUniverseDetaDphiStar HistogramRegistry* mHistogramRegistryQA = nullptr; ///< For QA output static constexpr std::string_view dirNames[4] = {"kTrack_kTrack/", "kTrack_kV0/", "kTrack_kPhi/", "kTrack_kD0/"}; - static constexpr std::string_view histNames[2][2] = {{"detadphidetadphi0Before_0", "detadphidetadphi0Before_1"}, - {"detadphidetadphi0After_0", "detadphidetadphi0After_1"}}; + static constexpr std::string_view histNamesSame[2][2] = {{"detadphidetadphi0BeforeSame_0", "detadphidetadphi0BeforeSame_1"}, + {"detadphidetadphi0AfterSame_0", "detadphidetadphi0AfterSame_1"}}; + static constexpr std::string_view histNamesMixed[2][2] = {{"detadphidetadphi0BeforeMixed_0", "detadphidetadphi0BeforeMixed_1"}, + {"detadphidetadphi0AfterMixed_0", "detadphidetadphi0AfterMixed_1"}}; + static constexpr std::string_view histNamesRadii[2][9] = {{"detadphidetadphi0Before_0_0", "detadphidetadphi0Before_0_1", "detadphidetadphi0Before_0_2", "detadphidetadphi0Before_0_3", "detadphidetadphi0Before_0_4", "detadphidetadphi0Before_0_5", "detadphidetadphi0Before_0_6", "detadphidetadphi0Before_0_7", "detadphidetadphi0Before_0_8"}, @@ -227,7 +299,8 @@ class FemtoUniverseDetaDphiStar float magfield; bool plotForEveryRadii = false; - std::array, 2>, 2> histdetadpi{}; + std::array, 2>, 2> histdetadpisame{}; + std::array, 2>, 2> histdetadpimixed{}; std::array, 9>, 2> histdetadpiRadii{}; /// Calculate phi at all required radii stored in tmpRadiiTPC diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx index 71bc29b6de5..980a16b7ded 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx @@ -103,17 +103,17 @@ struct femtoUniversePairTaskTrackD0 { struct : o2::framework::ConfigurableGroup { Configurable ConfPDGCodeD0{"ConfPDGCodeD0", 421, "D0 meson - PDG code"}; Configurable ConfPDGCodeD0bar{"ConfPDGCodeD0bar", -421, "D0bar meson - PDG code"}; - Configurable ConfMinInvMassD0D0bar{"ConfMinInvMassD0D0bar", 1.65, "D0/D0bar sel. - min. invMass"}; - Configurable ConfMaxInvMassD0D0bar{"ConfMaxInvMassD0D0bar", 2.05, "D0/D0bar sel. - max. invMass"}; + Configurable ConfMinInvMassD0D0bar{"ConfMinInvMassD0D0bar", 1.65, "D0/D0bar sel. - min. invMass"}; + Configurable ConfMaxInvMassD0D0bar{"ConfMaxInvMassD0D0bar", 2.05, "D0/D0bar sel. - max. invMass"}; } ConfDmesons; struct : o2::framework::ConfigurableGroup { - Configurable ConfSignalRegionMin{"ConfSignalRegionMin", 1.810, "Min. inv. mass for D0/D0bar in the signal region"}; - Configurable ConfSignalRegionMax{"ConfSignalRegionMax", 1.922, "Max. inv. mass for D0/D0bar in the signal region"}; - Configurable ConfMinInvMassLeftSB{"ConfMinInvMassLeftSB", 1.642, "Min. inv. mass for D0/D0bar in the left sideband region"}; - Configurable ConfMaxInvMassLeftSB{"ConfMaxInvMassLeftSB", 1.754, "Max. inv. mass for D0/D0bar in the left sideband region"}; - Configurable ConfMinInvMassRightSB{"ConfMinInvMassRightSB", 1.978, "Min. inv. mass for D0/D0bar in the right sideband region"}; - Configurable ConfMaxInvMassRightSB{"ConfMaxInvMassRightSB", 2.090, "Max. inv. mass for D0/D0bar in the right sideband region"}; + Configurable ConfSignalRegionMin{"ConfSignalRegionMin", 1.810, "Min. inv. mass for D0/D0bar in the signal region"}; + Configurable ConfSignalRegionMax{"ConfSignalRegionMax", 1.922, "Max. inv. mass for D0/D0bar in the signal region"}; + Configurable ConfMinInvMassLeftSB{"ConfMinInvMassLeftSB", 1.642, "Min. inv. mass for D0/D0bar in the left sideband region"}; + Configurable ConfMaxInvMassLeftSB{"ConfMaxInvMassLeftSB", 1.754, "Max. inv. mass for D0/D0bar in the left sideband region"}; + Configurable ConfMinInvMassRightSB{"ConfMinInvMassRightSB", 1.978, "Min. inv. mass for D0/D0bar in the right sideband region"}; + Configurable ConfMaxInvMassRightSB{"ConfMaxInvMassRightSB", 2.090, "Max. inv. mass for D0/D0bar in the right sideband region"}; } ConfD0D0barSideBand; Configurable> binsPt{"binsPt", std::vector{hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits"}; @@ -187,8 +187,10 @@ struct femtoUniversePairTaskTrackD0 { HistogramRegistry registry{"registry", {{"hInvMassD0", ";#it{M}(K^{-}#pi^{+}) (GeV/#it{c}^{2});counts", {HistType::kTH1F, {ConfInvMassBins}}}, {"hInvMassD0bar", ";#it{M}(#pi^{-}K^{+}) (GeV/#it{c}^{2});counts", {HistType::kTH1F, {ConfInvMassBins}}}, - {"hPtD0", ";#it{p}_{T} (GeV/#it{c});counts", {HistType::kTH1F, {ConfPtBins}}}, - {"hPtD0bar", ";#it{p}_{T} (GeV/#it{c});counts", {HistType::kTH1F, {ConfPtBins}}}, + {"hPtDmesonCand", "2-prong candidates;#it{p}_{T} (GeV/#it{c});counts", {HistType::kTH1F, {ConfPtBins}}}, + {"hPtD0", "D^{0} cand.;#it{p}_{T} (GeV/#it{c});counts", {HistType::kTH1F, {ConfPtBins}}}, + {"hPtD0bar", "#bar{D^{0}};#it{p}_{T} (GeV/#it{c});counts", {HistType::kTH1F, {ConfPtBins}}}, + {"hPtD0D0bar", "#bar{D^{0}};#it{p}_{T} (GeV/#it{c});counts", {HistType::kTH1F, {ConfPtBins}}}, {"hPhiDmesonCand", ";#varphi (rad);counts", {HistType::kTH1F, {{80, 0., 2. * o2::constants::math::PI}}}}, {"hPhiD0", ";#varphi (rad);counts", {HistType::kTH1F, {{80, 0., 2. * o2::constants::math::PI}}}}, {"hPhiD0bar", ";#varphi (rad);counts", {HistType::kTH1F, {{80, 0., 2. * o2::constants::math::PI}}}}, @@ -351,7 +353,6 @@ struct femtoUniversePairTaskTrackD0 { registry.add("hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {ConfInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("hMassVsPtFinerBinning", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {ConfInvMassFinerBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("hInvMassVsPtOnlyD0D0bar", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {ConfInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("hPtDmesonCand", "2-prong candidates;#it{p}_{T} (GeV/#it{c});counts", {HistType::kTH1F, {{vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("hDeltaPhiSigSig", "SxS correlation;#Delta#varphi (rad);counts", {HistType::kTH1F, {{50, -0.5 * o2::constants::math::PI, 1.5 * o2::constants::math::PI}}}); registry.add("hDeltaPhiD0BgD0barSig", "B(D0)x S(D0bar) correlation;#Delta#varphi (rad);counts", {HistType::kTH1F, {{50, -0.5 * o2::constants::math::PI, 1.5 * o2::constants::math::PI}}}); registry.add("hDeltaPhiD0SigD0barBg", "S(D0)x B(D0bar) correlation;#Delta#varphi (rad);counts", {HistType::kTH1F, {{50, -0.5 * o2::constants::math::PI, 1.5 * o2::constants::math::PI}}}); @@ -393,6 +394,9 @@ struct femtoUniversePairTaskTrackD0 { // loop over D0/D0bar mesons (ONLY) for (auto const& d0d0bar : groupPartsOnlyD0D0bar) { + + registry.fill(HIST("hPtD0D0bar"), d0d0bar.pt()); + if (d0d0bar.mLambda() > 0.0f && d0d0bar.mAntiLambda() < 0.0f) { registry.fill(HIST("hInvMassVsPtOnlyD0D0bar"), d0d0bar.mLambda(), d0d0bar.pt()); if (d0d0bar.mLambda() > ConfDmesons.ConfMinInvMassD0D0bar && d0d0bar.mLambda() < ConfDmesons.ConfMaxInvMassD0D0bar) { @@ -513,7 +517,7 @@ struct femtoUniversePairTaskTrackD0 { } // // Close Pair Rejection if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(track, d0candidate, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(track, d0candidate, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -580,7 +584,7 @@ struct femtoUniversePairTaskTrackD0 { } } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(track, d0candidate, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(track, d0candidate, parts, magFieldTesla, femtoUniverseContainer::EventType::mixed)) { continue; } } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index 9ca1edf50dc..5a6d68b9839 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -421,7 +421,7 @@ struct femtoUniversePairTaskTrackPhi { } // // Close Pair Rejection if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -511,7 +511,7 @@ struct femtoUniversePairTaskTrackPhi { } } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla, femtoUniverseContainer::EventType::mixed)) { continue; } } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack.cxx index ba3ea87efd5..6766d53d1ac 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack.cxx @@ -254,7 +254,7 @@ struct femtoUniversePairTaskTrackTrack { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -339,7 +339,7 @@ struct femtoUniversePairTaskTrackTrack { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::mixed)) { continue; } } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx index 1dd9592adc0..4cf5f5092af 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx @@ -451,7 +451,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -485,7 +485,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -629,7 +629,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::mixed)) { continue; } } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx index 799eb890e07..e1ffe799ca0 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx @@ -430,7 +430,7 @@ struct femtoUniversePairTaskTrackTrackExtended { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -486,7 +486,7 @@ struct femtoUniversePairTaskTrackTrackExtended { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -585,7 +585,7 @@ struct femtoUniversePairTaskTrackTrackExtended { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::mixed)) { continue; } } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMC.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMC.cxx index 71a4a85c333..02efd66a3e7 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMC.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMC.cxx @@ -448,7 +448,7 @@ struct femtoUniversePairTaskTrackTrackMC { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -480,7 +480,7 @@ struct femtoUniversePairTaskTrackTrackMC { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -594,7 +594,7 @@ struct femtoUniversePairTaskTrackTrackMC { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::mixed)) { continue; } } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMultKtExtended.cxx index 777266a111b..44024c9eb24 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMultKtExtended.cxx @@ -461,7 +461,7 @@ struct femtoUniversePairTaskTrackTrackMultKtExtended { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -491,7 +491,7 @@ struct femtoUniversePairTaskTrackTrackMultKtExtended { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -603,7 +603,7 @@ struct femtoUniversePairTaskTrackTrackMultKtExtended { } if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::mixed)) { continue; } } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx index e49d3f028a0..5b557a6a093 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx @@ -223,7 +223,7 @@ struct femtoUniversePairTaskTrackV0Extended { /// Now build the combinations for (auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -270,7 +270,7 @@ struct femtoUniversePairTaskTrackV0Extended { /// Now build the combinations for (auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsTwo, groupPartsTwo))) { if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femtoUniverseContainer::EventType::same)) { continue; } } @@ -309,7 +309,7 @@ struct femtoUniversePairTaskTrackV0Extended { for (auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla1)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla1, femtoUniverseContainer::EventType::mixed)) { continue; } } @@ -352,7 +352,7 @@ struct femtoUniversePairTaskTrackV0Extended { for (auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsTwo, groupPartsTwo))) { if (ConfIsCPR.value) { - if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla1)) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla1, femtoUniverseContainer::EventType::mixed)) { continue; } } diff --git a/PWGCF/TableProducer/dptdptfilter.cxx b/PWGCF/TableProducer/dptdptfilter.cxx index 77591a6d103..e24e7da572c 100644 --- a/PWGCF/TableProducer/dptdptfilter.cxx +++ b/PWGCF/TableProducer/dptdptfilter.cxx @@ -53,7 +53,7 @@ namespace o2::analysis::dptdptfilter { using DptDptFullTracks = soa::Join; using DptDptFullTracksAmbiguous = soa::Join; -using DptDptTracksPID = soa::Join; +using DptDptTracksPID = soa::Join; using DptDptFullTracksPID = soa::Join; using DptDptFullTracksPIDAmbiguous = soa::Join; using DptDptFullTracksDetLevel = soa::Join; diff --git a/PWGCF/TableProducer/dptdptfilter.h b/PWGCF/TableProducer/dptdptfilter.h index 86817fcd97f..2917ddcbd8b 100644 --- a/PWGCF/TableProducer/dptdptfilter.h +++ b/PWGCF/TableProducer/dptdptfilter.h @@ -908,6 +908,13 @@ struct PIDSpeciesSelection { return closeToTPC(config, sp) && awayFromTPC(config, sp); }; + /* let's start discarding garbage */ + if (track.hasTOF()) { + if (track.beta() < 0.42) { + return -127; + } + } + /* let's first check the exclusion from the analysis */ for (uint8_t ix = 0; ix < configexclude.size(); ++ix) { if (isA(configexclude[ix], speciesexclude[ix])) { diff --git a/PWGCF/TwoParticleCorrelations/Tasks/efficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/efficiencyAndQc.cxx index d31f4e52734..c4ceadeeb59 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/efficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/efficiencyAndQc.cxx @@ -61,16 +61,20 @@ enum BeforeAfter { std::vector poinames; ///< the species of interest names std::vector tnames; ///< the track names +static const std::vector allmainspecies{o2::track::PID::Electron, o2::track::PID::Muon, o2::track::PID::Pion, o2::track::PID::Kaon, o2::track::PID::Proton}; +static const std::vector allmainspnames{"ElectronP", "ElectronM", "MuonP", "MuonM", "PionP", "PionM", "KaonP", "KaonM", "ProtonP", "ProtonM"}; static const std::vector mainspecies{o2::track::PID::Pion, o2::track::PID::Kaon, o2::track::PID::Proton}; static const std::vector mainspnames{"PionP", "PionM", "KaonP", "KaonM", "ProtonP", "ProtonM"}; static const std::vector pdgcodes = {11, 13, 211, 321, 2212}; static const std::vector mainsptitles{"#pi^{#plus}", "#pi^{#minus}", "K^{#plus}", "K^{#minus}", "p", "#bar{p}"}; +static const std::vector allmainsptitles{"e^{#plus}", "e^{#minus}", "#mu^{#plus}", "#mu^{#minus}", "#pi^{#plus}", "#pi^{#minus}", "K^{#plus}", "K^{#minus}", "p", "#bar{p}"}; } // namespace efficiencyandqatask /* the QA data collecting engine */ struct QADataCollectingEngine { uint nsp = static_cast(efficiencyandqatask::tnames.size()); uint nmainsp = static_cast(efficiencyandqatask::mainspnames.size()); + uint nallmainsp = static_cast(efficiencyandqatask::allmainspnames.size()); //=================================================== // The QA output objects @@ -400,25 +404,26 @@ struct QADataCollectingEngine { struct PidDataCollectingEngine { uint nsp = static_cast(efficiencyandqatask::tnames.size()); uint nmainsp = static_cast(efficiencyandqatask::mainspnames.size()); + uint nallmainsp = static_cast(efficiencyandqatask::allmainspnames.size()); /* PID histograms */ /* before and after */ std::vector> fhTPCdEdxSignalVsP{2, nullptr}; std::vector>> fhTPCdEdxSignalDiffVsP{2, {nmainsp, nullptr}}; - std::vector>> fhTPCnSigmasVsP{2, {nmainsp, nullptr}}; + std::vector>> fhTPCnSigmasVsP{2, {nallmainsp, nullptr}}; std::vector> fhTOFSignalVsP{2, nullptr}; std::vector>> fhTOFSignalDiffVsP{2, {nmainsp, nullptr}}; - std::vector>> fhTOFnSigmasVsP{2, {nmainsp, nullptr}}; + std::vector>> fhTOFnSigmasVsP{2, {nallmainsp, nullptr}}; std::vector> fhPvsTOFSqMass{2, nullptr}; std::vector>> fhTPCTOFSigmaVsP{2, {nmainsp, nullptr}}; /* PID histograms */ /* only after track selection */ std::vector> fhIdTPCdEdxSignalVsP{nsp, nullptr}; - std::vector>> fhIdTPCdEdxSignalDiffVsP{nsp, {nsp, nullptr}}; - std::vector>> fhIdTPCnSigmasVsP{nsp, {nmainsp, nullptr}}; + std::vector>> fhIdTPCdEdxSignalDiffVsP{nsp, {nmainsp, nullptr}}; + std::vector>> fhIdTPCnSigmasVsP{nsp, {nallmainsp, nullptr}}; std::vector> fhIdTOFSignalVsP{nsp, nullptr}; - std::vector>> fhIdTOFSignalDiffVsP{nsp, {nsp, nullptr}}; - std::vector>> fhIdTOFnSigmasVsP{nsp, {nmainsp, nullptr}}; + std::vector>> fhIdTOFSignalDiffVsP{nsp, {nmainsp, nullptr}}; + std::vector>> fhIdTOFnSigmasVsP{nsp, {nallmainsp, nullptr}}; std::vector> fhIdPvsTOFSqMass{nsp, nullptr}; template @@ -452,23 +457,25 @@ struct PidDataCollectingEngine { HNAMESTRING("tpcSignalDiffVsP%c_%s", whenprefix[ix], mainspnames[isp].c_str()), HTITLESTRING("TPC dE/dx to the %s line %s", mainsptitles[isp].c_str(), whentitle[ix].c_str()), kTH2F, {pidPAxis, {400, -200.0, 200.0, FORMATSTRING("dE/dx - _{%s}", mainsptitles[isp].c_str())}}); - fhTPCnSigmasVsP[ix][isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", whenname[ix].c_str()), - HNAMESTRING("tpcNSigmasVsP%c_%s", whenprefix[ix], mainspnames[isp].c_str()), - HTITLESTRING("TPC n#sigma to the %s line %s", mainsptitles[isp].c_str(), whentitle[ix].c_str()), - kTH2F, {pidPAxis, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TPC}^{%s}", mainsptitles[isp].c_str())}}); fhTOFSignalDiffVsP[ix][isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", whenname[ix].c_str()), HNAMESTRING("tofSignalDiffVsP%c_%s", whenprefix[ix], mainspnames[isp].c_str()), HTITLESTRING("#Delta^{TOF_{%s}} %s", mainsptitles[isp].c_str(), whentitle[ix].c_str()), kTH2F, {pidPAxis, {200, -1000.0, 1000.0, FORMATSTRING("t-t_{ev}-t_{exp_{%s}} (ps)", mainsptitles[isp].c_str())}}); - fhTOFnSigmasVsP[ix][isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", whenname[ix].c_str()), - HNAMESTRING("tofNSigmasVsP%c_%s", whenprefix[ix], mainspnames[isp].c_str()), - HTITLESTRING("TOF n#sigma to the %s line %s", mainsptitles[isp].c_str(), whentitle[ix].c_str()), - kTH2F, {pidPAxis, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TOF}^{%s}", mainsptitles[isp].c_str())}}); fhTPCTOFSigmaVsP[ix][isp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", whenname[ix].c_str()), HNAMESTRING("toftpcNSigmasVsP%c_%s", whenprefix[ix], mainspnames[isp].c_str()), HTITLESTRING("n#sigma to the %s line %s", mainsptitles[isp].c_str(), whentitle[ix].c_str()), kTH3F, {pidPAxis, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TPC}^{%s}", mainsptitles[isp].c_str())}, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TOF}^{%s}", mainsptitles[isp].c_str())}}); } + for (uint isp = 0; isp < nallmainsp; ++isp) { + fhTPCnSigmasVsP[ix][isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", whenname[ix].c_str()), + HNAMESTRING("tpcNSigmasVsP%c_%s", whenprefix[ix], allmainspnames[isp].c_str()), + HTITLESTRING("TPC n#sigma to the %s line %s", allmainsptitles[isp].c_str(), whentitle[ix].c_str()), + kTH2F, {pidPAxis, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TPC}^{%s}", allmainsptitles[isp].c_str())}}); + fhTOFnSigmasVsP[ix][isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", whenname[ix].c_str()), + HNAMESTRING("tofNSigmasVsP%c_%s", whenprefix[ix], allmainspnames[isp].c_str()), + HTITLESTRING("TOF n#sigma to the %s line %s", allmainsptitles[isp].c_str(), whentitle[ix].c_str()), + kTH2F, {pidPAxis, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TOF}^{%s}", allmainsptitles[isp].c_str())}}); + } } for (uint isp = 0; isp < nsp; ++isp) { fhIdTPCdEdxSignalVsP[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", "Selected"), @@ -479,22 +486,22 @@ struct PidDataCollectingEngine { HNAMESTRING("tofSignalVsPSelected_%s", tnames[isp].c_str()), HTITLESTRING("TOF signal for selected %s", tnames[isp].c_str()), kTH2F, {pidPAxis, {200, 0.0, 1.1, "#beta"}}); - for (uint imainsp = 0; imainsp < nmainsp; ++imainsp) { + for (uint imainsp = 0; imainsp < nallmainsp; ++imainsp) { fhIdTPCnSigmasVsP[isp][imainsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", "Selected"), - HNAMESTRING("tpcNSigmasVsPSelected_%s_to%s", tnames[isp].c_str(), mainspnames[imainsp].c_str()), - HTITLESTRING("TPC n#sigma for selected %s to the %s line", tnames[isp].c_str(), mainsptitles[imainsp].c_str()), - kTH2F, {pidPAxis, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TPC}^{%s}", mainsptitles[isp].c_str())}}); + HNAMESTRING("tpcNSigmasVsPSelected_%s_to%s", tnames[isp].c_str(), allmainspnames[imainsp].c_str()), + HTITLESTRING("TPC n#sigma for selected %s to the %s line", tnames[isp].c_str(), allmainsptitles[imainsp].c_str()), + kTH2F, {pidPAxis, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TPC}^{%s}", allmainsptitles[isp].c_str())}}); fhIdTOFnSigmasVsP[isp][imainsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", "Selected"), - HNAMESTRING("tofNSigmasVsPSelected_%s_to%s", tnames[isp].c_str(), mainspnames[imainsp].c_str()), - HTITLESTRING("TOF n#sigma for selected %s to the %s line", tnames[isp].c_str(), mainsptitles[imainsp].c_str()), - kTH2F, {pidPAxis, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TOF}^{%s}", mainsptitles[isp].c_str())}}); + HNAMESTRING("tofNSigmasVsPSelected_%s_to%s", tnames[isp].c_str(), allmainspnames[imainsp].c_str()), + HTITLESTRING("TOF n#sigma for selected %s to the %s line", tnames[isp].c_str(), allmainsptitles[imainsp].c_str()), + kTH2F, {pidPAxis, {120, -6.0, 6.0, FORMATSTRING("n#sigma_{TOF}^{%s}", allmainsptitles[isp].c_str())}}); } } } } template - void fillSpeciesPID(uint ix, TrackObject const& track) + void fillAllSpeciesPID(uint ix, TrackObject const& track) { if (track.sign() < 0) { ix = 2 * ix + 1; @@ -502,11 +509,8 @@ struct PidDataCollectingEngine { ix = 2 * ix; } for (uint when = 0; when < 2; ++when) { - fhTPCdEdxSignalDiffVsP[when][ix]->Fill(track.p(), o2::aod::pidutils::tpcExpSignalDiff(track)); fhTPCnSigmasVsP[when][ix]->Fill(track.p(), o2::aod::pidutils::tpcNSigma(track)); - fhTOFSignalDiffVsP[when][ix]->Fill(track.p(), o2::aod::pidutils::tofExpSignalDiff(track)); fhTOFnSigmasVsP[when][ix]->Fill(track.p(), o2::aod::pidutils::tofNSigma(track)); - fhTPCTOFSigmaVsP[when][ix]->Fill(track.p(), o2::aod::pidutils::tpcNSigma(track), o2::aod::pidutils::tofNSigma(track)); if (track.trackacceptedid() < 0) { /* track not accepted */ return; @@ -516,6 +520,25 @@ struct PidDataCollectingEngine { fhIdTOFnSigmasVsP[track.trackacceptedid()][ix]->Fill(track.p(), o2::aod::pidutils::tofNSigma(track)); } + template + void fillSpeciesPID(uint ix, TrackObject const& track) + { + if (track.sign() < 0) { + ix = 2 * ix + 1; + } else { + ix = 2 * ix; + } + for (uint when = 0; when < 2; ++when) { + fhTPCdEdxSignalDiffVsP[when][ix]->Fill(track.p(), o2::aod::pidutils::tpcExpSignalDiff(track)); + fhTOFSignalDiffVsP[when][ix]->Fill(track.p(), o2::aod::pidutils::tofExpSignalDiff(track)); + fhTPCTOFSigmaVsP[when][ix]->Fill(track.p(), o2::aod::pidutils::tpcNSigma(track), o2::aod::pidutils::tofNSigma(track)); + if (track.trackacceptedid() < 0) { + /* track not accepted */ + return; + } + } + } + template void fillPID(TrackObject const& track) { @@ -542,6 +565,11 @@ struct PidDataCollectingEngine { fillSpeciesPID(0, track); fillSpeciesPID(1, track); fillSpeciesPID(2, track); + fillAllSpeciesPID(0, track); + fillAllSpeciesPID(1, track); + fillAllSpeciesPID(2, track); + fillAllSpeciesPID(3, track); + fillAllSpeciesPID(4, track); } } }; diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index 426588fdb2b..d0e3f9110a2 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -362,6 +362,12 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } + if (!nameStr.compare("pionPIDCut1")) { + cut->AddCut(GetAnalysisCut("pionQualityCut1")); + cut->AddCut(GetAnalysisCut("pionPIDnsigma")); + return cut; + } + if (!nameStr.compare("PIDCalibElectron")) { cut->AddCut(GetAnalysisCut("pidcalib_ele")); return cut; @@ -938,13 +944,13 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) } std::vector vecTypetrack; - vecTypetrack.emplace_back(""); // default TightGlobalTrackRun3 - vecTypetrack.emplace_back("_7ITSncls"); // default TightGlobalTrackRun3 but with 7 ITS clusters - vecTypetrack.emplace_back("_ITS"); // Ask only for ITS requirements - vecTypetrack.emplace_back("_ITSalone"); // Ask only for ITS requirements + ITSalone (no TPC matching) - vecTypetrack.emplace_back("_TPC"); // Ask only for TPC requirements - vecTypetrack.emplace_back("_TPCalone"); // Ask only for TPC requirements + TPCalone (no ITS matching) - vecTypetrack.emplace_back("_TPCnoTRD"); // Ask only for TPC requirements no TRD matching + vecTypetrack.emplace_back(""); // default TightGlobalTrackRun3 + vecTypetrack.emplace_back("_7ITSncls"); // default TightGlobalTrackRun3 but with 7 ITS clusters + vecTypetrack.emplace_back("_ITS"); // Ask only for ITS requirements + vecTypetrack.emplace_back("_ITSalone"); // Ask only for ITS requirements + ITSalone (no TPC matching) + vecTypetrack.emplace_back("_TPC"); // Ask only for TPC requirements + vecTypetrack.emplace_back("_TPCalone"); // Ask only for TPC requirements + TPCalone (no ITS matching) + vecTypetrack.emplace_back("_TPCnoTRD"); // Ask only for TPC requirements no TRD matching vecTypetrack.emplace_back("_TPCstrongncls"); // default TightGlobalTrackRun3 but with 130 TPC clusters // loop to define PID cuts with and without post calibration @@ -2402,6 +2408,11 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } + if (!nameStr.compare("pairJpsi2")) { + cut->AddCut(GetAnalysisCut("pairJpsi2")); + return cut; + } + if (!nameStr.compare("pairPsi2S")) { cut->AddCut(GetAnalysisCut("pairPsi2S")); return cut; @@ -2412,6 +2423,16 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } + if (!nameStr.compare("pairX3872Cut1")) { + cut->AddCut(GetAnalysisCut("pairX3872")); + return cut; + } + + if (!nameStr.compare("DipionPairCut1")) { + cut->AddCut(GetAnalysisCut("DipionMassCut1")); + return cut; + } + if (!nameStr.compare("pairRapidityForward")) { cut->AddCut(GetAnalysisCut("pairRapidityForward")); return cut; @@ -2912,13 +2933,13 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) } std::vector vecTypetrack; - vecTypetrack.emplace_back(""); // default TightGlobalTrackRun3 as above - vecTypetrack.emplace_back("_7ITSncls"); // default TightGlobalTrackRun3 but with 7 ITS clusters - vecTypetrack.emplace_back("_ITS"); // Ask only for ITS requirements - vecTypetrack.emplace_back("_ITSalone"); // Ask only for ITS requirements + ITSalone (no TPC matching) - vecTypetrack.emplace_back("_TPC"); // Ask only for TPC requirements - vecTypetrack.emplace_back("_TPCalone"); // Ask only for TPC requirements + TPCalone (no ITS matching) - vecTypetrack.emplace_back("_TPCnoTRD"); // Ask only for TPC requirements no TRD matching + vecTypetrack.emplace_back(""); // default TightGlobalTrackRun3 as above + vecTypetrack.emplace_back("_7ITSncls"); // default TightGlobalTrackRun3 but with 7 ITS clusters + vecTypetrack.emplace_back("_ITS"); // Ask only for ITS requirements + vecTypetrack.emplace_back("_ITSalone"); // Ask only for ITS requirements + ITSalone (no TPC matching) + vecTypetrack.emplace_back("_TPC"); // Ask only for TPC requirements + vecTypetrack.emplace_back("_TPCalone"); // Ask only for TPC requirements + TPCalone (no ITS matching) + vecTypetrack.emplace_back("_TPCnoTRD"); // Ask only for TPC requirements no TRD matching vecTypetrack.emplace_back("_TPCstrongncls"); // default TightGlobalTrackRun3 but with 130 TPC clusters // loop to define PID cuts with and without post calibration @@ -3068,6 +3089,15 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("pionQualityCut1")) { + cut->AddCut(VarManager::kPt, 0.15, 1000.0); + cut->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); + cut->AddCut(VarManager::kTPCncls, 100, 161); + cut->AddCut(VarManager::kTrackDCAxy, -0.05, 0.05); + cut->AddCut(VarManager::kTrackDCAz, -0.1, 0.1); + return cut; + } + if (!nameStr.compare("pidbasic")) { cut->AddCut(VarManager::kEta, -0.9, 0.9); cut->AddCut(VarManager::kTPCncls, 60, 161.); @@ -4343,6 +4373,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("DipionMassCut1")) { + cut->AddCut(VarManager::kMass, 0.5, 1.0); + return cut; + } + if (!nameStr.compare("pairMassLow1")) { cut->AddCut(VarManager::kMass, 1.0, 1000.0); return cut; @@ -4438,6 +4473,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("pairJpsi2")) { + cut->AddCut(VarManager::kMass, 2.72, 3.2); + return cut; + } + if (!nameStr.compare("pairPsi2S")) { cut->AddCut(VarManager::kMass, 3.4, 3.9); return cut; @@ -4448,6 +4488,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("pairX3872")) { + cut->AddCut(VarManager::kCosthetaDileptonDitrack, 0.98, 1); + return cut; + } + if (!nameStr.compare("pairPtLow1")) { cut->AddCut(VarManager::kPt, 2.0, 1000.0); return cut; diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 4cb724d5292..06cf529b24f 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1014,4 +1014,14 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "hPhiVsPtVsBdtDmesonWithJPsi", "", false, 100, 0.f, 1.f, VarManager::kBdtCharmHadron, 100, 0.f, 50.f, VarManager::kPtCharmHadron, 180, 0., 2 * constants::math::PI, VarManager::kPhiCharmHadron); } } + if (groupStr.Contains("dilepton-dihadron")) { + if (subGroupStr.EqualTo("xtojpsipipi")) { + hm->AddHistogram(histClass, "hMass_X3872", "", false, 1000, 3.0, 5.0, VarManager::kQuadMass); + hm->AddHistogram(histClass, "hPt_X3872", "", false, 200, 0.0, 20.0, VarManager::kQuadPt); + hm->AddHistogram(histClass, "hMass_Pt_X3872", "", false, 1000, 3.0, 5.0, VarManager::kQuadMass, 150, 0.0, 15.0, VarManager::kQuadPt); + hm->AddHistogram(histClass, "hCostheta_Jpsi_Dihadron", "", false, 100, -1.0, 1.0, VarManager::kCosthetaDileptonDitrack); + hm->AddHistogram(histClass, "hPtDilepton_PtDihadron", "", false, 200, 0, 20, VarManager::kPairPt, 100, 0, 10, VarManager::kDitrackPt); + hm->AddHistogram(histClass, "hPtDilepton_MassDihadron", "", false, 200, 0, 20, VarManager::kPairPt, 100, 3.0, 5.0, VarManager::kDitrackMass); + } + } } diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 35d061eff32..dc421e1753e 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -776,4 +776,18 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kIsSingleGapA] = ""; fgVariableNames[kIsSingleGapC] = "is single gap event side C"; fgVariableUnits[kIsSingleGapC] = ""; + fgVariableNames[kQuadMass] = "mass quadruplet"; + fgVariableUnits[kQuadMass] = "GeV/c2"; + fgVariableNames[kQuadPt] = "p_{T}"; + fgVariableUnits[kQuadPt] = "GeV/c"; + fgVariableNames[kQuadEta] = "#eta"; + fgVariableUnits[kQuadEta] = ""; + fgVariableNames[kQuadPhi] = "#varphi"; + fgVariableUnits[kQuadPhi] = "rad."; + fgVariableNames[kCosthetaDileptonDitrack] = "cos#it{#theta}_{dilepton-ditrack}"; + fgVariableUnits[kCosthetaDileptonDitrack] = ""; + fgVariableNames[kDitrackMass] = "mass di-track"; + fgVariableUnits[kDitrackMass] = "GeV/c2"; + fgVariableNames[kDitrackPt] = "p_{T}"; + fgVariableUnits[kDitrackPt] = "GeV/c"; } diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 475b1eb7791..36020bd4160 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -126,6 +126,8 @@ class VarManager : public TObject kElectronMuon, // e.g. Electron - muon correlations kBcToThreeMuons, // e.g. Bc -> mu+ mu- mu+ kBtoJpsiEEK, // e.g. B+ -> e+ e- K+ + kXtoJpsiPiPi, // e.g. X(3872) -> J/psi pi+ pi- + kChictoJpsiEE, // e.g. Chi_c1 -> J/psi e+ e- kNMaxCandidateTypes }; @@ -529,6 +531,15 @@ class VarManager : public TObject kDeltaPhiSym, kNCorrelationVariables, + // Dilepton-track-track variables + kQuadMass, + kQuadPt, + kQuadEta, + kQuadPhi, + kCosthetaDileptonDitrack, + kDitrackMass, + kDitrackPt, + // DQ-HF correlation variables kMassCharmHadron, kPtCharmHadron, @@ -769,6 +780,8 @@ class VarManager : public TObject static void FillQVectorFromCentralFW(C const& collision, float* values = nullptr); template static void FillPairVn(T1 const& t1, T2 const& t2, float* values = nullptr); + template + static void FillDileptonTrackTrack(T1 const& dilepton, T2 const& hadron1, T3 const& hadron2, float* values = nullptr); static void SetCalibrationObject(CalibObjects calib, TObject* obj) { @@ -3100,4 +3113,44 @@ void VarManager::FillDileptonCharmHadron(DQ const& dilepton, HF const& charmHadr FillSingleDileptonCharmHadron(charmHadron, hfHelper, bdtScoreCharmHad, values); } +template +void VarManager::FillDileptonTrackTrack(T1 const& dilepton, T2 const& hadron1, T3 const& hadron2, float* values) +{ + if (!values) { + values = fgValues; + } + + double DefaultdileptonMass = 3.096; + double hadronMass1 = o2::constants::physics::MassPionCharged; + double hadronMass2 = o2::constants::physics::MassPionCharged; + if (candidateType == kXtoJpsiPiPi) { + DefaultdileptonMass = 3.096; + hadronMass1 = o2::constants::physics::MassPionCharged; + hadronMass2 = o2::constants::physics::MassPionCharged; + } + if (candidateType == kChictoJpsiEE) { + DefaultdileptonMass = 3.096; + hadronMass1 = o2::constants::physics::MassElectron; + hadronMass2 = o2::constants::physics::MassElectron; + } + + ROOT::Math::PtEtaPhiMVector v1(dilepton.pt(), dilepton.eta(), dilepton.phi(), dilepton.mass()); + ROOT::Math::PtEtaPhiMVector v2(hadron1.pt(), hadron1.eta(), hadron1.phi(), hadronMass1); + ROOT::Math::PtEtaPhiMVector v3(hadron2.pt(), hadron2.eta(), hadron2.phi(), hadronMass2); + ROOT::Math::PtEtaPhiMVector v123 = v1 + v2 + v3; + values[kQuadMass] = v123.M() - v1.M() + DefaultdileptonMass; + values[kQuadPt] = v123.Pt(); + values[kQuadEta] = v123.Eta(); + values[kQuadPhi] = v123.Phi(); + + if (fgUsedVars[kCosthetaDileptonDitrack] || fgUsedVars[kPairMass] || fgUsedVars[kPairPt] || fgUsedVars[kDitrackPt] || fgUsedVars[kDitrackMass]) { + ROOT::Math::PtEtaPhiMVector v23 = v2 + v3; + values[kPairMass] = v1.M(); + values[kPairPt] = v1.Pt(); + values[kDitrackMass] = v23.M(); + values[kDitrackPt] = v23.Pt(); + values[kCosthetaDileptonDitrack] = (v1.Px() * v123.Px() + v1.Py() * v123.Py() + v1.Pz() * v123.Pz()) / (v1.P() * v123.P()); + } +} + #endif // PWGDQ_CORE_VARMANAGER_H_ diff --git a/PWGDQ/Tasks/MIDefficiency.cxx b/PWGDQ/Tasks/MIDefficiency.cxx index adef861473d..6e2d6eaa4e1 100644 --- a/PWGDQ/Tasks/MIDefficiency.cxx +++ b/PWGDQ/Tasks/MIDefficiency.cxx @@ -98,7 +98,7 @@ struct midEfficiency { LOGF(debug, "Calling process function"); // Loop over all forward tracks - LOGP(info, "collision index = {} , nTracks = {}", event.globalIndex(), muons.size()); + // LOGP(info, "collision index = {} , nTracks = {}", event.globalIndex(), muons.size()); for (auto& track : muons) { LOGF(debug, "Processing a track"); diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 0245db2c2f9..3736d01890b 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -1571,6 +1571,180 @@ struct AnalysisDileptonHadron { PROCESS_SWITCH(AnalysisDileptonHadron, processDummy, "Dummy function", false); }; +struct AnalysisDileptonTrackTrack { + OutputObj fOutputList{"output"}; + + Configurable fConfigTrackCuts{"cfgTrackCuts", "jpsiO2MCdebugCuts2", "Comma separated list of barrel track cuts"}; // used for select the tracks from SelectedTracks + Configurable fConfigDileptonCut{"cfgDiLeptonCut", "pairJpsi", "Dilepton cut"}; + Configurable fConfigDitrackCut{"cfgDiTrackCut", "pairNoCut", "Track-Track cut"}; + Configurable fConfigQuadrupletCut{"cfgQuadrupletCut", "pairNoCut", "Dilepton-Track-Track cut"}; + Configurable fConfigAddDileptonHistogram{"cfgAddDileptonHistogram", "berral", "Comma separated list of histograms"}; + Configurable fConfigAddDitrackHistogram{"cfgAddDitrackHistogram", "berral", "Comma separated list of histograms"}; + Configurable fConfigAddQuadrupletHistogram{"cfgAddQuadrupletHistogram", "XtoJpsipipi", "Comma separated list of histograms"}; + + Filter eventFilter = aod::dqanalysisflags::isEventSelected == 1; + Filter dileptonFilter = aod::reducedpair::mass > 1.0f && aod::reducedpair::mass < 4.0f; + Filter filterBarrelTrackSelected = aod::dqanalysisflags::isBarrelSelected > 0; + + constexpr static uint32_t fgDileptonFillMap = VarManager::ObjTypes::ReducedTrack | VarManager::ObjTypes::Pair; // fill map + + // use some values array to avoid mixing up the quantities + float* fValuesDitrack; + float* fValuesQuadruplet; + HistogramManager* fHistMan; + + uint32_t fDileptonFilter = 0; + uint32_t fHadronFilter = 0; + int fIsUnlikeSignDilepton = 0; + int fIsUnlikeSignDitrack = 0; + AnalysisCompositeCut fDileptonCut; + AnalysisCompositeCut fDitrackCut; + AnalysisCompositeCut fQuadrupletCut; + std::vector fTrackCutNames; + + void init(o2::framework::InitContext& context) + { + fValuesDitrack = new float[VarManager::kNVars]; + fValuesQuadruplet = new float[VarManager::kNVars]; + VarManager::SetDefaultVarNames(); + fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); + fHistMan->SetUseDefaultVariableNames(kTRUE); + fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); + + // define cuts + TString configTrackCutNamesStr = fConfigTrackCuts.value; + TString configDileptonCutNamesStr = fConfigDileptonCut.value; + fDileptonCut = *dqcuts::GetCompositeCut(configDileptonCutNamesStr.Data()); + TString configDitrackCutNamesStr = fConfigDitrackCut.value; + fDitrackCut = *dqcuts::GetCompositeCut(configDitrackCutNamesStr.Data()); + TString configQuadruletCutNamesStr = fConfigQuadrupletCut.value; + fQuadrupletCut = *dqcuts::GetCompositeCut(configQuadruletCutNamesStr.Data()); + + if (!context.mOptions.get("processDummy")) { + // define histograms for dilepton + DefineHistograms(fHistMan, Form("DileptonsSelectedUS_%s", configDileptonCutNamesStr.Data()), fConfigAddDileptonHistogram); + DefineHistograms(fHistMan, Form("DileptonsSelectedLS_%s", configDileptonCutNamesStr.Data()), fConfigAddDileptonHistogram); + if (!configTrackCutNamesStr.IsNull()) { + std::unique_ptr objArray(configTrackCutNamesStr.Tokenize(",")); + for (Int_t icut = 0; icut < objArray->GetEntries(); ++icut) { + TString cutName = objArray->At(icut)->GetName(); + fTrackCutNames.push_back(cutName); + DefineHistograms(fHistMan, Form("DitrackSelected_%s_%s", configDitrackCutNamesStr.Data(), cutName.Data()), fConfigAddDitrackHistogram); + DefineHistograms(fHistMan, Form("QuadrupletSEUSUS_%s_%s_%s", configDileptonCutNamesStr.Data(), configDitrackCutNamesStr.Data(), cutName.Data()), fConfigAddQuadrupletHistogram); + DefineHistograms(fHistMan, Form("QuadrupletSEUSLS_%s_%s_%s", configDileptonCutNamesStr.Data(), configDitrackCutNamesStr.Data(), cutName.Data()), fConfigAddQuadrupletHistogram); + DefineHistograms(fHistMan, Form("QuadrupletSELSUS_%s_%s_%s", configDileptonCutNamesStr.Data(), configDitrackCutNamesStr.Data(), cutName.Data()), fConfigAddQuadrupletHistogram); + DefineHistograms(fHistMan, Form("QuadrupletSELSLS_%s_%s_%s", configDileptonCutNamesStr.Data(), configDitrackCutNamesStr.Data(), cutName.Data()), fConfigAddQuadrupletHistogram); + } // loop over track cuts + } + } + + VarManager::SetUseVars(fHistMan->GetUsedVars()); + fOutputList.setObject(fHistMan->GetMainHistogramList()); + } + // Template function to run pair - track - track combinations + template + void runDileptonTrackTrack(TEvent const& event, TTracks const& tracks, soa::Filtered const& dileptons) + { + VarManager::ResetValues(0, VarManager::kNVars, fValuesDitrack); + VarManager::FillEvent(event, fValuesDitrack); + VarManager::ResetValues(0, VarManager::kNVars, fValuesQuadruplet); + VarManager::FillEvent(event, fValuesQuadruplet); + + // LOGF(info, "Number of dileptons: %d", dileptons.size()); + + // loop over dileptons + for (auto dilepton : dileptons) { + fDileptonFilter = 0; + fIsUnlikeSignDilepton = 0; + VarManager::FillTrack(dilepton, fValuesQuadruplet); + + // Check that the dilepton has zero charge + if (dilepton.sign() == 0) { + fIsUnlikeSignDilepton = 1; + } + + // apply the dilepton cut + if (fDileptonCut.IsSelected(fValuesQuadruplet)) { + fDileptonFilter = 1; + if (fIsUnlikeSignDilepton == 1) { + fHistMan->FillHistClass(Form("DileptonsSelectedUS_%s", fDileptonCut.GetName()), fValuesQuadruplet); + } else { + fHistMan->FillHistClass(Form("DileptonsSelectedLS_%s", fDileptonCut.GetName()), fValuesQuadruplet); + } + } + + // pass the dilepton without cut + if (fDileptonFilter == 0) { + continue; + } + + // get the index of the electron legs + int indexLepton1 = dilepton.index0Id(); + int indexLepton2 = dilepton.index1Id(); + + // loop over hadrons pairs + for (auto& [t1, t2] : combinations(tracks, tracks)) { + // avoid self-combinations + if (t1.globalIndex() == indexLepton1 || t1.globalIndex() == indexLepton2 || t2.globalIndex() == indexLepton1 || t2.globalIndex() == indexLepton2) { + continue; + } + + // fill variables + VarManager::FillPair(t1, t2, fValuesDitrack); + if constexpr (TCandidateType == VarManager::kChictoJpsiEE) { + VarManager::FillPair(t1, t2, fValuesDitrack); + } + VarManager::FillDileptonTrackTrack(dilepton, t1, t2, fValuesQuadruplet); + + if (t1.sign() * t2.sign() > 0) { + fIsUnlikeSignDitrack = 0; + } else { + fIsUnlikeSignDitrack = 1; + } + + int iTrackCut = 0; + for (auto cutname = fTrackCutNames.begin(); cutname != fTrackCutNames.end(); cutname++, iTrackCut++) { + // apply the DiTrack cut + if (fDitrackCut.IsSelected(fValuesDitrack)) { + // apply the Track cut + if (t1.isBarrelSelected() & (uint32_t(1) << (iTrackCut + 1)) && t2.isBarrelSelected() & (uint32_t(1) << (iTrackCut + 1))) { + fHistMan->FillHistClass(Form("DitrackSelected_%s_%s", fDitrackCut.GetName(), (*cutname).Data()), fValuesDitrack); + if (fQuadrupletCut.IsSelected(fValuesQuadruplet)) { + if (fIsUnlikeSignDilepton) { + if (fIsUnlikeSignDitrack) { + fHistMan->FillHistClass(Form("QuadrupletSEUSUS_%s_%s_%s", fDileptonCut.GetName(), fDitrackCut.GetName(), (*cutname).Data()), fValuesQuadruplet); + } else { + fHistMan->FillHistClass(Form("QuadrupletSEUSLS_%s_%s_%s", fDileptonCut.GetName(), fDitrackCut.GetName(), (*cutname).Data()), fValuesQuadruplet); + } + } else { + if (fIsUnlikeSignDitrack) { + fHistMan->FillHistClass(Form("QuadrupletSELSUS_%s_%s_%s", fDileptonCut.GetName(), fDitrackCut.GetName(), (*cutname).Data()), fValuesQuadruplet); + } else { + fHistMan->FillHistClass(Form("QuadrupletSELSLS_%s_%s_%s", fDileptonCut.GetName(), fDitrackCut.GetName(), (*cutname).Data()), fValuesQuadruplet); + } + } + } + } + } // check if the diTrack cut is selected + } // loop over hadron cuts + } + } + } + + void processJpsiPiPi(soa::Filtered::iterator const& event, MyBarrelTracksSelectedWithCov const& tracks, soa::Filtered const& dileptons) + { + runDileptonTrackTrack(event, tracks, dileptons); + } + + void processDummy(MyEvents&) + { + // do nothing + } + + PROCESS_SWITCH(AnalysisDileptonTrackTrack, processJpsiPiPi, "Run dilepton-dihadron pairing to study X(3872), using skimmed data", false); + PROCESS_SWITCH(AnalysisDileptonTrackTrack, processDummy, "Dummy function", false); +}; + WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ @@ -1581,7 +1755,8 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; } void DefineHistograms(HistogramManager* histMan, TString histClasses, Configurable configVar) @@ -1639,5 +1814,14 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses, Configurab if (classStr.Contains("DileptonHadronCorrelation")) { dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "dilepton-hadron-array-correlation"); } + + if (classStr.Contains("DitrackSelected")) { + dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "pair", histName); + } + + if (classStr.Contains("Quadruplet")) { + dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "dilepton-dihadron", histName); + } + } // end loop over histogram classes } diff --git a/PWGEM/PhotonMeson/Core/CutsLibrary.cxx b/PWGEM/PhotonMeson/Core/CutsLibrary.cxx index 0dc0f588cc1..511ddbc64c9 100644 --- a/PWGEM/PhotonMeson/Core/CutsLibrary.cxx +++ b/PWGEM/PhotonMeson/Core/CutsLibrary.cxx @@ -44,7 +44,7 @@ EMEventCut* o2::aod::pwgem::photon::eventcuts::GetCut(const char* cutName) if (!nameStr.compare("minbias")) { cut->SetRequireFT0AND(true); cut->SetZvtxRange(-10.f, +10.f); - cut->SetRequireNoTFB(true); + cut->SetRequireNoTFB(false); cut->SetRequireNoITSROFB(false); return cut; } @@ -57,6 +57,22 @@ EMEventCut* o2::aod::pwgem::photon::eventcuts::GetCut(const char* cutName) return cut; } + if (!nameStr.compare("minbias_notfb")) { + cut->SetRequireFT0AND(true); + cut->SetZvtxRange(-10.f, +10.f); + cut->SetRequireNoTFB(true); + cut->SetRequireNoITSROFB(false); + return cut; + } + + if (!nameStr.compare("minbias_notfb_noitsrofb")) { + cut->SetRequireFT0AND(true); + cut->SetZvtxRange(-10.f, +10.f); + cut->SetRequireNoTFB(true); + cut->SetRequireNoITSROFB(true); + return cut; + } + delete cut; LOGF(info, Form("Did not find cut %s", cutName)); return nullptr; diff --git a/PWGEM/PhotonMeson/Core/EMEventCut.h b/PWGEM/PhotonMeson/Core/EMEventCut.h index e51dd60bbd5..8fc86e0bb93 100644 --- a/PWGEM/PhotonMeson/Core/EMEventCut.h +++ b/PWGEM/PhotonMeson/Core/EMEventCut.h @@ -41,16 +41,16 @@ class EMEventCut : public TNamed template bool IsSelected(T const& collision) const { - if (!IsSelected(collision, EMEventCuts::kFT0AND)) { + if (mRequireFT0AND && !IsSelected(collision, EMEventCuts::kFT0AND)) { return false; } if (!IsSelected(collision, EMEventCuts::kZvtx)) { return false; } - if (!IsSelected(collision, EMEventCuts::kNoTFB)) { + if (mRequireNoTFB && !IsSelected(collision, EMEventCuts::kNoTFB)) { return false; } - if (!IsSelected(collision, EMEventCuts::kNoITSROFB)) { + if (mRequireNoITSROFB && !IsSelected(collision, EMEventCuts::kNoITSROFB)) { return false; } return true; diff --git a/PWGEM/PhotonMeson/Core/V0PhotonCut.h b/PWGEM/PhotonMeson/Core/V0PhotonCut.h index a73096684eb..a8bb27b11d3 100644 --- a/PWGEM/PhotonMeson/Core/V0PhotonCut.h +++ b/PWGEM/PhotonMeson/Core/V0PhotonCut.h @@ -299,7 +299,7 @@ class V0PhotonCut : public TNamed return v0.pca() <= mMaxPCA; case V0PhotonCuts::kRZLine: - return v0.v0radius() > abs(v0.vz()) * TMath::Tan(2 * TMath::ATan(TMath::Exp(-mMaxV0Eta))) - mMaxMarginZ; + return v0.v0radius() > abs(v0.vz()) * std::tan(2 * std::atan(std::exp(-mMaxV0Eta))) - mMaxMarginZ; case V0PhotonCuts::kOnWwireIB: { const float margin_xy = 1.0; // cm @@ -322,7 +322,7 @@ class V0PhotonCut : public TNamed return false; } - float dxy = abs(1.0 * y - x * TMath::Tan(-8.52 * TMath::DegToRad())) / sqrt(pow(1.0, 2) + pow(TMath::Tan(-8.52 * TMath::DegToRad()), 2)); + float dxy = abs(1.0 * y - x * std::tan(-8.52 * TMath::DegToRad())) / sqrt(pow(1.0, 2) + pow(std::tan(-8.52 * TMath::DegToRad()), 2)); return !(dxy > margin_xy); } case V0PhotonCuts::kOnWwireOB: { @@ -408,7 +408,7 @@ class V0PhotonCut : public TNamed if (track.x() < 0.1 && abs(track.y()) > 15.f) { return false; } - if (track.x() > 82.9 && abs(track.y()) > abs(track.x() * TMath::Tan(10.f * TMath::DegToRad())) + 5.f) { + if (track.x() > 82.9 && abs(track.y()) > abs(track.x() * std::tan(10.f * TMath::DegToRad())) + 5.f) { return false; } if (track.x() > 82.9 && abs(track.y()) < 15.0 && abs(abs(track.z()) - 44.5) < 2.5) { diff --git a/PWGEM/PhotonMeson/DataModel/gammaTables.h b/PWGEM/PhotonMeson/DataModel/gammaTables.h index c20d0a09fc9..ba0ab000be0 100644 --- a/PWGEM/PhotonMeson/DataModel/gammaTables.h +++ b/PWGEM/PhotonMeson/DataModel/gammaTables.h @@ -10,6 +10,7 @@ // or submit itself to any jurisdiction. #include +#include #include "Framework/AnalysisDataModel.h" #include "Common/DataModel/PIDResponse.h" @@ -20,7 +21,6 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" #include "PWGJE/DataModel/EMCALClusters.h" -#include #ifndef PWGEM_PHOTONMESON_DATAMODEL_GAMMATABLES_H_ #define PWGEM_PHOTONMESON_DATAMODEL_GAMMATABLES_H_ @@ -28,9 +28,9 @@ namespace o2::aod { -namespace emreducedevent +namespace emevent { -DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! +DECLARE_SOA_COLUMN(CollisionId, collisionId, int); DECLARE_SOA_COLUMN(NgammaPCM, ngpcm, int); DECLARE_SOA_COLUMN(NgammaPHOS, ngphos, int); DECLARE_SOA_COLUMN(NgammaEMC, ngemc, int); @@ -68,93 +68,89 @@ DECLARE_SOA_COLUMN(Q3xFT0C, q3xft0c, float); //! Qx for 3rd harmonic DECLARE_SOA_COLUMN(Q3yFT0C, q3yft0c, float); //! Qy for 3rd harmonics in FT0C (i.e. negative eta) DECLARE_SOA_COLUMN(Q3xFV0A, q3xfv0a, float); //! Qx for 3rd harmonics in FV0A (i.e. positive eta) DECLARE_SOA_COLUMN(Q3yFV0A, q3yfv0a, float); //! Qy for 3rd harmonics in FV0A (i.e. positive eta) -} // namespace emreducedevent -DECLARE_SOA_TABLE(EMReducedEvents, "AOD", "EMREDUCEDEVENT", //! Main event information table - o2::soa::Index<>, emreducedevent::CollisionId, bc::GlobalBC, bc::RunNumber, evsel::Sel8, evsel::Alias, evsel::Selection, - emreducedevent::IsPHOSCPVReadout, emreducedevent::IsEMCReadout, emreducedevent::NcollsPerBC, +} // namespace emevent +DECLARE_SOA_TABLE(EMEvents, "AOD", "EMEVENT", //! Main event information table + o2::soa::Index<>, emevent::CollisionId, bc::GlobalBC, bc::RunNumber, evsel::Sel8, evsel::Alias, evsel::Selection, + emevent::IsPHOSCPVReadout, emevent::IsEMCReadout, emevent::NcollsPerBC, collision::PosX, collision::PosY, collision::PosZ, collision::NumContrib, collision::CollisionTime, collision::CollisionTimeRes); -using EMReducedEvent = EMReducedEvents::iterator; +using EMEvent = EMEvents::iterator; -DECLARE_SOA_TABLE(EMReducedEventsBz, "AOD", "EMEVENTBZ", emreducedevent::Bz); // joinable to EMReducedEvents -using EMReducedEventBz = EMReducedEventsBz::iterator; +DECLARE_SOA_TABLE(EMEventsBz, "AOD", "EMEVENTBZ", emevent::Bz); // joinable to EMEvents +using EMEventBz = EMEventsBz::iterator; -DECLARE_SOA_TABLE(EMReducedEventsMult, "AOD", "EMEVENTMULT", //! event multiplicity table, joinable to EMReducedEvents +DECLARE_SOA_TABLE(EMEventsMult, "AOD", "EMEVENTMULT", //! event multiplicity table, joinable to EMEvents mult::MultFV0A, mult::MultFV0C, mult::MultFT0A, mult::MultFT0C, mult::MultFDDA, mult::MultFDDC, mult::MultZNA, mult::MultZNC, mult::MultTPC, mult::MultTracklets, mult::MultNTracksPV, mult::MultNTracksPVeta1, mult::MultNTracksPVetaHalf, mult::IsInelGt0, mult::IsInelGt1); -using EMReducedEventMult = EMReducedEventsMult::iterator; +using EMEventMult = EMEventsMult::iterator; -DECLARE_SOA_TABLE(EMReducedEventsCent, "AOD", "EMEVENTCENT", //! event centrality table, joinable to EMReducedEvents +DECLARE_SOA_TABLE(EMEventsCent, "AOD", "EMEVENTCENT", //! event centrality table, joinable to EMEvents cent::CentFT0M, cent::CentFT0A, cent::CentFT0C, cent::CentNTPV); -using EMReducedEventCent = EMReducedEventsCent::iterator; +using EMEventCent = EMEventsCent::iterator; -DECLARE_SOA_TABLE(EMReducedEventsQvec, "AOD", "EMEVENTQVECTOR", //! event q vector table, joinable to EMReducedEvents - emreducedevent::Q2xTPCPosEta, emreducedevent::Q2yTPCPosEta, emreducedevent::Q2xTPCNegEta, emreducedevent::Q2yTPCNegEta, emreducedevent::Q2xTPCFullEta, emreducedevent::Q2yTPCFullEta, - emreducedevent::Q2xFT0A, emreducedevent::Q2yFT0A, emreducedevent::Q2xFT0C, emreducedevent::Q2yFT0C, emreducedevent::Q2xFV0A, emreducedevent::Q2yFV0A, - emreducedevent::Q3xTPCPosEta, emreducedevent::Q3yTPCPosEta, emreducedevent::Q3xTPCNegEta, emreducedevent::Q3yTPCNegEta, emreducedevent::Q3xTPCFullEta, emreducedevent::Q3yTPCFullEta, - emreducedevent::Q3xFT0A, emreducedevent::Q3yFT0A, emreducedevent::Q3xFT0C, emreducedevent::Q3yFT0C, emreducedevent::Q3xFV0A, emreducedevent::Q3yFV0A); -using EMReducedEventQvec = EMReducedEventsQvec::iterator; +DECLARE_SOA_TABLE(EMEventsQvec, "AOD", "EMEVENTQVECTOR", //! event q vector table, joinable to EMEvents + emevent::Q2xTPCPosEta, emevent::Q2yTPCPosEta, emevent::Q2xTPCNegEta, emevent::Q2yTPCNegEta, emevent::Q2xTPCFullEta, emevent::Q2yTPCFullEta, + emevent::Q2xFT0A, emevent::Q2yFT0A, emevent::Q2xFT0C, emevent::Q2yFT0C, emevent::Q2xFV0A, emevent::Q2yFV0A, + emevent::Q3xTPCPosEta, emevent::Q3yTPCPosEta, emevent::Q3xTPCNegEta, emevent::Q3yTPCNegEta, emevent::Q3xTPCFullEta, emevent::Q3yTPCFullEta, + emevent::Q3xFT0A, emevent::Q3yFT0A, emevent::Q3xFT0C, emevent::Q3yFT0C, emevent::Q3xFV0A, emevent::Q3yFV0A); +using EMEventQvec = EMEventsQvec::iterator; -DECLARE_SOA_TABLE(EMReducedEventsNgPCM, "AOD", "EMEVENTNGPCM", emreducedevent::NgammaPCM); // joinable to EMReducedEvents -using EMReducedEventNgPCM = EMReducedEventsNgPCM::iterator; +DECLARE_SOA_TABLE(EMEventsNgPCM, "AOD", "EMEVENTNGPCM", emevent::NgammaPCM); // joinable to EMEvents +using EMEventNgPCM = EMEventsNgPCM::iterator; -DECLARE_SOA_TABLE(EMReducedEventsNgPHOS, "AOD", "EMEVENTNGPHOS", emreducedevent::NgammaPHOS); // joinable to EMReducedEvents -using EMReducedEventNgPHOS = EMReducedEventsNgPHOS::iterator; +DECLARE_SOA_TABLE(EMEventsNgPHOS, "AOD", "EMEVENTNGPHOS", emevent::NgammaPHOS); // joinable to EMEvents +using EMEventNgPHOS = EMEventsNgPHOS::iterator; -DECLARE_SOA_TABLE(EMReducedEventsNgEMC, "AOD", "EMEVENTNGEMC", emreducedevent::NgammaEMC); // joinable to EMReducedEvents -using EMReducedEventNgEMC = EMReducedEventsNgEMC::iterator; +DECLARE_SOA_TABLE(EMEventsNgEMC, "AOD", "EMEVENTNGEMC", emevent::NgammaEMC); // joinable to EMEvents +using EMEventNgEMC = EMEventsNgEMC::iterator; -DECLARE_SOA_TABLE(EMReducedEventsNee, "AOD", "EMEVENTNEE", emreducedevent::NeeULS, emreducedevent::NeeLSpp, emreducedevent::NeeLSmm); // joinable to EMReducedEvents -using EMReducedEventNee = EMReducedEventsNee::iterator; +DECLARE_SOA_TABLE(EMEventsNee, "AOD", "EMEVENTNEE", emevent::NeeULS, emevent::NeeLSpp, emevent::NeeLSmm); // joinable to EMEvents +using EMEventNee = EMEventsNee::iterator; -DECLARE_SOA_TABLE(EMReducedEventsNmumu, "AOD", "EMEVENTNMUMU", emreducedevent::NmumuULS, emreducedevent::NmumuLSpp, emreducedevent::NmumuLSmm); // joinable to EMReducedEvents -using EMReducedEventNmumu = EMReducedEventsNmumu::iterator; +DECLARE_SOA_TABLE(EMEventsNmumu, "AOD", "EMEVENTNMUMU", emevent::NmumuULS, emevent::NmumuLSpp, emevent::NmumuLSmm); // joinable to EMEvents +using EMEventNmumu = EMEventsNmumu::iterator; -namespace emreducedmcevent +namespace emmcevent { -DECLARE_SOA_COLUMN(PosX, posX, float); //! -DECLARE_SOA_COLUMN(PosY, posY, float); //! -DECLARE_SOA_COLUMN(PosZ, posZ, float); //! -} // namespace emreducedmcevent -DECLARE_SOA_TABLE(EMReducedMCEvents, "AOD", "EMMCEVENT", //! MC event information table - o2::soa::Index<>, mccollision::GeneratorsID, - emreducedmcevent::PosX, emreducedmcevent::PosY, emreducedmcevent::PosZ, - mccollision::T, mccollision::Weight, mccollision::ImpactParameter); -using EMReducedMCEvent = EMReducedMCEvents::iterator; +DECLARE_SOA_COLUMN(McCollisionId, mcCollisionId, int); +} + +DECLARE_SOA_TABLE(EMMCEvents, "AOD", "EMMCEVENT", //! MC event information table + o2::soa::Index<>, emmcevent::McCollisionId, mccollision::GeneratorsID, + mccollision::PosX, mccollision::PosY, mccollision::PosZ, + mccollision::T, mccollision::ImpactParameter, + + // dynamic column + mccollision::GetGeneratorId, + mccollision::GetSubGeneratorId, + mccollision::GetSourceId); + +using EMMCEvent = EMMCEvents::iterator; namespace emmceventlabel { -DECLARE_SOA_INDEX_COLUMN(EMReducedMCEvent, emreducedmcevent); //! MC collision -DECLARE_SOA_COLUMN(McMask, mcMask, uint16_t); //! Bit mask to indicate collision mismatches (bit ON means mismatch). Bit 15: indicates negative label +DECLARE_SOA_INDEX_COLUMN(EMMCEvent, emmcevent); //! MC collision +DECLARE_SOA_COLUMN(McMask, mcMask, uint16_t); //! Bit mask to indicate collision mismatches (bit ON means mismatch). Bit 15: indicates negative label } // namespace emmceventlabel -DECLARE_SOA_TABLE(EMReducedMCEventLabels, "AOD", "EMMCEVENTLABEL", //! Table joined to the EMReducedEvents table containing the MC index - emmceventlabel::EMReducedMCEventId, emmceventlabel::McMask); -using EMReducedMCEventLabel = EMReducedMCEventLabels::iterator; +DECLARE_SOA_TABLE(EMMCEventLabels, "AOD", "EMMCEVENTLABEL", //! Table joined to the EMEvents table containing the MC index + emmceventlabel::EMMCEventId, emmceventlabel::McMask); +using EMMCEventLabel = EMMCEventLabels::iterator; namespace emmcparticle { -DECLARE_SOA_INDEX_COLUMN(EMReducedMCEvent, emreducedmcevent); //! -DECLARE_SOA_SELF_INDEX_COLUMN_FULL(Mother0, mother0, int, "EMMCParticles_Mother0"); //! Track index of the first mother -DECLARE_SOA_SELF_INDEX_COLUMN_FULL(Mother1, mother1, int, "EMMCParticles_Mother1"); //! Track index of the last mother -DECLARE_SOA_SELF_INDEX_COLUMN_FULL(Daughter0, daughter0, int, "EMMCParticles_Daughter0"); //! Track index of the first daughter -DECLARE_SOA_SELF_INDEX_COLUMN_FULL(Daughter1, daughter1, int, "EMMCParticles_Daughter1"); //! Track index of the last daughter -DECLARE_SOA_SELF_ARRAY_INDEX_COLUMN(Mothers, mothers); //! Mother tracks (possible empty) array. Iterate over mcParticle.mothers_as()) -DECLARE_SOA_SELF_SLICE_INDEX_COLUMN(Daughters, daughters); //! Daughter tracks (possibly empty) slice. Check for non-zero with mcParticle.has_daughters(). Iterate over mcParticle.daughters_as()) -DECLARE_SOA_COLUMN(Pt, pt, float); //! -DECLARE_SOA_COLUMN(Eta, eta, float); //! -DECLARE_SOA_COLUMN(Phi, phi, float); //! -DECLARE_SOA_COLUMN(E, e, float); //! -DECLARE_SOA_DYNAMIC_COLUMN(Px, px, [](float pt, float phi) -> float { return pt * std::cos(phi); }); -DECLARE_SOA_DYNAMIC_COLUMN(Py, py, [](float pt, float phi) -> float { return pt * std::sin(phi); }); -DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, [](float pt, float eta) -> float { return pt * std::sinh(eta); }); -DECLARE_SOA_DYNAMIC_COLUMN(P, p, [](float pt, float eta) -> float { return pt * std::cosh(eta); }); +DECLARE_SOA_INDEX_COLUMN(EMMCEvent, emmcevent); +DECLARE_SOA_SELF_ARRAY_INDEX_COLUMN(Mothers, mothers); //! Mother tracks (possible empty) array. Iterate over mcParticle.mothers_as()) +DECLARE_SOA_SELF_SLICE_INDEX_COLUMN(Daughters, daughters); //! Daughter tracks (possibly empty) slice. Check for non-zero with mcParticle.has_daughters(). Iterate over mcParticle.daughters_as()) +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float px, float py) -> float { return RecoDecay::sqrtSumOfSquares(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](float px, float py, float pz) -> float { return RecoDecay::eta(std::array{px, py, pz}); }); +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](float px, float py) -> float { return RecoDecay::phi(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(P, p, [](float px, float py, float pz) -> float { return RecoDecay::sqrtSumOfSquares(px, py, pz); }); DECLARE_SOA_DYNAMIC_COLUMN(Y, y, //! Particle rapidity - [](float pt, float eta, float e) -> float { - float pz = pt * std::sinh(eta); + [](float pz, float e) -> float { if ((e - pz) > static_cast(1e-7)) { return 0.5f * std::log((e + pz) / (e - pz)); } else { @@ -162,26 +158,24 @@ DECLARE_SOA_DYNAMIC_COLUMN(Y, y, //! Particle rapidity } }); } // namespace emmcparticle -// NOTE: This table is nearly identical to the one from Framework (except that it points to the event ID, not the BC id) -// This table contains all MC truth tracks (both v0 and calos) + +// This table contains all MC truth tracks (both v0 and calos) DECLARE_SOA_TABLE_FULL(EMMCParticles, "EMMCParticles", "AOD", "EMMCPARTICLE", //! MC track information (on disk) - o2::soa::Index<>, emmcparticle::EMReducedMCEventId, - mcparticle::PdgCode, mcparticle::StatusCode, mcparticle::Flags, + o2::soa::Index<>, emmcparticle::EMMCEventId, + mcparticle::PdgCode, mcparticle::Flags, emmcparticle::MothersIds, emmcparticle::DaughtersIdSlice, - mcparticle::Weight, - emmcparticle::Pt, emmcparticle::Eta, emmcparticle::Phi, emmcparticle::E, + mcparticle::Px, mcparticle::Py, mcparticle::Pz, mcparticle::E, mcparticle::Vx, mcparticle::Vy, mcparticle::Vz, mcparticle::Vt, // dynamic column - emmcparticle::Px, - emmcparticle::Py, - emmcparticle::Pz, - emmcparticle::P, - emmcparticle::Y, + emmcparticle::Pt, + emmcparticle::Eta, + emmcparticle::Phi, + + emmcparticle::P, + emmcparticle::Y, mcparticle::ProducedByGenerator, mcparticle::FromBackgroundEvent, - mcparticle::GetGenStatusCode, - mcparticle::GetProcess, mcparticle::IsPhysicalPrimary); using EMMCParticle = EMMCParticles::iterator; @@ -308,7 +302,7 @@ using V0Leg = V0Legs::iterator; namespace v0photonkf { -DECLARE_SOA_INDEX_COLUMN(EMReducedEvent, emreducedevent); //! +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! DECLARE_SOA_INDEX_COLUMN_FULL(PosTrack, posTrack, int, V0Legs, "_Pos"); //! DECLARE_SOA_INDEX_COLUMN_FULL(NegTrack, negTrack, int, V0Legs, "_Neg"); //! @@ -354,17 +348,17 @@ DECLARE_SOA_TABLE(V0PhotonsKF, "AOD", "V0PHOTONKF", //! // iterators using V0PhotonKF = V0PhotonsKF::iterator; -DECLARE_SOA_TABLE(V0KFEMReducedEventIds, "AOD", "V0KFEMEVENTID", v0photonkf::EMReducedEventId); // To be joined with V0PhotonsKF table at analysis level. +DECLARE_SOA_TABLE(V0KFEMEventIds, "AOD", "V0KFEMEVENTID", v0photonkf::EMEventId); // To be joined with V0PhotonsKF table at analysis level. // iterators -using V0KFEMReducedEventId = V0KFEMReducedEventIds::iterator; +using V0KFEMEventId = V0KFEMEventIds::iterator; namespace emprimaryelectron { -DECLARE_SOA_INDEX_COLUMN(EMReducedEvent, emreducedevent); //! -DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! -DECLARE_SOA_COLUMN(TrackId, trackId, int); //! -DECLARE_SOA_COLUMN(Sign, sign, int); //! -DECLARE_SOA_COLUMN(PrefilterBit, pfb, uint8_t); //! +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! +DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! +DECLARE_SOA_COLUMN(TrackId, trackId, int); //! +DECLARE_SOA_COLUMN(Sign, sign, int); //! +DECLARE_SOA_COLUMN(PrefilterBit, pfb, uint8_t); //! DECLARE_SOA_DYNAMIC_COLUMN(Px, px, [](float pt, float phi) -> float { return pt * std::cos(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Py, py, [](float pt, float phi) -> float { return pt * std::sin(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, [](float pt, float eta) -> float { return pt * std::sinh(eta); }); @@ -454,9 +448,9 @@ DECLARE_SOA_TABLE(EMPrimaryElectrons, "AOD", "EMPRIMARYEL", //! // iterators using EMPrimaryElectron = EMPrimaryElectrons::iterator; -DECLARE_SOA_TABLE(EMPrimaryElectronEMReducedEventIds, "AOD", "PRMELEMEVENTID", emprimaryelectron::EMReducedEventId); // To be joined with EMPrimaryElectrons table at analysis level. +DECLARE_SOA_TABLE(EMPrimaryElectronEMEventIds, "AOD", "PRMELEMEVENTID", emprimaryelectron::EMEventId); // To be joined with EMPrimaryElectrons table at analysis level. // iterators -using EMPrimaryElectronEMReducedEventId = EMPrimaryElectronEMReducedEventIds::iterator; +using EMPrimaryElectronEMEventId = EMPrimaryElectronEMEventIds::iterator; DECLARE_SOA_TABLE(EMPrimaryElectronsPrefilterBit, "AOD", "PRMELEPFB", emprimaryelectron::PrefilterBit); // To be joined with EMPrimaryElectrons table at analysis level. // iterators @@ -464,7 +458,7 @@ using EMPrimaryElectronPrefilterBit = EMPrimaryElectronsPrefilterBit::iterator; namespace dalitzee { -DECLARE_SOA_INDEX_COLUMN(EMReducedEvent, emreducedevent); //! +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! DECLARE_SOA_INDEX_COLUMN_FULL(PosTrack, posTrack, int, EMPrimaryElectrons, "_Pos"); //! DECLARE_SOA_INDEX_COLUMN_FULL(NegTrack, negTrack, int, EMPrimaryElectrons, "_Neg"); //! DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! @@ -486,17 +480,17 @@ DECLARE_SOA_TABLE(DalitzEEs, "AOD", "DALITZEE", //! // iterators using DalitzEE = DalitzEEs::iterator; -DECLARE_SOA_TABLE(DalitzEEEMReducedEventIds, "AOD", "EEEMEVENTID", dalitzee::EMReducedEventId); // To be joined with DalitzEEs table at analysis level. +DECLARE_SOA_TABLE(DalitzEEEMEventIds, "AOD", "EEEMEVENTID", dalitzee::EMEventId); // To be joined with DalitzEEs table at analysis level. // iterators -using DalitzEEEMReducedEventId = DalitzEEEMReducedEventIds::iterator; +using DalitzEEEMEventId = DalitzEEEMEventIds::iterator; namespace emprimarymuon { -DECLARE_SOA_INDEX_COLUMN(EMReducedEvent, emreducedevent); //! -DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! -DECLARE_SOA_COLUMN(TrackId, trackId, int); //! -DECLARE_SOA_COLUMN(Sign, sign, int); //! -DECLARE_SOA_COLUMN(PrefilterBit, pfb, uint8_t); //! +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! +DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! +DECLARE_SOA_COLUMN(TrackId, trackId, int); //! +DECLARE_SOA_COLUMN(Sign, sign, int); //! +DECLARE_SOA_COLUMN(PrefilterBit, pfb, uint8_t); //! DECLARE_SOA_DYNAMIC_COLUMN(Px, px, [](float pt, float phi) -> float { return pt * std::cos(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Py, py, [](float pt, float phi) -> float { return pt * std::sin(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, [](float pt, float eta) -> float { return pt * std::sinh(eta); }); @@ -586,9 +580,9 @@ DECLARE_SOA_TABLE(EMPrimaryMuons, "AOD", "EMPRIMARYMU", //! // iterators using EMPrimaryMuon = EMPrimaryMuons::iterator; -DECLARE_SOA_TABLE(EMPrimaryMuonEMReducedEventIds, "AOD", "PRMMUEMEVENTID", emprimarymuon::EMReducedEventId); // To be joined with EMPrimaryMuons table at analysis level. +DECLARE_SOA_TABLE(EMPrimaryMuonEMEventIds, "AOD", "PRMMUEMEVENTID", emprimarymuon::EMEventId); // To be joined with EMPrimaryMuons table at analysis level. // iterators -using EMPrimaryMuonEMReducedEventId = EMPrimaryMuonEMReducedEventIds::iterator; +using EMPrimaryMuonEMEventId = EMPrimaryMuonEMEventIds::iterator; DECLARE_SOA_TABLE(EMPrimaryMuonsPrefilterBit, "AOD", "PRMMUPFB", emprimarymuon::PrefilterBit); // To be joined with EMPrimaryMuons table at analysis level. // iterators @@ -596,7 +590,7 @@ using EMPrimaryMuonPrefilterBit = EMPrimaryMuonsPrefilterBit::iterator; namespace dalitzmumu { -DECLARE_SOA_INDEX_COLUMN(EMReducedEvent, emreducedevent); //! +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! DECLARE_SOA_INDEX_COLUMN_FULL(PosTrack, posTrack, int, EMPrimaryMuons, "_Pos"); //! DECLARE_SOA_INDEX_COLUMN_FULL(NegTrack, negTrack, int, EMPrimaryMuons, "_Neg"); //! DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! @@ -618,13 +612,13 @@ DECLARE_SOA_TABLE(DalitzMuMus, "AOD", "DALITZMUMU", //! // iterators using DalitzMuMu = DalitzMuMus::iterator; -DECLARE_SOA_TABLE(DalitzMuMuEMReducedEventIds, "AOD", "MUMUEMEVENTID", dalitzmumu::EMReducedEventId); // To be joined with DalitzMuMus table at analysis level. +DECLARE_SOA_TABLE(DalitzMuMuEMEventIds, "AOD", "MUMUEMEVENTID", dalitzmumu::EMEventId); // To be joined with DalitzMuMus table at analysis level. // iterators -using DalitzMuMuEMReducedEventId = DalitzMuMuEMReducedEventIds::iterator; +using DalitzMuMuEMEventId = DalitzMuMuEMEventIds::iterator; namespace pwgem::photon::swtinfo { -DECLARE_SOA_INDEX_COLUMN(EMReducedEvent, emreducedevent); //! +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! DECLARE_SOA_INDEX_COLUMN_FULL(TriggerV0PhotonHighPt, triggerV0PhotonHighPt, int, V0PhotonsKF, "_TriggerV0PhotonHighPt"); //! high pT PCM trigger is fired by this v0 photon DECLARE_SOA_INDEX_COLUMN_FULL(TriggerV0PhotonPair, triggerV0PhotonPair, int, V0PhotonsKF, "_TriggerV0PhotonPair"); //! PCM+EE trigger is fired by this v0 photon and dielectron @@ -634,17 +628,17 @@ DECLARE_SOA_TABLE(EMSwtInfosPCM, "AOD", "SWTINFOPCM", //! o2::soa::Index<>, pwgem::photon::swtinfo::CollisionId, pwgem::photon::swtinfo::TriggerV0PhotonHighPtId); using EMSwtInfoPCM = EMSwtInfosPCM::iterator; -DECLARE_SOA_TABLE(EMSwtInfoPCMEMReducedEventIds, "AOD", "SWTPCMEVENTID", pwgem::photon::swtinfo::EMReducedEventId, o2::soa::Marker<1>); // To be joined with EMSwtInfosPCM table at analysis level. +DECLARE_SOA_TABLE(EMSwtInfoPCMEMEventIds, "AOD", "SWTPCMEVENTID", pwgem::photon::swtinfo::EMEventId, o2::soa::Marker<1>); // To be joined with EMSwtInfosPCM table at analysis level. // iterators -using EMSwtInfoPCMEMReducedEventId = EMSwtInfoPCMEMReducedEventIds::iterator; +using EMSwtInfoPCMEMEventId = EMSwtInfoPCMEMEventIds::iterator; DECLARE_SOA_TABLE(EMSwtInfosPair, "AOD", "SWTINFOPAIR", //! o2::soa::Index<>, pwgem::photon::swtinfo::CollisionId, pwgem::photon::swtinfo::TriggerV0PhotonPairId, pwgem::photon::swtinfo::TriggerDielectronPairId); using EMSwtInfoPair = EMSwtInfosPair::iterator; -DECLARE_SOA_TABLE(EMSwtInfoPairEMReducedEventIds, "AOD", "SWTPAIREVENTID", pwgem::photon::swtinfo::EMReducedEventId, o2::soa::Marker<2>); // To be joined with EMSwtInfosPair table at analysis level. +DECLARE_SOA_TABLE(EMSwtInfoPairEMEventIds, "AOD", "SWTPAIREVENTID", pwgem::photon::swtinfo::EMEventId, o2::soa::Marker<2>); // To be joined with EMSwtInfosPair table at analysis level. // iterators -using EMSwtInfoPairEMReducedEventId = EMSwtInfoPairEMReducedEventIds::iterator; +using EMSwtInfoPairEMEventId = EMSwtInfoPairEMEventIds::iterator; namespace MCTracksTrue { @@ -739,7 +733,7 @@ DECLARE_SOA_COLUMN(NLM, nlm, int); //! numbe namespace emccluster { -DECLARE_SOA_INDEX_COLUMN(EMReducedEvent, emreducedevent); //! +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! DECLARE_SOA_COLUMN(CoreEnergy, coreEnergy, float); //! cluster core energy (GeV) DECLARE_SOA_COLUMN(Time, time, float); //! cluster time (ns) DECLARE_SOA_COLUMN(IsExotic, isExotic, bool); //! flag to mark cluster as exotic @@ -760,13 +754,13 @@ DECLARE_SOA_TABLE(SkimEMCClusters, "AOD", "SKIMEMCCLUSTERS", //! table of skimme emccluster::Pt); using SkimEMCCluster = SkimEMCClusters::iterator; -DECLARE_SOA_TABLE(EMCEMReducedEventIds, "AOD", "EMCEMEVENTID", emccluster::EMReducedEventId); // To be joined with SkimEMCClusters table at analysis level. +DECLARE_SOA_TABLE(EMCEMEventIds, "AOD", "EMCEMEVENTID", emccluster::EMEventId); // To be joined with SkimEMCClusters table at analysis level. // iterators -using EMCEMReducedEventId = EMCEMReducedEventIds::iterator; +using EMCEMEventId = EMCEMEventIds::iterator; namespace phoscluster { -DECLARE_SOA_INDEX_COLUMN(EMReducedEvent, emreducedevent); //! +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! DECLARE_SOA_INDEX_COLUMN_FULL(MatchedTrack, matchedTrack, int, Tracks, "_Matched"); //! matched track index DECLARE_SOA_COLUMN(X, x, float); //! cluster hit position in ALICE global coordinate DECLARE_SOA_COLUMN(Y, y, float); //! cluster hit position in ALICE global coordinate @@ -801,9 +795,9 @@ DECLARE_SOA_TABLE(PHOSClusters, "AOD", "PHOSCLUSTERS", //! phoscluster::Phi); using PHOSCluster = PHOSClusters::iterator; -DECLARE_SOA_TABLE(PHOSEMReducedEventIds, "AOD", "PHOSEMEVENTID", phoscluster::EMReducedEventId); // To be joined with PHOSClusters table at analysis level. +DECLARE_SOA_TABLE(PHOSEMEventIds, "AOD", "PHOSEMEVENTID", phoscluster::EMEventId); // To be joined with PHOSClusters table at analysis level. // iterators -using PHOSEMReducedEventId = PHOSEMReducedEventIds::iterator; +using PHOSEMEventId = PHOSEMEventIds::iterator; namespace caloextra { diff --git a/PWGEM/PhotonMeson/TableProducer/associateMCinfo.cxx b/PWGEM/PhotonMeson/TableProducer/associateMCinfo.cxx index dd76146e8a7..1e06a6d9b7b 100644 --- a/PWGEM/PhotonMeson/TableProducer/associateMCinfo.cxx +++ b/PWGEM/PhotonMeson/TableProducer/associateMCinfo.cxx @@ -20,11 +20,13 @@ #include "Framework/ASoAHelpers.h" #include "ReconstructionDataFormats/Track.h" #include "PWGEM/PhotonMeson/DataModel/gammaTables.h" +#include "PWGEM/PhotonMeson/Utils/MCUtilities.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; +using namespace o2::aod::pwgem::mcutil; using MyCollisionsMC = soa::Join; using TracksMC = soa::Join; @@ -38,14 +40,16 @@ struct AssociateMCInfo { kDalitzMuMu = 0x10, }; - Produces mcevents; - Produces mceventlabels; + Produces mcevents; + Produces mceventlabels; Produces emmcparticles; Produces v0legmclabels; Produces emprimaryelectronmclabels; Produces emprimarymuonmclabels; Configurable max_rxy_gen{"max_rxy_gen", 100, "max rxy to store generated information"}; + Configurable max_Y_gen{"max_Y_gen", 1.5, "max rapidity Y to store generated information"}; + Configurable margin_z_gen{"margin_z_gen", 15.f, "margin for Z of true photon conversion point to store generated information"}; HistogramRegistry registry{"EMMCEvent"}; @@ -87,8 +91,8 @@ struct AssociateMCInfo { // make an entry for this MC event only if it was not already added to the table if (!(fEventLabels.find(mcCollision.globalIndex()) != fEventLabels.end())) { - // mcevents(mcCollision.globalIndex(), mcCollision.generatorsID(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.t(), mcCollision.weight(), mcCollision.impactParameter()); - mcevents(mcCollision.generatorsID(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.t(), mcCollision.weight(), mcCollision.impactParameter()); + mcevents(mcCollision.globalIndex(), mcCollision.generatorsID(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.t(), mcCollision.impactParameter()); + // mcevents(mcCollision.generatorsID(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.t(), mcCollision.impactParameter()); fEventLabels[mcCollision.globalIndex()] = fCounters[1]; fCounters[1]++; } @@ -98,8 +102,8 @@ struct AssociateMCInfo { // store mc particles auto groupedMcTracks = mcTracks.sliceBy(perMcCollision, mcCollision.globalIndex()); - for (auto& mctrack : groupedMcTracks) { - if (mctrack.pt() < 1e-3 || abs(mctrack.y()) > 1.5 || abs(mctrack.vz()) > 250 || sqrt(pow(mctrack.vx(), 2) + pow(mctrack.vy(), 2)) > max_rxy_gen) { + for (auto& mctrack : groupedMcTracks) { // store necessary information for denominator of efficiency + if (mctrack.pt() < 1e-3 || abs(mctrack.y()) > max_Y_gen || abs(mctrack.vz()) > 250 || sqrt(pow(mctrack.vx(), 2) + pow(mctrack.vy(), 2)) > max_rxy_gen) { continue; } int pdg = mctrack.pdgCode(); @@ -117,16 +121,33 @@ struct AssociateMCInfo { && (abs(pdg) != 223) // omega(782) && (abs(pdg) != 331) // eta'(958) && (abs(pdg) != 333) // phi(1020) + // charmonia + && (abs(pdg) != 443) // J/psi + && (abs(pdg) != 100443) // psi(2S) + // bottomonia + && (abs(pdg) != 553) // Upsilon(1S) + && (abs(pdg) != 100553) // Upsilon(2S) + && (abs(pdg) != 200553) // Upsilon(3S) + // strange hadrons - && (abs(pdg) != 310) // K0S - && (abs(pdg) != 130) // K0L - && (abs(pdg) != 3122) // Lambda + // && (abs(pdg) != 310) // K0S + // && (abs(pdg) != 130) // K0L + // && (abs(pdg) != 3122) // Lambda ) { continue; } - // LOGF(info,"index = %d , mc track pdg = %d , producedByGenerator = %d , isPhysicalPrimary = %d", mctrack.index(), mctrack.pdgCode(), mctrack.producedByGenerator(), mctrack.isPhysicalPrimary()); + if (abs(pdg) == 11) { // electrons // extra check of production vertex for secondary electrons to reduce data size. + if (!mctrack.isPhysicalPrimary() && !mctrack.producedByGenerator() && sqrt(pow(mctrack.vx(), 2) + pow(mctrack.vy(), 2)) < abs(mctrack.vz()) * std::tan(2 * std::atan(std::exp(-max_Y_gen))) - margin_z_gen) { + continue; + } + } else { + if (!mctrack.isPhysicalPrimary() && !mctrack.producedByGenerator()) { + continue; + } + } + // these are used as denominator for efficiency. (i.e. generated information) if (!(fNewLabels.find(mctrack.globalIndex()) != fNewLabels.end())) { fNewLabels[mctrack.globalIndex()] = fCounters[0]; @@ -154,6 +175,7 @@ struct AssociateMCInfo { // auto o2track = leg.template track_as(); auto o2track = o2tracks.iteratorAt(leg.trackId()); auto mctrack = o2track.template mcParticle_as(); + // LOGF(info, "mctrack.globalIndex() = %d, mctrack.index() = %d", mctrack.globalIndex(), mctrack.index()); // these are exactly the same. // if the MC truth particle corresponding to this reconstructed track which is not already written, add it to the skimmed MC stack if (!(fNewLabels.find(mctrack.globalIndex()) != fNewLabels.end())) { @@ -164,8 +186,36 @@ struct AssociateMCInfo { fCounters[0]++; } v0legmclabels(fNewLabels.find(mctrack.index())->second, o2track.mcMask()); - } // end of leg loop - } // end of v0 loop + + // Next, store mother-chain of this reconstructed track. + int motherid = -999; // first mother index + if (mctrack.has_mothers()) { + motherid = mctrack.mothersIds()[0]; // first mother index + } + while (motherid > -1) { + if (motherid < mcTracks.size()) { // protect against bad mother indices. why is this needed? + auto mp = mcTracks.iteratorAt(motherid); + + // if the MC truth particle corresponding to this reconstructed track which is not already written, add it to the skimmed MC stack + if (!(fNewLabels.find(mp.globalIndex()) != fNewLabels.end())) { + fNewLabels[mp.globalIndex()] = fCounters[0]; + fNewLabelsReversed[fCounters[0]] = mp.globalIndex(); + // fMCFlags[mp.globalIndex()] = mcflags; + fEventIdx[mp.globalIndex()] = fEventLabels.find(mcCollision.globalIndex())->second; + fCounters[0]++; + } + + if (mp.has_mothers()) { + motherid = mp.mothersIds()[0]; // first mother index + } else { + motherid = -999; + } + } else { + motherid = -999; + } + } // end of mother chain loop + } // end of leg loop + } // end of v0 loop } if constexpr (static_cast(system & kDalitzEE)) { // for dalitz ee @@ -186,6 +236,35 @@ struct AssociateMCInfo { fCounters[0]++; } emprimaryelectronmclabels(fNewLabels.find(mctrack.index())->second, o2track.mcMask()); + + // Next, store mother-chain of this reconstructed track. + int motherid = -999; // first mother index + if (mctrack.has_mothers()) { + motherid = mctrack.mothersIds()[0]; // first mother index + } + while (motherid > -1) { + if (motherid < mcTracks.size()) { // protect against bad mother indices. why is this needed? + auto mp = mcTracks.iteratorAt(motherid); + + // if the MC truth particle corresponding to this reconstructed track which is not already written, add it to the skimmed MC stack + if (!(fNewLabels.find(mp.globalIndex()) != fNewLabels.end())) { + fNewLabels[mp.globalIndex()] = fCounters[0]; + fNewLabelsReversed[fCounters[0]] = mp.globalIndex(); + // fMCFlags[mp.globalIndex()] = mcflags; + fEventIdx[mp.globalIndex()] = fEventLabels.find(mcCollision.globalIndex())->second; + fCounters[0]++; + } + + if (mp.has_mothers()) { + motherid = mp.mothersIds()[0]; // first mother index + } else { + motherid = -999; + } + } else { + motherid = -999; + } + } // end of mother chain loop + } // end of em primary track loop } if constexpr (static_cast(system & kDalitzMuMu)) { @@ -207,6 +286,35 @@ struct AssociateMCInfo { fCounters[0]++; } emprimarymuonmclabels(fNewLabels.find(mctrack.index())->second, o2track.mcMask()); + + // Next, store mother-chain of this reconstructed track. + int motherid = -999; // first mother index + if (mctrack.has_mothers()) { + motherid = mctrack.mothersIds()[0]; // first mother index + } + while (motherid > -1) { + if (motherid < mcTracks.size()) { // protect against bad mother indices. why is this needed? + auto mp = mcTracks.iteratorAt(motherid); + + // if the MC truth particle corresponding to this reconstructed track which is not already written, add it to the skimmed MC stack + if (!(fNewLabels.find(mp.globalIndex()) != fNewLabels.end())) { + fNewLabels[mp.globalIndex()] = fCounters[0]; + fNewLabelsReversed[fCounters[0]] = mp.globalIndex(); + // fMCFlags[mp.globalIndex()] = mcflags; + fEventIdx[mp.globalIndex()] = fEventLabels.find(mcCollision.globalIndex())->second; + fCounters[0]++; + } + + if (mp.has_mothers()) { + motherid = mp.mothersIds()[0]; // first mother index + } else { + motherid = -999; + } + } else { + motherid = -999; + } + } // end of mother chain loop + } // end of em primary track loop } } // end of collision loop @@ -218,7 +326,12 @@ struct AssociateMCInfo { std::vector mothers; if (mctrack.has_mothers()) { + // LOGF(info, "mother ids size = %d", mctrack.mothersIds().size()); + // int counter = 0; for (auto& m : mctrack.mothersIds()) { + // LOGF(info, "counter = %d , mother id = %d", counter, m); + // counter++; + if (m < mcTracks.size()) { // protect against bad mother indices if (fNewLabels.find(m) != fNewLabels.end()) { mothers.push_back(fNewLabels.find(m)->second); @@ -252,9 +365,9 @@ struct AssociateMCInfo { daughterRange[1] = daughters[daughters.size() - 1]; } - emmcparticles(fEventIdx.find(oldLabel)->second, mctrack.pdgCode(), mctrack.statusCode(), mctrack.flags(), + emmcparticles(fEventIdx.find(oldLabel)->second, mctrack.pdgCode(), mctrack.flags(), mothers, daughterRange, - mctrack.weight(), mctrack.pt(), mctrack.eta(), mctrack.phi(), mctrack.e(), + mctrack.px(), mctrack.py(), mctrack.pz(), mctrack.e(), mctrack.vx(), mctrack.vy(), mctrack.vz(), mctrack.vt()); } // end loop over labels diff --git a/PWGEM/PhotonMeson/TableProducer/createEMReducedEvent.cxx b/PWGEM/PhotonMeson/TableProducer/createEMReducedEvent.cxx index b8b353d8571..7b73b9bc74c 100644 --- a/PWGEM/PhotonMeson/TableProducer/createEMReducedEvent.cxx +++ b/PWGEM/PhotonMeson/TableProducer/createEMReducedEvent.cxx @@ -38,9 +38,11 @@ using MyCollisionsMC = soa::Join; // centrality table has dependency on multiplicity table. struct CreateEMEvent { - Produces event; - Produces event_mult; - Produces event_cent; + Produces event; + Produces event_mult; + Produces event_cent; + + Configurable requireCaloReadout{"requireCaloReadout", true, "Require calorimeters readout when analyzing EMCal/PHOS"}; enum class EMEventType : int { kEvent = 0, @@ -80,8 +82,8 @@ struct CreateEMEvent { // LOGF(info, "collision-loop | bc.globalIndex() = %d, ncolls_per_bc = %d", bc.globalIndex(), map_ncolls_per_bc[bc.globalIndex()]); registry.fill(HIST("hEventCounter"), 1); - bool is_phoscpv_readout = collision.alias_bit(kTVXinPHOS); - bool is_emc_readout = collision.alias_bit(kTVXinEMC); + bool is_phoscpv_readout = (!requireCaloReadout || collision.alias_bit(kTVXinPHOS)); + bool is_emc_readout = (!requireCaloReadout || collision.alias_bit(kTVXinEMC)); if (collision.sel8()) { registry.fill(HIST("hEventCounter"), 2); @@ -136,15 +138,15 @@ struct CreateEMEvent { PROCESS_SWITCH(CreateEMEvent, processDummy, "processDummy", true); }; struct AssociatePhotonToEMEvent { - Produces v0kfeventid; - Produces prmeleventid; - Produces prmmueventid; - Produces phoseventid; - Produces emceventid; + Produces v0kfeventid; + Produces prmeleventid; + Produces prmmueventid; + Produces phoseventid; + Produces emceventid; - Produces event_ng_pcm; - Produces event_ng_phos; - Produces event_ng_emc; + Produces event_ng_pcm; + Produces event_ng_phos; + Produces event_ng_emc; Preslice perCollision_pcm = aod::v0photonkf::collisionId; Preslice perCollision_el = aod::emprimaryelectron::collisionId; @@ -209,32 +211,32 @@ struct AssociatePhotonToEMEvent { // This struct is for both data and MC. // Note that reconstructed collisions without mc collisions are already rejected in CreateEMEvent in MC. - void processPCM(aod::EMReducedEvents const& collisions, aod::V0PhotonsKF const& photons) + void processPCM(aod::EMEvents const& collisions, aod::V0PhotonsKF const& photons) { fillEventId_Ng(collisions, photons, v0kfeventid, event_ng_pcm, perCollision_pcm); } - void processDalitzEE(aod::EMReducedEvents const& collisions, aod::EMPrimaryElectrons const& tracks) + void processDalitzEE(aod::EMEvents const& collisions, aod::EMPrimaryElectrons const& tracks) { fillEventId(collisions, tracks, prmeleventid, perCollision_el); } - void processDalitzMuMu(aod::EMReducedEvents const& collisions, aod::EMPrimaryMuons const& tracks) + void processDalitzMuMu(aod::EMEvents const& collisions, aod::EMPrimaryMuons const& tracks) { fillEventId(collisions, tracks, prmmueventid, perCollision_mu); } - void processPHOS(aod::EMReducedEvents const& collisions, aod::PHOSClusters const& photons) + void processPHOS(aod::EMEvents const& collisions, aod::PHOSClusters const& photons) { fillEventId_Ng(collisions, photons, phoseventid, event_ng_phos, perCollision_phos); } - void processEMC(aod::EMReducedEvents const& collisions, aod::SkimEMCClusters const& photons) + void processEMC(aod::EMEvents const& collisions, aod::SkimEMCClusters const& photons) { fillEventId_Ng(collisions, photons, emceventid, event_ng_emc, perCollision_emc); } - void processZeroPadding(aod::EMReducedEvents const& collisions) + void processZeroPadding(aod::EMEvents const& collisions) { if (!doPCM) { zero_padding(collisions, event_ng_pcm); diff --git a/PWGEM/PhotonMeson/TableProducer/gammaSelection.cxx b/PWGEM/PhotonMeson/TableProducer/gammaSelection.cxx index ed61d0832bd..7a3708d480b 100644 --- a/PWGEM/PhotonMeson/TableProducer/gammaSelection.cxx +++ b/PWGEM/PhotonMeson/TableProducer/gammaSelection.cxx @@ -132,7 +132,7 @@ struct gammaSelection { LOG(info) << "|\t TM |phi|: |phi| <= " << PHOS_TM_Phi << std::endl; } - void processRec(aod::EMReducedEvents const&, aod::SkimEMCClusters const& emcclusters, aod::SkimEMCMTs const& matchedtracks, aod::PHOSClusters const& phosclusters) + void processRec(aod::EMEvents const&, aod::SkimEMCClusters const& emcclusters, aod::SkimEMCMTs const& matchedtracks, aod::PHOSClusters const& phosclusters) { for (const auto& emccluster : emcclusters) { // loop of EMC clusters uint64_t EMC_CutBit = doPhotonCutsEMC(EMC_CutModeBit, emccluster, matchedtracks, perEMCClusterMT, EMCHistos); diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEE.cxx index 84bfb9789bf..503dc37cf45 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEE.cxx @@ -26,10 +26,10 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyTracks = soa::Join; +using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; struct skimmerDalitzEE { @@ -40,14 +40,14 @@ struct skimmerDalitzEE { }; SliceCache cache; - Preslice perCol = o2::aod::emprimaryelectron::emreducedeventId; + Preslice perCol = o2::aod::emprimaryelectron::emeventId; SliceCache cache_cefp; Preslice perCol_cefp = o2::aod::emprimaryelectron::collisionId; Produces dalitzees; - Produces dalitz_ee_eventid; - Produces event_nee; + Produces dalitz_ee_eventid; + Produces event_nee; // Configurables Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; @@ -198,8 +198,8 @@ struct skimmerDalitzEE { continue; } - auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::emprimaryelectron::emreducedeventId, collision.globalIndex(), cache); - auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::emprimaryelectron::emreducedeventId, collision.globalIndex(), cache); + auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); + auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); fRegistry.fill(HIST("hNpos"), collision.centFT0C(), posTracks_per_coll.size()); fRegistry.fill(HIST("hNele"), collision.centFT0C(), negTracks_per_coll.size()); // LOGF(info, "collision.centFT0C() = %f, posTracks_per_coll.size() = %d, negTracks_per_coll.size() = %d", collision.centFT0C() , posTracks_per_coll.size(), negTracks_per_coll.size()); @@ -217,7 +217,7 @@ struct skimmerDalitzEE { Partition posTracks_cefp = o2::aod::emprimaryelectron::sign > 0 && o2::aod::track::pt > minpt&& nabs(o2::aod::track::eta) < maxeta&& minTPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl&& o2::aod::pidtpc::tpcNSigmaEl < maxTPCNsigmaEl; Partition negTracks_cefp = o2::aod::emprimaryelectron::sign < 0 && o2::aod::track::pt > minpt&& nabs(o2::aod::track::eta) < maxeta&& minTPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl&& o2::aod::pidtpc::tpcNSigmaEl < maxTPCNsigmaEl; - void processCEFP(soa::Join const& collisions, aod::EMPrimaryElectrons const& tracks) + void processCEFP(soa::Join const& collisions, aod::EMPrimaryElectrons const& tracks) { for (auto& collision : collisions) { auto posTracks_per_coll = posTracks_cefp->sliceByCached(o2::aod::emprimaryelectron::collisionId, collision.globalIndex(), cache_cefp); diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerDalitzMuMu.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerDalitzMuMu.cxx index 3687587f05c..d10e94417c9 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerDalitzMuMu.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerDalitzMuMu.cxx @@ -26,10 +26,10 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyTracks = soa::Join; +using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; struct skimmerDalitzMuMu { @@ -40,10 +40,10 @@ struct skimmerDalitzMuMu { }; SliceCache cache; - Preslice perCol = o2::aod::emprimarymuon::emreducedeventId; + Preslice perCol = o2::aod::emprimarymuon::emeventId; Produces dalitzmumus; - Produces dalitz_mumu_eventid; - Produces event_nmumu; + Produces dalitz_mumu_eventid; + Produces event_nmumu; // Configurables Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; @@ -179,8 +179,8 @@ struct skimmerDalitzMuMu { continue; } - auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::emprimarymuon::emreducedeventId, collision.globalIndex(), cache); - auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::emprimarymuon::emreducedeventId, collision.globalIndex(), cache); + auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::emprimarymuon::emeventId, collision.globalIndex(), cache); + auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::emprimarymuon::emeventId, collision.globalIndex(), cache); int npair_uls = 0, npair_lspp = 0, npair_lsmm = 0; npair_uls = fillPairTable(collision, posTracks_per_coll, negTracks_per_coll); // ULS diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectron.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectron.cxx index 0f314826950..ab3c3fcd211 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectron.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectron.cxx @@ -51,7 +51,7 @@ struct skimmerPrimaryElectron { SliceCache cache; Preslice perCol = o2::aod::track::collisionId; Produces emprimaryelectrons; - Produces events_bz; + Produces events_bz; // Configurables Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGEM/PhotonMeson/Tasks/MaterialBudget.cxx b/PWGEM/PhotonMeson/Tasks/MaterialBudget.cxx index 8e880e8eb7b..398f5dede2c 100644 --- a/PWGEM/PhotonMeson/Tasks/MaterialBudget.cxx +++ b/PWGEM/PhotonMeson/Tasks/MaterialBudget.cxx @@ -44,10 +44,10 @@ using namespace o2::soa; using namespace o2::aod::photonpair; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; struct MaterialBudget { @@ -199,7 +199,7 @@ struct MaterialBudget { LOGF(info, "Number of Pair cuts = %d", fPairCuts.size()); } - Preslice perCollision_pcm = aod::v0photonkf::emreducedeventId; + Preslice perCollision_pcm = aod::v0photonkf::emeventId; template bool IsSelectedPair(TG1 const& g1, TG2 const& g2, TCut1 const& cut1, TCut2 const& cut2) @@ -380,7 +380,7 @@ struct MaterialBudget { Partition grouped_collisions = cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax; // this goes to same event. Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - Filter collisionFilter_subsys = o2::aod::emreducedevent::ngpcm >= 2; + Filter collisionFilter_subsys = o2::aod::emevent::ngpcm >= 2; using MyFilteredCollisions = soa::Filtered; // this goes to mixed event. void processMB(MyCollisions const& collisions, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, aod::V0Legs const& legs) diff --git a/PWGEM/PhotonMeson/Tasks/MaterialBudgetMC.cxx b/PWGEM/PhotonMeson/Tasks/MaterialBudgetMC.cxx index 2dd79348cb5..942512bc96e 100644 --- a/PWGEM/PhotonMeson/Tasks/MaterialBudgetMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/MaterialBudgetMC.cxx @@ -46,10 +46,10 @@ using namespace o2::aod::photonpair; using namespace o2::aod::pwgem::mcutil; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; using MyMCV0Legs = soa::Join; @@ -216,7 +216,7 @@ struct MaterialBudgetMC { LOGF(info, "Number of Pair cuts = %d", fPairCuts.size()); } - Preslice perCollision_pcm = aod::v0photonkf::emreducedeventId; + Preslice perCollision_pcm = aod::v0photonkf::emeventId; template bool IsSelectedPair(TG1 const& g1, TG2 const& g2, TCut1 const& tagcut, TCut2 const& probecut) @@ -262,7 +262,7 @@ struct MaterialBudgetMC { bool is_photon_physical_primary = false; if (photonid > 0) { auto mcphoton = mcparticles.iteratorAt(photonid); - is_photon_physical_primary = IsPhysicalPrimary(mcphoton.emreducedmcevent(), mcphoton, mcparticles); + is_photon_physical_primary = IsPhysicalPrimary(mcphoton.emmcevent(), mcphoton, mcparticles); } if (!is_photon_physical_primary) { continue; @@ -345,7 +345,7 @@ struct MaterialBudgetMC { continue; } auto pi0mc = mcparticles.iteratorAt(pi0id); - if (!IsPhysicalPrimary(pi0mc.emreducedmcevent(), pi0mc, mcparticles)) { + if (!IsPhysicalPrimary(pi0mc.emmcevent(), pi0mc, mcparticles)) { continue; } @@ -372,17 +372,17 @@ struct MaterialBudgetMC { Partition grouped_collisions = cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax; // this goes to same event. Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - Filter collisionFilter_subsys = o2::aod::emreducedevent::ngpcm >= 2; + Filter collisionFilter_subsys = o2::aod::emevent::ngpcm >= 2; using MyFilteredCollisions = soa::Filtered; // this goes to same event pairing. - void processMBMC(MyCollisions const& collisions, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const& mccollisions) + void processMBMC(MyCollisions const& collisions, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) { fillsinglephoton(grouped_collisions, v0photons, perCollision_pcm, fProbeCuts, legs, mcparticles, mccollisions); TruePairing(filtered_collisions, v0photons, v0photons, perCollision_pcm, perCollision_pcm, fTagCuts, fProbeCuts, fPairCuts, legs, mcparticles, mccollisions); } - PresliceUnsorted perMcCollision = aod::emmcparticle::emreducedmceventId; - void processGen(MyCollisions const& collisions, aod::EMReducedMCEvents const&, aod::EMMCParticles const& mcparticles) + PresliceUnsorted perMcCollision = aod::emmcparticle::emmceventId; + void processGen(MyCollisions const& collisions, aod::EMMCEvents const&, aod::EMMCParticles const& mcparticles) { // loop over mc stack and fill histograms for pure MC truth signals // all MC tracks which belong to the MC event corresponding to the current reconstructed event @@ -392,7 +392,7 @@ struct MaterialBudgetMC { if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; } - auto mccollision = collision.emreducedmcevent(); + auto mccollision = collision.emmcevent(); // LOGF(info, "mccollision.globalIndex() = %d", mccollision.globalIndex()); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hCollisionCounter"))->Fill(1.0); diff --git a/PWGEM/PhotonMeson/Tasks/PhotonHBT.cxx b/PWGEM/PhotonMeson/Tasks/PhotonHBT.cxx index 36f0bc1636f..8cc67f0ab77 100644 --- a/PWGEM/PhotonMeson/Tasks/PhotonHBT.cxx +++ b/PWGEM/PhotonMeson/Tasks/PhotonHBT.cxx @@ -43,16 +43,16 @@ using namespace o2::soa; using namespace o2::aod::photonpair; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; -using MyDalitzEEs = soa::Join; +using MyDalitzEEs = soa::Join; using MyDalitzEE = MyDalitzEEs::iterator; -using MyPrimaryElectrons = soa::Join; +using MyPrimaryElectrons = soa::Join; using MyPrimaryElectron = MyPrimaryElectrons::iterator; struct PhotonHBT { @@ -558,8 +558,8 @@ struct PhotonHBT { } // end of different collision combinations } - Preslice perCollision_pcm = aod::v0photonkf::emreducedeventId; - Preslice perCollision_dalitzee = aod::dalitzee::emreducedeventId; + Preslice perCollision_pcm = aod::v0photonkf::emeventId; + Preslice perCollision_dalitzee = aod::dalitzee::emeventId; Preslice perCollision_phos = aod::skimmedcluster::collisionId; Filter eeFilter = o2::aod::dalitzee::sign == 0 && nabs(o2::aod::dalitzee::rapidity) < maxY_dielectron; // analyze only uls @@ -569,7 +569,7 @@ struct PhotonHBT { Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - Filter collisionFilter_subsys = (o2::aod::emreducedevent::ngpcm >= 1); + Filter collisionFilter_subsys = (o2::aod::emevent::ngpcm >= 1); using MyFilteredCollisions = soa::Filtered; void processPCMPCM(MyCollisions const& collisions, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, aod::V0Legs const& legs) diff --git a/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGamma.cxx b/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGamma.cxx index bedc2f4e683..820ea16e280 100644 --- a/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGamma.cxx +++ b/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGamma.cxx @@ -47,22 +47,22 @@ using namespace o2::soa; using namespace o2::aod::photonpair; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; -using MyDalitzEEs = soa::Join; +using MyDalitzEEs = soa::Join; using MyDalitzEE = MyDalitzEEs::iterator; -using MyDalitzMuMus = soa::Join; +using MyDalitzMuMus = soa::Join; using MyDalitzMuMu = MyDalitzMuMus::iterator; -using MyPrimaryElectrons = soa::Join; +using MyPrimaryElectrons = soa::Join; using MyPrimaryElectron = MyPrimaryElectrons::iterator; -using MyPrimaryMuons = soa::Join; +using MyPrimaryMuons = soa::Join; using MyPrimaryMuon = MyPrimaryMuons::iterator; struct Pi0EtaToGammaGamma { @@ -340,9 +340,9 @@ struct Pi0EtaToGammaGamma { LOGF(info, "Number of Pair cuts = %d", fPairCuts.size()); } - Preslice perCollision = aod::v0photonkf::emreducedeventId; - Preslice perCollision_dalitzee = aod::dalitzee::emreducedeventId; - Preslice perCollision_dalitzmumu = aod::dalitzmumu::emreducedeventId; + Preslice perCollision = aod::v0photonkf::emeventId; + Preslice perCollision_dalitzee = aod::dalitzee::emeventId; + Preslice perCollision_dalitzmumu = aod::dalitzmumu::emeventId; Preslice perCollision_phos = aod::skimmedcluster::collisionId; Preslice perCollision_emc = aod::skimmedcluster::collisionId; @@ -644,7 +644,7 @@ struct Pi0EtaToGammaGamma { Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - Filter collisionFilter_subsys = (o2::aod::emreducedevent::ngpcm >= 1) || (o2::aod::emreducedevent::ngphos >= 1) || (o2::aod::emreducedevent::ngemc >= 1); + Filter collisionFilter_subsys = (o2::aod::emevent::ngpcm >= 1) || (o2::aod::emevent::ngphos >= 1) || (o2::aod::emevent::ngemc >= 1); using MyFilteredCollisions = soa::Filtered; // this goes to mixed event. void processPCMPCM(MyCollisions const& collisions, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, aod::V0Legs const& legs) diff --git a/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGammaMC.cxx b/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGammaMC.cxx index 33a8a0a3657..c715ce44b4d 100644 --- a/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGammaMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGammaMC.cxx @@ -42,16 +42,16 @@ using namespace o2::aod::photonpair; using namespace o2::aod::pwgem::mcutil; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; -using MyDalitzEEs = soa::Join; +using MyDalitzEEs = soa::Join; using MyDalitzEE = MyDalitzEEs::iterator; -using MyDalitzMuMus = soa::Join; +using MyDalitzMuMus = soa::Join; using MyDalitzMuMu = MyDalitzMuMus::iterator; struct Pi0EtaToGammaGammaMC { @@ -323,9 +323,9 @@ struct Pi0EtaToGammaGammaMC { return true; } - Preslice perCollision_pcm = aod::v0photonkf::emreducedeventId; - Preslice perCollision_dalitzee = aod::dalitzee::emreducedeventId; - Preslice perCollision_dalitzmumu = aod::dalitzmumu::emreducedeventId; + Preslice perCollision_pcm = aod::v0photonkf::emeventId; + Preslice perCollision_dalitzee = aod::dalitzee::emeventId; + Preslice perCollision_dalitzmumu = aod::dalitzmumu::emeventId; template void TruePairing(TEvents const& collisions, TPhotons1 const& photons1, TPhotons2 const& photons2, TPreslice1 const& perCollision1, TPreslice2 const& perCollision2, TCuts1 const& cuts1, TCuts2 const& cuts2, TPairCuts const& paircuts, TV0Legs const& v0legs, TEMPrimaryElectrons const& emprimaryelectrons, TEMPrimaryMuons const& emprimarymuons, TMCEvents const& mcevents, TMCParticles const& mcparticles) @@ -410,9 +410,9 @@ struct Pi0EtaToGammaGammaMC { if (pi0id > 0) { auto pi0mc = mcparticles.iteratorAt(pi0id); - if (IsPhysicalPrimary(pi0mc.emreducedmcevent(), pi0mc, mcparticles)) { + if (IsPhysicalPrimary(pi0mc.emmcevent(), pi0mc, mcparticles)) { reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut.GetName(), cut.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_Primary"))->Fill(v12.M(), v12.Pt()); - } else if (IsFromWD(pi0mc.emreducedmcevent(), pi0mc, mcparticles)) { + } else if (IsFromWD(pi0mc.emmcevent(), pi0mc, mcparticles)) { reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut.GetName(), cut.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_FromWD"))->Fill(v12.M(), v12.Pt()); } } else if (etaid > 0) { @@ -518,9 +518,9 @@ struct Pi0EtaToGammaGammaMC { } if (pi0id > 0) { auto pi0mc = mcparticles.iteratorAt(pi0id); - if (IsPhysicalPrimary(pi0mc.emreducedmcevent(), pi0mc, mcparticles)) { + if (IsPhysicalPrimary(pi0mc.emmcevent(), pi0mc, mcparticles)) { reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_Primary"))->Fill(v12.M(), v12.Pt()); - } else if (IsFromWD(pi0mc.emreducedmcevent(), pi0mc, mcparticles)) { + } else if (IsFromWD(pi0mc.emmcevent(), pi0mc, mcparticles)) { reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_FromWD"))->Fill(v12.M(), v12.Pt()); } } else if (etaid > 0) { @@ -536,8 +536,8 @@ struct Pi0EtaToGammaGammaMC { } // end of collision loop } - PresliceUnsorted perMcCollision = aod::emmcparticle::emreducedmceventId; - PresliceUnsorted rec_perMcCollision = aod::emmceventlabel::emreducedmceventId; + PresliceUnsorted perMcCollision = aod::emmcparticle::emmceventId; + PresliceUnsorted rec_perMcCollision = aod::emmceventlabel::emmceventId; template void runGenInfo(TCollisions const& collisions, TMCCollisions const& mccollisions, TMCParticles const& mcparticles) @@ -568,7 +568,7 @@ struct Pi0EtaToGammaGammaMC { continue; } - auto mccollision = collision.emreducedmcevent(); + auto mccollision = collision.emmcevent(); reinterpret_cast(list_gen_pair->FindObject("hZvtx_before"))->Fill(mccollision.posZ()); reinterpret_cast(list_gen_pair->FindObject("hCollisionCounter"))->Fill(1.0); // all if (!collision.sel8()) { @@ -595,7 +595,7 @@ struct Pi0EtaToGammaGammaMC { } int pdg = mctrack.pdgCode(); - if (abs(pdg) == 111 && IsPhysicalPrimary(mctrack.emreducedmcevent(), mctrack, mcparticles)) { + if (abs(pdg) == 111 && IsPhysicalPrimary(mctrack.emmcevent(), mctrack, mcparticles)) { reinterpret_cast(list_gen_pair->FindObject("hPt_Pi0"))->Fill(mctrack.pt()); reinterpret_cast(list_gen_pair->FindObject("hY_Pi0"))->Fill(mctrack.y()); reinterpret_cast(list_gen_pair->FindObject("hPhi_Pi0"))->Fill(mctrack.phi()); @@ -604,7 +604,7 @@ struct Pi0EtaToGammaGammaMC { reinterpret_cast(list_gen_pair->FindObject("hY_Pi0_Acc"))->Fill(mctrack.y()); reinterpret_cast(list_gen_pair->FindObject("hPhi_Pi0_Acc"))->Fill(mctrack.phi()); } - } else if (abs(pdg) == 221 && IsPhysicalPrimary(mctrack.emreducedmcevent(), mctrack, mcparticles)) { + } else if (abs(pdg) == 221 && IsPhysicalPrimary(mctrack.emmcevent(), mctrack, mcparticles)) { reinterpret_cast(list_gen_pair->FindObject("hPt_Eta"))->Fill(mctrack.pt()); reinterpret_cast(list_gen_pair->FindObject("hY_Eta"))->Fill(mctrack.y()); reinterpret_cast(list_gen_pair->FindObject("hPhi_Eta"))->Fill(mctrack.phi()); @@ -620,26 +620,26 @@ struct Pi0EtaToGammaGammaMC { Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. - void processPCMPCM(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& v0legs, aod::EMReducedMCEvents const& mccollisions, aod::EMMCParticles const& mcparticles) + void processPCMPCM(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& v0legs, aod::EMMCEvents const& mccollisions, aod::EMMCParticles const& mcparticles) { TruePairing(grouped_collisions, v0photons, v0photons, perCollision_pcm, perCollision_pcm, fPCMCuts, fPCMCuts, fPairCuts, v0legs, nullptr, nullptr, mccollisions, mcparticles); runGenInfo(grouped_collisions, mccollisions, mcparticles); } void processPHOSPHOS(MyCollisions const& collisions) {} - void processEMCEMC(MyCollisions const& collisions, aod::EMReducedMCEvents const& mccollisions, aod::EMMCParticles const& mcparticles) + void processEMCEMC(MyCollisions const& collisions, aod::EMMCEvents const& mccollisions, aod::EMMCParticles const& mcparticles) { runGenInfo(collisions, mccollisions, mcparticles); } void processPCMPHOS(MyCollisions const& collisions) {} void processPCMEMC(MyCollisions const& collisions) {} - void processPCMDalitzEE(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& v0legs, MyDalitzEEs const& dileptons, MyMCElectrons const& emprimaryelectrons, aod::EMReducedMCEvents const& mccollisions, aod::EMMCParticles const& mcparticles) + void processPCMDalitzEE(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& v0legs, MyDalitzEEs const& dileptons, MyMCElectrons const& emprimaryelectrons, aod::EMMCEvents const& mccollisions, aod::EMMCParticles const& mcparticles) { TruePairing(grouped_collisions, v0photons, dileptons, perCollision_pcm, perCollision_dalitzee, fPCMCuts, fDalitzEECuts, fPairCuts, v0legs, emprimaryelectrons, nullptr, mccollisions, mcparticles); runGenInfo(grouped_collisions, mccollisions, mcparticles); } - void processPCMDalitzMuMu(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& v0legs, MyDalitzMuMus const& dileptons, MyMCMuons const& emprimarymuons, aod::EMReducedMCEvents const& mccollisions, aod::EMMCParticles const& mcparticles) + void processPCMDalitzMuMu(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& v0legs, MyDalitzMuMus const& dileptons, MyMCMuons const& emprimarymuons, aod::EMMCEvents const& mccollisions, aod::EMMCParticles const& mcparticles) { TruePairing(grouped_collisions, v0photons, dileptons, perCollision_pcm, perCollision_dalitzmumu, fPCMCuts, fDalitzMuMuCuts, fPairCuts, v0legs, nullptr, emprimarymuons, mccollisions, mcparticles); runGenInfo(grouped_collisions, mccollisions, mcparticles); diff --git a/PWGEM/PhotonMeson/Tasks/SinglePhoton.cxx b/PWGEM/PhotonMeson/Tasks/SinglePhoton.cxx index 2483347c374..bd6cf959ebc 100644 --- a/PWGEM/PhotonMeson/Tasks/SinglePhoton.cxx +++ b/PWGEM/PhotonMeson/Tasks/SinglePhoton.cxx @@ -45,10 +45,10 @@ using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; struct SinglePhoton { @@ -236,7 +236,7 @@ struct SinglePhoton { LOGF(info, "Number of EMCal cuts = %d", fEMCCuts.size()); } - Preslice perCollision = aod::v0photonkf::emreducedeventId; + Preslice perCollision = aod::v0photonkf::emeventId; // Preslice perCollision_phos = aod::skimmedcluster::collisionId; // Preslice perCollision_emc = aod::skimmedcluster::collisionId; diff --git a/PWGEM/PhotonMeson/Tasks/SinglePhotonMC.cxx b/PWGEM/PhotonMeson/Tasks/SinglePhotonMC.cxx index c56e393e152..056e8849fa7 100644 --- a/PWGEM/PhotonMeson/Tasks/SinglePhotonMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/SinglePhotonMC.cxx @@ -48,10 +48,10 @@ using namespace o2::soa; using namespace o2::aod::pwgem::mcutil; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; using MyMCV0Legs = soa::Join; @@ -248,7 +248,7 @@ struct SinglePhotonMC { // LOGF(info, "Number of EMCal cuts = %d", fEMCCuts.size()); // } - Preslice perCollision = aod::v0photonkf::emreducedeventId; + Preslice perCollision = aod::v0photonkf::emeventId; // Preslice perCollision_phos = aod::skimmedcluster::collisionId; // Preslice perCollision_emc = aod::skimmedcluster::collisionId; @@ -325,11 +325,11 @@ struct SinglePhotonMC { } auto mcphoton = mcparticles.iteratorAt(photonid); - if (IsPhysicalPrimary(mcphoton.emreducedmcevent(), mcphoton, mcparticles)) { + if (IsPhysicalPrimary(mcphoton.emmcevent(), mcphoton, mcparticles)) { reinterpret_cast(list_photon_det_cut->FindObject("hPt_Photon_Primary"))->Fill(v1.Pt()); reinterpret_cast(list_photon_det_cut->FindObject("hY_Photon_Primary"))->Fill(v1.Rapidity()); reinterpret_cast(list_photon_det_cut->FindObject("hPhi_Photon_Primary"))->Fill(v1.Phi() < 0.0 ? v1.Phi() + TMath::TwoPi() : v1.Phi()); - } else if (IsFromWD(mcphoton.emreducedmcevent(), mcphoton, mcparticles)) { + } else if (IsFromWD(mcphoton.emmcevent(), mcphoton, mcparticles)) { reinterpret_cast(list_photon_det_cut->FindObject("hPt_Photon_FromWD"))->Fill(v1.Pt()); reinterpret_cast(list_photon_det_cut->FindObject("hY_Photon_FromWD"))->Fill(v1.Rapidity()); reinterpret_cast(list_photon_det_cut->FindObject("hPhi_Photon_FromWD"))->Fill(v1.Phi() < 0.0 ? v1.Phi() + TMath::TwoPi() : v1.Phi()); @@ -346,23 +346,23 @@ struct SinglePhotonMC { Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. - void processPCM(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const& mccollisions) + void processPCM(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) { FillTruePhoton(grouped_collisions, v0photons, perCollision, fPCMCuts, legs, nullptr, mcparticles, mccollisions); } - // void processPHOS(MyCollisions const& collisions, aod::PHOSClusters const& phosclusters, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const& mccollisions) + // void processPHOS(MyCollisions const& collisions, aod::PHOSClusters const& phosclusters, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) // { // FillTruePhoton(grouped_collisions, phosclusters, perCollision_phos, fPHOSCuts, nullptr, nullptr, mcparticles, mccollisions); // } - // void processEMC(MyCollisions const& collisions, aod::SkimEMCClusters const& emcclusters, aod::SkimEMCMTs const& emcmatchedtracks, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const& mccollisions) + // void processEMC(MyCollisions const& collisions, aod::SkimEMCClusters const& emcclusters, aod::SkimEMCMTs const& emcmatchedtracks, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) // { // FillTruePhoton(grouped_collisions, emcclusters, perCollision_emc, fEMCCuts, nullptr, emcmatchedtracks, mcparticles, mccollisions); // } - PresliceUnsorted perMcCollision = aod::emmcparticle::emreducedmceventId; - void processGen(MyCollisions const& collisions, aod::EMReducedMCEvents const&, aod::EMMCParticles const& mcparticles) + PresliceUnsorted perMcCollision = aod::emmcparticle::emmceventId; + void processGen(MyCollisions const& collisions, aod::EMMCEvents const&, aod::EMMCParticles const& mcparticles) { // loop over mc stack and fill histograms for pure MC truth signals // all MC tracks which belong to the MC event corresponding to the current reconstructed event @@ -371,7 +371,7 @@ struct SinglePhotonMC { if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; } - auto mccollision = collision.emreducedmcevent(); + auto mccollision = collision.emmcevent(); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hCollisionCounter"))->Fill(1.0); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hZvtx_before"))->Fill(mccollision.posZ()); @@ -391,7 +391,7 @@ struct SinglePhotonMC { reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hCollisionCounter"))->Fill(4.0); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hZvtx_after"))->Fill(mccollision.posZ()); - auto mctracks_coll = mcparticles.sliceBy(perMcCollision, collision.emreducedmceventId()); + auto mctracks_coll = mcparticles.sliceBy(perMcCollision, collision.emmceventId()); for (auto& mctrack : mctracks_coll) { if (abs(mctrack.y()) > maxY) { continue; @@ -400,11 +400,11 @@ struct SinglePhotonMC { int photonid = IsEleFromPC(mctrack, mcparticles); if (photonid > 0) { auto mcphoton = mcparticles.iteratorAt(photonid); - if (!IsPhysicalPrimary(mcphoton.emreducedmcevent(), mcphoton, mcparticles)) { + if (!IsPhysicalPrimary(mcphoton.emmcevent(), mcphoton, mcparticles)) { continue; } } - if (abs(mctrack.pdgCode()) == 22 && IsPhysicalPrimary(mctrack.emreducedmcevent(), mctrack, mcparticles)) { + if (abs(mctrack.pdgCode()) == 22 && IsPhysicalPrimary(mctrack.emmcevent(), mctrack, mcparticles)) { reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hPt_Photon"))->Fill(mctrack.pt()); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hY_Photon"))->Fill(mctrack.y()); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hPhi_Photon"))->Fill(mctrack.phi()); diff --git a/PWGEM/PhotonMeson/Tasks/TagAndProbe.cxx b/PWGEM/PhotonMeson/Tasks/TagAndProbe.cxx index 5bd84496a63..3e4776d8b9a 100644 --- a/PWGEM/PhotonMeson/Tasks/TagAndProbe.cxx +++ b/PWGEM/PhotonMeson/Tasks/TagAndProbe.cxx @@ -45,13 +45,13 @@ using namespace o2::soa; using namespace o2::aod::photonpair; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; -using MyDalitzEEs = soa::Join; +using MyDalitzEEs = soa::Join; using MyDalitzEE = MyDalitzEEs::iterator; struct TagAndProbe { @@ -228,7 +228,7 @@ struct TagAndProbe { LOGF(info, "Number of Pair cuts = %d", fPairCuts.size()); } - Preslice perCollision = aod::v0photonkf::emreducedeventId; + Preslice perCollision = aod::v0photonkf::emeventId; Preslice perCollision_phos = aod::skimmedcluster::collisionId; Preslice perCollision_emc = aod::skimmedcluster::collisionId; @@ -478,7 +478,7 @@ struct TagAndProbe { Partition grouped_collisions = cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax; // this goes to same event. Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - Filter collisionFilter_subsys = (o2::aod::emreducedevent::ngpcm >= 1) || (o2::aod::emreducedevent::ngphos >= 1) || (o2::aod::emreducedevent::ngemc >= 1); + Filter collisionFilter_subsys = (o2::aod::emevent::ngpcm >= 1) || (o2::aod::emevent::ngphos >= 1) || (o2::aod::emevent::ngemc >= 1); using MyFilteredCollisions = soa::Filtered; // this goes to mixed event. void processPCMPCM(MyCollisions const& collisions, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, aod::V0Legs const& legs) diff --git a/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx b/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx index eb249f0ebda..259a62e211a 100644 --- a/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx +++ b/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx @@ -42,16 +42,16 @@ using namespace o2::soa; using namespace o2::aod::photonpair; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; -using MyDalitzEEs = soa::Join; +using MyDalitzEEs = soa::Join; using MyDalitzEE = MyDalitzEEs::iterator; -using MyPrimaryElectrons = soa::Join; +using MyPrimaryElectrons = soa::Join; using MyPrimaryElectron = MyPrimaryElectrons::iterator; struct TaggingPi0 { @@ -453,14 +453,14 @@ struct TaggingPi0 { Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - Filter collisionFilter_subsys = (o2::aod::emreducedevent::ngpcm >= 1) || (o2::aod::emreducedevent::ngphos >= 1) || (o2::aod::emreducedevent::ngemc >= 1); + Filter collisionFilter_subsys = (o2::aod::emevent::ngpcm >= 1) || (o2::aod::emevent::ngphos >= 1) || (o2::aod::emevent::ngemc >= 1); using MyFilteredCollisions = soa::Filtered; Filter DalitzEEFilter = o2::aod::dalitzee::sign == 0; // analyze only uls using MyFilteredDalitzEEs = soa::Filtered; - Preslice perCollision_pcm = aod::v0photonkf::emreducedeventId; - Preslice perCollision_dalitz = aod::dalitzee::emreducedeventId; + Preslice perCollision_pcm = aod::v0photonkf::emeventId; + Preslice perCollision_dalitz = aod::dalitzee::emeventId; Preslice perCollision_phos = aod::skimmedcluster::collisionId; Preslice perCollision_emc = aod::skimmedcluster::collisionId; diff --git a/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx b/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx index d38dc4c7cc6..47f2f9ce76e 100644 --- a/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx +++ b/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx @@ -46,13 +46,13 @@ using namespace o2::aod::photonpair; using namespace o2::aod::pwgem::mcutil; using namespace o2::aod::pwgem::photon; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; -using MyDalitzEEs = soa::Join; +using MyDalitzEEs = soa::Join; using MyDalitzEE = MyDalitzEEs::iterator; struct TaggingPi0MC { @@ -365,9 +365,9 @@ struct TaggingPi0MC { int pi0id1 = IsXFromY(mcphoton1, mcparticles, 22, 111); if (pi0id1 > 0) { auto mcpi01 = mcparticles.iteratorAt(pi0id1); - if (IsPhysicalPrimary(mcpi01.emreducedmcevent(), mcpi01, mcparticles)) { + if (IsPhysicalPrimary(mcpi01.emmcevent(), mcpi01, mcparticles)) { reinterpret_cast(list_pcm->FindObject(Form("%s", cut1.GetName()))->FindObject("hPt_v0photon_Pi0_Primary"))->Fill(g1.pt()); - } else if (IsFromWD(mcpi01.emreducedmcevent(), mcpi01, mcparticles)) { + } else if (IsFromWD(mcpi01.emmcevent(), mcpi01, mcparticles)) { reinterpret_cast(list_pcm->FindObject(Form("%s", cut1.GetName()))->FindObject("hPt_v0photon_Pi0_FromWD"))->Fill(g1.pt()); } else { reinterpret_cast(list_pcm->FindObject(Form("%s", cut1.GetName()))->FindObject("hPt_v0photon_Pi0_hs"))->Fill(g1.pt()); @@ -439,9 +439,9 @@ struct TaggingPi0MC { if (pi0id > 0) { auto mcpi0 = mcparticles.iteratorAt(pi0id); - if (IsPhysicalPrimary(mcpi0.emreducedmcevent(), mcpi0, mcparticles)) { + if (IsPhysicalPrimary(mcpi0.emmcevent(), mcpi0, mcparticles)) { reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_Primary"))->Fill(v12.M(), v1.Pt()); - } else if (IsFromWD(mcpi0.emreducedmcevent(), mcpi0, mcparticles)) { + } else if (IsFromWD(mcpi0.emmcevent(), mcpi0, mcparticles)) { reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_FromWD"))->Fill(v12.M(), v1.Pt()); } else { reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_hs"))->Fill(v12.M(), v1.Pt()); @@ -457,23 +457,23 @@ struct TaggingPi0MC { Filter DalitzEEFilter = o2::aod::dalitzee::sign == 0; // analyze only uls using MyFilteredDalitzEEs = soa::Filtered; - Preslice perCollision_pcm = aod::v0photonkf::emreducedeventId; - Preslice perCollision_dalitz = aod::dalitzee::emreducedeventId; + Preslice perCollision_pcm = aod::v0photonkf::emeventId; + Preslice perCollision_dalitz = aod::dalitzee::emeventId; Preslice perCollision_phos = aod::skimmedcluster::collisionId; Preslice perCollision_emc = aod::skimmedcluster::collisionId; Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. - void processPCMDalitzEE(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& legs, MyFilteredDalitzEEs const& dielectrons, MyMCTracks const& emprimaryelectrons, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const& mccollisions) + void processPCMDalitzEE(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& legs, MyFilteredDalitzEEs const& dielectrons, MyMCTracks const& emprimaryelectrons, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) { TruePairing(grouped_collisions, v0photons, dielectrons, perCollision_pcm, perCollision_dalitz, fPCMCuts, fDalitzEECuts, fPairCuts, legs, emprimaryelectrons, mcparticles, mccollisions); } - void processPCMPHOS(MyCollisions const& collisions, MyV0Photons const& v0photons, aod::PHOSClusters const& phosclusters, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const& mccollisions) + void processPCMPHOS(MyCollisions const& collisions, MyV0Photons const& v0photons, aod::PHOSClusters const& phosclusters, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) { TruePairing(grouped_collisions, v0photons, phosclusters, perCollision_pcm, perCollision_phos, fPCMCuts, fPHOSCuts, fPairCuts, legs, nullptr, mcparticles, mccollisions); } - void processPCMEMC(MyCollisions const& collisions, MyV0Photons const& v0photons, aod::SkimEMCClusters const& emcclusters, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const& mccollisions) + void processPCMEMC(MyCollisions const& collisions, MyV0Photons const& v0photons, aod::SkimEMCClusters const& emcclusters, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) { TruePairing(grouped_collisions, v0photons, emcclusters, perCollision_pcm, perCollision_emc, fPCMCuts, fEMCCuts, fPairCuts, legs, nullptr, mcparticles, mccollisions); } diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx index 95cbc54e566..a5574382b8d 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx @@ -38,13 +38,13 @@ using namespace o2::soa; using namespace o2::aod::pwgem::photon; using std::array; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyDalitzEEs = soa::Join; +using MyDalitzEEs = soa::Join; using MyDalitzEE = MyDalitzEEs::iterator; -using MyTracks = soa::Join; +using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; struct DalitzEEQC { @@ -136,8 +136,8 @@ struct DalitzEEQC { Partition lsmm_pairs = o2::aod::dalitzee::sign == -1; SliceCache cache; - Preslice perCollision = aod::dalitzee::emreducedeventId; - Preslice perCollision_track = aod::emprimaryelectron::emreducedeventId; + Preslice perCollision = aod::dalitzee::emeventId; + Preslice perCollision_track = aod::emprimaryelectron::emeventId; Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. std::vector used_trackIds; @@ -166,9 +166,9 @@ struct DalitzEEQC { reinterpret_cast(list_ev_before->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); reinterpret_cast(list_ev_after->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); - auto uls_pairs_per_coll = uls_pairs->sliceByCached(o2::aod::dalitzee::emreducedeventId, collision.globalIndex(), cache); - auto lspp_pairs_per_coll = lspp_pairs->sliceByCached(o2::aod::dalitzee::emreducedeventId, collision.globalIndex(), cache); - auto lsmm_pairs_per_coll = lsmm_pairs->sliceByCached(o2::aod::dalitzee::emreducedeventId, collision.globalIndex(), cache); + auto uls_pairs_per_coll = uls_pairs->sliceByCached(o2::aod::dalitzee::emeventId, collision.globalIndex(), cache); + auto lspp_pairs_per_coll = lspp_pairs->sliceByCached(o2::aod::dalitzee::emeventId, collision.globalIndex(), cache); + auto lsmm_pairs_per_coll = lsmm_pairs->sliceByCached(o2::aod::dalitzee::emeventId, collision.globalIndex(), cache); for (const auto& cut : fDalitzEECuts) { THashList* list_dalitzee_cut = static_cast(list_dalitzee->FindObject(cut.GetName())); @@ -278,7 +278,7 @@ struct DalitzEEQC { Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - Filter collisionFilter_subsys = (o2::aod::emreducedevent::neeuls >= 1) || (o2::aod::emreducedevent::neelspp >= 1) || (o2::aod::emreducedevent::neelsmm >= 1); + Filter collisionFilter_subsys = (o2::aod::emevent::neeuls >= 1) || (o2::aod::emevent::neelspp >= 1) || (o2::aod::emevent::neelsmm >= 1); using MyFilteredCollisions = soa::Filtered; // this goes to mixed event. // e+, e- enter to event mixing, only if any pair exists. If you want to do mixed event, please store LS for ee diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx index eda1773d2b8..e64f97ba41d 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx @@ -39,13 +39,13 @@ using namespace o2::aod::pwgem::mcutil; using namespace o2::aod::pwgem::photon; using std::array; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyDalitzEEs = soa::Join; +using MyDalitzEEs = soa::Join; using MyDalitzEE = MyDalitzEEs::iterator; -using MyTracks = soa::Join; +using MyTracks = soa::Join; using MyMCTracks = soa::Join; struct DalitzEEQCMC { @@ -157,12 +157,12 @@ struct DalitzEEQCMC { Partition uls_pairs = o2::aod::dalitzee::sign == 0; SliceCache cache; - Preslice perCollision = aod::dalitzee::emreducedeventId; + Preslice perCollision = aod::dalitzee::emeventId; Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. std::vector used_trackIds; - void processQCMC(MyCollisions const& collisions, MyDalitzEEs const& dileptons, MyMCTracks const& tracks, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const&) + void processQCMC(MyCollisions const& collisions, MyDalitzEEs const& dileptons, MyMCTracks const& tracks, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const&) { THashList* list_ev_before = static_cast(fMainList->FindObject("Event")->FindObject(event_types[0].data())); THashList* list_ev_after = static_cast(fMainList->FindObject("Event")->FindObject(event_types[1].data())); @@ -186,7 +186,7 @@ struct DalitzEEQCMC { reinterpret_cast(list_ev_before->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); reinterpret_cast(list_ev_after->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); - auto uls_pairs_per_coll = uls_pairs->sliceByCached(o2::aod::dalitzee::emreducedeventId, collision.globalIndex(), cache); + auto uls_pairs_per_coll = uls_pairs->sliceByCached(o2::aod::dalitzee::emeventId, collision.globalIndex(), cache); for (const auto& cut : fDalitzEECuts) { THashList* list_dalitzee_cut = static_cast(list_dalitzee->FindObject(cut.GetName())); @@ -211,7 +211,7 @@ struct DalitzEEQCMC { } if (mother_id > 0) { auto mcmother = mcparticles.iteratorAt(mother_id); - if (IsPhysicalPrimary(mcmother.emreducedmcevent(), mcmother, mcparticles)) { + if (IsPhysicalPrimary(mcmother.emmcevent(), mcmother, mcparticles)) { dca_pos_3d = pos.dca3DinSigma(); dca_ele_3d = ele.dca3DinSigma(); dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); @@ -252,7 +252,7 @@ struct DalitzEEQCMC { } // end of LF } else if (photonid > 0) { auto mcphoton = mcparticles.iteratorAt(photonid); - if (IsPhysicalPrimary(mcphoton.emreducedmcevent(), mcphoton, mcparticles) && IsEleFromPC(elemc, mcparticles) && IsEleFromPC(posmc, mcparticles)) { + if (IsPhysicalPrimary(mcphoton.emmcevent(), mcphoton, mcparticles) && IsEleFromPC(elemc, mcparticles) && IsEleFromPC(posmc, mcparticles)) { reinterpret_cast(list_dalitzee_cut->FindObject("hMvsPhiV_Photon"))->Fill(uls_pair.phiv(), uls_pair.mass()); reinterpret_cast(list_dalitzee_cut->FindObject("hMvsOPA_Photon"))->Fill(uls_pair.opangle(), uls_pair.mass()); } @@ -272,8 +272,8 @@ struct DalitzEEQCMC { Configurable max_mcEta{"max_mcEta", 0.9, "max. MC eta"}; Partition posTracks = o2::aod::mcparticle::pdgCode == -11; // e+ Partition negTracks = o2::aod::mcparticle::pdgCode == +11; // e- - PresliceUnsorted perMcCollision = aod::emmcparticle::emreducedmceventId; - void processGen(MyCollisions const& collisions, aod::EMReducedMCEvents const&, aod::EMMCParticles const& mcparticles) + PresliceUnsorted perMcCollision = aod::emmcparticle::emmceventId; + void processGen(MyCollisions const& collisions, aod::EMMCEvents const&, aod::EMMCParticles const& mcparticles) { // loop over mc stack and fill histograms for pure MC truth signals // all MC tracks which belong to the MC event corresponding to the current reconstructed event @@ -282,7 +282,7 @@ struct DalitzEEQCMC { if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; } - auto mccollision = collision.emreducedmcevent(); + auto mccollision = collision.emmcevent(); // LOGF(info, "mccollision.globalIndex() = %d", mccollision.globalIndex()); // auto mctracks_coll = mcparticles.sliceBy(perMcCollision, mccollision.globalIndex()); @@ -308,8 +308,8 @@ struct DalitzEEQCMC { reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hCollisionCounter"))->Fill(4.0); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hZvtx_after"))->Fill(mccollision.posZ()); - auto posTracks_per_coll = posTracks->sliceByCachedUnsorted(o2::aod::emmcparticle::emreducedmceventId, mccollision.globalIndex(), cache); - auto negTracks_per_coll = negTracks->sliceByCachedUnsorted(o2::aod::emmcparticle::emreducedmceventId, mccollision.globalIndex(), cache); + auto posTracks_per_coll = posTracks->sliceByCachedUnsorted(o2::aod::emmcparticle::emmceventId, mccollision.globalIndex(), cache); + auto negTracks_per_coll = negTracks->sliceByCachedUnsorted(o2::aod::emmcparticle::emmceventId, mccollision.globalIndex(), cache); for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // LOGF(info, "pdg1 = %d, pdg2 = %d", t1.pdgCode(), t2.pdgCode()); @@ -325,7 +325,7 @@ struct DalitzEEQCMC { continue; } auto mcmother = mcparticles.iteratorAt(mother_id); - if (IsPhysicalPrimary(mcmother.emreducedmcevent(), mcmother, mcparticles)) { + if (IsPhysicalPrimary(mcmother.emmcevent(), mcmother, mcparticles)) { ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; diff --git a/PWGEM/PhotonMeson/Tasks/dalitzMuMuQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzMuMuQC.cxx index 4e6290642ce..dc7128c0db4 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzMuMuQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzMuMuQC.cxx @@ -37,13 +37,13 @@ using namespace o2::soa; using namespace o2::aod::pwgem::photon; using std::array; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyDalitzMuMus = soa::Join; +using MyDalitzMuMus = soa::Join; using MyDalitzMuMu = MyDalitzMuMus::iterator; -using MyTracks = soa::Join; +using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; struct DalitzMuMuQC { @@ -144,8 +144,8 @@ struct DalitzMuMuQC { Partition lsmm_pairs = o2::aod::dalitzmumu::sign == -1; SliceCache cache; - Preslice perCollision = aod::dalitzmumu::emreducedeventId; - Preslice perCollision_track = aod::emprimarymuon::emreducedeventId; + Preslice perCollision = aod::dalitzmumu::emeventId; + Preslice perCollision_track = aod::emprimarymuon::emeventId; Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. std::vector used_trackIds; @@ -173,9 +173,9 @@ struct DalitzMuMuQC { reinterpret_cast(list_ev_before->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); reinterpret_cast(list_ev_after->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); - auto uls_pairs_per_coll = uls_pairs->sliceByCached(o2::aod::dalitzmumu::emreducedeventId, collision.globalIndex(), cache); - auto lspp_pairs_per_coll = lspp_pairs->sliceByCached(o2::aod::dalitzmumu::emreducedeventId, collision.globalIndex(), cache); - auto lsmm_pairs_per_coll = lsmm_pairs->sliceByCached(o2::aod::dalitzmumu::emreducedeventId, collision.globalIndex(), cache); + auto uls_pairs_per_coll = uls_pairs->sliceByCached(o2::aod::dalitzmumu::emeventId, collision.globalIndex(), cache); + auto lspp_pairs_per_coll = lspp_pairs->sliceByCached(o2::aod::dalitzmumu::emeventId, collision.globalIndex(), cache); + auto lsmm_pairs_per_coll = lsmm_pairs->sliceByCached(o2::aod::dalitzmumu::emeventId, collision.globalIndex(), cache); for (const auto& cut : fDalitzMuMuCuts) { THashList* list_dalitzmumu_cut = static_cast(list_dalitzmumu->FindObject(cut.GetName())); @@ -263,7 +263,7 @@ struct DalitzMuMuQC { Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - Filter collisionFilter_subsys = (o2::aod::emreducedevent::nmumuuls >= 1) || (o2::aod::emreducedevent::nmumulspp >= 1) || (o2::aod::emreducedevent::nmumulsmm >= 1); + Filter collisionFilter_subsys = (o2::aod::emevent::nmumuuls >= 1) || (o2::aod::emevent::nmumulspp >= 1) || (o2::aod::emevent::nmumulsmm >= 1); using MyFilteredCollisions = soa::Filtered; // this goes to mixed event. // mu+, mu- enter to event mixing, only if any pair exists. If you want to do mixed event, please store LS for mumu diff --git a/PWGEM/PhotonMeson/Tasks/dalitzMuMuQCMC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzMuMuQCMC.cxx index 094da56b9ac..d1d7a3d53c2 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzMuMuQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzMuMuQCMC.cxx @@ -39,13 +39,13 @@ using namespace o2::aod::pwgem::mcutil; using namespace o2::aod::pwgem::photon; using std::array; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyDalitzMuMus = soa::Join; +using MyDalitzMuMus = soa::Join; using MyDalitzMuMu = MyDalitzMuMus::iterator; -using MyTracks = soa::Join; +using MyTracks = soa::Join; using MyMCTracks = soa::Join; struct DalitzMuMuQCMC { @@ -150,12 +150,12 @@ struct DalitzMuMuQCMC { Partition uls_pairs = o2::aod::dalitzmumu::sign == 0; SliceCache cache; - Preslice perCollision = aod::dalitzmumu::emreducedeventId; + Preslice perCollision = aod::dalitzmumu::emeventId; Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. std::vector used_trackIds; - void processQCMC(MyCollisions const& collisions, MyDalitzMuMus const& dileptons, MyMCTracks const& tracks, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const&) + void processQCMC(MyCollisions const& collisions, MyDalitzMuMus const& dileptons, MyMCTracks const& tracks, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const&) { THashList* list_ev_before = static_cast(fMainList->FindObject("Event")->FindObject(event_types[0].data())); THashList* list_ev_after = static_cast(fMainList->FindObject("Event")->FindObject(event_types[1].data())); @@ -178,7 +178,7 @@ struct DalitzMuMuQCMC { reinterpret_cast(list_ev_before->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); reinterpret_cast(list_ev_after->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); - auto uls_pairs_per_coll = uls_pairs->sliceByCached(o2::aod::dalitzmumu::emreducedeventId, collision.globalIndex(), cache); + auto uls_pairs_per_coll = uls_pairs->sliceByCached(o2::aod::dalitzmumu::emeventId, collision.globalIndex(), cache); for (const auto& cut : fDalitzMuMuCuts) { THashList* list_dalitzmumu_cut = static_cast(list_dalitzmumu->FindObject(cut.GetName())); @@ -203,7 +203,7 @@ struct DalitzMuMuQCMC { } if (mother_id > 0) { auto mcmother = mcparticles.iteratorAt(mother_id); - if (IsPhysicalPrimary(mcmother.emreducedmcevent(), mcmother, mcparticles)) { + if (IsPhysicalPrimary(mcmother.emmcevent(), mcmother, mcparticles)) { dca_pos_3d = pos.dca3DinSigma(); dca_ele_3d = ele.dca3DinSigma(); dca_ee_3d = std::sqrt((dca_pos_3d * dca_pos_3d + dca_ele_3d * dca_ele_3d) / 2.); @@ -242,8 +242,8 @@ struct DalitzMuMuQCMC { Configurable max_mcEta{"max_mcEta", 0.9, "max. MC eta"}; Partition posTracks = o2::aod::mcparticle::pdgCode == -13; // mu+ Partition negTracks = o2::aod::mcparticle::pdgCode == +13; // mu- - PresliceUnsorted perMcCollision = aod::emmcparticle::emreducedmceventId; - void processGen(MyCollisions const& collisions, aod::EMReducedMCEvents const&, aod::EMMCParticles const& mcparticles) + PresliceUnsorted perMcCollision = aod::emmcparticle::emmceventId; + void processGen(MyCollisions const& collisions, aod::EMMCEvents const&, aod::EMMCParticles const& mcparticles) { // loop over mc stack and fill histograms for pure MC truth signals // all MC tracks which belong to the MC event corresponding to the current reconstructed event @@ -253,7 +253,7 @@ struct DalitzMuMuQCMC { continue; } - auto mccollision = collision.emreducedmcevent(); + auto mccollision = collision.emmcevent(); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hCollisionCounter"))->Fill(1.0); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hZvtx_before"))->Fill(mccollision.posZ()); @@ -276,8 +276,8 @@ struct DalitzMuMuQCMC { reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hCollisionCounter"))->Fill(4.0); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hZvtx_after"))->Fill(mccollision.posZ()); - auto posTracks_per_coll = posTracks->sliceByCachedUnsorted(o2::aod::emmcparticle::emreducedmceventId, mccollision.globalIndex(), cache); - auto negTracks_per_coll = negTracks->sliceByCachedUnsorted(o2::aod::emmcparticle::emreducedmceventId, mccollision.globalIndex(), cache); + auto posTracks_per_coll = posTracks->sliceByCachedUnsorted(o2::aod::emmcparticle::emmceventId, mccollision.globalIndex(), cache); + auto negTracks_per_coll = negTracks->sliceByCachedUnsorted(o2::aod::emmcparticle::emmceventId, mccollision.globalIndex(), cache); for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // LOGF(info, "pdg1 = %d, pdg2 = %d", t1.pdgCode(), t2.pdgCode()); @@ -293,7 +293,7 @@ struct DalitzMuMuQCMC { continue; } auto mcmother = mcparticles.iteratorAt(mother_id); - if (IsPhysicalPrimary(mcmother.emreducedmcevent(), mcmother, mcparticles)) { + if (IsPhysicalPrimary(mcmother.emmcevent(), mcmother, mcparticles)) { ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassMuon); ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassMuon); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; diff --git a/PWGEM/PhotonMeson/Tasks/emcalQC.cxx b/PWGEM/PhotonMeson/Tasks/emcalQC.cxx index 6043db306b5..399cbed8e27 100644 --- a/PWGEM/PhotonMeson/Tasks/emcalQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/emcalQC.cxx @@ -42,7 +42,7 @@ using namespace o2::soa; using namespace o2::aod::pwgem::photon; using std::array; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; struct emcalQC { @@ -80,9 +80,9 @@ struct emcalQC { reinterpret_cast(list_ev->FindObject("hNEvents"))->GetXaxis()->SetBinLabel(1, "all cols"); reinterpret_cast(list_ev->FindObject("hNEvents"))->GetXaxis()->SetBinLabel(2, "sel8"); reinterpret_cast(list_ev->FindObject("hNEvents"))->GetXaxis()->SetBinLabel(3, "emc readout"); - reinterpret_cast(list_ev->FindObject("hNEvents"))->GetXaxis()->SetBinLabel(5, "1+ Contributor"); - reinterpret_cast(list_ev->FindObject("hNEvents"))->GetXaxis()->SetBinLabel(6, "z<10cm"); - reinterpret_cast(list_ev->FindObject("hNEvents"))->GetXaxis()->SetBinLabel(7, "unique col"); + reinterpret_cast(list_ev->FindObject("hNEvents"))->GetXaxis()->SetBinLabel(4, "1+ Contributor"); + reinterpret_cast(list_ev->FindObject("hNEvents"))->GetXaxis()->SetBinLabel(5, "z<10cm"); + reinterpret_cast(list_ev->FindObject("hNEvents"))->GetXaxis()->SetBinLabel(6, "unique col"); o2::aod::pwgem::photon::histogram::AddHistClass(fMainList, "Cluster"); THashList* list_cluster = reinterpret_cast(fMainList->FindObject("Cluster")); diff --git a/PWGEM/PhotonMeson/Tasks/gammaConversions.cxx b/PWGEM/PhotonMeson/Tasks/gammaConversions.cxx index c7bf5b48c25..76457f809f8 100644 --- a/PWGEM/PhotonMeson/Tasks/gammaConversions.cxx +++ b/PWGEM/PhotonMeson/Tasks/gammaConversions.cxx @@ -35,7 +35,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using V0DatasAdditional = soa::Join; +using V0DatasAdditional = soa::Join; using V0LegsWithMC = soa::Join; // using collisionEvSelIt = soa::Join::iterator; @@ -608,8 +608,8 @@ struct GammaConversions { } } - Preslice perCollision = aod::v0photonkf::emreducedeventId; - void processRec(aod::EMReducedEvents::iterator const& theCollision, + Preslice perCollision = aod::v0photonkf::emeventId; + void processRec(aod::EMEvents::iterator const& theCollision, V0DatasAdditional const& theV0s, aod::V0Legs const& theAllTracks) { @@ -634,7 +634,7 @@ struct GammaConversions { Preslice gperV0 = aod::gammamctrue::v0photonkfId; - void processMc(aod::EMReducedEvents::iterator const& theCollision, + void processMc(aod::EMEvents::iterator const& theCollision, V0DatasAdditional const& theV0s, V0LegsWithMC const& theAllTracks, aod::V0DaughterMcParticles const& TheAllTracksMC, diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index 4564b34bedb..e61445cf95b 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -49,10 +49,10 @@ using namespace o2::soa; using namespace o2::aod::pwgem::photon; using std::array; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; struct PCMQC { @@ -138,7 +138,7 @@ struct PCMQC { fOutputV0.setObject(reinterpret_cast(fMainList->FindObject("V0"))); } - Preslice perCollision = aod::v0photonkf::emreducedeventId; + Preslice perCollision = aod::v0photonkf::emeventId; Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. void processQC(MyCollisions const& collisions, MyV0Photons const& v0photons, aod::V0Legs const& v0legs) diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 4625357172d..6d9f5732d36 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -50,10 +50,10 @@ using namespace o2::aod::pwgem::mcutil; using namespace o2::aod::pwgem::photon; using std::array; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; struct PCMQCMC { @@ -153,8 +153,8 @@ struct PCMQCMC { Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. - Preslice perCollision = aod::v0photonkf::emreducedeventId; - void processQCMC(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& v0legs, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const&) + Preslice perCollision = aod::v0photonkf::emeventId; + void processQCMC(MyCollisions const& collisions, MyV0Photons const& v0photons, MyMCV0Legs const& v0legs, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const&) { THashList* list_ev_before = static_cast(fMainList->FindObject("Event")->FindObject(event_types[0].data())); THashList* list_ev_after = static_cast(fMainList->FindObject("Event")->FindObject(event_types[1].data())); @@ -200,7 +200,7 @@ struct PCMQCMC { float eta_cp = std::atanh(v0.vz() / sqrt(pow(v0.vx(), 2) + pow(v0.vy(), 2) + pow(v0.vz(), 2))); o2::aod::pwgem::photon::histogram::FillHistClass(list_v0_cut, "", v0); - if (IsPhysicalPrimary(mcphoton.emreducedmcevent(), mcphoton, mcparticles)) { + if (IsPhysicalPrimary(mcphoton.emmcevent(), mcphoton, mcparticles)) { reinterpret_cast(fMainList->FindObject("V0")->FindObject(cut.GetName())->FindObject("hPt_Photon_Primary"))->Fill(v0.pt()); reinterpret_cast(fMainList->FindObject("V0")->FindObject(cut.GetName())->FindObject("hEtaPhi_Photon_Primary"))->Fill(v0.phi(), v0.eta()); reinterpret_cast(fMainList->FindObject("V0")->FindObject(cut.GetName())->FindObject("hXY_Photon_Primary"))->Fill(v0.vx(), v0.vy()); @@ -216,7 +216,7 @@ struct PCMQCMC { reinterpret_cast(fMainList->FindObject("V0")->FindObject(cut.GetName())->FindObject("hEtaRec_DeltaEta"))->Fill(eta_cp, v0.eta() - mcphoton.eta()); reinterpret_cast(fMainList->FindObject("V0")->FindObject(cut.GetName())->FindObject("hEtaRec_DeltaPhi"))->Fill(eta_cp, v0.phi() - mcphoton.phi()); - } else if (IsFromWD(mcphoton.emreducedmcevent(), mcphoton, mcparticles)) { + } else if (IsFromWD(mcphoton.emmcevent(), mcphoton, mcparticles)) { reinterpret_cast(fMainList->FindObject("V0")->FindObject(cut.GetName())->FindObject("hPt_Photon_FromWD"))->Fill(v0.pt()); reinterpret_cast(fMainList->FindObject("V0")->FindObject(cut.GetName())->FindObject("hEtaPhi_Photon_FromWD"))->Fill(v0.phi(), v0.eta()); } else { @@ -255,8 +255,8 @@ struct PCMQCMC { } // end of collision loop } // end of process - PresliceUnsorted perMcCollision = aod::emmcparticle::emreducedmceventId; - void processGen(MyCollisions const& collisions, aod::EMReducedMCEvents const&, aod::EMMCParticles const& mcparticles) + PresliceUnsorted perMcCollision = aod::emmcparticle::emmceventId; + void processGen(MyCollisions const& collisions, aod::EMMCEvents const&, aod::EMMCParticles const& mcparticles) { // loop over mc stack and fill histograms for pure MC truth signals // all MC tracks which belong to the MC event corresponding to the current reconstructed event @@ -266,7 +266,7 @@ struct PCMQCMC { if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; } - auto mccollision = collision.emreducedmcevent(); + auto mccollision = collision.emmcevent(); // LOGF(info, "mccollision.globalIndex() = %d", mccollision.globalIndex()); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hCollisionCounter"))->Fill(1.0); @@ -298,7 +298,7 @@ struct PCMQCMC { continue; } - if (abs(mctrack.pdgCode()) == 22 && IsPhysicalPrimary(mctrack.emreducedmcevent(), mctrack, mcparticles)) { + if (abs(mctrack.pdgCode()) == 22 && IsPhysicalPrimary(mctrack.emmcevent(), mctrack, mcparticles)) { reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hPt_Photon"))->Fill(mctrack.pt()); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hY_Photon"))->Fill(mctrack.y()); reinterpret_cast(fMainList->FindObject("Generated")->FindObject("hPhi_Photon"))->Fill(mctrack.phi()); diff --git a/PWGEM/PhotonMeson/Tasks/phosQC.cxx b/PWGEM/PhotonMeson/Tasks/phosQC.cxx index 014fc001759..84f7d5f5a20 100644 --- a/PWGEM/PhotonMeson/Tasks/phosQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/phosQC.cxx @@ -42,7 +42,7 @@ using namespace o2::soa; using namespace o2::aod::pwgem::photon; using std::array; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; struct phosQC { @@ -104,7 +104,7 @@ struct phosQC { fOutputCluster.setObject(reinterpret_cast(fMainList->FindObject("Cluster"))); } - Filter collisionFilter = o2::aod::emreducedevent::isPHOSCPVreadout == true; + Filter collisionFilter = o2::aod::emevent::isPHOSCPVreadout == true; using MyFilteredCollisions = soa::Filtered; Preslice perCollision = aod::skimmedcluster::collisionId; diff --git a/PWGEM/PhotonMeson/Utils/MCUtilities.h b/PWGEM/PhotonMeson/Utils/MCUtilities.h index 2b2ad3a620e..f4450154203 100644 --- a/PWGEM/PhotonMeson/Utils/MCUtilities.h +++ b/PWGEM/PhotonMeson/Utils/MCUtilities.h @@ -62,6 +62,8 @@ bool IsPhysicalPrimary(TCollision const& mccollision, TTrack const& mctrack, TMC } else { motherid = -999; } + } else { + motherid = -999; } } diff --git a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx index 900117466f6..5228e43d0b4 100644 --- a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx +++ b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx @@ -296,7 +296,7 @@ struct TaskPolarisationCharmHadrons { } // MC Gen histos - if (doprocessDstarMc || doprocessDstarMc || doprocessLcToPKPiMc || doprocessLcToPKPiMc) { + if (doprocessDstarMc || doprocessDstarMcWithMl || doprocessLcToPKPiMc || doprocessLcToPKPiMcWithMl) { if (activateTHnSparseCosThStarHelicity) { registry.add("hGenPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisPz, thnAxisY, thnAxisCosThetaStarHelicity}); registry.add("hGenNonPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisPz, thnAxisY, thnAxisCosThetaStarHelicity}); @@ -307,7 +307,7 @@ struct TaskPolarisationCharmHadrons { } if (activateTHnSparseCosThStarBeam) { registry.add("hGenPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisPz, thnAxisY, thnAxisCosThetaStarBeam}); - registry.add("hRecoNonPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisPz, thnAxisY, thnAxisCosThetaStarBeam}); + registry.add("hGenNonPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisPz, thnAxisY, thnAxisCosThetaStarBeam}); } if (activateTHnSparseCosThStarRandom) { registry.add("hGenPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisPz, thnAxisY, thnAxisCosThetaStarRandom}); diff --git a/PWGHF/D2H/Tasks/taskDs.cxx b/PWGHF/D2H/Tasks/taskDs.cxx index 9c9106dc7ce..12f6a907bf7 100644 --- a/PWGHF/D2H/Tasks/taskDs.cxx +++ b/PWGHF/D2H/Tasks/taskDs.cxx @@ -42,6 +42,9 @@ struct HfTaskDs { Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; Configurable> binsPt{"binsPt", std::vector{hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits"}; + ConfigurableAxis axisMlScore0{"axisMlScore0", {100, 0., 1.}, "axis for ML output score 0"}; + ConfigurableAxis axisMlScore1{"axisMlScore1", {100, 0., 1.}, "axis for ML output score 1"}; + ConfigurableAxis axisMlScore2{"axisMlScore2", {100, 0., 1.}, "axis for ML output score 2"}; HfHelper hfHelper; @@ -99,7 +102,7 @@ struct HfTaskDs { void init(InitContext&) { - std::array processes = {doprocessDataWithCentFT0, doprocessDataWithCentFT0M, doprocessDataWithCentNTracksPV, doprocessData, doprocessDataWithMlAndCentFT0, doprocessDataWithMlAndCentFT0M, doprocessDataWithMlAndCentNTracksPV, doprocessDataWithMl, doprocessMcWithCentFT0, doprocessMcWithCentFT0M, doprocessMcWithCentNTracksPV, doprocessMc, doprocessMcWithMlAndCentFT0, doprocessMcWithMlAndCentFT0M, doprocessMcWithMlAndCentNTracksPV, doprocessMcWithMl}; + std::array processes = {doprocessDataWithCentFT0C, doprocessDataWithCentFT0M, doprocessDataWithCentNTracksPV, doprocessData, doprocessDataWithMlAndCentFT0C, doprocessDataWithMlAndCentFT0M, doprocessDataWithMlAndCentNTracksPV, doprocessDataWithMl, doprocessMcWithCentFT0C, doprocessMcWithCentFT0M, doprocessMcWithCentNTracksPV, doprocessMc, doprocessMcWithMlAndCentFT0C, doprocessMcWithMlAndCentFT0M, doprocessMcWithMlAndCentNTracksPV, doprocessMcWithMl}; const int nProcesses = std::accumulate(processes.begin(), processes.end(), 0); if (nProcesses > 1) { @@ -112,19 +115,18 @@ struct HfTaskDs { AxisSpec ptbins = {vbins, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec ybins = {100, -5., 5, "#it{y}"}; AxisSpec massbins = {600, 1.67, 2.27, "inv. mass (KK#pi) (GeV/#it{c}^{2})"}; - AxisSpec MLbins = {100, 0., 1., "ML output"}; AxisSpec centralitybins = {100, 0., 100., "Centrality"}; - if (doprocessDataWithCentFT0 || doprocessDataWithCentFT0M || doprocessDataWithCentNTracksPV || - doprocessMcWithCentFT0 || doprocessMcWithCentFT0M || doprocessMcWithCentNTracksPV) { + if (doprocessDataWithCentFT0C || doprocessDataWithCentFT0M || doprocessDataWithCentNTracksPV || + doprocessMcWithCentFT0C || doprocessMcWithCentFT0M || doprocessMcWithCentNTracksPV) { registry.add("hSparseMass", "THn for Ds", HistType::kTHnSparseF, {massbins, ptbins, centralitybins}); - } else if (doprocessDataWithMlAndCentFT0 || doprocessDataWithMlAndCentFT0M || doprocessDataWithMlAndCentNTracksPV || - doprocessMcWithMlAndCentFT0 || doprocessMcWithMlAndCentFT0M || doprocessMcWithMlAndCentNTracksPV) { - registry.add("hSparseMass", "THn for Ds", HistType::kTHnSparseF, {massbins, ptbins, centralitybins, MLbins, MLbins, MLbins}); + } else if (doprocessDataWithMlAndCentFT0C || doprocessDataWithMlAndCentFT0M || doprocessDataWithMlAndCentNTracksPV || + doprocessMcWithMlAndCentFT0C || doprocessMcWithMlAndCentFT0M || doprocessMcWithMlAndCentNTracksPV) { + registry.add("hSparseMass", "THn for Ds", HistType::kTHnSparseF, {massbins, ptbins, centralitybins, {axisMlScore0}, {axisMlScore1}, {axisMlScore2}}); } else if (doprocessData || doprocessMc) { registry.add("hSparseMass", "THn for Ds", HistType::kTHnSparseF, {massbins, ptbins}); } else if (doprocessDataWithMl || doprocessMcWithMl) { - registry.add("hSparseMass", "THn for Ds", HistType::kTHnSparseF, {massbins, ptbins, MLbins, MLbins, MLbins}); + registry.add("hSparseMass", "THn for Ds", HistType::kTHnSparseF, {massbins, ptbins, {axisMlScore0}, {axisMlScore1}, {axisMlScore2}}); } registry.add("hEta", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {{100, -2., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("hCt", "3-prong candidates;proper lifetime (D_{s}^{#pm}) * #it{c} (cm);entries", {HistType::kTH2F, {{100, 0., 100}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); @@ -526,13 +528,13 @@ struct HfTaskDs { } } - void processDataWithCentFT0(CollisionsWithFT0C const&, - CandDsData const& candidates) + void processDataWithCentFT0C(CollisionsWithFT0C const&, + CandDsData const& candidates) { runDataAnalysis(selectedDsToKKPiCandData); runDataAnalysis(selectedDsToPiKKCandData); } - PROCESS_SWITCH(HfTaskDs, processDataWithCentFT0, "Process data w/o ML information on Ds, with information on centrality from FT0C", false); + PROCESS_SWITCH(HfTaskDs, processDataWithCentFT0C, "Process data w/o ML information on Ds, with information on centrality from FT0C", false); void processDataWithCentFT0M(CollisionsWithFT0M const&, CandDsData const& candidates) @@ -558,13 +560,13 @@ struct HfTaskDs { } PROCESS_SWITCH(HfTaskDs, processData, "Process data w/o ML information on Ds, w/o information on centrality", true); - void processDataWithMlAndCentFT0(CollisionsWithFT0C const&, - CandDsDataWithMl const& candidates) + void processDataWithMlAndCentFT0C(CollisionsWithFT0C const&, + CandDsDataWithMl const& candidates) { runDataAnalysis(selectedDsToKKPiCandWithMlData); runDataAnalysis(selectedDsToPiKKCandWithMlData); } - PROCESS_SWITCH(HfTaskDs, processDataWithMlAndCentFT0, "Process data with ML information on Ds, with information on centrality from FT0C", false); + PROCESS_SWITCH(HfTaskDs, processDataWithMlAndCentFT0C, "Process data with ML information on Ds, with information on centrality from FT0C", false); void processDataWithMlAndCentFT0M(CollisionsWithFT0M const&, CandDsDataWithMl const& candidates) @@ -590,16 +592,16 @@ struct HfTaskDs { } PROCESS_SWITCH(HfTaskDs, processDataWithMl, "Process data with ML information on Ds, w/o information on centrality", false); - void processMcWithCentFT0(CollisionsWithFT0C const&, - CandDsMcReco const& candidates, - CandDsMcGen const& mcParticles, - aod::TracksWMc const&) + void processMcWithCentFT0C(CollisionsWithFT0C const&, + CandDsMcReco const& candidates, + CandDsMcGen const& mcParticles, + aod::TracksWMc const&) { runMcAnalysis(candidates, mcParticles); runDataAnalysis(selectedDsToKKPiCandMc); runDataAnalysis(selectedDsToPiKKCandMc); } - PROCESS_SWITCH(HfTaskDs, processMcWithCentFT0, "Process MC w/o ML information on Ds, with information on centrality from FT0C", false); + PROCESS_SWITCH(HfTaskDs, processMcWithCentFT0C, "Process MC w/o ML information on Ds, with information on centrality from FT0C", false); void processMcWithCentFT0M(CollisionsWithFT0M const&, CandDsMcReco const& candidates, @@ -634,16 +636,16 @@ struct HfTaskDs { } PROCESS_SWITCH(HfTaskDs, processMc, "Process MC w/o ML information on Ds, w/o information on centrality", false); - void processMcWithMlAndCentFT0(CollisionsWithFT0C const&, - CandDsMcRecoWithMl const& candidates, - CandDsMcGen const& mcParticles, - aod::TracksWMc const&) + void processMcWithMlAndCentFT0C(CollisionsWithFT0C const&, + CandDsMcRecoWithMl const& candidates, + CandDsMcGen const& mcParticles, + aod::TracksWMc const&) { runMcAnalysis(candidates, mcParticles); runDataAnalysis(selectedDsToKKPiCandWithMlMc); runDataAnalysis(selectedDsToPiKKCandWithMlMc); } - PROCESS_SWITCH(HfTaskDs, processMcWithMlAndCentFT0, "Process MC with ML information on Ds, with information on centrality from FT0C", false); + PROCESS_SWITCH(HfTaskDs, processMcWithMlAndCentFT0C, "Process MC with ML information on Ds, with information on centrality from FT0C", false); void processMcWithMlAndCentFT0M(CollisionsWithFT0M const&, CandDsMcRecoWithMl const& candidates, diff --git a/PWGHF/HFC/DataModel/DMesonPairsTables.h b/PWGHF/HFC/DataModel/DMesonPairsTables.h index 97c9fb1c396..bb149169d19 100644 --- a/PWGHF/HFC/DataModel/DMesonPairsTables.h +++ b/PWGHF/HFC/DataModel/DMesonPairsTables.h @@ -11,6 +11,7 @@ /// \file DMesonPairsTables.h /// \brief D meson pair table definition. +/// /// \author Andrea Tavira García , IJCLab Orsay #ifndef PWGHF_HFC_DATAMODEL_DMESONPAIRSTABLES_H_ @@ -24,19 +25,18 @@ namespace o2::aod namespace hf_correlation_d_meson_pair { // Kinematic info -DECLARE_SOA_COLUMN(DeltaPhi, deltaPhi, float); //! Delta phi of the pair -DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float); //! Delta eta of the pair -DECLARE_SOA_COLUMN(PtCand1, ptCand1, float); //! Transverse momentum of first candidate -DECLARE_SOA_COLUMN(PtCand2, ptCand2, float); //! Transverse momentum of second candidate -DECLARE_SOA_COLUMN(YCand1, yCand1, float); //! Rapidity of first candidate -DECLARE_SOA_COLUMN(YCand2, yCand2, float); //! Rapidity of second candidate +DECLARE_SOA_COLUMN(PtCand1, ptCand1, float); //! Transverse momentum of first candidate +DECLARE_SOA_COLUMN(PtCand2, ptCand2, float); //! Transverse momentum of second candidate +DECLARE_SOA_COLUMN(YCand1, yCand1, float); //! Rapidity of first candidate +DECLARE_SOA_COLUMN(YCand2, yCand2, float); //! Rapidity of second candidate // Invariant mass -DECLARE_SOA_COLUMN(MCand1, mCand1, float); //! Invariant mass of first candidate -DECLARE_SOA_COLUMN(MCand2, mCand2, float); //! Invariant mass of second candidate -// Type of candidate: candidate charge and whether it is signal, reflected, or bkg -DECLARE_SOA_COLUMN(CandidateType1, candidateType1, uint8_t); //! Type of first candidate -DECLARE_SOA_COLUMN(CandidateType2, candidateType2, uint8_t); //! Type of second candidate -DECLARE_SOA_COLUMN(DataType, dataType, uint8_t); //! 0: data, 1: MC reco, 2: MC gen +DECLARE_SOA_COLUMN(MDCand1, mDCand1, float); //! Invariant mass of first candidate as D +DECLARE_SOA_COLUMN(MDbarCand1, mDbarCand1, float); //! Invariant mass of first candidate as Dbar +DECLARE_SOA_COLUMN(MDCand2, mDCand2, float); //! Invariant mass of second candidate as D +DECLARE_SOA_COLUMN(MDbarCand2, mDbarCand2, float); //! Invariant mass of second candidate as Dbar +DECLARE_SOA_COLUMN(PairType, pairType, uint8_t); //! Bitmap with all pair types (DD, DDbar, etc.) a pair of candidates has passed +DECLARE_SOA_COLUMN(CandidateType1, candidateType1, uint8_t); //! Bitmap with Selected and True info of candidate 1 +DECLARE_SOA_COLUMN(CandidateType2, candidateType2, uint8_t); //! Bitmap with Selected and True info of candidate 2 // MC info DECLARE_SOA_COLUMN(Origin1, origin1, uint8_t); //! candidate 1 origin DECLARE_SOA_COLUMN(Origin2, origin2, uint8_t); //! candidate 2 origin @@ -47,31 +47,31 @@ DECLARE_SOA_COLUMN(MatchedMc2, matchedMc2, uint8_t); //! MC matching of candidat // Definition of the D meson pair table. Contains the info needed at Data level. #define DECLARE_DMESON_PAIR_TABLE(_pair_type_, _marker_value_, _description_) \ DECLARE_SOA_TABLE(_pair_type_, "AOD", _description_, o2::soa::Marker<_marker_value_>, \ - hf_correlation_d_meson_pair::DeltaPhi, \ - hf_correlation_d_meson_pair::DeltaEta, \ hf_correlation_d_meson_pair::PtCand1, \ hf_correlation_d_meson_pair::PtCand2, \ hf_correlation_d_meson_pair::YCand1, \ hf_correlation_d_meson_pair::YCand2, \ - hf_correlation_d_meson_pair::MCand1, \ - hf_correlation_d_meson_pair::MCand2, \ + hf_correlation_d_meson_pair::MDCand1, \ + hf_correlation_d_meson_pair::MDbarCand1, \ + hf_correlation_d_meson_pair::MDCand2, \ + hf_correlation_d_meson_pair::MDbarCand2, \ + hf_correlation_d_meson_pair::PairType, \ hf_correlation_d_meson_pair::CandidateType1, \ - hf_correlation_d_meson_pair::CandidateType2, \ - hf_correlation_d_meson_pair::DataType); - -// definition of the D meson pair table with info at MC level. -#define DECLARE_DMESON_PAIR_RECOINFO_TABLE(_pair_type_, _marker_value_, _description_) \ - DECLARE_SOA_TABLE(_pair_type_, "AOD", _description_ "RECOINFO", o2::soa::Marker<_marker_value_>, \ - hf_correlation_d_meson_pair::Origin1, \ - hf_correlation_d_meson_pair::Origin2, \ - hf_correlation_d_meson_pair::MatchedMc1, \ + hf_correlation_d_meson_pair::CandidateType2); +// Definition of the D meson pair table with info at MC level. +#define DECLARE_DMESON_PAIR_MCINFO_TABLE(_pair_type_, _marker_value_, _description_) \ + DECLARE_SOA_TABLE(_pair_type_, "AOD", _description_ "MCINFO", o2::soa::Marker<_marker_value_>, \ + hf_correlation_d_meson_pair::Origin1, \ + hf_correlation_d_meson_pair::Origin2, \ + hf_correlation_d_meson_pair::MatchedMc1, \ hf_correlation_d_meson_pair::MatchedMc2); // Creation of tables with D Meson Pairs info -DECLARE_DMESON_PAIR_TABLE(D0Pair, 1, "D0PAIR"); //! D0 pairs Info -DECLARE_DMESON_PAIR_RECOINFO_TABLE(D0PairRecoInfo, 1, "D0PAIR"); //! D0 pairs Reconstructed Info -DECLARE_DMESON_PAIR_TABLE(DplusPair, 2, "DPLUSPAIR"); //! D+ pairs Info -DECLARE_DMESON_PAIR_RECOINFO_TABLE(DplusPairRecoInfo, 2, "DPLUS"); //! D+ pairs Reconstructed Info +DECLARE_DMESON_PAIR_TABLE(D0Pair, 1, "D0PAIR"); //! D0 pairs Info +DECLARE_DMESON_PAIR_MCINFO_TABLE(D0PairMcInfo, 1, "D0PAIR"); //! D0 pairs MC Rec Info + +DECLARE_DMESON_PAIR_TABLE(D0PairMcGen, 2, "D0PAIRGEN"); //! D0 pairs MC Gen Kinematic Info +DECLARE_DMESON_PAIR_MCINFO_TABLE(D0PairMcGenInfo, 2, "D0PAIRGEN"); //! D0 pairs MC Gen Info } // namespace o2::aod diff --git a/PWGHF/HFC/DataModel/DMesonPairsTablesTesting.h b/PWGHF/HFC/DataModel/DMesonPairsTablesTesting.h deleted file mode 100644 index 1fb0f1702e4..00000000000 --- a/PWGHF/HFC/DataModel/DMesonPairsTablesTesting.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -/// \file DMesonPairsTablesTesting.h -/// \brief D meson pair table definition. -/// \note Temporary code for tests of D0-D0 correlations -/// -/// \author Andrea Tavira García , IJCLab Orsay - -#ifndef PWGHF_HFC_DATAMODEL_DMESONPAIRSTABLESTESTING_H_ -#define PWGHF_HFC_DATAMODEL_DMESONPAIRSTABLESTESTING_H_ - -#include "Framework/AnalysisDataModel.h" - -namespace o2::aod -{ -// definition of columns and tables for D(bar) Meson correlation pair studies -namespace hf_correlation_d_meson_pair_testing -{ -// Kinematic info -DECLARE_SOA_COLUMN(PtCand1, ptCand1, float); //! Transverse momentum of first candidate -DECLARE_SOA_COLUMN(PtCand2, ptCand2, float); //! Transverse momentum of second candidate -DECLARE_SOA_COLUMN(YCand1, yCand1, float); //! Rapidity of first candidate -DECLARE_SOA_COLUMN(YCand2, yCand2, float); //! Rapidity of second candidate -// Invariant mass -DECLARE_SOA_COLUMN(MDCand1, mDCand1, float); //! Invariant mass of first candidate as D -DECLARE_SOA_COLUMN(MDbarCand1, mDbarCand1, float); //! Invariant mass of first candidate as Dbar -DECLARE_SOA_COLUMN(MDCand2, mDCand2, float); //! Invariant mass of second candidate as D -DECLARE_SOA_COLUMN(MDbarCand2, mDbarCand2, float); //! Invariant mass of second candidate as Dbar -DECLARE_SOA_COLUMN(PairType, pairType, uint8_t); //! Bitmap with all pair types (DD, DDbar, etc.) a pair of candidates has passed -DECLARE_SOA_COLUMN(CandidateType1, candidateType1, uint8_t); //! Bitmap with Selected and True info of candidate 1 -DECLARE_SOA_COLUMN(CandidateType2, candidateType2, uint8_t); //! Bitmap with Selected and True info of candidate 2 -// MC info -DECLARE_SOA_COLUMN(Origin1, origin1, uint8_t); //! candidate 1 origin -DECLARE_SOA_COLUMN(Origin2, origin2, uint8_t); //! candidate 2 origin -DECLARE_SOA_COLUMN(MatchedMc1, matchedMc1, uint8_t); //! MC matching of candidate 1 -DECLARE_SOA_COLUMN(MatchedMc2, matchedMc2, uint8_t); //! MC matching of candidate 2 -} // namespace hf_correlation_d_meson_pair_testing - -// Definition of the D meson pair table. Contains the info needed at Data level. -#define DECLARE_DMESON_PAIR_TABLE_TESTING(_pair_type_, _marker_value_, _description_) \ - DECLARE_SOA_TABLE(_pair_type_, "AOD", _description_, o2::soa::Marker<_marker_value_>, \ - hf_correlation_d_meson_pair_testing::PtCand1, \ - hf_correlation_d_meson_pair_testing::PtCand2, \ - hf_correlation_d_meson_pair_testing::YCand1, \ - hf_correlation_d_meson_pair_testing::YCand2, \ - hf_correlation_d_meson_pair_testing::MDCand1, \ - hf_correlation_d_meson_pair_testing::MDbarCand1, \ - hf_correlation_d_meson_pair_testing::MDCand2, \ - hf_correlation_d_meson_pair_testing::MDbarCand2, \ - hf_correlation_d_meson_pair_testing::PairType, \ - hf_correlation_d_meson_pair_testing::CandidateType1, \ - hf_correlation_d_meson_pair_testing::CandidateType2); -// Definition of the D meson pair table with info at MC level. -#define DECLARE_DMESON_PAIR_MCINFO_TABLE_TESTING(_pair_type_, _marker_value_, _description_) \ - DECLARE_SOA_TABLE(_pair_type_, "AOD", _description_ "MCINFO", o2::soa::Marker<_marker_value_>, \ - hf_correlation_d_meson_pair_testing::Origin1, \ - hf_correlation_d_meson_pair_testing::Origin2, \ - hf_correlation_d_meson_pair_testing::MatchedMc1, \ - hf_correlation_d_meson_pair_testing::MatchedMc2); - -// Creation of tables with D Meson Pairs info -DECLARE_DMESON_PAIR_TABLE_TESTING(D0PairTesting, 1, "D0PAIR"); //! D0 pairs Info -DECLARE_DMESON_PAIR_MCINFO_TABLE_TESTING(D0PairMcInfoTesting, 1, "D0PAIR"); //! D0 pairs MC Rec Info - -DECLARE_DMESON_PAIR_TABLE_TESTING(D0PairMcGenTesting, 2, "D0PAIRGEN"); //! D0 pairs MC Gen Kinematic Info -DECLARE_DMESON_PAIR_MCINFO_TABLE_TESTING(D0PairMcGenInfoTesting, 2, "D0PAIRGEN"); //! D0 pairs MC Gen Info - -} // namespace o2::aod - -#endif // PWGHF_HFC_DATAMODEL_DMESONPAIRSTABLESTESTING_H_ diff --git a/PWGHF/HFC/TableProducer/CMakeLists.txt b/PWGHF/HFC/TableProducer/CMakeLists.txt index 55c39530cd6..16c61cdcdec 100644 --- a/PWGHF/HFC/TableProducer/CMakeLists.txt +++ b/PWGHF/HFC/TableProducer/CMakeLists.txt @@ -29,11 +29,6 @@ o2physics_add_dpl_workflow(correlator-d-meson-pairs PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(correlator-d-meson-pairs-testing - SOURCES correlatorDMesonPairsTesting.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(correlator-dplus-dminus SOURCES correlatorDplusDminus.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx index 8ffd085f3d5..63827f2b89c 100644 --- a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx @@ -10,12 +10,10 @@ // or submit itself to any jurisdiction. /// \file correlatorDMesonPairs.cxx -/// \brief D0(bar) and DPlus(Minus) correlator task - data-like, MC-reco and MC-kine analyses. +/// \brief D0(bar) correlator task - data-like, MC-reco and MC-kine analyses. /// -/// \author Fabio Colamaria , INFN Bari /// \author Andrea Tavira García , IJCLab Orsay -#include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" @@ -34,693 +32,762 @@ using namespace o2::constants::physics; using namespace o2::framework; using namespace o2::framework::expressions; -/// -/// Returns deltaPhi value in range [-pi/2., 3.*pi/2], typically used for correlation studies -/// -double getDeltaPhi(double phiD, double phiDbar) -{ - return RecoDecay::constrainAngle(phiDbar - phiD, -o2::constants::math::PIHalf); -} - namespace { -enum CandidateTypeSel { +enum CandidateType { SelectedD = 0, // This particle is selected as a D SelectedDbar, // This particle is selected as a Dbar TrueD, // This particle is a true D TrueDbar // This particle is a true Dbar }; -} // namespace -// histogram binning definition -const int massAxisBins = 120; -const double massAxisMin = 1.5848; -const double massAxisMax = 2.1848; -const int phiAxisBins = 32; -const double phiAxisMin = 0.; -const double phiAxisMax = o2::constants::math::TwoPI; -const int yAxisBins = 100; -const double yAxisMin = -5.; -const double yAxisMax = 5.; -const int ptDAxisBins = 180; -const double ptDAxisMin = 0.; -const double ptDAxisMax = 36.; +enum PairTypeOfSelMassSel { + DD = 0, // This is a D0-D0 pair + DbarDbar, // This is a D0bar-D0bar pair + DDbar, // This is a D0-D0bar pair + DbarD // This is a D0bar-D0 pair +}; +} // namespace using McParticlesPlus2Prong = soa::Join; -using McParticlesPlus3Prong = soa::Join; struct HfCorrelatorDMesonPairs { SliceCache cache; Preslice perCol2Prong = aod::hf_cand::collisionId; - Preslice perCol3Prong = aod::hf_cand::collisionId; Produces entryD0Pair; - Produces entryD0PairRecoInfo; - Produces entryDplusPair; - Produces entryDplusPairRecoInfo; + Produces entryD0PairMcInfo; + Produces entryD0PairMcGen; + Produces entryD0PairMcGenInfo; - Configurable verbose{"verbose", false, "Enable debug mode"}; - // Selection Flags Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; - Configurable selectionFlagDplus{"selectionFlagDPlus", 1, "Selection Flag for DPlus"}; - // Kinematics - Configurable etaCandMax{"etaCandMax", 4.0, "max. eta accepted"}; - Configurable etaCandMin{"etaCandMin", -4.0, "min. eta accepted"}; - Configurable dcaXYMax{"dcaXYMax", 0.0025, "max. dcaXY accepted"}; - Configurable dcaZMax{"dcaZMax", 0.0025, "max. dcaZ accepted"}; - - Configurable yCandMax{"yCandMax", -1., "max. cand. rapidity"}; - Configurable ptCandMin{"ptCandMin", -1., "min. cand. pT"}; - Configurable multMin{"multMin", 0., "minimum multiplicity accepted"}; - Configurable multMax{"multMax", 10000., "maximum multiplicity accepted"}; + Configurable yCandMax{"yCandMax", 0.8, "maxmum |y| of D0 candidates"}; + Configurable ptCandMin{"ptCandMin", -1., "minimum pT of D0 candidates"}; + Configurable> binsPt{"binsPt", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for candidate mass plots"}; Configurable selectSignalRegionOnly{"selectSignalRegionOnly", false, "only use events close to PDG peak"}; Configurable massCut{"massCut", 0.05, "Maximum deviation from PDG peak allowed for signal region"}; - Configurable> binsPt{"binsPt", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for candidate mass plots"}; + Configurable daughterTracksCutFlag{"daughterTracksCutFlag", false, "Flag to add cut on daughter tracks"}; HfHelper hfHelper; + using TracksWPid = soa::Join; + Partition> selectedD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; Partition> selectedD0CandidatesMc = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; - Partition> selectedDPlusCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; - Partition> selectedDPlusCandidatesMc = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; - - // HistoTypes - HistogramConfigSpec hTH1Pt{HistType::kTH1F, {{ptDAxisBins, ptDAxisMin, ptDAxisMax}}}; - HistogramConfigSpec hTH1Y{HistType::kTH1F, {{yAxisBins, yAxisMin, yAxisMax}}}; - HistogramConfigSpec hTH1Phi{HistType::kTH1F, {{phiAxisBins, phiAxisMin, phiAxisMax}}}; - HistogramConfigSpec hTH1Matched{HistType::kTH1F, {{3, -1.5, 1.5}}}; - HistogramConfigSpec hTH1Origin{HistType::kTH1F, {{3, -0.5, 2.5}}}; - HistogramConfigSpec hTH1Multiplicity{HistType::kTH1F, {{10000, 0., 10000.}}}; + HistogramConfigSpec hTH1Pt{HistType::kTH1F, {{180, 0., 36.}}}; + HistogramConfigSpec hTH1Y{HistType::kTH1F, {{100, -5., 5.}}}; + HistogramConfigSpec hTH1Phi{HistType::kTH1F, {{32, 0., o2::constants::math::TwoPI}}}; + HistogramConfigSpec hTH2Pid{HistType::kTH2F, {{500, 0., 10.}, {400, -20., 20.}}}; HistogramRegistry registry{ "registry", - // NOTE: use hMassD0 for trigger normalisation (S*0.955), and hMass2DCorrelationPairs (in final task) for 2D-sideband-subtraction purposes - {{"hPtCand", "D Meson pair candidates;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hPtProng0", "D Meson pair candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hPtProng1", "D Meson pair candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hEta", "D Meson pair candidates;candidate #it{#eta};entries", hTH1Y}, - {"hPhi", "D Meson pair candidates;candidate #it{#varphi};entries", hTH1Phi}, - {"hY", "D Meson pair candidates;candidate #it{y};entries", hTH1Y}, - // Mc Reco - {"hMultiplicityPreSelection", "multiplicity prior to selection;multiplicity;entries", hTH1Multiplicity}, - {"hMultiplicity", "multiplicity;multiplicity;entries", hTH1Multiplicity}, - {"hPtCandMcRec", "D Meson pair candidates - MC reco;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hPtProng0McRec", "D Meson pair candidates - MC reco;prong 0 #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hPtProng1McRec", "D Meson pair candidates - MC reco;prong 1 #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hEtaMcRec", "D Meson pair candidates - MC reco;candidate #it{#eta};entries", hTH1Y}, - {"hPhiMcRec", "D Meson pair candidates - MC reco;candidate #it{#varphi};entries", hTH1Phi}, - {"hYMcRec", "D Meson pair candidates - MC reco;candidate #it{y};entries", hTH1Y}, - {"hMatchedMcRec", "D Meson pair candidates - MC reco;MC Matched;entries", hTH1Matched}, - {"hOriginMcRec", "D Meson pair candidates - MC reco;prompt vs. non-prompt;entries", hTH1Origin}, - // Mc Gen - {"hMcEvtCount", "Event counter - MC gen;;entries", {HistType::kTH1F, {{1, -0.5, 0.5}}}}, - {"hPtCandMcGen", "D Meson pair particles - MC gen;particle #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hEtaMcGen", "D Meson pair particles - MC gen;particle #it{#eta};entries", hTH1Y}, - {"hPhiMcGen", "D Meson pair particles - MC gen;particle #it{#varphi};entries", hTH1Phi}, - {"hYMcGen", "D Meson pair candidates - MC gen;candidate #it{y};entries", hTH1Y}, - {"hMatchedMcGen", "D Meson pair candidates - MC gen;MC Matched;entries", hTH1Matched}, - {"hOriginMcGen", "D Meson pair candidates - MC gen;prompt vs. non-prompt;entries", hTH1Origin}}}; + {{"hPtCand", "D meson candidates;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, + {"hPtCandAfterCut", "D meson candidates after pT cut;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, + {"hPtProng0", "D meson candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, + {"hPtProng1", "D meson candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, + {"hEta", "D meson candidates;candidate #it{#eta};entries", hTH1Y}, + {"hPhi", "D meson candidates;candidate #it{#varphi};entries", hTH1Phi}, + {"hY", "D meson candidates;candidate #it{y};entries", hTH1Y}, + // MC Gen plots + {"hPtCandMcGen", "D meson candidates MC Gen;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, + {"hPtCandAfterCutMcGen", "D meson candidates after pT cut;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, + {"hEtaMcGen", "D meson candidates MC Gen;candidate #it{#eta};entries", hTH1Y}, + {"hPhiMcGen", "D meson candidates MC Gen;candidate #it{#varphi};entries", hTH1Phi}, + // PID plots ----- Not definitively here + {"PID/hTofNSigmaPi", "(TOFsignal-time#pi)/tofSigPid;p[GeV/c];(TOFsignal-time#pi)/tofSigPid", hTH2Pid}, + {"PID/hTofNSigmaKa", "(TOFsignal-timeK)/tofSigPid;p[GeV/c];(TOFsignal-timeK)/tofSigPid", hTH2Pid}, + {"PID/hTpcNSigmaPi", "(TPCsignal-time#pi)/tpcSigPid;p[GeV/c];(TPCsignal-time#pi)/tpcSigPid", hTH2Pid}, + {"PID/hTpcNSigmaKa", "(TPCsignal-timeK)/tpcSigPid;p[GeV/c];(TPCsignal-timeK)/tpcSigPid", hTH2Pid}, + {"PID/hTpcTofNSigmaPi", "(TPC+TOFsignal-time#pi)/tpcTofSigPid;p[GeV/#it{c}];(TPC+TOFsignal-time#pi)/tpcTofSigPid", hTH2Pid}, + {"PID/hTpcTofNSigmaKa", "(TPC+TOFsignal-timeK)/tpcTofSigPid;p[GeV/c];(TPC+TOFsignal-timeK)/tpcTofSigPid", hTH2Pid}}}; void init(InitContext&) { auto vbins = (std::vector)binsPt; - constexpr int kNBinsSelStatus = 6; + constexpr int kNBinsSelStatus = 25; std::string labels[kNBinsSelStatus]; + labels[0] = "total # of Selected pairs"; - labels[1] = "# of Selected D + Dbar"; - labels[2] = "# of Selected D"; - labels[3] = "# of Selected Dbar"; - labels[4] = "# of True D"; - labels[5] = "# of True Dbar"; + // Cand1 analysis + labels[1] = "total # of Selected Cands 1"; + labels[2] = "# of Selected D Cand 1 ONLY"; + labels[3] = "# of Selected Dbar Cand 1 ONLY"; + labels[4] = "# of Selected Simultaneous D + Dbar Cand 1"; + labels[5] = "# of True D Cand 1"; + labels[6] = "# of True Dbar Cand 1"; + // Cand2 analysis + labels[7] = "total # of Selected Cands 2"; + labels[8] = "# of Selected D Cand 2 ONLY"; + labels[9] = "# of Selected Dbar Cand 2 ONLY"; + labels[10] = "# of Selected Simultaneous D + Dbar Cand 2"; + labels[11] = "# of True D Cand 2"; + labels[12] = "# of True Dbar Cand 2"; + // Pair analysis + labels[13] = "# of D+D Pairs"; + labels[14] = "# of Dbar+Dbar Pairs"; + labels[15] = "# of D+Dbar Pairs"; + labels[16] = "# of Dbar+D Pairs"; + labels[17] = "# of D+D ONLY Pairs"; + labels[18] = "# of Dbar+Dbar ONLY Pairs"; + labels[19] = "# of D+Dbar ONLY Pairs"; + labels[20] = "# of Dbar+D ONLY Pairs"; + // True pair analysis + labels[21] = "# of True D+D Pairs"; + labels[22] = "# of True Dbar+Dbar Pairs"; + labels[23] = "# of True D+Dbar Pairs"; + labels[24] = "# of True Dbar+D Pairs"; + AxisSpec axisSelStatus = {kNBinsSelStatus, 0.5, kNBinsSelStatus + 0.5, ""}; registry.add("hSelectionStatus", "D Meson candidates;selection status;entries", HistType::kTH1F, {axisSelStatus}); + registry.add("hSelectionStatusMcGen", "D Meson candidates MC Gen;selection status;entries", HistType::kTH1F, {axisSelStatus}); + for (int iBin = 0; iBin < kNBinsSelStatus; iBin++) { registry.get(HIST("hSelectionStatus"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); + registry.get(HIST("hSelectionStatusMcGen"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); } - registry.add("hMass", "D Meson pair candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - } - - // Performs an analysis on multiplicity and fills histograms - template - void analyseMultiplicity(const T& collision, const U& tracks) - { - int nTracks = 0; - if (collision.numContrib() > 1) { - for (const auto& track : tracks) { - if (track.eta() < etaCandMin || track.eta() > etaCandMax) { - continue; - } - if (std::abs(track.dcaXY()) > dcaXYMax || std::abs(track.dcaZ()) > dcaZMax) { - continue; - } - nTracks++; - } - } - registry.fill(HIST("hMultiplicityPreSelection"), nTracks); - if (nTracks < multMin || nTracks > multMax) { - return; - } - registry.fill(HIST("hMultiplicity"), nTracks); - } - // Returns false if the candidate does not pass cuts on decay type, y max, and pt min. Used for data and MC reco. - template - bool kinematicCuts(const T& candidate) - { - // check decay channel flag for candidate - if constexpr (isD0) { - if (!(TESTBIT(candidate.hfflag(), o2::aod::hf_cand_2prong::DecayType::D0ToPiK))) { - return false; - } - if (yCandMax >= 0. && std::abs(candidate.y(MassD0)) > yCandMax) { - return false; - } - } else { - if (!(TESTBIT(candidate.hfflag(), o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi))) { - return false; - } - if (yCandMax >= 0. && std::abs(candidate.y(MassDPlus)) > yCandMax) { - return false; - } + constexpr int kNBinsMatching = 8; + std::string labelsMatching[kNBinsMatching]; + // Cand1 analysis + labelsMatching[0] = "total # of Cand 1"; + labelsMatching[1] = "# of matched D Cand 1"; + labelsMatching[2] = "# of matched Dbar Cand 1"; + labelsMatching[3] = "# of unmatched Cand 1"; + // Cand2 analysis + labelsMatching[4] = "total # of Cand 2"; + labelsMatching[5] = "# of matched D Cand 2"; + labelsMatching[6] = "# of matched Dbar Cand 2"; + labelsMatching[7] = "# of unmatched Cand 2"; + + AxisSpec axisMatching = {kNBinsMatching, 0.5, kNBinsMatching + 0.5, ""}; + registry.add("hMatchingMcRec", "D Meson candidates; MC matching status;entries", HistType::kTH1F, {axisMatching}); + registry.add("hMatchingMcGen", "D Meson candidates; MC matching status;entries", HistType::kTH1F, {axisMatching}); + + for (int iBin = 0; iBin < kNBinsMatching; iBin++) { + registry.get(HIST("hMatchingMcRec"))->GetXaxis()->SetBinLabel(iBin + 1, labelsMatching[iBin].data()); + registry.get(HIST("hMatchingMcGen"))->GetXaxis()->SetBinLabel(iBin + 1, labelsMatching[iBin].data()); } - if (ptCandMin >= 0. && candidate.pt() < ptCandMin) { - return false; - } - return true; - } - // Returns false if the candidate does not pass cuts on pdgCode, y max, and pt min. Used for MC gen. - template - bool kinematicCutsGen(const T& particle) - { - // check if the particle is D or Dbar (for general plot filling and selection, so both cases are fine) - NOTE: decay channel is not probed! - if (std::abs(particle.pdgCode()) != Pdg::kDPlus && std::abs(particle.pdgCode()) != Pdg::kD0) { - return false; - } - if (yCandMax >= 0. && std::abs(particle.y()) > yCandMax) { - return false; + constexpr int kNBinsSinglePart = 6; + std::string labelsSinglePart[kNBinsSinglePart]; + // Candidate analysis + labelsSinglePart[0] = "total # of Candidates"; + labelsSinglePart[1] = "# of selected D"; + labelsSinglePart[2] = "# of selected Dbar"; + labelsSinglePart[3] = "# of selected D and Dbar"; + labelsSinglePart[4] = "# of true D"; + labelsSinglePart[5] = "# of true Dbar"; + + AxisSpec axisSinglePart = {kNBinsSinglePart, 0.5, kNBinsSinglePart + 0.5, ""}; + registry.add("hStatusSinglePart", "D Meson candidates; MC matching status;entries", HistType::kTH1F, {axisSinglePart}); + registry.add("hStatusSinglePartMcGen", "D Meson candidates; MC matching status;entries", HistType::kTH1F, {axisSinglePart}); + + for (int iBin = 0; iBin < kNBinsSinglePart; iBin++) { + registry.get(HIST("hStatusSinglePart"))->GetXaxis()->SetBinLabel(iBin + 1, labelsSinglePart[iBin].data()); + registry.get(HIST("hStatusSinglePartMcGen"))->GetXaxis()->SetBinLabel(iBin + 1, labelsSinglePart[iBin].data()); } - if (ptCandMin >= 0. && particle.pt() < ptCandMin) { - return false; - } - return true; - } - // Fills histograms with basic kinematic info. - template - void fillInfoHists(const T& candidate, bool const& isReco, bool const& isD0) - { - if (isReco) { - registry.fill(HIST("hPtCandMcRec"), candidate.pt()); - registry.fill(HIST("hPtProng0McRec"), candidate.ptProng0()); - registry.fill(HIST("hPtProng1McRec"), candidate.ptProng1()); - registry.fill(HIST("hEtaMcRec"), candidate.eta()); - registry.fill(HIST("hPhiMcRec"), candidate.phi()); - if (isD0) { - registry.fill(HIST("hYMcRec"), candidate.y(MassD0)); - } else { - registry.fill(HIST("hYMcRec"), candidate.y(MassDPlus)); - } - } else { - registry.fill(HIST("hPtCand"), candidate.pt()); - registry.fill(HIST("hPtProng0"), candidate.ptProng0()); - registry.fill(HIST("hPtProng1"), candidate.ptProng1()); - registry.fill(HIST("hEta"), candidate.eta()); - registry.fill(HIST("hPhi"), candidate.phi()); - if (isD0) { - registry.fill(HIST("hY"), candidate.y(MassD0)); - } else { - registry.fill(HIST("hY"), candidate.y(MassDPlus)); - } - } + AxisSpec axisInputD0 = {200, -0.5, 199.5}; + registry.add("hInputCheckD0", "Check on input D0 meson candidates/event", {HistType::kTH1F, {axisInputD0}}); + registry.add("hInputCheckD0bar", "Check on input D0bar meson candidates/event", {HistType::kTH1F, {axisInputD0}}); + registry.add("hInputCheckD0AndD0bar", "Check on input D0 & D0bar meson candidates/event", {HistType::kTH1F, {axisInputD0}}); + registry.add("hInputCheckD0OrD0bar", "Check on input D0 | D0bar meson candidates/event", {HistType::kTH1F, {axisInputD0}}); + // MC Gen + registry.add("hInputCheckD0McGen", "Check on input D0 meson candidates/event MC Gen", {HistType::kTH1F, {axisInputD0}}); + registry.add("hInputCheckD0barMcGen", "Check on input D0bar meson candidates/event MC Gen", {HistType::kTH1F, {axisInputD0}}); + registry.add("hInputCheckD0AndD0barMcGen", "Check on input D0 & D0bar meson candidates/event MC Gen", {HistType::kTH1F, {axisInputD0}}); + registry.add("hInputCheckD0OrD0barMcGen", "Check on input D0 | D0bar meson candidates/event MC Gen", {HistType::kTH1F, {axisInputD0}}); + + registry.add("hMass", "D Meson pair candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{120, 1.5848, 2.1848}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); } - // Sets bits to select candidate type for D0. - // SelectedD and SelectedDbar bits look at whether the candidate passed the selection flags, and TrueD and TrueDbar check if it is matched with Mc. - template + /// Sets bits to select candidate type for D0 + /// SelectedD and SelectedDbar bits look at whether the candidate passed the selection flags. + /// \param candidate is candidate + /// \return bitmap with type of candidate + template uint8_t assignCandidateTypeD0(const T& candidate) { uint8_t candidateType(0); if (candidate.isSelD0() >= selectionFlagD0) { SETBIT(candidateType, SelectedD); - registry.fill(HIST("hSelectionStatus"), 2); - registry.fill(HIST("hSelectionStatus"), 3); } if (candidate.isSelD0bar() >= selectionFlagD0bar) { SETBIT(candidateType, SelectedDbar); - registry.fill(HIST("hSelectionStatus"), 2); - registry.fill(HIST("hSelectionStatus"), 4); } - if constexpr (isRecoMc) { + if constexpr (isMcRec) { if (candidate.flagMcMatchRec() == 1 << o2::aod::hf_cand_2prong::DecayType::D0ToPiK) { // matched as D0 SETBIT(candidateType, TrueD); - registry.fill(HIST("hSelectionStatus"), 5); } if (candidate.flagMcMatchRec() == -(1 << o2::aod::hf_cand_2prong::DecayType::D0ToPiK)) { // matched as D0bar SETBIT(candidateType, TrueDbar); - registry.fill(HIST("hSelectionStatus"), 6); } } return candidateType; } - // Sets bits to select candidate type for D plus - template - uint8_t assignCandidateTypeDPlus(const T& candidate, int const& particleSign) + /// Sets bits to select candidate type at generator level + /// \param particle is particle + /// \return bitmap with type of gen particle - they are selected as True + template + uint8_t assignParticleTypeD0Gen(const T& particle) { - uint8_t candidateType(0); - if (particleSign == 1) { - SETBIT(candidateType, SelectedD); - registry.fill(HIST("hSelectionStatus"), 2); - registry.fill(HIST("hSelectionStatus"), 3); - } else { - SETBIT(candidateType, SelectedDbar); - registry.fill(HIST("hSelectionStatus"), 2); - registry.fill(HIST("hSelectionStatus"), 4); + uint8_t particleType(0); + if (particle.pdgCode() == Pdg::kD0) { // just checking the particle PDG, not the decay channel + SETBIT(particleType, TrueD); } - if constexpr (isRecoMc) { - if (std::abs(candidate.flagMcMatchRec()) == 1 << o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi) { // matched as DPlus - SETBIT(candidateType, TrueD); - registry.fill(HIST("hSelectionStatus"), 5); - } else { // matched as D0bar - SETBIT(candidateType, TrueDbar); - registry.fill(HIST("hSelectionStatus"), 6); - } + if (particle.pdgCode() == (-Pdg::kD0)) { // just checking the particle PDG, not the decay channel + SETBIT(particleType, TrueDbar); } - return candidateType; + return particleType; + } + + /// Check if the candidate is a D + /// \param candidate is candidate + /// \return true if is a D + bool isD(const uint8_t candidateType) + { + return (TESTBIT(candidateType, SelectedD)); + } + + /// Check if the candidate is a Dbar + /// \param candidate is candidate + /// \return true if is a Dbar + bool isDbar(const uint8_t candidateType) + { + return (TESTBIT(candidateType, SelectedDbar)); + } + + /// Check if the candidate is a true D + /// \param candidate is candidate + /// \return true if is a true D + bool isTrueD(const uint8_t candidateType) + { + return (TESTBIT(candidateType, TrueD)); + } + + /// Check if the candidate is a true Dbar + /// \param candidate is candidate + /// \return true if is a true Dbar + bool isTrueDbar(const uint8_t candidateType) + { + return (TESTBIT(candidateType, TrueDbar)); } - // Sets bits to select candidate type at generator level + /// Fill PID related plots for D0 and D0bar + /// \param candidate is candidate template - uint8_t assignCandidateTypeGen(const T& candidate) + void AnalysePid(const T& candidate) { - uint8_t candidateType(0); - if (candidate.pdgCode() == Pdg::kDPlus || candidate.pdgCode() == Pdg::kD0) { // just checking the particle PDG, not the decay channel (differently from Reco: you have a BR factor btw such levels!) - SETBIT(candidateType, SelectedD); - SETBIT(candidateType, TrueD); - } else if (candidate.pdgCode() == -Pdg::kDPlus || candidate.pdgCode() == -Pdg::kD0) { // just checking the particle PDG, not the decay channel (differently from Reco: you have a BR factor btw such levels!) - SETBIT(candidateType, SelectedDbar); - SETBIT(candidateType, TrueDbar); + auto prong0 = candidate.template prong0_as(); + auto prong1 = candidate.template prong1_as(); + if (candidate.isSelD0() >= selectionFlagD0) { + registry.fill(HIST("PID/hTofNSigmaPi"), candidate.ptProng0(), prong0.tofNSigmaPi()); + registry.fill(HIST("PID/hTofNSigmaKa"), candidate.ptProng1(), prong1.tofNSigmaKa()); + registry.fill(HIST("PID/hTpcNSigmaPi"), candidate.ptProng0(), prong0.tpcNSigmaPi()); + registry.fill(HIST("PID/hTpcNSigmaKa"), candidate.ptProng1(), prong1.tpcNSigmaKa()); + registry.fill(HIST("PID/hTpcTofNSigmaPi"), candidate.ptProng0(), prong0.tpcTofNSigmaPi()); + registry.fill(HIST("PID/hTpcTofNSigmaKa"), candidate.ptProng1(), prong1.tpcTofNSigmaKa()); + } + if (candidate.isSelD0bar() >= selectionFlagD0bar) { + registry.fill(HIST("PID/hTofNSigmaPi"), candidate.ptProng1(), prong1.tofNSigmaPi()); + registry.fill(HIST("PID/hTofNSigmaKa"), candidate.ptProng0(), prong0.tofNSigmaKa()); + registry.fill(HIST("PID/hTpcNSigmaPi"), candidate.ptProng1(), prong1.tpcNSigmaPi()); + registry.fill(HIST("PID/hTpcNSigmaKa"), candidate.ptProng0(), prong0.tpcNSigmaKa()); + registry.fill(HIST("PID/hTpcTofNSigmaPi"), candidate.ptProng1(), prong1.tpcTofNSigmaPi()); + registry.fill(HIST("PID/hTpcTofNSigmaKa"), candidate.ptProng0(), prong0.tpcTofNSigmaKa()); } - return candidateType; } - // Common code to analyse D0's and D+'s at Gen level. + /// Fill counters for D0 and D0bar + /// \param selectedD0Candidates contains all D0 candidates template - void analyseMcGen(const T& mcParticles) + void GetCountersPerEvent(const T& selectedD0Candidates) { - registry.fill(HIST("hMcEvtCount"), 0); - for (const auto& particle1 : mcParticles) { - // check if the particle is D0, D0bar, DPlus or DMinus (for general plot filling and selection, so both cases are fine) - NOTE: decay channel is not probed! - auto pdgCode = std::abs(particle1.pdgCode()); - if (pdgCode != Pdg::kD0 && pdgCode != Pdg::kDPlus) { + int nDevent = 0, nDbarevent = 0, nDDbarevent = 0, nDorDbarevent = 0; + for (const auto& candidate : selectedD0Candidates) { + // Get counters per event + bool isSignalD0 = std::abs(hfHelper.invMassD0ToPiK(candidate) - MassD0) < massCut; + bool isSignalD0bar = std::abs(hfHelper.invMassD0barToKPi(candidate) - MassD0Bar) < massCut; + if (selectSignalRegionOnly && !(isSignalD0 || isSignalD0bar)) { continue; } - auto massD = pdgCode == Pdg::kD0 ? MassD0 : MassDPlus; - double yD = RecoDecay::y(std::array{particle1.px(), particle1.py(), particle1.pz()}, massD); - if (!kinematicCutsGen(particle1)) { + auto candidateType1 = assignCandidateTypeD0(candidate); // Candidate type attribution + registry.fill(HIST("hPtCand"), candidate.pt()); + if (abs(hfHelper.yD0(candidate)) > yCandMax) { continue; } + if (ptCandMin >= 0. && candidate.pt() < ptCandMin) { + continue; + } + registry.fill(HIST("hPtProng0"), candidate.ptProng0()); + registry.fill(HIST("hPtProng1"), candidate.ptProng1()); + registry.fill(HIST("hEta"), candidate.eta()); + registry.fill(HIST("hPhi"), candidate.phi()); + registry.fill(HIST("hY"), candidate.y(MassD0)); + registry.fill(HIST("hPtCandAfterCut"), candidate.pt()); + registry.fill(HIST("hMass"), hfHelper.invMassD0ToPiK(candidate), candidate.pt()); + + bool isDCand1 = isD(candidateType1); + bool isDbarCand1 = isDbar(candidateType1); + if (isDCand1) { + nDevent++; + } + if (isDbarCand1) { + nDbarevent++; + } + if (isDCand1 && isDbarCand1) { + nDDbarevent++; + } + if (isDCand1 || isDbarCand1) { + nDorDbarevent++; + } - registry.fill(HIST("hPtCandMcGen"), particle1.pt()); - registry.fill(HIST("hEtaMcGen"), particle1.eta()); - registry.fill(HIST("hPhiMcGen"), particle1.phi()); - registry.fill(HIST("hYMcGen"), yD); + // Fill selection status single particle + registry.fill(HIST("hStatusSinglePart"), 1); + if (isDCand1 && !isDbarCand1) { + registry.fill(HIST("hStatusSinglePart"), 2); + } else if (isDbarCand1 && !isDCand1) { + registry.fill(HIST("hStatusSinglePart"), 3); + } else if (isDCand1 && isDbarCand1) { + registry.fill(HIST("hStatusSinglePart"), 4); + } + } + if (nDevent > 0) { + registry.fill(HIST("hInputCheckD0"), nDevent); + } + if (nDbarevent > 0) { + registry.fill(HIST("hInputCheckD0bar"), nDbarevent); + } + if (nDDbarevent > 0) { + registry.fill(HIST("hInputCheckD0AndD0bar"), nDDbarevent); + } + if (nDorDbarevent > 0) { + registry.fill(HIST("hInputCheckD0OrD0bar"), nDorDbarevent); + } + } - auto candidateType1 = assignCandidateTypeGen(particle1); // Candidate sign attribution + /// Fill selection status histogram + /// \param candidate1 is the first candidate of the pair + /// \param candidate2 is the second candidate of the pair + template + void fillEntry(const T& candidate1, const T& candidate2, const bool& isDCand1, const bool& isDbarCand1, + const bool& isDCand2, const bool& isDbarCand2, const uint8_t& candidateType1, const uint8_t& candidateType2) + { - // check if it's prompt or non-prompt - int8_t originGen1 = particle1.originMcGen(); - registry.fill(HIST("hOriginMcGen"), originGen1); - // check if it's MC matched - int8_t matchedGen1 = particle1.flagMcMatchGen(); - registry.fill(HIST("hMatchedMcGen"), matchedGen1); + /// Fill information on the D candidates + registry.fill(HIST("hSelectionStatus"), 2); + if (isDCand1 && !isDbarCand1) { + registry.fill(HIST("hSelectionStatus"), 3); + } else if (isDbarCand1 && !isDCand1) { + registry.fill(HIST("hSelectionStatus"), 4); + } else if (isDCand1 && isDbarCand1) { + registry.fill(HIST("hSelectionStatus"), 5); + } - for (const auto& particle2 : mcParticles) { - // Candidate sign attribution. - auto candidateType2 = assignCandidateTypeGen(particle2); - if (!kinematicCutsGen(particle2)) { - continue; - } + registry.fill(HIST("hSelectionStatus"), 8); + if (isDCand2 && !isDbarCand2) { + registry.fill(HIST("hSelectionStatus"), 9); + } else if (isDbarCand2 && !isDCand2) { + registry.fill(HIST("hSelectionStatus"), 10); + } else if (isDCand2 && isDbarCand2) { + registry.fill(HIST("hSelectionStatus"), 11); + } - // check if it's prompt or non-prompt - int8_t originGen2 = particle2.originMcGen(); - // check if it's MC matched - int8_t matchedGen2 = particle2.flagMcMatchGen(); + /// Collect information on the D pairs + uint8_t pairType(0); + registry.fill(HIST("hSelectionStatus"), 1); + float yCand1 = hfHelper.yD0(candidate1); + float yCand2 = hfHelper.yD0(candidate2); + float massDCand1 = hfHelper.invMassD0ToPiK(candidate1); + float massDbarCand1 = hfHelper.invMassD0barToKPi(candidate1); + float massDCand2 = hfHelper.invMassD0ToPiK(candidate2); + float massDbarCand2 = hfHelper.invMassD0barToKPi(candidate2); + if (isDCand1 && isDCand2) { + SETBIT(pairType, DD); + registry.fill(HIST("hSelectionStatus"), 14); + if ((!isDbarCand1) && (!isDbarCand2)) { + registry.fill(HIST("hSelectionStatus"), 18); + } + } + if (isDbarCand1 && isDbarCand2) { + SETBIT(pairType, DbarDbar); + registry.fill(HIST("hSelectionStatus"), 15); + if ((!isDCand1) && (!isDCand2)) { + registry.fill(HIST("hSelectionStatus"), 19); + } + } + if (isDCand1 && isDbarCand2) { + SETBIT(pairType, DDbar); + registry.fill(HIST("hSelectionStatus"), 16); + if ((!isDbarCand1) && (!isDCand2)) { + registry.fill(HIST("hSelectionStatus"), 20); + } + } + if (isDbarCand1 && isDCand2) { + SETBIT(pairType, DbarD); + registry.fill(HIST("hSelectionStatus"), 17); + if ((!isDCand1) && (!isDbarCand2)) { + registry.fill(HIST("hSelectionStatus"), 21); + } + } - // If both particles are D0's, fill D0Pair table - if (std::abs(particle1.pdgCode()) == Pdg::kD0 && std::abs(particle2.pdgCode()) == Pdg::kD0) { - entryD0Pair(getDeltaPhi(particle2.phi(), particle1.phi()), - particle2.eta() - particle1.eta(), - particle1.pt(), - particle2.pt(), - particle1.y(), - particle2.y(), - MassD0, - MassD0, - candidateType1, - candidateType2, - 2); - entryD0PairRecoInfo(originGen1, - originGen2, - matchedGen1, - matchedGen2); - // If both particles are DPlus, fill DplusPair table - } else if (std::abs(particle1.pdgCode()) == Pdg::kDPlus && std::abs(particle2.pdgCode()) == Pdg::kDPlus) { - entryDplusPair(getDeltaPhi(particle2.phi(), particle1.phi()), - particle2.eta() - particle1.eta(), - particle1.pt(), - particle2.pt(), - particle1.y(), - particle2.y(), - MassDPlus, - MassDPlus, - candidateType1, - candidateType2, - 2); - entryDplusPairRecoInfo(originGen1, - originGen2, - matchedGen1, - matchedGen2); - } - } // end inner loop - } // end outer loop + entryD0Pair(candidate1.pt(), candidate2.pt(), yCand1, yCand2, massDCand1, massDbarCand1, massDCand2, massDbarCand2, pairType, candidateType1, candidateType2); } /// D0(bar)-D0(bar) correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) - void processDataD0(aod::Collision const& collision, - aod::TracksWDca const& tracks, - soa::Join const&) + void processData(aod::Collision const& collision, + soa::Join const& candidates, TracksWPid const&) { + for (const auto& candidate : candidates) { + AnalysePid(candidate); + } + auto selectedD0CandidatesGrouped = selectedD0Candidates->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + GetCountersPerEvent(selectedD0CandidatesGrouped); // protection against empty tables to be sliced if (selectedD0Candidates.size() <= 1) { return; } - analyseMultiplicity(collision, tracks); - auto selectedD0CandidatesGrouped = selectedD0Candidates->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); for (const auto& candidate1 : selectedD0CandidatesGrouped) { - fillInfoHists(candidate1, false, true); - if (!kinematicCuts(candidate1)) { + if (abs(hfHelper.yD0(candidate1)) > yCandMax) { continue; } + if (ptCandMin >= 0. && candidate1.pt() < ptCandMin) { + continue; + } + auto prong0Cand1 = candidate1.template prong0_as(); + auto prong1Cand1 = candidate1.template prong1_as(); bool isSignalD0Cand1 = std::abs(hfHelper.invMassD0ToPiK(candidate1) - MassD0) < massCut; bool isSignalD0barCand1 = std::abs(hfHelper.invMassD0barToKPi(candidate1) - MassD0Bar) < massCut; if (selectSignalRegionOnly && !(isSignalD0Cand1 || isSignalD0barCand1)) { continue; } - registry.fill(HIST("hMass"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt()); - auto candidateType1 = assignCandidateTypeD0(candidate1); // Candidate type attribution. - auto prong0Cand1 = candidate1.template prong0_as(); - auto prong1Cand1 = candidate1.template prong1_as(); + auto candidateType1 = assignCandidateTypeD0(candidate1); // Candidate type attribution + bool isDCand1 = isD(candidateType1); + bool isDbarCand1 = isDbar(candidateType1); + for (auto candidate2 = candidate1 + 1; candidate2 != selectedD0CandidatesGrouped.end(); ++candidate2) { - if (!kinematicCuts(candidate2)) { + if (abs(hfHelper.yD0(candidate2)) > yCandMax) { continue; } - - auto prong0Cand2 = candidate2.template prong0_as(); - auto prong1Cand2 = candidate2.template prong1_as(); - if ((prong0Cand1 == prong0Cand2) || (prong1Cand1 == prong1Cand2) || (prong0Cand1 == prong1Cand2) || (prong1Cand1 == prong0Cand2)) { + if (ptCandMin >= 0. && candidate2.pt() < ptCandMin) { + continue; + } + auto prong0Cand2 = candidate2.template prong0_as(); + auto prong1Cand2 = candidate2.template prong1_as(); + if (daughterTracksCutFlag && ((prong0Cand1 == prong0Cand2) || (prong1Cand1 == prong1Cand2) || (prong0Cand1 == prong1Cand2) || (prong1Cand1 == prong0Cand2))) { continue; } + bool isSignalD0Cand2 = std::abs(hfHelper.invMassD0ToPiK(candidate2) - MassD0) < massCut; bool isSignalD0barCand2 = std::abs(hfHelper.invMassD0barToKPi(candidate2) - MassD0Bar) < massCut; if (selectSignalRegionOnly && !(isSignalD0Cand2 || isSignalD0barCand2)) { continue; } - auto candidateType2 = assignCandidateTypeD0(candidate2); // Candidate type attribution - registry.fill(HIST("hSelectionStatus"), 1); - // fill tables - entryD0Pair(getDeltaPhi(candidate2.phi(), candidate1.phi()), - candidate2.eta() - candidate1.eta(), - candidate1.pt(), - candidate2.pt(), - hfHelper.yD0(candidate1), - hfHelper.yD0(candidate2), - hfHelper.invMassD0ToPiK(candidate1), - hfHelper.invMassD0barToKPi(candidate2), - candidateType1, - candidateType2, - 0); + auto candidateType2 = assignCandidateTypeD0(candidate2); // Candidate type attribution + + bool isDCand2 = isD(candidateType2); + bool isDbarCand2 = isDbar(candidateType2); + + fillEntry(candidate1, candidate2, isDCand1, isDbarCand1, isDCand2, isDbarCand2, candidateType1, candidateType2); } // end inner loop (Cand2) } // end outer loop (Cand1) } - PROCESS_SWITCH(HfCorrelatorDMesonPairs, processDataD0, "Process data D0", true); - /// D0(bar)-D0(bar) correlation pair builder - for MC reco-level analysis (candidates matched to true signal only, but also the various bkg sources are studied) - void processMcRecD0(aod::Collision const& collision, - aod::TracksWDca const& tracks, - soa::Join const&) + PROCESS_SWITCH(HfCorrelatorDMesonPairs, processData, "Process data mode", true); + + void processMcRec(aod::Collision const& collision, soa::Join const& candidates, TracksWPid const&) { + for (const auto& candidate : candidates) { + AnalysePid(candidate); + } + auto selectedD0CandidatesGroupedMc = selectedD0CandidatesMc->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + GetCountersPerEvent(selectedD0CandidatesGroupedMc); // protection against empty tables to be sliced if (selectedD0CandidatesMc.size() <= 1) { return; } - analyseMultiplicity(collision, tracks); - auto selectedD0CandidatesGroupedMc = selectedD0CandidatesMc->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); for (const auto& candidate1 : selectedD0CandidatesGroupedMc) { - if (!kinematicCuts(candidate1)) { + if (abs(hfHelper.yD0(candidate1)) > yCandMax) { continue; } - if (std::abs(candidate1.flagMcMatchRec()) == 1 << o2::aod::hf_cand_2prong::DecayType::D0ToPiK) { - fillInfoHists(candidate1, true, true); + if (ptCandMin >= 0. && candidate1.pt() < ptCandMin) { + continue; } + auto prong0Cand1 = candidate1.template prong0_as(); + auto prong1Cand1 = candidate1.template prong1_as(); bool isSignalD0Cand1 = std::abs(hfHelper.invMassD0ToPiK(candidate1) - MassD0) < massCut; bool isSignalD0barCand1 = std::abs(hfHelper.invMassD0barToKPi(candidate1) - MassD0Bar) < massCut; if (selectSignalRegionOnly && !(isSignalD0Cand1 || isSignalD0barCand1)) { continue; } - registry.fill(HIST("hMass"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt()); - auto candidateType1 = assignCandidateTypeD0(candidate1); // Candidate type attribution - auto prong0Cand1 = candidate1.template prong0_as(); - auto prong1Cand1 = candidate1.template prong1_as(); - int8_t origin1 = 0, matchedRec1 = 0; - if (!(TESTBIT(candidateType1, TrueD) && TESTBIT(candidateType1, TrueDbar))) { // if our event is not bkg - // check if it's prompt or non-prompt - origin1 = candidate1.originMcRec(); - registry.fill(HIST("hOriginMcRec"), origin1); - // check if it's MC matched - matchedRec1 = candidate1.flagMcMatchRec(); - registry.fill(HIST("hMatchedMcRec"), matchedRec1); + auto candidateType1 = assignCandidateTypeD0(candidate1); // Candidate type attribution + + bool isDCand1 = isD(candidateType1); + bool isDbarCand1 = isDbar(candidateType1); + bool isTrueDCand1 = isTrueD(candidateType1); + bool isTrueDbarCand1 = isTrueDbar(candidateType1); + + int8_t matchedRec1 = candidate1.flagMcMatchRec(); + int8_t originRec1 = candidate1.originMcRec(); + + if (isTrueDCand1) { + registry.fill(HIST("hStatusSinglePart"), 5); + } else if (isTrueDbarCand1) { + registry.fill(HIST("hStatusSinglePart"), 6); } for (auto candidate2 = candidate1 + 1; candidate2 != selectedD0CandidatesGroupedMc.end(); ++candidate2) { - if (!kinematicCuts(candidate2)) { + if (abs(hfHelper.yD0(candidate2)) > yCandMax) { continue; } - - auto candidateType2 = assignCandidateTypeD0(candidate2); // Candidate type attribution - int8_t origin2 = 0, matchedRec2 = 0; - auto prong0Cand2 = candidate2.template prong0_as(); - auto prong1Cand2 = candidate2.template prong1_as(); - if ((prong0Cand1 == prong0Cand2) || (prong1Cand1 == prong1Cand2) || (prong0Cand1 == prong1Cand2) || (prong1Cand1 == prong0Cand2)) { + if (ptCandMin >= 0. && candidate2.pt() < ptCandMin) { + continue; + } + auto prong0Cand2 = candidate2.template prong0_as(); + auto prong1Cand2 = candidate2.template prong1_as(); + if (daughterTracksCutFlag && ((prong0Cand1 == prong0Cand2) || (prong1Cand1 == prong1Cand2) || (prong0Cand1 == prong1Cand2) || (prong1Cand1 == prong0Cand2))) { continue; } + bool isSignalD0Cand2 = std::abs(hfHelper.invMassD0ToPiK(candidate2) - MassD0) < massCut; bool isSignalD0barCand2 = std::abs(hfHelper.invMassD0barToKPi(candidate2) - MassD0Bar) < massCut; if (selectSignalRegionOnly && !(isSignalD0Cand2 || isSignalD0barCand2)) { continue; } - if (!(TESTBIT(candidateType2, TrueD) && TESTBIT(candidateType2, TrueDbar))) { // if our event is not bkg - // check if it's prompt or non-prompt - origin2 = candidate2.originMcRec(); - // check if it's MC matched - matchedRec2 = candidate2.flagMcMatchRec(); + auto candidateType2 = assignCandidateTypeD0(candidate2); // Candidate type attribution + + bool isDCand2 = isD(candidateType2); + bool isDbarCand2 = isDbar(candidateType2); + bool isTrueDCand2 = isTrueD(candidateType2); + bool isTrueDbarCand2 = isTrueDbar(candidateType2); + + int8_t matchedRec2 = candidate2.flagMcMatchRec(); + int8_t originRec2 = candidate2.originMcRec(); + + // Fill hMatchingMcRec - Cand 1 + registry.fill(HIST("hMatchingMcRec"), 1); + if (matchedRec1 == 1) { + registry.fill(HIST("hMatchingMcRec"), 2); + } else if (matchedRec1 == -1) { + registry.fill(HIST("hMatchingMcRec"), 3); + } else if (matchedRec1 == 0) { + registry.fill(HIST("hMatchingMcRec"), 4); } - registry.fill(HIST("hSelectionStatus"), 1); - // fill tables - entryD0Pair(getDeltaPhi(candidate2.phi(), candidate1.phi()), - candidate2.eta() - candidate1.eta(), - candidate1.pt(), - candidate2.pt(), - hfHelper.yD0(candidate1), - hfHelper.yD0(candidate2), - hfHelper.invMassD0ToPiK(candidate1), - hfHelper.invMassD0barToKPi(candidate2), - candidateType1, - candidateType2, - 1); - entryD0PairRecoInfo(origin1, - origin2, - matchedRec1, - matchedRec2); - } // end inner loop - } // end outer loop - } - - PROCESS_SWITCH(HfCorrelatorDMesonPairs, processMcRecD0, "Process D0 Mc Reco mode", false); - - /// D0(bar)-D0(bar) correlation pair builder - for MC gen-level analysis (no filter/selection, only true signal) - void processMcGenD0(aod::McCollision const&, - McParticlesPlus2Prong const& mcParticles) - { - analyseMcGen(mcParticles); + // Fill hMatchingMcRec - Cand 2 + registry.fill(HIST("hMatchingMcRec"), 5); + if (matchedRec2 == 1) { + registry.fill(HIST("hMatchingMcRec"), 6); + } else if (matchedRec2 == -1) { + registry.fill(HIST("hMatchingMcRec"), 7); + } else if (matchedRec2 == 0) { + registry.fill(HIST("hMatchingMcRec"), 8); + } + // Fill True info + if (isTrueDCand1) { + registry.fill(HIST("hSelectionStatus"), 6); + } else if (isTrueDbarCand1) { + registry.fill(HIST("hSelectionStatus"), 7); + } + if (isTrueDCand2) { + registry.fill(HIST("hSelectionStatus"), 12); + } else if (isTrueDbarCand2) { + registry.fill(HIST("hSelectionStatus"), 13); + } + if (isTrueDCand1 && isTrueDCand2) { + registry.fill(HIST("hSelectionStatus"), 22); + } else if (isTrueDbarCand1 && isTrueDbarCand2) { + registry.fill(HIST("hSelectionStatus"), 23); + } else if (isTrueDCand1 && isTrueDbarCand2) { + registry.fill(HIST("hSelectionStatus"), 24); + } else if (isTrueDbarCand1 && isTrueDCand2) { + registry.fill(HIST("hSelectionStatus"), 25); + } + fillEntry(candidate1, candidate2, isDCand1, isDbarCand1, isDCand2, isDbarCand2, candidateType1, candidateType2); + entryD0PairMcInfo(originRec1, originRec2, matchedRec1, matchedRec2); + } // end inner loop (Cand2) + } // end outer loop (Cand1) } - PROCESS_SWITCH(HfCorrelatorDMesonPairs, processMcGenD0, "Process D0 Mc Gen mode", false); + PROCESS_SWITCH(HfCorrelatorDMesonPairs, processMcRec, "Process Mc reco mode", false); - /// Dplus(minus)-Dplus(minus) correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) - void processDataDPlus(aod::Collision const& collision, - aod::TracksWDca const& tracks, - soa::Join const&) + void processMcGen(aod::McCollision const&, McParticlesPlus2Prong const& mcParticles) { - // protection against empty tables to be sliced - if (selectedDPlusCandidates.size() <= 1) { - return; - } - analyseMultiplicity(collision, tracks); - auto selectedDPlusCandidatesGrouped = selectedDPlusCandidates->sliceByCached(o2::aod::hf_cand::collisionId, collision.globalIndex(), cache); - for (const auto& candidate1 : selectedDPlusCandidatesGrouped) { - if (!kinematicCuts(candidate1)) { + // Get counters per event + int nDevent = 0, nDbarevent = 0, nDDbarevent = 0, nDorDbarevent = 0; + for (const auto& particle : mcParticles) { + // check if the particle is D0 or D0bar + if (std::abs(particle.pdgCode()) != Pdg::kD0) { continue; } - - int outerParticleSign = 1; // Dplus - auto outerSecondTrack = candidate1.prong1(); - if (outerSecondTrack.sign() == 1) { - outerParticleSign = -1; // Dminus (second daughter track is positive) + if (abs(particle.y()) > yCandMax) { + continue; } - - bool isSignalDPlusCand1 = std::abs(hfHelper.invMassDplusToPiKPi(candidate1) - MassDPlus) < massCut; - if (selectSignalRegionOnly && !isSignalDPlusCand1) { + if (ptCandMin >= 0. && particle.pt() < ptCandMin) { continue; } - auto candidateType1 = assignCandidateTypeDPlus(candidate1, outerParticleSign); - fillInfoHists(candidate1, false, false); - registry.fill(HIST("hMass"), hfHelper.invMassDplusToPiKPi(candidate1), candidate1.pt()); - - for (auto candidate2 = candidate1 + 1; candidate2 != selectedDPlusCandidatesGrouped.end(); ++candidate2) { - if (!kinematicCuts(candidate2)) { - continue; - } - - int innerParticleSign = 1; // Dplus - auto innerSecondTrack = candidate2.prong1(); - if (innerSecondTrack.sign() == 1) { - innerParticleSign = -1; // Dminus (second daughter track is positive) - } - bool isSignalDPlusCand2 = std::abs(hfHelper.invMassDplusToPiKPi(candidate2) - MassDPlus) < massCut; - if (selectSignalRegionOnly && !isSignalDPlusCand2) { - continue; - } - auto candidateType2 = assignCandidateTypeDPlus(candidate2, innerParticleSign); - registry.fill(HIST("hSelectionStatus"), 1); - // fill tables - entryDplusPair(getDeltaPhi(candidate2.phi(), candidate1.phi()), - candidate2.eta() - candidate1.eta(), - candidate1.pt(), - candidate2.pt(), - hfHelper.yDplus(candidate1), - hfHelper.yDplus(candidate2), - hfHelper.invMassDplusToPiKPi(candidate1), - hfHelper.invMassDplusToPiKPi(candidate2), - candidateType1, - candidateType2, - 0); - } // end inner loop (cand2) - } // end outer loop (cand1) - } + auto particleType = assignParticleTypeD0Gen(particle); // Candidate type attribution + bool isDParticle = isTrueD(particleType); + bool isDbarParticle = isTrueDbar(particleType); + if (isDParticle) { + nDevent++; + } + if (isDbarParticle) { + nDbarevent++; + } + if (isDParticle && isDbarParticle) { + nDDbarevent++; + } + if (isDParticle || isDbarParticle) { + nDorDbarevent++; + } + } + if (nDevent > 0) { + registry.fill(HIST("hInputCheckD0McGen"), nDevent); + } + if (nDbarevent > 0) { + registry.fill(HIST("hInputCheckD0barMcGen"), nDbarevent); + } + if (nDDbarevent > 0) { + registry.fill(HIST("hInputCheckD0AndD0barMcGen"), nDDbarevent); + } + if (nDorDbarevent > 0) { + registry.fill(HIST("hInputCheckD0OrD0barMcGen"), nDorDbarevent); + } - PROCESS_SWITCH(HfCorrelatorDMesonPairs, processDataDPlus, "Process Data DPlus", false); + auto massD = MassD0; + auto massDbar = MassD0Bar; - /// Dplus(minus)-Dplus(minus) correlation pair builder - for MC reco-level analysis (candidates matched to true signal only, but also the various bkg sources are studied) - void processMcRecDPlus(aod::Collision const& collision, - aod::TracksWDca const& tracks, - soa::Join const&) - { - // protection against empty tables to be sliced - if (selectedDPlusCandidatesMc.size() <= 1) { - return; - } - analyseMultiplicity(collision, tracks); - auto selectedDPlusCandidatesGroupedMc = selectedDPlusCandidatesMc->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); - for (const auto& candidate1 : selectedDPlusCandidatesGroupedMc) { - if (!kinematicCuts(candidate1)) { + for (const auto& particle1 : mcParticles) { + // check if the particle is D0 or D0bar + if (std::abs(particle1.pdgCode()) != Pdg::kD0) { continue; } + registry.fill(HIST("hPtCandMcGen"), particle1.pt()); - int outerParticleSign = 1; // Dplus - auto outerSecondTrack = candidate1.prong1(); - if (outerSecondTrack.sign() == 1) { - outerParticleSign = -1; // Dminus (second daughter track is positive) + if (abs(particle1.y()) > yCandMax) { + continue; } - bool isSignalDPlusCand1 = std::abs(hfHelper.invMassDplusToPiKPi(candidate1) - MassDPlus) < massCut; - if (selectSignalRegionOnly && !isSignalDPlusCand1) { + if (ptCandMin >= 0. && particle1.pt() < ptCandMin) { continue; } + registry.fill(HIST("hEtaMcGen"), particle1.eta()); + registry.fill(HIST("hPhiMcGen"), particle1.phi()); + registry.fill(HIST("hPtCandAfterCutMcGen"), particle1.pt()); - auto candidateType1 = assignCandidateTypeDPlus(candidate1, outerParticleSign); - registry.fill(HIST("hMass"), hfHelper.invMassDplusToPiKPi(candidate1), candidate1.pt()); + auto particleType1 = assignParticleTypeD0Gen(particle1); // Candidate sign attribution + bool isDParticle1 = isTrueD(particleType1); + bool isDbarParticle1 = isTrueDbar(particleType1); - int8_t origin1 = 0, matchedRec1 = 0; - if (!(TESTBIT(candidateType1, TrueD) && TESTBIT(candidateType1, TrueDbar))) { // if our event is not bkg - // check if it's prompt or non-prompt - origin1 = candidate1.originMcRec(); - registry.fill(HIST("hOriginMcRec"), origin1); - // check if it's MC matched - matchedRec1 = candidate1.flagMcMatchRec(); - registry.fill(HIST("hMatchedMcRec"), matchedRec1); + // check if it's MC matched + int8_t matchedGen1 = particle1.flagMcMatchGen(); + // check origin + int8_t originGen1 = particle1.originMcGen(); + + // Fill selection status single particle + registry.fill(HIST("hStatusSinglePartMcGen"), 1); + if (isDParticle1 && !isDbarParticle1) { + registry.fill(HIST("hStatusSinglePartMcGen"), 2); + registry.fill(HIST("hStatusSinglePartMcGen"), 5); + } else if (isDbarParticle1 && !isDParticle1) { + registry.fill(HIST("hStatusSinglePartMcGen"), 3); + registry.fill(HIST("hStatusSinglePartMcGen"), 6); + } else if (isDParticle1 && isDbarParticle1) { + registry.fill(HIST("hStatusSinglePartMcGen"), 4); } - for (auto candidate2 = candidate1 + 1; candidate2 != selectedDPlusCandidatesGroupedMc.end(); ++candidate2) { - if (!kinematicCuts(candidate2)) { + for (auto particle2 = particle1 + 1; particle2 != mcParticles.end(); ++particle2) { + // check if the particle is D0 or D0bar + if (std::abs(particle2.pdgCode()) != Pdg::kD0) { continue; } - - int innerParticleSign = 1; // Dplus - auto innerSecondTrack = candidate2.prong1(); - if (innerSecondTrack.sign() == 1) { - innerParticleSign = -1; // Dminus (second daughter track is positive) + if (abs(particle2.y()) > yCandMax) { + continue; } - bool isSignalDPlusCand2 = std::abs(hfHelper.invMassDplusToPiKPi(candidate2) - MassDPlus) < massCut; - if (selectSignalRegionOnly && !isSignalDPlusCand2) { + if (ptCandMin >= 0. && particle2.pt() < ptCandMin) { continue; } + // Candidate sign attribution. + auto particleType2 = assignParticleTypeD0Gen(particle2); + bool isDParticle2 = isTrueD(particleType2); + bool isDbarParticle2 = isTrueDbar(particleType2); - uint candidateType2 = assignCandidateTypeDPlus(candidate2, innerParticleSign); - int8_t origin2 = 0, matchedRec2 = 0; - if (!(TESTBIT(candidateType2, TrueD) && TESTBIT(candidateType2, TrueDbar))) { // if our event is not bkg - // check if it's prompt or non-prompt - origin2 = candidate1.originMcRec(); - // check if it's MC matched - matchedRec2 = candidate1.flagMcMatchRec(); + // check if it's MC matched + int8_t matchedGen2 = particle2.flagMcMatchGen(); + // check origin + int8_t originGen2 = particle2.originMcGen(); + + // Fill hMatchingMcGen - Cand 1 + registry.fill(HIST("hMatchingMcGen"), 1); + if (matchedGen1 == 1) { + registry.fill(HIST("hMatchingMcGen"), 2); + } else if (matchedGen1 == -1) { + registry.fill(HIST("hMatchingMcGen"), 3); + } else if (matchedGen1 == 0) { + registry.fill(HIST("hMatchingMcGen"), 4); + } + // Fill hMatchingMcRec - Cand 2 + registry.fill(HIST("hMatchingMcGen"), 5); + if (matchedGen2 == 1) { + registry.fill(HIST("hMatchingMcGen"), 6); + } else if (matchedGen2 == -1) { + registry.fill(HIST("hMatchingMcGen"), 7); + } else if (matchedGen2 == 0) { + registry.fill(HIST("hMatchingMcGen"), 8); } - registry.fill(HIST("hSelectionStatus"), 1); - // fill tables - entryDplusPair(getDeltaPhi(candidate2.phi(), candidate1.phi()), - candidate2.eta() - candidate1.eta(), - candidate1.pt(), - candidate2.pt(), - hfHelper.yDplus(candidate1), - hfHelper.yDplus(candidate2), - hfHelper.invMassDplusToPiKPi(candidate1), - hfHelper.invMassDplusToPiKPi(candidate2), - candidateType1, - candidateType2, - 1); - entryDplusPairRecoInfo(origin1, - origin2, - matchedRec1, - matchedRec2); - } // end inner loop (cand2) - } // end outer loop (cand1) - } - PROCESS_SWITCH(HfCorrelatorDMesonPairs, processMcRecDPlus, "Process DPlus Mc Reco", false); + // Fill particle1's Selection Status + registry.fill(HIST("hSelectionStatusMcGen"), 2); + if (isDParticle1 && !isDbarParticle1) { + registry.fill(HIST("hSelectionStatusMcGen"), 6); + } else if (isDbarParticle1 && !isDParticle1) { + registry.fill(HIST("hSelectionStatusMcGen"), 7); + } - /// Dplus(minus)-Dplus(minus) correlation pair builder - for MC gen-level analysis (no filter/selection, only true signal) - void processMcGenDPlus(aod::McCollision const&, - McParticlesPlus3Prong const& mcParticles) - { - analyseMcGen(mcParticles); + // Fill particle2's Selection Status + registry.fill(HIST("hSelectionStatusMcGen"), 8); + if (isDParticle2 && !isDbarParticle2) { + registry.fill(HIST("hSelectionStatusMcGen"), 12); + } else if (isDbarParticle2 && !isDParticle2) { + registry.fill(HIST("hSelectionStatusMcGen"), 13); + } + + // Fill pair Selection Status + uint8_t pairType(0); + registry.fill(HIST("hSelectionStatusMcGen"), 1); + + if (isDParticle1 && isDParticle2) { + SETBIT(pairType, DD); + registry.fill(HIST("hSelectionStatusMcGen"), 22); + } + if (isDbarParticle1 && isDbarParticle2) { + SETBIT(pairType, DbarDbar); + registry.fill(HIST("hSelectionStatusMcGen"), 23); + } + if (isDParticle1 && isDbarParticle2) { + SETBIT(pairType, DDbar); + registry.fill(HIST("hSelectionStatusMcGen"), 24); + } + if (isDbarParticle1 && isDParticle2) { + SETBIT(pairType, DbarD); + registry.fill(HIST("hSelectionStatusMcGen"), 25); + } + + // Fill pair Selection Status + entryD0PairMcGen(particle1.pt(), particle2.pt(), particle1.y(), particle2.y(), massD, massDbar, massD, massDbar, pairType, particleType1, particleType2); + entryD0PairMcGenInfo(originGen1, originGen2, matchedGen1, matchedGen2); + + } // end inner loop + } // end outer loop } - PROCESS_SWITCH(HfCorrelatorDMesonPairs, processMcGenDPlus, "Process DPlus Mc Gen mode", false); + PROCESS_SWITCH(HfCorrelatorDMesonPairs, processMcGen, "Process D0 Mc Gen mode", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGHF/HFC/TableProducer/correlatorDMesonPairsTesting.cxx b/PWGHF/HFC/TableProducer/correlatorDMesonPairsTesting.cxx deleted file mode 100644 index 31df5687855..00000000000 --- a/PWGHF/HFC/TableProducer/correlatorDMesonPairsTesting.cxx +++ /dev/null @@ -1,797 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -/// \file correlatorDMesonPairs.cxx -/// \brief D0(bar) correlator task - data-like, MC-reco and MC-kine analyses. -/// \note Temporary code for tests of D0-D0 correlations -/// -/// \author Andrea Tavira García , IJCLab Orsay - -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" - -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" - -#include "PWGHF/Core/HfHelper.h" -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" -#include "PWGHF/HFC/DataModel/DMesonPairsTablesTesting.h" - -using namespace o2; -using namespace o2::analysis; -using namespace o2::constants::physics; -using namespace o2::framework; -using namespace o2::framework::expressions; - -namespace -{ -enum CandidateType { - SelectedD = 0, // This particle is selected as a D - SelectedDbar, // This particle is selected as a Dbar - TrueD, // This particle is a true D - TrueDbar // This particle is a true Dbar -}; - -enum PairTypeOfSelMassSel { - DD = 0, // This is a D0-D0 pair - DbarDbar, // This is a D0bar-D0bar pair - DDbar, // This is a D0-D0bar pair - DbarD // This is a D0bar-D0 pair -}; -} // namespace - -using McParticlesPlus2Prong = soa::Join; - -struct HfCorrelatorDMesonPairsTesting { - SliceCache cache; - Preslice perCol2Prong = aod::hf_cand::collisionId; - - Produces entryD0Pair; - Produces entryD0PairMcInfo; - Produces entryD0PairMcGen; - Produces entryD0PairMcGenInfo; - - Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; - Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; - Configurable yCandMax{"yCandMax", 0.8, "maxmum |y| of D0 candidates"}; - Configurable ptCandMin{"ptCandMin", -1., "minimum pT of D0 candidates"}; - Configurable> binsPt{"binsPt", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for candidate mass plots"}; - Configurable selectSignalRegionOnly{"selectSignalRegionOnly", false, "only use events close to PDG peak"}; - Configurable massCut{"massCut", 0.05, "Maximum deviation from PDG peak allowed for signal region"}; - Configurable daughterTracksCutFlag{"daughterTracksCutFlag", false, "Flag to add cut on daughter tracks"}; - - HfHelper hfHelper; - - using TracksWPid = soa::Join; - - Partition> selectedD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; - Partition> selectedD0CandidatesMc = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; - - HistogramConfigSpec hTH1Pt{HistType::kTH1F, {{180, 0., 36.}}}; - HistogramConfigSpec hTH1Y{HistType::kTH1F, {{100, -5., 5.}}}; - HistogramConfigSpec hTH1Phi{HistType::kTH1F, {{32, 0., o2::constants::math::TwoPI}}}; - HistogramConfigSpec hTH2Pid{HistType::kTH2F, {{500, 0., 10.}, {400, -20., 20.}}}; - - HistogramRegistry registry{ - "registry", - {{"hPtCand", "D meson candidates;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hPtCandAfterCut", "D meson candidates after pT cut;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hPtProng0", "D meson candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hPtProng1", "D meson candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hEta", "D meson candidates;candidate #it{#eta};entries", hTH1Y}, - {"hPhi", "D meson candidates;candidate #it{#varphi};entries", hTH1Phi}, - {"hY", "D meson candidates;candidate #it{y};entries", hTH1Y}, - // MC Gen plots - {"hPtCandMcGen", "D meson candidates MC Gen;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hPtCandAfterCutMcGen", "D meson candidates after pT cut;candidate #it{p}_{T} (GeV/#it{c});entries", hTH1Pt}, - {"hEtaMcGen", "D meson candidates MC Gen;candidate #it{#eta};entries", hTH1Y}, - {"hPhiMcGen", "D meson candidates MC Gen;candidate #it{#varphi};entries", hTH1Phi}, - // PID plots ----- Not definitively here - {"PID/hTofNSigmaPi", "(TOFsignal-time#pi)/tofSigPid;p[GeV/c];(TOFsignal-time#pi)/tofSigPid", hTH2Pid}, - {"PID/hTofNSigmaKa", "(TOFsignal-timeK)/tofSigPid;p[GeV/c];(TOFsignal-timeK)/tofSigPid", hTH2Pid}, - {"PID/hTpcNSigmaPi", "(TPCsignal-time#pi)/tpcSigPid;p[GeV/c];(TPCsignal-time#pi)/tpcSigPid", hTH2Pid}, - {"PID/hTpcNSigmaKa", "(TPCsignal-timeK)/tpcSigPid;p[GeV/c];(TPCsignal-timeK)/tpcSigPid", hTH2Pid}, - {"PID/hTpcTofNSigmaPi", "(TPC+TOFsignal-time#pi)/tpcTofSigPid;p[GeV/#it{c}];(TPC+TOFsignal-time#pi)/tpcTofSigPid", hTH2Pid}, - {"PID/hTpcTofNSigmaKa", "(TPC+TOFsignal-timeK)/tpcTofSigPid;p[GeV/c];(TPC+TOFsignal-timeK)/tpcTofSigPid", hTH2Pid}}}; - - void init(InitContext&) - { - auto vbins = (std::vector)binsPt; - constexpr int kNBinsSelStatus = 25; - std::string labels[kNBinsSelStatus]; - - labels[0] = "total # of Selected pairs"; - // Cand1 analysis - labels[1] = "total # of Selected Cands 1"; - labels[2] = "# of Selected D Cand 1 ONLY"; - labels[3] = "# of Selected Dbar Cand 1 ONLY"; - labels[4] = "# of Selected Simultaneous D + Dbar Cand 1"; - labels[5] = "# of True D Cand 1"; - labels[6] = "# of True Dbar Cand 1"; - // Cand2 analysis - labels[7] = "total # of Selected Cands 2"; - labels[8] = "# of Selected D Cand 2 ONLY"; - labels[9] = "# of Selected Dbar Cand 2 ONLY"; - labels[10] = "# of Selected Simultaneous D + Dbar Cand 2"; - labels[11] = "# of True D Cand 2"; - labels[12] = "# of True Dbar Cand 2"; - // Pair analysis - labels[13] = "# of D+D Pairs"; - labels[14] = "# of Dbar+Dbar Pairs"; - labels[15] = "# of D+Dbar Pairs"; - labels[16] = "# of Dbar+D Pairs"; - labels[17] = "# of D+D ONLY Pairs"; - labels[18] = "# of Dbar+Dbar ONLY Pairs"; - labels[19] = "# of D+Dbar ONLY Pairs"; - labels[20] = "# of Dbar+D ONLY Pairs"; - // True pair analysis - labels[21] = "# of True D+D Pairs"; - labels[22] = "# of True Dbar+Dbar Pairs"; - labels[23] = "# of True D+Dbar Pairs"; - labels[24] = "# of True Dbar+D Pairs"; - - AxisSpec axisSelStatus = {kNBinsSelStatus, 0.5, kNBinsSelStatus + 0.5, ""}; - registry.add("hSelectionStatus", "D Meson candidates;selection status;entries", HistType::kTH1F, {axisSelStatus}); - registry.add("hSelectionStatusMcGen", "D Meson candidates MC Gen;selection status;entries", HistType::kTH1F, {axisSelStatus}); - - for (int iBin = 0; iBin < kNBinsSelStatus; iBin++) { - registry.get(HIST("hSelectionStatus"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); - registry.get(HIST("hSelectionStatusMcGen"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); - } - - constexpr int kNBinsMatching = 8; - std::string labelsMatching[kNBinsMatching]; - // Cand1 analysis - labelsMatching[0] = "total # of Cand 1"; - labelsMatching[1] = "# of matched D Cand 1"; - labelsMatching[2] = "# of matched Dbar Cand 1"; - labelsMatching[3] = "# of unmatched Cand 1"; - // Cand2 analysis - labelsMatching[4] = "total # of Cand 2"; - labelsMatching[5] = "# of matched D Cand 2"; - labelsMatching[6] = "# of matched Dbar Cand 2"; - labelsMatching[7] = "# of unmatched Cand 2"; - - AxisSpec axisMatching = {kNBinsMatching, 0.5, kNBinsMatching + 0.5, ""}; - registry.add("hMatchingMcRec", "D Meson candidates; MC matching status;entries", HistType::kTH1F, {axisMatching}); - registry.add("hMatchingMcGen", "D Meson candidates; MC matching status;entries", HistType::kTH1F, {axisMatching}); - - for (int iBin = 0; iBin < kNBinsMatching; iBin++) { - registry.get(HIST("hMatchingMcRec"))->GetXaxis()->SetBinLabel(iBin + 1, labelsMatching[iBin].data()); - registry.get(HIST("hMatchingMcGen"))->GetXaxis()->SetBinLabel(iBin + 1, labelsMatching[iBin].data()); - } - - constexpr int kNBinsSinglePart = 6; - std::string labelsSinglePart[kNBinsSinglePart]; - // Candidate analysis - labelsSinglePart[0] = "total # of Candidates"; - labelsSinglePart[1] = "# of selected D"; - labelsSinglePart[2] = "# of selected Dbar"; - labelsSinglePart[3] = "# of selected D and Dbar"; - labelsSinglePart[4] = "# of true D"; - labelsSinglePart[5] = "# of true Dbar"; - - AxisSpec axisSinglePart = {kNBinsSinglePart, 0.5, kNBinsSinglePart + 0.5, ""}; - registry.add("hStatusSinglePart", "D Meson candidates; MC matching status;entries", HistType::kTH1F, {axisSinglePart}); - registry.add("hStatusSinglePartMcGen", "D Meson candidates; MC matching status;entries", HistType::kTH1F, {axisSinglePart}); - - for (int iBin = 0; iBin < kNBinsSinglePart; iBin++) { - registry.get(HIST("hStatusSinglePart"))->GetXaxis()->SetBinLabel(iBin + 1, labelsSinglePart[iBin].data()); - registry.get(HIST("hStatusSinglePartMcGen"))->GetXaxis()->SetBinLabel(iBin + 1, labelsSinglePart[iBin].data()); - } - - AxisSpec axisInputD0 = {200, -0.5, 199.5}; - registry.add("hInputCheckD0", "Check on input D0 meson candidates/event", {HistType::kTH1F, {axisInputD0}}); - registry.add("hInputCheckD0bar", "Check on input D0bar meson candidates/event", {HistType::kTH1F, {axisInputD0}}); - registry.add("hInputCheckD0AndD0bar", "Check on input D0 & D0bar meson candidates/event", {HistType::kTH1F, {axisInputD0}}); - registry.add("hInputCheckD0OrD0bar", "Check on input D0 | D0bar meson candidates/event", {HistType::kTH1F, {axisInputD0}}); - // MC Gen - registry.add("hInputCheckD0McGen", "Check on input D0 meson candidates/event MC Gen", {HistType::kTH1F, {axisInputD0}}); - registry.add("hInputCheckD0barMcGen", "Check on input D0bar meson candidates/event MC Gen", {HistType::kTH1F, {axisInputD0}}); - registry.add("hInputCheckD0AndD0barMcGen", "Check on input D0 & D0bar meson candidates/event MC Gen", {HistType::kTH1F, {axisInputD0}}); - registry.add("hInputCheckD0OrD0barMcGen", "Check on input D0 | D0bar meson candidates/event MC Gen", {HistType::kTH1F, {axisInputD0}}); - - registry.add("hMass", "D Meson pair candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{120, 1.5848, 2.1848}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - } - - /// Sets bits to select candidate type for D0 - /// SelectedD and SelectedDbar bits look at whether the candidate passed the selection flags. - /// \param candidate is candidate - /// \return bitmap with type of candidate - template - uint8_t assignCandidateTypeD0(const T& candidate) - { - uint8_t candidateType(0); - if (candidate.isSelD0() >= selectionFlagD0) { - SETBIT(candidateType, SelectedD); - } - if (candidate.isSelD0bar() >= selectionFlagD0bar) { - SETBIT(candidateType, SelectedDbar); - } - if constexpr (isMcRec) { - if (candidate.flagMcMatchRec() == 1 << o2::aod::hf_cand_2prong::DecayType::D0ToPiK) { // matched as D0 - SETBIT(candidateType, TrueD); - } - if (candidate.flagMcMatchRec() == -(1 << o2::aod::hf_cand_2prong::DecayType::D0ToPiK)) { // matched as D0bar - SETBIT(candidateType, TrueDbar); - } - } - return candidateType; - } - - /// Sets bits to select candidate type at generator level - /// \param particle is particle - /// \return bitmap with type of gen particle - they are selected as True - template - uint8_t assignParticleTypeD0Gen(const T& particle) - { - uint8_t particleType(0); - if (particle.pdgCode() == Pdg::kD0) { // just checking the particle PDG, not the decay channel - SETBIT(particleType, TrueD); - } - if (particle.pdgCode() == (-Pdg::kD0)) { // just checking the particle PDG, not the decay channel - SETBIT(particleType, TrueDbar); - } - return particleType; - } - - /// Check if the candidate is a D - /// \param candidate is candidate - /// \return true if is a D - bool isD(const uint8_t candidateType) - { - return (TESTBIT(candidateType, SelectedD)); - } - - /// Check if the candidate is a Dbar - /// \param candidate is candidate - /// \return true if is a Dbar - bool isDbar(const uint8_t candidateType) - { - return (TESTBIT(candidateType, SelectedDbar)); - } - - /// Check if the candidate is a true D - /// \param candidate is candidate - /// \return true if is a true D - bool isTrueD(const uint8_t candidateType) - { - return (TESTBIT(candidateType, TrueD)); - } - - /// Check if the candidate is a true Dbar - /// \param candidate is candidate - /// \return true if is a true Dbar - bool isTrueDbar(const uint8_t candidateType) - { - return (TESTBIT(candidateType, TrueDbar)); - } - - /// Fill PID related plots for D0 and D0bar - /// \param candidate is candidate - template - void AnalysePid(const T& candidate) - { - auto prong0 = candidate.template prong0_as(); - auto prong1 = candidate.template prong1_as(); - if (candidate.isSelD0() >= selectionFlagD0) { - registry.fill(HIST("PID/hTofNSigmaPi"), candidate.ptProng0(), prong0.tofNSigmaPi()); - registry.fill(HIST("PID/hTofNSigmaKa"), candidate.ptProng1(), prong1.tofNSigmaKa()); - registry.fill(HIST("PID/hTpcNSigmaPi"), candidate.ptProng0(), prong0.tpcNSigmaPi()); - registry.fill(HIST("PID/hTpcNSigmaKa"), candidate.ptProng1(), prong1.tpcNSigmaKa()); - registry.fill(HIST("PID/hTpcTofNSigmaPi"), candidate.ptProng0(), prong0.tpcTofNSigmaPi()); - registry.fill(HIST("PID/hTpcTofNSigmaKa"), candidate.ptProng1(), prong1.tpcTofNSigmaKa()); - } - if (candidate.isSelD0bar() >= selectionFlagD0bar) { - registry.fill(HIST("PID/hTofNSigmaPi"), candidate.ptProng1(), prong1.tofNSigmaPi()); - registry.fill(HIST("PID/hTofNSigmaKa"), candidate.ptProng0(), prong0.tofNSigmaKa()); - registry.fill(HIST("PID/hTpcNSigmaPi"), candidate.ptProng1(), prong1.tpcNSigmaPi()); - registry.fill(HIST("PID/hTpcNSigmaKa"), candidate.ptProng0(), prong0.tpcNSigmaKa()); - registry.fill(HIST("PID/hTpcTofNSigmaPi"), candidate.ptProng1(), prong1.tpcTofNSigmaPi()); - registry.fill(HIST("PID/hTpcTofNSigmaKa"), candidate.ptProng0(), prong0.tpcTofNSigmaKa()); - } - } - - /// Fill counters for D0 and D0bar - /// \param selectedD0Candidates contains all D0 candidates - template - void GetCountersPerEvent(const T& selectedD0Candidates) - { - int nDevent = 0, nDbarevent = 0, nDDbarevent = 0, nDorDbarevent = 0; - for (const auto& candidate : selectedD0Candidates) { - // Get counters per event - bool isSignalD0 = std::abs(hfHelper.invMassD0ToPiK(candidate) - MassD0) < massCut; - bool isSignalD0bar = std::abs(hfHelper.invMassD0barToKPi(candidate) - MassD0Bar) < massCut; - if (selectSignalRegionOnly && !(isSignalD0 || isSignalD0bar)) { - continue; - } - auto candidateType1 = assignCandidateTypeD0(candidate); // Candidate type attribution - registry.fill(HIST("hPtCand"), candidate.pt()); - if (abs(hfHelper.yD0(candidate)) > yCandMax) { - continue; - } - if (ptCandMin >= 0. && candidate.pt() < ptCandMin) { - continue; - } - registry.fill(HIST("hPtProng0"), candidate.ptProng0()); - registry.fill(HIST("hPtProng1"), candidate.ptProng1()); - registry.fill(HIST("hEta"), candidate.eta()); - registry.fill(HIST("hPhi"), candidate.phi()); - registry.fill(HIST("hY"), candidate.y(MassD0)); - registry.fill(HIST("hPtCandAfterCut"), candidate.pt()); - registry.fill(HIST("hMass"), hfHelper.invMassD0ToPiK(candidate), candidate.pt()); - - bool isDCand1 = isD(candidateType1); - bool isDbarCand1 = isDbar(candidateType1); - if (isDCand1) { - nDevent++; - } - if (isDbarCand1) { - nDbarevent++; - } - if (isDCand1 && isDbarCand1) { - nDDbarevent++; - } - if (isDCand1 || isDbarCand1) { - nDorDbarevent++; - } - - // Fill selection status single particle - registry.fill(HIST("hStatusSinglePart"), 1); - if (isDCand1 && !isDbarCand1) { - registry.fill(HIST("hStatusSinglePart"), 2); - } else if (isDbarCand1 && !isDCand1) { - registry.fill(HIST("hStatusSinglePart"), 3); - } else if (isDCand1 && isDbarCand1) { - registry.fill(HIST("hStatusSinglePart"), 4); - } - } - if (nDevent > 0) { - registry.fill(HIST("hInputCheckD0"), nDevent); - } - if (nDbarevent > 0) { - registry.fill(HIST("hInputCheckD0bar"), nDbarevent); - } - if (nDDbarevent > 0) { - registry.fill(HIST("hInputCheckD0AndD0bar"), nDDbarevent); - } - if (nDorDbarevent > 0) { - registry.fill(HIST("hInputCheckD0OrD0bar"), nDorDbarevent); - } - } - - /// Fill selection status histogram - /// \param candidate1 is the first candidate of the pair - /// \param candidate2 is the second candidate of the pair - template - void fillEntry(const T& candidate1, const T& candidate2, const bool& isDCand1, const bool& isDbarCand1, - const bool& isDCand2, const bool& isDbarCand2, const uint8_t& candidateType1, const uint8_t& candidateType2) - { - - /// Fill information on the D candidates - registry.fill(HIST("hSelectionStatus"), 2); - if (isDCand1 && !isDbarCand1) { - registry.fill(HIST("hSelectionStatus"), 3); - } else if (isDbarCand1 && !isDCand1) { - registry.fill(HIST("hSelectionStatus"), 4); - } else if (isDCand1 && isDbarCand1) { - registry.fill(HIST("hSelectionStatus"), 5); - } - - registry.fill(HIST("hSelectionStatus"), 8); - if (isDCand2 && !isDbarCand2) { - registry.fill(HIST("hSelectionStatus"), 9); - } else if (isDbarCand2 && !isDCand2) { - registry.fill(HIST("hSelectionStatus"), 10); - } else if (isDCand2 && isDbarCand2) { - registry.fill(HIST("hSelectionStatus"), 11); - } - - /// Collect information on the D pairs - uint8_t pairType(0); - registry.fill(HIST("hSelectionStatus"), 1); - float yCand1 = hfHelper.yD0(candidate1); - float yCand2 = hfHelper.yD0(candidate2); - float massDCand1 = hfHelper.invMassD0ToPiK(candidate1); - float massDbarCand1 = hfHelper.invMassD0barToKPi(candidate1); - float massDCand2 = hfHelper.invMassD0ToPiK(candidate2); - float massDbarCand2 = hfHelper.invMassD0barToKPi(candidate2); - if (isDCand1 && isDCand2) { - SETBIT(pairType, DD); - registry.fill(HIST("hSelectionStatus"), 14); - if ((!isDbarCand1) && (!isDbarCand2)) { - registry.fill(HIST("hSelectionStatus"), 18); - } - } - if (isDbarCand1 && isDbarCand2) { - SETBIT(pairType, DbarDbar); - registry.fill(HIST("hSelectionStatus"), 15); - if ((!isDCand1) && (!isDCand2)) { - registry.fill(HIST("hSelectionStatus"), 19); - } - } - if (isDCand1 && isDbarCand2) { - SETBIT(pairType, DDbar); - registry.fill(HIST("hSelectionStatus"), 16); - if ((!isDbarCand1) && (!isDCand2)) { - registry.fill(HIST("hSelectionStatus"), 20); - } - } - if (isDbarCand1 && isDCand2) { - SETBIT(pairType, DbarD); - registry.fill(HIST("hSelectionStatus"), 17); - if ((!isDCand1) && (!isDbarCand2)) { - registry.fill(HIST("hSelectionStatus"), 21); - } - } - - entryD0Pair(candidate1.pt(), candidate2.pt(), yCand1, yCand2, massDCand1, massDbarCand1, massDCand2, massDbarCand2, pairType, candidateType1, candidateType2); - } - - /// D0(bar)-D0(bar) correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) - void processData(aod::Collision const& collision, - soa::Join const& candidates, TracksWPid const&) - { - for (const auto& candidate : candidates) { - AnalysePid(candidate); - } - auto selectedD0CandidatesGrouped = selectedD0Candidates->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); - GetCountersPerEvent(selectedD0CandidatesGrouped); - // protection against empty tables to be sliced - if (selectedD0Candidates.size() <= 1) { - return; - } - for (const auto& candidate1 : selectedD0CandidatesGrouped) { - if (abs(hfHelper.yD0(candidate1)) > yCandMax) { - continue; - } - if (ptCandMin >= 0. && candidate1.pt() < ptCandMin) { - continue; - } - auto prong0Cand1 = candidate1.template prong0_as(); - auto prong1Cand1 = candidate1.template prong1_as(); - - bool isSignalD0Cand1 = std::abs(hfHelper.invMassD0ToPiK(candidate1) - MassD0) < massCut; - bool isSignalD0barCand1 = std::abs(hfHelper.invMassD0barToKPi(candidate1) - MassD0Bar) < massCut; - if (selectSignalRegionOnly && !(isSignalD0Cand1 || isSignalD0barCand1)) { - continue; - } - - auto candidateType1 = assignCandidateTypeD0(candidate1); // Candidate type attribution - bool isDCand1 = isD(candidateType1); - bool isDbarCand1 = isDbar(candidateType1); - - for (auto candidate2 = candidate1 + 1; candidate2 != selectedD0CandidatesGrouped.end(); ++candidate2) { - if (abs(hfHelper.yD0(candidate2)) > yCandMax) { - continue; - } - if (ptCandMin >= 0. && candidate2.pt() < ptCandMin) { - continue; - } - auto prong0Cand2 = candidate2.template prong0_as(); - auto prong1Cand2 = candidate2.template prong1_as(); - if (daughterTracksCutFlag && ((prong0Cand1 == prong0Cand2) || (prong1Cand1 == prong1Cand2) || (prong0Cand1 == prong1Cand2) || (prong1Cand1 == prong0Cand2))) { - continue; - } - - bool isSignalD0Cand2 = std::abs(hfHelper.invMassD0ToPiK(candidate2) - MassD0) < massCut; - bool isSignalD0barCand2 = std::abs(hfHelper.invMassD0barToKPi(candidate2) - MassD0Bar) < massCut; - if (selectSignalRegionOnly && !(isSignalD0Cand2 || isSignalD0barCand2)) { - continue; - } - auto candidateType2 = assignCandidateTypeD0(candidate2); // Candidate type attribution - - bool isDCand2 = isD(candidateType2); - bool isDbarCand2 = isDbar(candidateType2); - - fillEntry(candidate1, candidate2, isDCand1, isDbarCand1, isDCand2, isDbarCand2, candidateType1, candidateType2); - } // end inner loop (Cand2) - } // end outer loop (Cand1) - } - - PROCESS_SWITCH(HfCorrelatorDMesonPairsTesting, processData, "Process data mode", true); - - void processMcRec(aod::Collision const& collision, soa::Join const& candidates, TracksWPid const&) - { - for (const auto& candidate : candidates) { - AnalysePid(candidate); - } - auto selectedD0CandidatesGroupedMc = selectedD0CandidatesMc->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); - GetCountersPerEvent(selectedD0CandidatesGroupedMc); - // protection against empty tables to be sliced - if (selectedD0CandidatesMc.size() <= 1) { - return; - } - for (const auto& candidate1 : selectedD0CandidatesGroupedMc) { - if (abs(hfHelper.yD0(candidate1)) > yCandMax) { - continue; - } - if (ptCandMin >= 0. && candidate1.pt() < ptCandMin) { - continue; - } - auto prong0Cand1 = candidate1.template prong0_as(); - auto prong1Cand1 = candidate1.template prong1_as(); - - bool isSignalD0Cand1 = std::abs(hfHelper.invMassD0ToPiK(candidate1) - MassD0) < massCut; - bool isSignalD0barCand1 = std::abs(hfHelper.invMassD0barToKPi(candidate1) - MassD0Bar) < massCut; - if (selectSignalRegionOnly && !(isSignalD0Cand1 || isSignalD0barCand1)) { - continue; - } - - auto candidateType1 = assignCandidateTypeD0(candidate1); // Candidate type attribution - - bool isDCand1 = isD(candidateType1); - bool isDbarCand1 = isDbar(candidateType1); - bool isTrueDCand1 = isTrueD(candidateType1); - bool isTrueDbarCand1 = isTrueDbar(candidateType1); - - int8_t matchedRec1 = candidate1.flagMcMatchRec(); - int8_t originRec1 = candidate1.originMcRec(); - - if (isTrueDCand1) { - registry.fill(HIST("hStatusSinglePart"), 5); - } else if (isTrueDbarCand1) { - registry.fill(HIST("hStatusSinglePart"), 6); - } - - for (auto candidate2 = candidate1 + 1; candidate2 != selectedD0CandidatesGroupedMc.end(); ++candidate2) { - if (abs(hfHelper.yD0(candidate2)) > yCandMax) { - continue; - } - if (ptCandMin >= 0. && candidate2.pt() < ptCandMin) { - continue; - } - auto prong0Cand2 = candidate2.template prong0_as(); - auto prong1Cand2 = candidate2.template prong1_as(); - if (daughterTracksCutFlag && ((prong0Cand1 == prong0Cand2) || (prong1Cand1 == prong1Cand2) || (prong0Cand1 == prong1Cand2) || (prong1Cand1 == prong0Cand2))) { - continue; - } - - bool isSignalD0Cand2 = std::abs(hfHelper.invMassD0ToPiK(candidate2) - MassD0) < massCut; - bool isSignalD0barCand2 = std::abs(hfHelper.invMassD0barToKPi(candidate2) - MassD0Bar) < massCut; - if (selectSignalRegionOnly && !(isSignalD0Cand2 || isSignalD0barCand2)) { - continue; - } - auto candidateType2 = assignCandidateTypeD0(candidate2); // Candidate type attribution - - bool isDCand2 = isD(candidateType2); - bool isDbarCand2 = isDbar(candidateType2); - bool isTrueDCand2 = isTrueD(candidateType2); - bool isTrueDbarCand2 = isTrueDbar(candidateType2); - - int8_t matchedRec2 = candidate2.flagMcMatchRec(); - int8_t originRec2 = candidate2.originMcRec(); - - // Fill hMatchingMcRec - Cand 1 - registry.fill(HIST("hMatchingMcRec"), 1); - if (matchedRec1 == 1) { - registry.fill(HIST("hMatchingMcRec"), 2); - } else if (matchedRec1 == -1) { - registry.fill(HIST("hMatchingMcRec"), 3); - } else if (matchedRec1 == 0) { - registry.fill(HIST("hMatchingMcRec"), 4); - } - // Fill hMatchingMcRec - Cand 2 - registry.fill(HIST("hMatchingMcRec"), 5); - if (matchedRec2 == 1) { - registry.fill(HIST("hMatchingMcRec"), 6); - } else if (matchedRec2 == -1) { - registry.fill(HIST("hMatchingMcRec"), 7); - } else if (matchedRec2 == 0) { - registry.fill(HIST("hMatchingMcRec"), 8); - } - // Fill True info - if (isTrueDCand1) { - registry.fill(HIST("hSelectionStatus"), 6); - } else if (isTrueDbarCand1) { - registry.fill(HIST("hSelectionStatus"), 7); - } - if (isTrueDCand2) { - registry.fill(HIST("hSelectionStatus"), 12); - } else if (isTrueDbarCand2) { - registry.fill(HIST("hSelectionStatus"), 13); - } - if (isTrueDCand1 && isTrueDCand2) { - registry.fill(HIST("hSelectionStatus"), 22); - } else if (isTrueDbarCand1 && isTrueDbarCand2) { - registry.fill(HIST("hSelectionStatus"), 23); - } else if (isTrueDCand1 && isTrueDbarCand2) { - registry.fill(HIST("hSelectionStatus"), 24); - } else if (isTrueDbarCand1 && isTrueDCand2) { - registry.fill(HIST("hSelectionStatus"), 25); - } - fillEntry(candidate1, candidate2, isDCand1, isDbarCand1, isDCand2, isDbarCand2, candidateType1, candidateType2); - entryD0PairMcInfo(originRec1, originRec2, matchedRec1, matchedRec2); - } // end inner loop (Cand2) - } // end outer loop (Cand1) - } - - PROCESS_SWITCH(HfCorrelatorDMesonPairsTesting, processMcRec, "Process Mc reco mode", false); - - void processMcGen(aod::McCollision const&, McParticlesPlus2Prong const& mcParticles) - { - // Get counters per event - int nDevent = 0, nDbarevent = 0, nDDbarevent = 0, nDorDbarevent = 0; - for (const auto& particle : mcParticles) { - // check if the particle is D0 or D0bar - if (std::abs(particle.pdgCode()) != Pdg::kD0) { - continue; - } - if (abs(particle.y()) > yCandMax) { - continue; - } - if (ptCandMin >= 0. && particle.pt() < ptCandMin) { - continue; - } - auto particleType = assignParticleTypeD0Gen(particle); // Candidate type attribution - bool isDParticle = isTrueD(particleType); - bool isDbarParticle = isTrueDbar(particleType); - if (isDParticle) { - nDevent++; - } - if (isDbarParticle) { - nDbarevent++; - } - if (isDParticle && isDbarParticle) { - nDDbarevent++; - } - if (isDParticle || isDbarParticle) { - nDorDbarevent++; - } - } - if (nDevent > 0) { - registry.fill(HIST("hInputCheckD0McGen"), nDevent); - } - if (nDbarevent > 0) { - registry.fill(HIST("hInputCheckD0barMcGen"), nDbarevent); - } - if (nDDbarevent > 0) { - registry.fill(HIST("hInputCheckD0AndD0barMcGen"), nDDbarevent); - } - if (nDorDbarevent > 0) { - registry.fill(HIST("hInputCheckD0OrD0barMcGen"), nDorDbarevent); - } - - auto massD = MassD0; - auto massDbar = MassD0Bar; - - for (const auto& particle1 : mcParticles) { - // check if the particle is D0 or D0bar - if (std::abs(particle1.pdgCode()) != Pdg::kD0) { - continue; - } - registry.fill(HIST("hPtCandMcGen"), particle1.pt()); - - if (abs(particle1.y()) > yCandMax) { - continue; - } - if (ptCandMin >= 0. && particle1.pt() < ptCandMin) { - continue; - } - registry.fill(HIST("hEtaMcGen"), particle1.eta()); - registry.fill(HIST("hPhiMcGen"), particle1.phi()); - registry.fill(HIST("hPtCandAfterCutMcGen"), particle1.pt()); - - auto particleType1 = assignParticleTypeD0Gen(particle1); // Candidate sign attribution - bool isDParticle1 = isTrueD(particleType1); - bool isDbarParticle1 = isTrueDbar(particleType1); - - // check if it's MC matched - int8_t matchedGen1 = particle1.flagMcMatchGen(); - // check origin - int8_t originGen1 = particle1.originMcGen(); - - // Fill selection status single particle - registry.fill(HIST("hStatusSinglePartMcGen"), 1); - if (isDParticle1 && !isDbarParticle1) { - registry.fill(HIST("hStatusSinglePartMcGen"), 2); - registry.fill(HIST("hStatusSinglePartMcGen"), 5); - } else if (isDbarParticle1 && !isDParticle1) { - registry.fill(HIST("hStatusSinglePartMcGen"), 3); - registry.fill(HIST("hStatusSinglePartMcGen"), 6); - } else if (isDParticle1 && isDbarParticle1) { - registry.fill(HIST("hStatusSinglePartMcGen"), 4); - } - - for (auto particle2 = particle1 + 1; particle2 != mcParticles.end(); ++particle2) { - // check if the particle is D0 or D0bar - if (std::abs(particle2.pdgCode()) != Pdg::kD0) { - continue; - } - if (abs(particle2.y()) > yCandMax) { - continue; - } - if (ptCandMin >= 0. && particle2.pt() < ptCandMin) { - continue; - } - // Candidate sign attribution. - auto particleType2 = assignParticleTypeD0Gen(particle2); - bool isDParticle2 = isTrueD(particleType2); - bool isDbarParticle2 = isTrueDbar(particleType2); - - // check if it's MC matched - int8_t matchedGen2 = particle2.flagMcMatchGen(); - // check origin - int8_t originGen2 = particle2.originMcGen(); - - // Fill hMatchingMcGen - Cand 1 - registry.fill(HIST("hMatchingMcGen"), 1); - if (matchedGen1 == 1) { - registry.fill(HIST("hMatchingMcGen"), 2); - } else if (matchedGen1 == -1) { - registry.fill(HIST("hMatchingMcGen"), 3); - } else if (matchedGen1 == 0) { - registry.fill(HIST("hMatchingMcGen"), 4); - } - // Fill hMatchingMcRec - Cand 2 - registry.fill(HIST("hMatchingMcGen"), 5); - if (matchedGen2 == 1) { - registry.fill(HIST("hMatchingMcGen"), 6); - } else if (matchedGen2 == -1) { - registry.fill(HIST("hMatchingMcGen"), 7); - } else if (matchedGen2 == 0) { - registry.fill(HIST("hMatchingMcGen"), 8); - } - - // Fill particle1's Selection Status - registry.fill(HIST("hSelectionStatusMcGen"), 2); - if (isDParticle1 && !isDbarParticle1) { - registry.fill(HIST("hSelectionStatusMcGen"), 6); - } else if (isDbarParticle1 && !isDParticle1) { - registry.fill(HIST("hSelectionStatusMcGen"), 7); - } - - // Fill particle2's Selection Status - registry.fill(HIST("hSelectionStatusMcGen"), 8); - if (isDParticle2 && !isDbarParticle2) { - registry.fill(HIST("hSelectionStatusMcGen"), 12); - } else if (isDbarParticle2 && !isDParticle2) { - registry.fill(HIST("hSelectionStatusMcGen"), 13); - } - - // Fill pair Selection Status - uint8_t pairType(0); - registry.fill(HIST("hSelectionStatusMcGen"), 1); - - if (isDParticle1 && isDParticle2) { - SETBIT(pairType, DD); - registry.fill(HIST("hSelectionStatusMcGen"), 22); - } - if (isDbarParticle1 && isDbarParticle2) { - SETBIT(pairType, DbarDbar); - registry.fill(HIST("hSelectionStatusMcGen"), 23); - } - if (isDParticle1 && isDbarParticle2) { - SETBIT(pairType, DDbar); - registry.fill(HIST("hSelectionStatusMcGen"), 24); - } - if (isDbarParticle1 && isDParticle2) { - SETBIT(pairType, DbarD); - registry.fill(HIST("hSelectionStatusMcGen"), 25); - } - - // Fill pair Selection Status - entryD0PairMcGen(particle1.pt(), particle2.pt(), particle1.y(), particle2.y(), massD, massDbar, massD, massDbar, pairType, particleType1, particleType2); - entryD0PairMcGenInfo(originGen1, originGen2, matchedGen1, matchedGen2); - - } // end inner loop - } // end outer loop - } - - PROCESS_SWITCH(HfCorrelatorDMesonPairsTesting, processMcGen, "Process D0 Mc Gen mode", false); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx index 60aab2e1da1..76ccc4fa3a1 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx @@ -152,7 +152,7 @@ struct HfCorrelatorDsHadrons { Configurable ptTrackMin{"ptTrackMin", 0.3, "min. track pT"}; Configurable ptTrackMax{"ptTrackMax", 50., "max. track pT"}; Configurable> binsPtD{"binsPtD", std::vector{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for candidate mass plots"}; - Configurable> binsPtHadron{"binsPtHadron", std::vector{VARIABLE_WIDTH, 0., 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle"}; + Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle"}; Configurable> binsPtEfficiencyD{"binsPtEfficiencyD", std::vector{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for efficiency"}; Configurable> efficiencyD{"efficiencyD", {1., 1., 1., 1., 1., 1.}, "efficiency values for Ds meson"}; ConfigurableAxis zPoolBins{"zPoolBins", {VARIABLE_WIDTH, -10.0, -2.5, 2.5, 10.0}, "z vertex position pools"}; @@ -161,7 +161,7 @@ struct HfCorrelatorDsHadrons { ConfigurableAxis binsEta{"binsEta", {100, -2., 2.}, "#it{#eta}"}; ConfigurableAxis binsPhi{"binsPhi", {128, -PIHalf, 3. * PIHalf}, "#it{#varphi}"}; ConfigurableAxis binsMultiplicity{"binsMultiplicity", {200, 0., 800.}, "Multiplicity"}; - ConfigurableAxis binsMultFT0M{"binsMultFT0M", {1000, 0., 10000.}, "Multiplicity as FT0M signal amplitude"}; + ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 6000.}, "Multiplicity as FT0M signal amplitude"}; ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"}; ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; @@ -181,15 +181,15 @@ struct HfCorrelatorDsHadrons { kAssocTrackStepFake, kAssocTrackNSteps }; - using SelCollisionsWithDs = soa::Filtered>; // collisionFilter applied - using SelCollisionsWithDsMc = soa::Filtered>; // collisionFilter applied - using CandDsData = soa::Filtered>; // flagDsFilter applied - using CandDsMcReco = soa::Filtered>; // flagDsFilter applied - using CandDsMcGen = soa::Join; // flagDsFilter applied - using MyTracksData = soa::Filtered; // trackFilter applied - using TracksWithMc = soa::Filtered>; // trackFilter applied + using SelCollisionsWithDs = soa::Filtered>; // collisionFilter applied + using SelCollisionsWithDsMc = soa::Filtered>; // collisionFilter applied + using CandDsData = soa::Filtered>; // flagDsFilter applied + using CandDsMcReco = soa::Filtered>; // flagDsFilter applied + using CandDsMcGen = soa::Join; // flagDsFilter applied + using MyTracksData = soa::Filtered; // trackFilter applied + using TracksWithMc = soa::Filtered>; // trackFilter applied - Filter collisionFilter = aod::hf_selection_dmeson_collision::dmesonSel == true /*&& aod::hf_sel_collision::whyRejectColl == 0*/; + Filter collisionFilter = aod::hf_selection_dmeson_collision::dmesonSel == true && o2::aod::evsel::sel8 == true; Filter flagDsFilter = ((o2::aod::hf_track_index::hfflag & static_cast(1 << aod::hf_cand_3prong::DecayType::DsToKKPi)) != static_cast(0)) && (aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlagDs || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlagDs); Filter trackFilter = (nabs(aod::track::eta) < etaTrackMax) && (aod::track::pt > ptTrackMin) && (aod::track::pt < ptTrackMax) && (nabs(aod::track::dcaXY) < dcaXYTrackMax) && (nabs(aod::track::dcaZ) < dcaZTrackMax); @@ -222,9 +222,6 @@ struct HfCorrelatorDsHadrons { registry.add("hMultiplicity", "Multiplicity", {HistType::kTH1F, {axisMultiplicity}}); registry.add("hMultFT0M", "Multiplicity FT0M", {HistType::kTH1F, {axisMultFT0M}}); registry.add("hZVtx", "z vertex", {HistType::kTH1F, {axisPosZ}}); - registry.add("hPoolBinCollision", "Collisions in each pool Bin", {HistType::kTH1F, {axisPoolBin}}); - registry.add("hPoolBinDs", "Ds selected in pool Bin", {HistType::kTH1F, {axisPoolBin}}); - registry.add("hPoolBinPartAssoc", "Tracks selected in pool Bin", {HistType::kTH1F, {axisPoolBin}}); registry.add("hMassDsVsPt", "Ds candidates massVsPt", {HistType::kTH2F, {{axisMassD}, {axisPtD}}}); registry.add("hMassDsData", "Ds candidates mass", {HistType::kTH1F, {axisMassD}}); registry.add("hCollisionPoolBin", "Ds candidates collision pool bin", {HistType::kTH1F, {axisPoolBin}}); diff --git a/PWGHF/HFC/Tasks/CMakeLists.txt b/PWGHF/HFC/Tasks/CMakeLists.txt index 9bc18f22359..567a21d2129 100644 --- a/PWGHF/HFC/Tasks/CMakeLists.txt +++ b/PWGHF/HFC/Tasks/CMakeLists.txt @@ -24,11 +24,6 @@ o2physics_add_dpl_workflow(task-correlation-d-meson-pairs PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(task-correlation-d-meson-pairs-testing - SOURCES taskCorrelationDMesonPairsTesting.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(task-correlation-dplus-hadrons SOURCES taskCorrelationDplusHadrons.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGHF/HFC/Tasks/taskCorrelationDMesonPairs.cxx b/PWGHF/HFC/Tasks/taskCorrelationDMesonPairs.cxx index c6a319fecfc..799de44bc60 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDMesonPairs.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDMesonPairs.cxx @@ -12,7 +12,6 @@ /// \file taskCorrelationDMesonPairs.cxx /// \brief D-Dbar analysis task - data-like, MC-reco and MC-kine analyses for D0 and DPlus pairs. /// -/// \author Fabio Colamaria , INFN Bari /// \author Andrea Tavira García , IJCLab Orsay #include "Framework/AnalysisTask.h" @@ -28,171 +27,54 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -namespace o2::aod -{ -using D0PairFull = soa::Join; -using DplusPairFull = soa::Join; -} // namespace o2::aod - -/// -/// Returns deltaPhi value in range [-pi/2., 3.*pi/2], typically used for correlation studies -/// -double getDeltaPhi(double phiD, double phiDbar) -{ - return RecoDecay::constrainAngle(phiDbar - phiD, -o2::constants::math::PIHalf); -} - namespace { -enum CandidateTypeSel { +enum PairTypeSel { + DD = 0, // D0-D0 + DbarDbar, // D0bar-D0bar + DDbar, + DbarD +}; + +enum CandidateType { SelectedD = 0, // This particle is selected as a D SelectedDbar, // This particle is selected as a Dbar TrueD, // This particle is a true D TrueDbar // This particle is a true Dbar }; -enum DMesonType { +enum D0Type { Default = 0, // Default value Signal, // This particle is a signal D meson Reflected, // This particle is a reflected D meson Bkg // This particle is background of D meson }; - -enum PairTypeSel { - DD = 0, // Analyse D0-D0 or DPlus-DPlus correlations - DDbar, // Analyse D0-D0bar or DPlus-DMinus correlations - DbarDbar // Analyse D0bar-D0bar or DMinus-DMinus correlations -}; } // namespace -/// -/// Returns phi of candidate/particle evaluated from x and y components of segment connecting primary and secondary vertices -/// -double evaluatePhiByVertex(double xVertex1, double xVertex2, double yVertex1, double yVertex2) -{ - return RecoDecay::phi(xVertex2 - xVertex1, yVertex2 - yVertex1); -} - // string definitions, used for histogram axis labels -const TString stringPtD = "#it{p}_{T}^{D_{1}} (GeV/#it{c});"; -const TString stringPtDbar = "#it{p}_{T}^{D_{2}} (GeV/#it{c});"; -const TString stringDeltaPt = "#it{p}_{T}^{D_{2}}-#it{p}_{T}^{D_{1}} (GeV/#it{c});"; -const TString stringDeltaPtMaxMin = "#it{p}_{T}^{max}-#it{p}_{T}^{min} (GeV/#it{c});"; -const TString stringDeltaEta = "#it{#eta}^{D_{2}}-#it{#eta}^{D_{1}};"; -const TString stringDeltaY = "#it{y}^{D_{2}}-#it{y}^{D_{1}};"; -const TString stringDeltaPhi = "#it{#varphi}^{D_{2}}-#it{#varphi}^{D_{1}} (rad);"; -const TString stringDDbar = "D meson pair candidates "; -const TString stringSignal = "signal region;"; -const TString stringSideband = "sidebands;"; -const TString stringMCParticles = "MC gen - D meson pair particles;"; -const TString stringMCReco = "MC reco - D meson pair candidates "; -const TString stringMassD = "inv. mass D_{1} (GeV/#it{c}^{2});"; -const TString stringMassDbar = "inv. mass D_{2} (GeV/#it{c}^{2});"; +const char stringCorrelationPairs[193] = "D meson pair candidates 2D;inv. mass D_{1} (GeV/#it{c}^{2});inv. mass D_{2} (GeV/#it{c}^{2});#it{p}_{T}^{D_{1}} (GeV/#it{c});#it{p}_{T}^{D_{2}} (GeV/#it{c});#eta D_{1};#eta D_{2};type1;type2;"; +const char stringCorrelationPairsFinerBinning[207] = "D meson pair candidates 2D Finer Binning;inv. mass D_{1} (GeV/#it{c}^{2});inv. mass D_{2} (GeV/#it{c}^{2});#it{p}_{T}^{D_{1}} (GeV/#it{c});#it{p}_{T}^{D_{2}} (GeV/#it{c});#eta D_{1};#eta D_{2};type1;type2;"; // definition of vectors for standard ptbin and invariant mass configurables const int nPtBinsCorrelations = 8; const double ptBinsCorrelations[nPtBinsCorrelations + 1] = {0., 2., 4., 6., 8., 12., 16., 24., 99.}; auto vecPtBinsCorrelations = std::vector{ptBinsCorrelations, ptBinsCorrelations + nPtBinsCorrelations + 1}; -const double signalRegionInnerDefault[nPtBinsCorrelations] = {1.810, 1.810, 1.810, 1.810, 1.810, 1.810, 1.810, 1.810}; -const double signalRegionOuterDefault[nPtBinsCorrelations] = {1.922, 1.922, 1.922, 1.922, 1.922, 1.922, 1.922, 1.922}; -const double sidebandLeftInnerDefault[nPtBinsCorrelations] = {1.642, 1.642, 1.642, 1.642, 1.642, 1.642, 1.642, 1.642}; -const double sidebandLeftOuterDefault[nPtBinsCorrelations] = {1.754, 1.754, 1.754, 1.754, 1.754, 1.754, 1.754, 1.754}; -const double sidebandRightInnerDefault[nPtBinsCorrelations] = {1.978, 1.978, 1.978, 1.978, 1.978, 1.978, 1.978, 1.978}; -const double sidebandRightOuterDefault[nPtBinsCorrelations] = {2.090, 2.090, 2.090, 2.090, 2.090, 2.090, 2.090, 2.090}; -auto vecSignalRegionInner = std::vector{signalRegionInnerDefault, signalRegionInnerDefault + nPtBinsCorrelations}; -auto vecSignalRegionOuter = std::vector{signalRegionOuterDefault, signalRegionOuterDefault + nPtBinsCorrelations}; -auto vecSidebandLeftInner = std::vector{sidebandLeftInnerDefault, sidebandLeftInnerDefault + nPtBinsCorrelations}; -auto vecSidebandLeftOuter = std::vector{sidebandLeftOuterDefault, sidebandLeftOuterDefault + nPtBinsCorrelations}; -auto vecSidebandRightInner = std::vector{sidebandRightInnerDefault, sidebandRightInnerDefault + nPtBinsCorrelations}; -auto vecSidebandRightOuter = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + nPtBinsCorrelations}; struct HfTaskCorrelationDMesonPairs { // Enable histograms with finer pT and y binning Configurable enableFinerBinning{"enableFinerBinning", false, "Enable histograms with finer pT and y binning"}; - // pT ranges for correlation plots: the default values are those embedded in hf_cuts_d0_to_pi_k (i.e. the mass pT bins), but can be redefined via json files Configurable> binsPtCorrelations{"binsPtCorrelations", std::vector{vecPtBinsCorrelations}, "pT bin limits for correlation plots"}; - // signal and sideband region edges, to be defined via json file (initialised to empty) - Configurable> signalRegionInner{"signalRegionInner", std::vector{vecSignalRegionInner}, "Inner values of signal region vs pT"}; - Configurable> signalRegionOuter{"signalRegionOuter", std::vector{vecSignalRegionOuter}, "Outer values of signal region vs pT"}; - Configurable> sidebandLeftInner{"sidebandLeftInner", std::vector{vecSidebandLeftInner}, "Inner values of left sideband vs pT"}; - Configurable> sidebandLeftOuter{"sidebandLeftOuter", std::vector{vecSidebandLeftOuter}, "Outer values of left sideband vs pT"}; - Configurable> sidebandRightInner{"sidebandRightInner", std::vector{vecSidebandRightInner}, "Inner values of right sideband vs pT"}; - Configurable> sidebandRightOuter{"sidebandRightOuter", std::vector{vecSidebandRightOuter}, "Outer values of right sideband vs pT"}; - Configurable pairType{"pairType", 0, "Pair type: 0 = DD, 1=DDbar, 2 = DbarDbar"}; // HistoTypes - HistogramConfigSpec hTHnMass2DCorrPairs{HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}, {10, -1, 1}, {10, -1, 1}}}; // note: axes 3 and 4 (the pT) are updated in the init(); - HistogramConfigSpec hTHnCorrel2DVsPt{HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}; // note: axes 3 and 4 (the pT) are updated in the init() - HistogramConfigSpec hTH1Y{HistType::kTH1F, {{200, -10., 10.}}}; - HistogramConfigSpec hTH1DeltaPtDDbar{HistType::kTH1F, {{144, -36., 36.}}}; - HistogramConfigSpec hTH1DeltaPtMaxMin{HistType::kTH1F, {{72, 0., 36.}}}; - HistogramConfigSpec hTH1Phi{HistType::kTH1F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}}}; - HistogramConfigSpec hTH2CorrelPt{HistType::kTH2F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {200, -10., 10.}}}; - HistogramConfigSpec hTHnMass2DCorrPairsFinerBinning{HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {60, 1., 6.}, {60, 1., 6.}, {160, -0.8, 0.8}, {160, -0.8, 0.8}}}; + HistogramConfigSpec hTHnMass2DCorrPairs{HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}, {10, -1, 1}, {10, -1, 1}, {4, -0.5, 3.5}, {4, -0.5, 3.5}}}; // note: axes 3 and 4 (the pT) are updated in the init(); + HistogramConfigSpec hTHnMass2DCorrPairsFinerBinning{HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {60, 1., 6.}, {60, 1., 6.}, {160, -0.8, 0.8}, {160, -0.8, 0.8}, {4, -0.5, 3.5}, {4, -0.5, 3.5}}}; HistogramRegistry registry{ "registry", - // NOTE: use hMassD0 (from correlator task) for normalisation, and hMass2DCorrelationPairs for 2D-sideband-subtraction purposes - {{"hMass2DCorrelationPairs", stringDDbar + "2D;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hDeltaEtaPtIntSignalRegion", stringDDbar + stringSignal + stringDeltaEta + "entries", hTH1Y}, - {"hDeltaYPtIntSignalRegion", stringDDbar + stringSignal + stringDeltaY + "entries", hTH1Y}, - {"hDeltaPhiPtIntSignalRegion", stringDDbar + stringSignal + stringDeltaPhi + "entries", hTH1Phi}, - {"hCorrel2DPtIntSignalRegion", stringDDbar + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", hTH2CorrelPt}, - {"hCorrel2DVsPtSignalRegion", stringDDbar + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hDeltaPtDDbarSignalRegion", stringDDbar + stringSignal + stringDeltaPt + "entries", hTH1DeltaPtDDbar}, - {"hDeltaPtMaxMinSignalRegion", stringDDbar + stringSignal + stringDeltaPtMaxMin + "entries", hTH1DeltaPtMaxMin}, - {"hDeltaEtaPtIntSidebands", stringDDbar + stringSideband + stringDeltaEta + "entries", hTH1Y}, - {"hDeltaYPtIntSidebands", stringDDbar + stringSideband + stringDeltaY + "entries", hTH1Y}, - {"hDeltaPhiPtIntSidebands", stringDDbar + stringSideband + stringDeltaPhi + "entries", hTH1Phi}, - {"hCorrel2DPtIntSidebands", stringDDbar + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", hTH2CorrelPt}, - {"hCorrel2DVsPtSidebands", stringDDbar + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hDeltaPtDDbarSidebands", stringDDbar + stringSideband + stringDeltaPt + "entries", hTH1DeltaPtDDbar}, - {"hDeltaPtMaxMinSidebands", stringDDbar + stringSideband + stringDeltaPtMaxMin + "entries", hTH1DeltaPtMaxMin}, - {"hMass2DCorrelationPairsMCRecBkgBkg", stringDDbar + "2D BkgBkg - MC reco;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsMCRecBkgRef", stringDDbar + "2D BkgRef - MC reco;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsMCRecBkgSig", stringDDbar + "2D BkgSig - MC reco;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsMCRecRefBkg", stringDDbar + "2D RefBkg - MC reco;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsMCRecRefRef", stringDDbar + "2D RefRef - MC reco;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsMCRecRefSig", stringDDbar + "2D RefSig - MC reco;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsMCRecSigBkg", stringDDbar + "2D SigBkg - MC reco;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsMCRecSigRef", stringDDbar + "2D SigRef - MC reco;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsMCRecSigSig", stringDDbar + "2D SigSig - MC reco;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairs}, - {"hDeltaEtaPtIntSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaEta + "entries", hTH1Y}, - {"hDeltaPhiPtIntSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaPhi + "entries", hTH1Phi}, - {"hDeltaYPtIntSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaY + "entries", hTH1Y}, - {"hCorrel2DPtIntSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", hTH2CorrelPt}, - {"hDeltaPtDDbarSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaPt + "entries", hTH1DeltaPtDDbar}, - {"hDeltaPtMaxMinSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaPtMaxMin + "entries", hTH1DeltaPtMaxMin}, - {"hCorrel2DVsPtSignalRegionMCRecBkgBkg", stringMCReco + "BkgBkg" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSignalRegionMCRecBkgRef", stringMCReco + "BkgRef" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSignalRegionMCRecBkgSig", stringMCReco + "BkgSig" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSignalRegionMCRecRefBkg", stringMCReco + "RefBkg" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSignalRegionMCRecRefRef", stringMCReco + "RefRef" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSignalRegionMCRecRefSig", stringMCReco + "RefSig" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSignalRegionMCRecSigBkg", stringMCReco + "SigBkg" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSignalRegionMCRecSigRef", stringMCReco + "SigRef" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSignalRegionMCRecSigSig", stringMCReco + "SigSig" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hDeltaEtaPtIntSidebandsMCRec", stringMCReco + stringSideband + stringDeltaEta + "entries", hTH1Y}, - {"hDeltaPhiPtIntSidebandsMCRec", stringMCReco + stringSideband + stringDeltaPhi + "entries", hTH1Phi}, - {"hCorrel2DPtIntSidebandsMCRec", stringMCReco + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", hTH2CorrelPt}, - {"hDeltaPtDDbarSidebandsMCRec", stringMCReco + stringSideband + stringDeltaPt + "entries", hTH1DeltaPtDDbar}, - {"hDeltaPtMaxMinSidebandsMCRec", stringMCReco + stringSideband + stringDeltaPtMaxMin + "entries", hTH1DeltaPtMaxMin}, - {"hCorrel2DVsPtSidebandsMCRecBkgBkg", stringMCReco + "BkgBkg" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSidebandsMCRecBkgRef", stringMCReco + "BkgRef" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSidebandsMCRecBkgSig", stringMCReco + "BkgSig" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSidebandsMCRecRefBkg", stringMCReco + "RefBkg" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSidebandsMCRecRefRef", stringMCReco + "RefRef" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSidebandsMCRecRefSig", stringMCReco + "RefSig" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSidebandsMCRecSigBkg", stringMCReco + "SigBkg" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSidebandsMCRecSigRef", stringMCReco + "SigRef" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hCorrel2DVsPtSidebandsMCRecSigSig", stringMCReco + "SigSig" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hDeltaEtaPtIntMCGen", stringMCParticles + stringDeltaEta + "entries", hTH1Y}, - {"hDeltaYPtIntMCGen", stringMCParticles + stringDeltaY + "entries", hTH1Y}, - {"hDeltaPhiPtIntMCGen", stringMCParticles + stringDeltaPhi + "entries", hTH1Phi}, - {"hCorrel2DPtIntMCGen", stringMCParticles + stringDeltaPhi + stringDeltaEta + "entries", hTH2CorrelPt}, - {"hCorrel2DVsPtMCGen", stringMCParticles + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", hTHnCorrel2DVsPt}, - {"hDeltaPtDDbarMCGen", stringMCParticles + stringDeltaPt + "entries", hTH1DeltaPtDDbar}, - {"hDeltaPtMaxMinMCGen", stringMCParticles + stringDeltaPtMaxMin + "entries", hTH1DeltaPtMaxMin}}}; + {{"hMass2DCorrelationPairsLS", stringCorrelationPairs, hTHnMass2DCorrPairs}, + {"hMass2DCorrelationPairsOS", stringCorrelationPairs, hTHnMass2DCorrPairs}, + {"hMass2DCorrelationPairsLSMcGen", stringCorrelationPairs, hTHnMass2DCorrPairs}, + {"hMass2DCorrelationPairsOSMcGen", stringCorrelationPairs, hTHnMass2DCorrPairs}}}; void init(InitContext&) { @@ -201,486 +83,132 @@ struct HfTaskCorrelationDMesonPairs { const double* valuespTaxis = binsPtCorrelations->data(); if (enableFinerBinning) { - registry.add("hMass2DCorrelationPairsFinerBinning", stringDDbar + "2D Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.add("hMass2DCorrelationPairsMCRecBkgBkgFinerBinning", stringDDbar + "2D BkgBkg - MC reco Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.add("hMass2DCorrelationPairsMCRecBkgRefFinerBinning", stringDDbar + "2D BkgBkg - MC reco Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.add("hMass2DCorrelationPairsMCRecBkgSigFinerBinning", stringDDbar + "2D BkgBkg - MC reco Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.add("hMass2DCorrelationPairsMCRecRefBkgFinerBinning", stringDDbar + "2D BkgBkg - MC reco Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.add("hMass2DCorrelationPairsMCRecRefRefFinerBinning", stringDDbar + "2D BkgBkg - MC reco Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.add("hMass2DCorrelationPairsMCRecRefSigFinerBinning", stringDDbar + "2D BkgBkg - MC reco Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.add("hMass2DCorrelationPairsMCRecSigBkgFinerBinning", stringDDbar + "2D BkgBkg - MC reco Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.add("hMass2DCorrelationPairsMCRecSigRefFinerBinning", stringDDbar + "2D BkgBkg - MC reco Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.add("hMass2DCorrelationPairsMCRecSigSigFinerBinning", stringDDbar + "2D BkgBkg - MC reco Finer Binning;" + stringMassD + stringMassDbar + stringPtD + stringPtDbar + "entries", hTHnMass2DCorrPairsFinerBinning); - registry.get(HIST("hMass2DCorrelationPairsFinerBinning"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecBkgBkgFinerBinning"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecBkgRefFinerBinning"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecBkgSigFinerBinning"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecRefBkgFinerBinning"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecRefRefFinerBinning"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecRefSigFinerBinning"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecSigBkgFinerBinning"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecSigRefFinerBinning"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecSigSigFinerBinning"))->Sumw2(); + registry.add("hMass2DCorrelationPairsLSFinerBinning", stringCorrelationPairsFinerBinning, hTHnMass2DCorrPairsFinerBinning); + registry.get(HIST("hMass2DCorrelationPairsLSFinerBinning"))->Sumw2(); + registry.add("hMass2DCorrelationPairsOSFinerBinning", stringCorrelationPairsFinerBinning, hTHnMass2DCorrPairsFinerBinning); + registry.get(HIST("hMass2DCorrelationPairsOSFinerBinning"))->Sumw2(); + + registry.add("hMass2DCorrelationPairsLSMcGenFinerBinning", stringCorrelationPairsFinerBinning, hTHnMass2DCorrPairsFinerBinning); + registry.get(HIST("hMass2DCorrelationPairsLSMcGenFinerBinning"))->Sumw2(); + registry.add("hMass2DCorrelationPairsOSMcGenFinerBinning", stringCorrelationPairsFinerBinning, hTHnMass2DCorrPairsFinerBinning); + registry.get(HIST("hMass2DCorrelationPairsOSMcGenFinerBinning"))->Sumw2(); } for (int i = 2; i <= 3; i++) { - registry.get(HIST("hMass2DCorrelationPairs"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegion"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebands"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairs"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegion"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebands"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecBkgBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsMCRecBkgRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsMCRecBkgSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsMCRecRefBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsMCRecRefRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsMCRecRefSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsMCRecSigBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsMCRecSigRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsMCRecSigSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsMCRecBkgBkg"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecBkgRef"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecBkgSig"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecRefBkg"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecRefRef"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecRefSig"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecSigBkg"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecSigRef"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsMCRecSigSig"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgBkg"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgRef"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgSig"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefBkg"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefRef"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefSig"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigBkg"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigRef"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigSig"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgBkg"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgRef"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgSig"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefBkg"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefRef"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefSig"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigBkg"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigRef"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigSig"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtMCGen"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hCorrel2DVsPtMCGen"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsLS"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsLS"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsOS"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsOS"))->Sumw2(); + + registry.get(HIST("hMass2DCorrelationPairsLSMcGen"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsLSMcGen"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsOSMcGen"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsOSMcGen"))->Sumw2(); } } - /// - /// FUNCTIONS - /// - // Register whether our D meson candidate is Sig, Ref or Bkg - uint getDMesonType(uint const& candidateType) + uint getD0Type(uint const& candidateType) { - if (TESTBIT(candidateType, SelectedD) && TESTBIT(candidateType, TrueD) && !TESTBIT(candidateType, TrueDbar)) { // Signal + if ((TESTBIT(candidateType, SelectedD) && TESTBIT(candidateType, TrueD)) || (TESTBIT(candidateType, SelectedDbar) && TESTBIT(candidateType, TrueDbar))) { return Signal; - } else if (TESTBIT(candidateType, SelectedD) && TESTBIT(candidateType, TrueDbar)) { // Reflected + } else if ((TESTBIT(candidateType, SelectedD) && TESTBIT(candidateType, TrueDbar)) || (TESTBIT(candidateType, SelectedDbar) && TESTBIT(candidateType, TrueD))) { return Reflected; - } else if (TESTBIT(candidateType, SelectedD) && !(TESTBIT(candidateType, TrueD) && TESTBIT(candidateType, TrueDbar))) { // Background + } else if ((TESTBIT(candidateType, SelectedD) && !(TESTBIT(candidateType, TrueD) && TESTBIT(candidateType, TrueDbar))) || + (TESTBIT(candidateType, SelectedDbar) && !(TESTBIT(candidateType, TrueD) && TESTBIT(candidateType, TrueDbar)))) { return Bkg; - } - return Default; - } - - // Register whether our Dbar meson candidate is Sig, Ref or Bkg - uint getDMesonBarType(uint const& candidateType) - { - if (TESTBIT(candidateType, SelectedDbar) && TESTBIT(candidateType, TrueDbar) && !TESTBIT(candidateType, TrueD)) { // Signal - return Signal; - } else if (TESTBIT(candidateType, SelectedDbar) && TESTBIT(candidateType, TrueD)) { // Reflected - return Reflected; - } else if (TESTBIT(candidateType, SelectedDbar) && !(TESTBIT(candidateType, TrueD) && TESTBIT(candidateType, TrueDbar))) { // Background - return Bkg; - } - return Default; - } - - // Fill Mass correlation histograms - void fillMassCorrHists(std::shared_ptr hMassCorrArray[3][3], uint const& candLabel1, uint const& candLabel2, double const& massCand1, double const& massCand2, double const& ptCand1, double const& ptCand2, double const& yCand1, double const& yCand2) - { - if (candLabel1 != 0 && candLabel2 != 0) { - hMassCorrArray[candLabel1 - 1][candLabel2 - 1]->Fill(massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - } - } - - // Fill angular correlation histograms - void fillAngularCorrelHists(std::shared_ptr hCorrelArray[3][3], uint const& candLabel1, uint const& candLabel2, double const& deltaPhi, double const& deltaEta, double const& ptCand1, double const& ptCand2) - { - if (candLabel1 != 0 && candLabel2 != 0) { - hCorrelArray[candLabel1 - 1][candLabel2 - 1]->Fill(deltaPhi, deltaEta, ptCand1, ptCand2); - } - } - - // Fill kinematic pair info histograms in signal region - void fillKinematicSignalHists(int const& dataType, double const& yCand1, double const& yCand2, double const& deltaPhi, double const& deltaEta, double const& ptCand1, double const& ptCand2) - { - if (dataType == 0) { // Data - registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, ptCand1, ptCand2); - registry.fill(HIST("hCorrel2DPtIntSignalRegion"), deltaPhi, deltaEta); - registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta); - registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi); - registry.fill(HIST("hDeltaYPtIntSignalRegion"), yCand2 - yCand1); - registry.fill(HIST("hDeltaPtDDbarSignalRegion"), ptCand2 - ptCand1); - registry.fill(HIST("hDeltaPtMaxMinSignalRegion"), std::abs(ptCand2 - ptCand1)); - } else if (dataType == 1) { // MC Reco - registry.fill(HIST("hCorrel2DPtIntSignalRegionMCRec"), deltaPhi, deltaEta); - registry.fill(HIST("hDeltaEtaPtIntSignalRegionMCRec"), deltaEta); - registry.fill(HIST("hDeltaPhiPtIntSignalRegionMCRec"), deltaPhi); - registry.fill(HIST("hDeltaYPtIntSignalRegionMCRec"), yCand2 - yCand1); - registry.fill(HIST("hDeltaPtDDbarSignalRegionMCRec"), ptCand2 - ptCand1); - registry.fill(HIST("hDeltaPtMaxMinSignalRegionMCRec"), std::abs(ptCand2 - ptCand1)); - } else { // MC gen - registry.fill(HIST("hCorrel2DVsPtMCGen"), deltaPhi, deltaEta, ptCand1, ptCand2); - registry.fill(HIST("hCorrel2DPtIntMCGen"), deltaPhi, deltaEta); - registry.fill(HIST("hDeltaEtaPtIntMCGen"), deltaEta); - registry.fill(HIST("hDeltaPhiPtIntMCGen"), deltaPhi); - registry.fill(HIST("hDeltaYPtIntMCGen"), yCand2 - yCand1); - registry.fill(HIST("hDeltaPtDDbarMCGen"), ptCand2 - ptCand1); - registry.fill(HIST("hDeltaPtMaxMinMCGen"), std::abs(ptCand2 - ptCand2)); - } - } - - // Fill kinematic pair info histograms in sideband region - void fillKinematicSidebandHists(int const& dataType, double const& yCand1, double const& yCand2, double const& deltaPhi, double const& deltaEta, double const& ptCand1, double const& ptCand2) - { - if (dataType == 0) { // Data - registry.fill(HIST("hCorrel2DVsPtSidebands"), deltaPhi, deltaEta, ptCand1, ptCand2); - registry.fill(HIST("hCorrel2DPtIntSidebands"), deltaPhi, deltaEta); - registry.fill(HIST("hDeltaEtaPtIntSidebands"), deltaEta); - registry.fill(HIST("hDeltaPhiPtIntSidebands"), deltaPhi); - registry.fill(HIST("hDeltaPtDDbarSidebands"), ptCand2 - ptCand1); - registry.fill(HIST("hDeltaYPtIntSidebands"), yCand2 - yCand1); - registry.fill(HIST("hDeltaPtMaxMinSidebands"), std::abs(ptCand2 - ptCand1)); - } else { // MC Reco - registry.fill(HIST("hCorrel2DPtIntSidebandsMCRec"), deltaPhi, deltaEta); - registry.fill(HIST("hDeltaEtaPtIntSidebandsMCRec"), deltaEta); - registry.fill(HIST("hDeltaPhiPtIntSidebandsMCRec"), deltaPhi); - registry.fill(HIST("hDeltaPtDDbarSidebandsMCRec"), ptCand2 - ptCand1); - registry.fill(HIST("hDeltaPtMaxMinSidebandsMCRec"), std::abs(ptCand2 - ptCand1)); + } else { + return Default; } } - // Common code to analyse correlations at data level - template - void analyseData(const T& pairEntries) + void processData(aod::D0Pair const& pairEntries) { for (const auto& pairEntry : pairEntries) { - if (pairEntry.dataType() != 0) { - continue; - } // define variables for widely used quantities - double deltaPhi = pairEntry.deltaPhi(); - double deltaEta = pairEntry.deltaEta(); - double ptCand1 = pairEntry.ptCand1(); - double ptCand2 = pairEntry.ptCand2(); - double massCand1 = pairEntry.mCand1(); - double massCand2 = pairEntry.mCand2(); - double yCand1 = pairEntry.yCand1(); - double yCand2 = pairEntry.yCand2(); - - int ptBinCand1 = o2::analysis::findBin(binsPtCorrelations, ptCand1); - int ptBinCand2 = o2::analysis::findBin(binsPtCorrelations, ptCand2); - - // fill 2D invariant mass plots - if (pairType == DD && (TESTBIT(pairEntry.candidateType1(), SelectedD) && TESTBIT(pairEntry.candidateType2(), SelectedD))) { - registry.fill(HIST("hMass2DCorrelationPairs"), massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); + float ptCand1 = pairEntry.ptCand1(); + float ptCand2 = pairEntry.ptCand2(); + float massDCand1 = pairEntry.mDCand1(); + float massDbarCand1 = pairEntry.mDbarCand1(); + float massDCand2 = pairEntry.mDCand2(); + float massDbarCand2 = pairEntry.mDbarCand2(); + float yCand1 = pairEntry.yCand1(); + float yCand2 = pairEntry.yCand2(); + auto pairType = pairEntry.pairType(); + auto d0Type1 = getD0Type(pairEntry.candidateType1()); + auto d0Type2 = getD0Type(pairEntry.candidateType2()); + + if (TESTBIT(pairType, DD)) { + registry.fill(HIST("hMass2DCorrelationPairsLS"), massDCand1, massDCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsFinerBinning"), massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); + registry.fill(HIST("hMass2DCorrelationPairsLSFinerBinning"), massDCand1, massDCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); } - } else if (pairType == DDbar && ((TESTBIT(pairEntry.candidateType1(), SelectedD) && TESTBIT(pairEntry.candidateType2(), SelectedDbar)) || (TESTBIT(pairEntry.candidateType1(), SelectedDbar) && TESTBIT(pairEntry.candidateType2(), SelectedD)))) { - registry.fill(HIST("hMass2DCorrelationPairs"), massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsFinerBinning"), massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - } - } else if (pairType == DbarDbar && (TESTBIT(pairEntry.candidateType1(), SelectedDbar) && TESTBIT(pairEntry.candidateType2(), SelectedDbar))) { - registry.fill(HIST("hMass2DCorrelationPairs"), massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); + } + if (TESTBIT(pairType, DbarDbar)) { + registry.fill(HIST("hMass2DCorrelationPairsLS"), massDbarCand1, massDbarCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsFinerBinning"), massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); + registry.fill(HIST("hMass2DCorrelationPairsLSFinerBinning"), massDbarCand1, massDbarCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); } } - // reject entries outside pT ranges of interest - if (ptBinCand1 == -1 || ptBinCand2 == -1) { // at least one particle outside accepted pT range - continue; - } - - // check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots - if (massCand1 > signalRegionInner->at(ptBinCand1) && massCand1 < signalRegionOuter->at(ptBinCand1) && massCand2 > signalRegionInner->at(ptBinCand2) && massCand2 < signalRegionOuter->at(ptBinCand2)) { - // in signal region - if (pairType == DD && (TESTBIT(pairEntry.candidateType1(), SelectedD) && TESTBIT(pairEntry.candidateType2(), SelectedD))) { - fillKinematicSignalHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DDbar && ((TESTBIT(pairEntry.candidateType1(), SelectedD) && TESTBIT(pairEntry.candidateType2(), SelectedDbar)) || (TESTBIT(pairEntry.candidateType1(), SelectedDbar) && TESTBIT(pairEntry.candidateType2(), SelectedD)))) { - fillKinematicSignalHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DbarDbar && (TESTBIT(pairEntry.candidateType1(), SelectedDbar) && TESTBIT(pairEntry.candidateType2(), SelectedDbar))) { - fillKinematicSignalHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); + if (TESTBIT(pairType, DDbar)) { + registry.fill(HIST("hMass2DCorrelationPairsOS"), massDCand1, massDbarCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); + if (enableFinerBinning) { + registry.fill(HIST("hMass2DCorrelationPairsOSFinerBinning"), massDCand1, massDbarCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); } } - - bool leftSidebandCand1 = massCand1 > sidebandLeftInner->at(ptBinCand1) && massCand1 < sidebandLeftOuter->at(ptBinCand1); - bool rightSidebandCand1 = massCand1 > sidebandRightInner->at(ptBinCand1) && massCand1 < sidebandRightOuter->at(ptBinCand1); - bool leftSidebandCand2 = massCand2 > sidebandLeftInner->at(ptBinCand2) && massCand2 < sidebandLeftOuter->at(ptBinCand2); - bool rightSidebandCand2 = massCand2 > sidebandRightInner->at(ptBinCand2) && massCand2 < sidebandRightOuter->at(ptBinCand2); - - if ((leftSidebandCand1 || rightSidebandCand1) && (leftSidebandCand2 || rightSidebandCand2)) { - // in sideband region - if (pairType == DD && (TESTBIT(pairEntry.candidateType1(), SelectedD) && TESTBIT(pairEntry.candidateType2(), SelectedD))) { - fillKinematicSidebandHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DDbar && ((TESTBIT(pairEntry.candidateType1(), SelectedD) && TESTBIT(pairEntry.candidateType2(), SelectedDbar)) || (TESTBIT(pairEntry.candidateType1(), SelectedDbar) && TESTBIT(pairEntry.candidateType2(), SelectedD)))) { - fillKinematicSidebandHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DbarDbar && (TESTBIT(pairEntry.candidateType1(), SelectedDbar) && TESTBIT(pairEntry.candidateType2(), SelectedDbar))) { - fillKinematicSidebandHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); + if (TESTBIT(pairType, DbarD)) { + registry.fill(HIST("hMass2DCorrelationPairsOS"), massDbarCand1, massDCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); + if (enableFinerBinning) { + registry.fill(HIST("hMass2DCorrelationPairsOSFinerBinning"), massDbarCand1, massDCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); } } } } + PROCESS_SWITCH(HfTaskCorrelationDMesonPairs, processData, "Process data mode", true); - // Common code to analyse correlations at Mc reco level - template - void analyseMcRec(const T& pairEntries) + void processMcGen(aod::D0PairMcGen const& pairEntries) { - // Array definitions to later be used to fill histograms - std::shared_ptr hMassCorrArray[3][3] = {{registry.get(HIST("hMass2DCorrelationPairsMCRecSigSig")), registry.get(HIST("hMass2DCorrelationPairsMCRecSigRef")), registry.get(HIST("hMass2DCorrelationPairsMCRecSigBkg"))}, - {registry.get(HIST("hMass2DCorrelationPairsMCRecRefSig")), registry.get(HIST("hMass2DCorrelationPairsMCRecRefRef")), registry.get(HIST("hMass2DCorrelationPairsMCRecRefBkg"))}, - {registry.get(HIST("hMass2DCorrelationPairsMCRecBkgSig")), registry.get(HIST("hMass2DCorrelationPairsMCRecBkgRef")), registry.get(HIST("hMass2DCorrelationPairsMCRecBkgBkg"))}}; - - std::shared_ptr hCorrelSignalArray[3][3] = {{registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigSig")), registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigRef")), registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigBkg"))}, - {registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefSig")), registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefRef")), registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefBkg"))}, - {registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgSig")), registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgRef")), registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgBkg"))}}; - - std::shared_ptr hCorrelSidebandsArray[3][3] = {{registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigSig")), registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigRef")), registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigBkg"))}, - {registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefSig")), registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefRef")), registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefBkg"))}, - {registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgSig")), registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgRef")), registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgBkg"))}}; - - std::shared_ptr hMassCorrArrayFinerBinning[3][3] = {{registry.get(HIST("hMass2DCorrelationPairsMCRecSigSigFinerBinning")), registry.get(HIST("hMass2DCorrelationPairsMCRecSigRefFinerBinning")), registry.get(HIST("hMass2DCorrelationPairsMCRecSigBkgFinerBinning"))}, - {registry.get(HIST("hMass2DCorrelationPairsMCRecRefSigFinerBinning")), registry.get(HIST("hMass2DCorrelationPairsMCRecRefRefFinerBinning")), registry.get(HIST("hMass2DCorrelationPairsMCRecRefBkgFinerBinning"))}, - {registry.get(HIST("hMass2DCorrelationPairsMCRecBkgSigFinerBinning")), registry.get(HIST("hMass2DCorrelationPairsMCRecBkgRefFinerBinning")), registry.get(HIST("hMass2DCorrelationPairsMCRecBkgBkgFinerBinning"))}}; - for (const auto& pairEntry : pairEntries) { - if (pairEntry.dataType() != 1) { // Assure that we only analyse Mc reco elements - continue; - } // define variables for widely used quantities - double deltaPhi = pairEntry.deltaPhi(); - double deltaEta = pairEntry.deltaEta(); - double ptCand1 = pairEntry.ptCand1(); - double ptCand2 = pairEntry.ptCand2(); - double massCand1 = pairEntry.mCand1(); - double massCand2 = pairEntry.mCand2(); - double yCand1 = pairEntry.yCand1(); - double yCand2 = pairEntry.yCand2(); - - int ptBinCand1 = o2::analysis::findBin(binsPtCorrelations, ptCand1); - int ptBinCand2 = o2::analysis::findBin(binsPtCorrelations, ptCand2); - - uint dMesonCand1 = 0, dMesonCand2 = 0; - uint dMesonBarCand1 = 0, dMesonBarCand2 = 0; - // 0: default; 1: Signal; 2: Reflected; 3: Background - dMesonCand1 = getDMesonType(pairEntry.candidateType1()); - dMesonBarCand1 = getDMesonBarType(pairEntry.candidateType1()); - dMesonCand2 = getDMesonType(pairEntry.candidateType2()); - dMesonBarCand2 = getDMesonBarType(pairEntry.candidateType2()); - - // fill 2D invariant mass plots - switch (pairType) { - case DD: // D0 D0 - fillMassCorrHists(hMassCorrArray, dMesonCand1, dMesonCand2, massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - if (enableFinerBinning) { - fillMassCorrHists(hMassCorrArrayFinerBinning, dMesonCand1, dMesonCand2, massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - } - break; - case DDbar: // D0 D0bar - fillMassCorrHists(hMassCorrArray, dMesonCand1, dMesonBarCand2, massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - fillMassCorrHists(hMassCorrArray, dMesonBarCand1, dMesonCand2, massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - if (enableFinerBinning) { - fillMassCorrHists(hMassCorrArrayFinerBinning, dMesonCand1, dMesonBarCand2, massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - fillMassCorrHists(hMassCorrArrayFinerBinning, dMesonBarCand1, dMesonCand2, massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - } - break; - case DbarDbar: // D0bar D0bar - fillMassCorrHists(hMassCorrArray, dMesonBarCand1, dMesonBarCand2, massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - if (enableFinerBinning) { - fillMassCorrHists(hMassCorrArrayFinerBinning, dMesonBarCand1, dMesonBarCand2, massCand1, massCand2, ptCand1, ptCand2, yCand1, yCand2); - } - break; - } - - // reject entries outside pT ranges of interest - if (ptBinCand1 == -1 || ptBinCand2 == -1) { // at least one particle outside accepted pT range - continue; - } - - // check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots - if (massCand1 > signalRegionInner->at(ptBinCand1) && massCand1 < signalRegionOuter->at(ptBinCand1) && massCand2 > signalRegionInner->at(ptBinCand2) && massCand2 < signalRegionOuter->at(ptBinCand2)) { - // in signal region - // Fill histograms depending on the type of pair we are analysing - if (pairType == DD && (dMesonCand1 != 0 && dMesonCand2 != 0)) { - fillKinematicSignalHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DDbar && ((dMesonCand1 != 0 && dMesonBarCand2 != 0) || (dMesonBarCand1 != 0 && dMesonCand2 != 0))) { - fillKinematicSignalHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DbarDbar && (dMesonBarCand1 != 0 && dMesonBarCand2 != 0)) { - fillKinematicSignalHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } - - // fill 2D angular correlations plots - switch (pairType) { - case DD: // D0 D0 - fillAngularCorrelHists(hCorrelSignalArray, dMesonCand1, dMesonCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - break; - case DDbar: // D0 D0bar - fillAngularCorrelHists(hCorrelSignalArray, dMesonCand1, dMesonBarCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - fillAngularCorrelHists(hCorrelSignalArray, dMesonBarCand1, dMesonCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - break; - case DbarDbar: // D0bar D0bar - fillAngularCorrelHists(hCorrelSignalArray, dMesonBarCand1, dMesonBarCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - break; + double ptParticle1 = pairEntry.ptCand1(); + double ptParticle2 = pairEntry.ptCand2(); + float massDParticle1 = pairEntry.mDCand1(); + float massDbarParticle1 = pairEntry.mDbarCand1(); + float massDParticle2 = pairEntry.mDCand2(); + float massDbarParticle2 = pairEntry.mDbarCand2(); + float yParticle1 = pairEntry.yCand1(); + float yParticle2 = pairEntry.yCand2(); + auto pairType = pairEntry.pairType(); + auto d0Type1 = getD0Type(pairEntry.candidateType1()); + auto d0Type2 = getD0Type(pairEntry.candidateType2()); + + if (TESTBIT(pairType, DD)) { + registry.fill(HIST("hMass2DCorrelationPairsLSMcGen"), massDParticle1, massDParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); + if (enableFinerBinning) { + registry.fill(HIST("hMass2DCorrelationPairsLSMcGenFinerBinning"), massDParticle1, massDParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); } } - - bool leftSidebandCand1 = massCand1 > sidebandLeftInner->at(ptBinCand1) && massCand1 < sidebandLeftOuter->at(ptBinCand1); - bool rightSidebandCand1 = massCand1 > sidebandRightInner->at(ptBinCand1) && massCand1 < sidebandRightOuter->at(ptBinCand1); - bool leftSidebandCand2 = massCand2 > sidebandLeftInner->at(ptBinCand2) && massCand2 < sidebandLeftOuter->at(ptBinCand2); - bool rightSidebandCand2 = massCand2 > sidebandRightInner->at(ptBinCand2) && massCand2 < sidebandRightOuter->at(ptBinCand2); - - if ((leftSidebandCand1 || rightSidebandCand1) && (leftSidebandCand2 || rightSidebandCand2)) { - // in sideband region - // Fill histograms depending on the type of pair we are analysing - if (pairType == DD && (dMesonCand1 != 0 && dMesonCand2 != 0)) { - fillKinematicSidebandHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DDbar && ((dMesonCand1 != 0 && dMesonBarCand2 != 0) || (dMesonBarCand1 != 0 && dMesonCand2 != 0))) { - fillKinematicSidebandHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DbarDbar && (dMesonBarCand1 != 0 && dMesonBarCand2 != 0)) { - fillKinematicSidebandHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } - - // fill 2D angular correlations plots - switch (pairType) { - case DD: // D0 D0 - fillAngularCorrelHists(hCorrelSidebandsArray, dMesonCand1, dMesonCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - break; - case DDbar: // D0 D0bar - fillAngularCorrelHists(hCorrelSidebandsArray, dMesonCand1, dMesonBarCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - fillAngularCorrelHists(hCorrelSidebandsArray, dMesonBarCand1, dMesonCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - break; - case DbarDbar: // D0bar D0bar - fillAngularCorrelHists(hCorrelSidebandsArray, dMesonBarCand1, dMesonBarCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - break; + if (TESTBIT(pairType, DbarDbar)) { + registry.fill(HIST("hMass2DCorrelationPairsLSMcGen"), massDbarParticle1, massDbarParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); + if (enableFinerBinning) { + registry.fill(HIST("hMass2DCorrelationPairsLSMcGenFinerBinning"), massDbarParticle1, massDbarParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); } } - } // end loop - } - - // Common code to analyse correlations at Mc gen level - template - void analyseMcGen(const T& pairEntries) - { - for (const auto& pairEntry : pairEntries) { - if (pairEntry.dataType() != 2) { // Assure that we only have Mc gen elements - continue; - } - // define variables for widely used quantities - double deltaPhi = pairEntry.deltaPhi(); - double deltaEta = pairEntry.deltaEta(); - double ptCand1 = pairEntry.ptCand1(); - double ptCand2 = pairEntry.ptCand2(); - double yCand1 = pairEntry.yCand1(); - double yCand2 = pairEntry.yCand2(); - - uint dMesonCand1 = 0, dMesonCand2 = 0; - uint dMesonBarCand1 = 0, dMesonBarCand2 = 0; - // 0: default; 1: Signal; 2: Reflected; 3: Background - dMesonCand1 = getDMesonType(pairEntry.candidateType1()); - dMesonBarCand1 = getDMesonBarType(pairEntry.candidateType1()); - dMesonCand2 = getDMesonType(pairEntry.candidateType2()); - dMesonBarCand2 = getDMesonBarType(pairEntry.candidateType2()); - - // reject entries outside pT ranges of interest - if (o2::analysis::findBin(binsPtCorrelations, ptCand1) == -1 || o2::analysis::findBin(binsPtCorrelations, ptCand2) == -1) { - continue; + if (TESTBIT(pairType, DDbar)) { + registry.fill(HIST("hMass2DCorrelationPairsOSMcGen"), massDParticle1, massDbarParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); + if (enableFinerBinning) { + registry.fill(HIST("hMass2DCorrelationPairsOSMcGenFinerBinning"), massDParticle1, massDbarParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); + } } - - // Fill histograms depending on the type of pair we are analysing - if (pairType == DD && (dMesonCand1 != 0 && dMesonCand2 != 0)) { - fillKinematicSignalHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DDbar && ((dMesonCand1 != 0 && dMesonBarCand2 != 0) || (dMesonBarCand1 != 0 && dMesonCand2 != 0))) { - fillKinematicSignalHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); - } else if (pairType == DbarDbar && (dMesonBarCand1 != 0 && dMesonBarCand2 != 0)) { - fillKinematicSignalHists(pairEntry.dataType(), yCand1, yCand2, deltaPhi, deltaEta, ptCand1, ptCand2); + if (TESTBIT(pairType, DbarD)) { + registry.fill(HIST("hMass2DCorrelationPairsOSMcGen"), massDbarParticle1, massDParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); + if (enableFinerBinning) { + registry.fill(HIST("hMass2DCorrelationPairsOSMcGenFinerBinning"), massDbarParticle1, massDParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); + } } } - } // end loop - - /// - /// PROCESS FUNCTIONS - /// - /// D0-D0bar correlation pair filling task, from pair tables - for data-level analysis (no filter/selection, only true signal) - void processDataD0(aod::D0Pair const& pairEntries) - { - analyseData(pairEntries); - } - PROCESS_SWITCH(HfTaskCorrelationDMesonPairs, processDataD0, "Process data D0", true); - - /// DPlus-DMinus correlation pair filling task, from pair tables - for data-level analysis (no filter/selection, only true signal) - void processDataDPlus(aod::DplusPair const& pairEntries) - { - analyseData(pairEntries); - } - - PROCESS_SWITCH(HfTaskCorrelationDMesonPairs, processDataDPlus, "Process data Dplus", false); - - /// D0-D0bar correlation pair filling task, from pair tables - for MC reco-level analysis (candidates matched to true signal only, but also bkg sources are studied) - void processMcRecD0(aod::D0PairFull const& pairEntries) - { - analyseMcRec(pairEntries); } - - PROCESS_SWITCH(HfTaskCorrelationDMesonPairs, processMcRecD0, "Process MC D0 Rec mode", false); - - /// DPlus-DMinus correlation pair filling task, from pair tables - for MC reco-level analysis (no filter/selection, only true signal) - void processMcRecDPlus(aod::DplusPairFull const& pairEntries) - { - analyseMcRec(pairEntries); - } - - PROCESS_SWITCH(HfTaskCorrelationDMesonPairs, processMcRecDPlus, "Process MC Dplus Reco mode", false); - - /// D0-D0bar correlation pair filling task, from pair tables - for MC gen-level analysis (no filter/selection, only true signal) - void processMcGenD0(aod::D0PairFull const& pairEntries) - { - analyseMcGen(pairEntries); - } - - PROCESS_SWITCH(HfTaskCorrelationDMesonPairs, processMcGenD0, "Process MC D0 Gen mode", false); - - /// DPlus-DMinus correlation pair filling task, from pair tables - for MC gen-level analysis (no filter/selection, only true signal) - void processMcGenDPlus(aod::DplusPairFull const& pairEntries) - { - analyseMcGen(pairEntries); - } - - PROCESS_SWITCH(HfTaskCorrelationDMesonPairs, processMcGenDPlus, "Process MC DPlus Gen mode", false); + PROCESS_SWITCH(HfTaskCorrelationDMesonPairs, processMcGen, "Process MC Gen mode", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGHF/HFC/Tasks/taskCorrelationDMesonPairsTesting.cxx b/PWGHF/HFC/Tasks/taskCorrelationDMesonPairsTesting.cxx deleted file mode 100644 index 562b724949c..00000000000 --- a/PWGHF/HFC/Tasks/taskCorrelationDMesonPairsTesting.cxx +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -/// \file taskCorrelationDMesonPairs.cxx -/// \brief D-Dbar analysis task - data-like, MC-reco and MC-kine analyses for D0 and DPlus pairs. -/// \note Temporary code for tests of D0-D0 correlations -/// -/// \author Andrea Tavira García , IJCLab Orsay - -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" - -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" -#include "PWGHF/Utils/utilsAnalysis.h" -#include "PWGHF/HFC/DataModel/DMesonPairsTablesTesting.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -namespace -{ -enum PairTypeSel { - DD = 0, // D0-D0 - DbarDbar, // D0bar-D0bar - DDbar, - DbarD -}; - -enum CandidateType { - SelectedD = 0, // This particle is selected as a D - SelectedDbar, // This particle is selected as a Dbar - TrueD, // This particle is a true D - TrueDbar // This particle is a true Dbar -}; - -enum D0Type { - Default = 0, // Default value - Signal, // This particle is a signal D meson - Reflected, // This particle is a reflected D meson - Bkg // This particle is background of D meson -}; -} // namespace - -// string definitions, used for histogram axis labels -const char stringCorrelationPairs[193] = "D meson pair candidates 2D;inv. mass D_{1} (GeV/#it{c}^{2});inv. mass D_{2} (GeV/#it{c}^{2});#it{p}_{T}^{D_{1}} (GeV/#it{c});#it{p}_{T}^{D_{2}} (GeV/#it{c});#eta D_{1};#eta D_{2};type1;type2;"; -const char stringCorrelationPairsFinerBinning[207] = "D meson pair candidates 2D Finer Binning;inv. mass D_{1} (GeV/#it{c}^{2});inv. mass D_{2} (GeV/#it{c}^{2});#it{p}_{T}^{D_{1}} (GeV/#it{c});#it{p}_{T}^{D_{2}} (GeV/#it{c});#eta D_{1};#eta D_{2};type1;type2;"; - -// definition of vectors for standard ptbin and invariant mass configurables -const int nPtBinsCorrelations = 8; -const double ptBinsCorrelations[nPtBinsCorrelations + 1] = {0., 2., 4., 6., 8., 12., 16., 24., 99.}; -auto vecPtBinsCorrelations = std::vector{ptBinsCorrelations, ptBinsCorrelations + nPtBinsCorrelations + 1}; - -struct HfTaskCorrelationDMesonPairsTesting { - // Enable histograms with finer pT and y binning - Configurable enableFinerBinning{"enableFinerBinning", false, "Enable histograms with finer pT and y binning"}; - Configurable> binsPtCorrelations{"binsPtCorrelations", std::vector{vecPtBinsCorrelations}, "pT bin limits for correlation plots"}; - - // HistoTypes - HistogramConfigSpec hTHnMass2DCorrPairs{HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}, {10, -1, 1}, {10, -1, 1}, {4, -0.5, 3.5}, {4, -0.5, 3.5}}}; // note: axes 3 and 4 (the pT) are updated in the init(); - HistogramConfigSpec hTHnMass2DCorrPairsFinerBinning{HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {60, 1., 6.}, {60, 1., 6.}, {160, -0.8, 0.8}, {160, -0.8, 0.8}, {4, -0.5, 3.5}, {4, -0.5, 3.5}}}; - - HistogramRegistry registry{ - "registry", - {{"hMass2DCorrelationPairsLS", stringCorrelationPairs, hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsOS", stringCorrelationPairs, hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsLSMcGen", stringCorrelationPairs, hTHnMass2DCorrPairs}, - {"hMass2DCorrelationPairsOSMcGen", stringCorrelationPairs, hTHnMass2DCorrPairs}}}; - - void init(InitContext&) - { - // redefinition of pT axes for THnSparse holding correlation entries - int nBinspTaxis = binsPtCorrelations->size() - 1; - const double* valuespTaxis = binsPtCorrelations->data(); - - if (enableFinerBinning) { - registry.add("hMass2DCorrelationPairsLSFinerBinning", stringCorrelationPairsFinerBinning, hTHnMass2DCorrPairsFinerBinning); - registry.get(HIST("hMass2DCorrelationPairsLSFinerBinning"))->Sumw2(); - registry.add("hMass2DCorrelationPairsOSFinerBinning", stringCorrelationPairsFinerBinning, hTHnMass2DCorrPairsFinerBinning); - registry.get(HIST("hMass2DCorrelationPairsOSFinerBinning"))->Sumw2(); - - registry.add("hMass2DCorrelationPairsLSMcGenFinerBinning", stringCorrelationPairsFinerBinning, hTHnMass2DCorrPairsFinerBinning); - registry.get(HIST("hMass2DCorrelationPairsLSMcGenFinerBinning"))->Sumw2(); - registry.add("hMass2DCorrelationPairsOSMcGenFinerBinning", stringCorrelationPairsFinerBinning, hTHnMass2DCorrPairsFinerBinning); - registry.get(HIST("hMass2DCorrelationPairsOSMcGenFinerBinning"))->Sumw2(); - } - - for (int i = 2; i <= 3; i++) { - registry.get(HIST("hMass2DCorrelationPairsLS"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsLS"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsOS"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsOS"))->Sumw2(); - - registry.get(HIST("hMass2DCorrelationPairsLSMcGen"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsLSMcGen"))->Sumw2(); - registry.get(HIST("hMass2DCorrelationPairsOSMcGen"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); - registry.get(HIST("hMass2DCorrelationPairsOSMcGen"))->Sumw2(); - } - } - - uint getD0Type(uint const& candidateType) - { - if ((TESTBIT(candidateType, SelectedD) && TESTBIT(candidateType, TrueD)) || (TESTBIT(candidateType, SelectedDbar) && TESTBIT(candidateType, TrueDbar))) { - return Signal; - } else if ((TESTBIT(candidateType, SelectedD) && TESTBIT(candidateType, TrueDbar)) || (TESTBIT(candidateType, SelectedDbar) && TESTBIT(candidateType, TrueD))) { - return Reflected; - } else if ((TESTBIT(candidateType, SelectedD) && !(TESTBIT(candidateType, TrueD) && TESTBIT(candidateType, TrueDbar))) || - (TESTBIT(candidateType, SelectedDbar) && !(TESTBIT(candidateType, TrueD) && TESTBIT(candidateType, TrueDbar)))) { - return Bkg; - } else { - return Default; - } - } - - void processData(aod::D0PairTesting const& pairEntries) - { - for (const auto& pairEntry : pairEntries) { - // define variables for widely used quantities - float ptCand1 = pairEntry.ptCand1(); - float ptCand2 = pairEntry.ptCand2(); - float massDCand1 = pairEntry.mDCand1(); - float massDbarCand1 = pairEntry.mDbarCand1(); - float massDCand2 = pairEntry.mDCand2(); - float massDbarCand2 = pairEntry.mDbarCand2(); - float yCand1 = pairEntry.yCand1(); - float yCand2 = pairEntry.yCand2(); - auto pairType = pairEntry.pairType(); - auto d0Type1 = getD0Type(pairEntry.candidateType1()); - auto d0Type2 = getD0Type(pairEntry.candidateType2()); - - if (TESTBIT(pairType, DD)) { - registry.fill(HIST("hMass2DCorrelationPairsLS"), massDCand1, massDCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); - if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsLSFinerBinning"), massDCand1, massDCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); - } - } - if (TESTBIT(pairType, DbarDbar)) { - registry.fill(HIST("hMass2DCorrelationPairsLS"), massDbarCand1, massDbarCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); - if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsLSFinerBinning"), massDbarCand1, massDbarCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); - } - } - - if (TESTBIT(pairType, DDbar)) { - registry.fill(HIST("hMass2DCorrelationPairsOS"), massDCand1, massDbarCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); - if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsOSFinerBinning"), massDCand1, massDbarCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); - } - } - if (TESTBIT(pairType, DbarD)) { - registry.fill(HIST("hMass2DCorrelationPairsOS"), massDbarCand1, massDCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); - if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsOSFinerBinning"), massDbarCand1, massDCand2, ptCand1, ptCand2, yCand1, yCand2, d0Type1, d0Type2); - } - } - } - } - PROCESS_SWITCH(HfTaskCorrelationDMesonPairsTesting, processData, "Process data mode", true); - - void processMcGen(aod::D0PairMcGenTesting const& pairEntries) - { - for (const auto& pairEntry : pairEntries) { - // define variables for widely used quantities - double ptParticle1 = pairEntry.ptCand1(); - double ptParticle2 = pairEntry.ptCand2(); - float massDParticle1 = pairEntry.mDCand1(); - float massDbarParticle1 = pairEntry.mDbarCand1(); - float massDParticle2 = pairEntry.mDCand2(); - float massDbarParticle2 = pairEntry.mDbarCand2(); - float yParticle1 = pairEntry.yCand1(); - float yParticle2 = pairEntry.yCand2(); - auto pairType = pairEntry.pairType(); - auto d0Type1 = getD0Type(pairEntry.candidateType1()); - auto d0Type2 = getD0Type(pairEntry.candidateType2()); - - if (TESTBIT(pairType, DD)) { - registry.fill(HIST("hMass2DCorrelationPairsLSMcGen"), massDParticle1, massDParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); - if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsLSMcGenFinerBinning"), massDParticle1, massDParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); - } - } - if (TESTBIT(pairType, DbarDbar)) { - registry.fill(HIST("hMass2DCorrelationPairsLSMcGen"), massDbarParticle1, massDbarParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); - if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsLSMcGenFinerBinning"), massDbarParticle1, massDbarParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); - } - } - if (TESTBIT(pairType, DDbar)) { - registry.fill(HIST("hMass2DCorrelationPairsOSMcGen"), massDParticle1, massDbarParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); - if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsOSMcGenFinerBinning"), massDParticle1, massDbarParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); - } - } - if (TESTBIT(pairType, DbarD)) { - registry.fill(HIST("hMass2DCorrelationPairsOSMcGen"), massDbarParticle1, massDParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); - if (enableFinerBinning) { - registry.fill(HIST("hMass2DCorrelationPairsOSMcGenFinerBinning"), massDbarParticle1, massDParticle2, ptParticle1, ptParticle2, yParticle1, yParticle2, d0Type1, d0Type2); - } - } - } - } - PROCESS_SWITCH(HfTaskCorrelationDMesonPairsTesting, processMcGen, "Process MC Gen mode", false); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index 84a84305198..d80fc17c6bc 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -32,9 +32,9 @@ using namespace o2::framework::expressions; struct HfTaskCorrelationDsHadrons { Configurable applyEfficiency{"applyEfficiency", false, "Flag for applying efficiency weights"}; Configurable> binsPtD{"binsPtD", std::vector{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for candidate mass plots and efficiency"}; - Configurable> binsPtHadron{"binsPtHadron", std::vector{VARIABLE_WIDTH, 0., 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle efficiency"}; + Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle efficiency"}; Configurable> binsPtEfficiencyD{"binsPtEfficiencyD", std::vector{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for D-meson efficiency"}; - Configurable> binsPtEfficiencyHad{"binsPtEfficiencyHad", std::vector{VARIABLE_WIDTH, 0., 2., 4., 8., 12., 50.}, "pT bin limits for associated particle efficiency"}; + Configurable> binsPtEfficiencyHad{"binsPtEfficiencyHad", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for associated particle efficiency"}; Configurable> efficiencyD{"efficiencyD", {1., 1., 1., 1., 1., 1.}, "efficiency values for Ds meson"}; Configurable> efficiencyHad{"efficiencyHad", {1., 1., 1., 1., 1., 1.}, "efficiency values for associated particles"}; Configurable> signalRegionInner{"signalRegionInner", {1.9440, 1.9440, 1.9440, 1.9440, 1.9440, 1.9440, 1.9440, 1.9440}, "Inner values of signal region vs pT"}; diff --git a/PWGHF/TableProducer/candidateCreator2Prong.cxx b/PWGHF/TableProducer/candidateCreator2Prong.cxx index a81ebfe2bfd..74628c854de 100644 --- a/PWGHF/TableProducer/candidateCreator2Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator2Prong.cxx @@ -102,6 +102,9 @@ struct HfCandidateCreator2Prong { OutputObj hDcaXYProngs{TH2F("hDcaXYProngs", "DCAxy of 2-prong candidates;#it{p}_{T} (GeV/#it{c};#it{d}_{xy}) (#mum);entries", 100, 0., 20., 200, -500., 500.)}; OutputObj hDcaZProngs{TH2F("hDcaZProngs", "DCAz of 2-prong candidates;#it{p}_{T} (GeV/#it{c};#it{d}_{z}) (#mum);entries", 100, 0., 20., 200, -500., 500.)}; OutputObj hVertexerType{TH1F("hVertexerType", "Use KF or DCAFitterN;Vertexer type;entries", 2, -0.5, 1.5)}; // See o2::aod::hf_cand::VertexerType + OutputObj hCollisions{TH1D("hCollisions", "HF event counter", ValuesEvSel::NEvSel, -0.5f, static_cast(ValuesEvSel::NEvSel) - 0.5f)}; + OutputObj hPosZBeforeEvSel{TH1D("hPosZBeforeEvSel", "PV position Z before ev. selection;posZ (cm);entries", 400, -20, 20)}; + OutputObj hPosZAfterEvSel{TH1D("hPosZAfterEvSel", "PV position Z after ev. selection;posZ (cm);entries", 400, -20, 20)}; void init(InitContext const&) { @@ -115,6 +118,23 @@ struct HfCandidateCreator2Prong { LOGP(fatal, "One and only one process function must be enabled at a time."); } + std::array processesCollisions = {doprocessCollisions, doprocessCollisionsCentFT0C, doprocessCollisionsCentFT0M}; + const int nProcessesCollisions = std::accumulate(processesCollisions.begin(), processesCollisions.end(), 0); + if (nProcessesCollisions > 1) { + LOGP(fatal, "At most one process function for collision monitoring can be enabled at a time."); + } + if (nProcessesCollisions == 1) { + if ((doprocessPvRefitWithDCAFitterN || doprocessNoPvRefitWithDCAFitterN || doprocessPvRefitWithKFParticle || doprocessNoPvRefitWithKFParticle) && !doprocessCollisions) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisions\"?"); + } + if ((doprocessPvRefitWithDCAFitterNCentFT0C || doprocessNoPvRefitWithDCAFitterNCentFT0C || doprocessPvRefitWithKFParticleCentFT0C || doprocessNoPvRefitWithKFParticleCentFT0C) && !doprocessCollisionsCentFT0C) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisionsCentFT0C\"?"); + } + if ((doprocessPvRefitWithDCAFitterNCentFT0M || doprocessNoPvRefitWithDCAFitterNCentFT0M || doprocessPvRefitWithKFParticleCentFT0M || doprocessNoPvRefitWithKFParticleCentFT0M) && !doprocessCollisionsCentFT0M) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisionsCentFT0M\"?"); + } + } + massPi = MassPiPlus; massK = MassKPlus; @@ -139,9 +159,12 @@ struct HfCandidateCreator2Prong { ccdb->setLocalObjectValidityChecking(); lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); runNumber = 0; + + /// collision monitoring + setLabelHistoEvSel(hCollisions.object); } - template + template void runCreator2ProngWithDCAFitterN(Coll const& collisions, CandType const& rowsTrackIndexProng2, TTracks const& tracks, @@ -150,24 +173,11 @@ struct HfCandidateCreator2Prong { // loop over pairs of track indices for (const auto& rowTrackIndexProng2 : rowsTrackIndexProng2) { - // reject candidates in collisions outside the centrality range + /// reject candidates not satisfying the event selections auto collision = rowTrackIndexProng2.template collision_as(); - float centrality = -1.; - if constexpr (centEstimator != CentralityEstimator::None) { - if constexpr (centEstimator == CentralityEstimator::FT0C) { - centrality = collision.centFT0C(); - } else if constexpr (centEstimator == CentralityEstimator::FT0M) { - centrality = collision.centFT0M(); - } else { - LOGP(fatal, "Centrality estimator different from FT0C and FT0M, fix it!"); - } - if (centrality < centralityMin || centrality > centralityMax) { - continue; - } - } - - /// event selection: sel8, PV posZ, TF border cut - if (!isHfCollisionSelected(collision, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut)) { + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + if (rejectionMask != 0) { + /// at least one event selection not satisfied --> reject the candidate continue; } @@ -283,7 +293,7 @@ struct HfCandidateCreator2Prong { } } - template + template void runCreator2ProngWithKFParticle(Coll const& collisions, CandType const& rowsTrackIndexProng2, TTracks const& tracks, @@ -292,24 +302,11 @@ struct HfCandidateCreator2Prong { for (const auto& rowTrackIndexProng2 : rowsTrackIndexProng2) { - // reject candidates in collisions outside the centrality range + /// reject candidates in collisions not satisfying the event selections auto collision = rowTrackIndexProng2.template collision_as(); - float centrality = -1.; - if constexpr (centEstimator != CentralityEstimator::None) { - if constexpr (centEstimator == CentralityEstimator::FT0C) { - centrality = collision.centFT0C(); - } else if constexpr (centEstimator == CentralityEstimator::FT0M) { - centrality = collision.centFT0M(); - } else { - LOGP(fatal, "Centrality estimator different from FT0C and FT0M, fix it!"); - } - if (centrality < centralityMin || centrality > centralityMax) { - continue; - } - } - - /// event selection: sel8, PV posZ, TF border cut - if (!isHfCollisionSelected(collision, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut)) { + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + if (rejectionMask != 0) { + /// at least one event selection not satisfied --> reject the candidate continue; } @@ -572,6 +569,60 @@ struct HfCandidateCreator2Prong { runCreator2ProngWithKFParticle(collisions, rowsTrackIndexProng2, tracks, bcWithTimeStamps); } PROCESS_SWITCH(HfCandidateCreator2Prong, processNoPvRefitWithKFParticleCentFT0M, "Run candidate creator using KFParticle package w/o PV refit and w/ centrality selection on FT0M", false); + + /////////////////////////////////////////////////////////// + /// /// + /// Process functions only for collision monitoring /// + /// /// + /////////////////////////////////////////////////////////// + + /// @brief process function to monitor collisions - no centrality + void processCollisions(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreator2Prong, processCollisions, "Collision monitoring - no centrality", true); + + /// @brief process function to monitor collisions - FT0C centrality + void processCollisionsCentFT0C(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreator2Prong, processCollisionsCentFT0C, "Collision monitoring - FT0C centrality", false); + + /// @brief process function to monitor collisions - FT0M centrality + void processCollisionsCentFT0M(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreator2Prong, processCollisionsCentFT0M, "Collision monitoring - FT0M centrality", false); }; /// Extends the base table with expression columns. diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index ccfa9451593..e6571bcf3a9 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -99,6 +99,9 @@ struct HfCandidateCreator3Prong { OutputObj hCovSVZZ{TH1F("hCovSVZZ", "3-prong candidates;ZZ element of cov. matrix of sec. vtx. position (cm^{2});entries", 100, 0., 0.2)}; OutputObj hDcaXYProngs{TH2F("hDcaXYProngs", "DCAxy of 3-prong candidates;#it{p}_{T} (GeV/#it{c};#it{d}_{xy}) (#mum);entries", 100, 0., 20., 200, -500., 500.)}; OutputObj hDcaZProngs{TH2F("hDcaZProngs", "DCAz of 3-prong candidates;#it{p}_{T} (GeV/#it{c};#it{d}_{z}) (#mum);entries", 100, 0., 20., 200, -500., 500.)}; + OutputObj hCollisions{TH1D("hCollisions", "HF event counter", ValuesEvSel::NEvSel, -0.5f, static_cast(ValuesEvSel::NEvSel) - 0.5f)}; + OutputObj hPosZBeforeEvSel{TH1D("hPosZBeforeEvSel", "PV position Z before ev. selection;posZ (cm);entries", 400, -20, 20)}; + OutputObj hPosZAfterEvSel{TH1D("hPosZAfterEvSel", "PV position Z after ev. selection;posZ (cm);entries", 400, -20, 20)}; void init(InitContext const&) { @@ -109,6 +112,23 @@ struct HfCandidateCreator3Prong { LOGP(fatal, "One and only one process function must be enabled at a time."); } + std::array processesCollisions = {doprocessCollisions, doprocessCollisionsCentFT0C, doprocessCollisionsCentFT0M}; + const int nProcessesCollisions = std::accumulate(processesCollisions.begin(), processesCollisions.end(), 0); + if (nProcessesCollisions > 1) { + LOGP(fatal, "At most one process function for collision monitoring can be enabled at a time."); + } + if (nProcessesCollisions == 1) { + if ((doprocessPvRefit || doprocessNoPvRefit) && !doprocessCollisions) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisions\"?"); + } + if ((doprocessPvRefitCentFT0C || doprocessNoPvRefitCentFT0C) && !doprocessCollisionsCentFT0C) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisionsCentFT0C\"?"); + } + if ((doprocessPvRefitCentFT0M || doprocessNoPvRefitCentFT0M) && !doprocessCollisionsCentFT0M) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisionsCentFT0M\"?"); + } + } + std::array creationFlags = {createDplus, createDs, createLc, createXic}; if (std::accumulate(creationFlags.begin(), creationFlags.end(), 0) == 0) { LOGP(fatal, "At least one particle specie should be enabled for the creation."); @@ -132,9 +152,12 @@ struct HfCandidateCreator3Prong { ccdb->setLocalObjectValidityChecking(); lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); runNumber = 0; + + /// collision monitoring + setLabelHistoEvSel(hCollisions.object); } - template + template void runCreator3Prong(Coll const& collisions, Cand const& rowsTrackIndexProng3, aod::TracksWCovExtra const& tracks, @@ -143,24 +166,11 @@ struct HfCandidateCreator3Prong { // loop over triplets of track indices for (const auto& rowTrackIndexProng3 : rowsTrackIndexProng3) { - // reject candidates in collisions outside the centrality range + /// reject candidates in collisions not satisfying the event selections auto collision = rowTrackIndexProng3.template collision_as(); - float centrality = -1.; - if constexpr (centEstimator != CentralityEstimator::None) { - if constexpr (centEstimator == CentralityEstimator::FT0C) { - centrality = collision.centFT0C(); - } else if constexpr (centEstimator == CentralityEstimator::FT0M) { - centrality = collision.centFT0M(); - } else { - LOGP(fatal, "Centrality estimator different from FT0C and FT0M, fix it!"); - } - if (centrality < centralityMin || centrality > centralityMax) { - continue; - } - } - - /// event selection: sel8, PV posZ, TF border cut - if (!isHfCollisionSelected(collision, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut)) { + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + if (rejectionMask != 0) { + /// at least one event selection not satisfied --> reject the candidate continue; } @@ -364,6 +374,60 @@ struct HfCandidateCreator3Prong { runCreator3Prong(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); } PROCESS_SWITCH(HfCandidateCreator3Prong, processNoPvRefitCentFT0M, "Run candidate creator without PV refit and w/ centrality selection on FT0M", false); + + /////////////////////////////////////////////////////////// + /// /// + /// Process functions only for collision monitoring /// + /// /// + /////////////////////////////////////////////////////////// + + /// @brief process function to monitor collisions - no centrality + void processCollisions(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreator3Prong, processCollisions, "Collision monitoring - no centrality", true); + + /// @brief process function to monitor collisions - FT0C centrality + void processCollisionsCentFT0C(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreator3Prong, processCollisionsCentFT0C, "Collision monitoring - FT0C centrality", false); + + /// @brief process function to monitor collisions - FT0M centrality + void processCollisionsCentFT0M(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreator3Prong, processCollisionsCentFT0M, "Collision monitoring - FT0M centrality", false); }; /// Extends the base table with expression columns. diff --git a/PWGHF/TableProducer/candidateCreatorCascade.cxx b/PWGHF/TableProducer/candidateCreatorCascade.cxx index 9c08adb124d..ad63bfa35c6 100644 --- a/PWGHF/TableProducer/candidateCreatorCascade.cxx +++ b/PWGHF/TableProducer/candidateCreatorCascade.cxx @@ -81,6 +81,9 @@ struct HfCandidateCreatorCascade { OutputObj hMass2{TH1F("hMass2", "2-prong candidates;inv. mass (p K_{S}^{0}) (GeV/#it{c}^{2});entries", 500, 0., 5.)}; OutputObj hCovPVXX{TH1F("hCovPVXX", "2-prong candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", 100, 0., 1.e-4)}; OutputObj hCovSVXX{TH1F("hCovSVXX", "2-prong candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", 100, 0., 0.2)}; + OutputObj hCollisions{TH1D("hCollisions", "HF event counter", ValuesEvSel::NEvSel, -0.5f, static_cast(ValuesEvSel::NEvSel) - 0.5f)}; + OutputObj hPosZBeforeEvSel{TH1D("hPosZBeforeEvSel", "PV position Z before ev. selection;posZ (cm);entries", 400, -20, 20)}; + OutputObj hPosZAfterEvSel{TH1D("hPosZAfterEvSel", "PV position Z after ev. selection;posZ (cm);entries", 400, -20, 20)}; void init(InitContext const&) { @@ -89,6 +92,23 @@ struct HfCandidateCreatorCascade { LOGP(fatal, "One and only one process function must be enabled at a time."); } + std::array processesCollisions = {doprocessCollisions, doprocessCollisionsCentFT0C, doprocessCollisionsCentFT0M}; + const int nProcessesCollisions = std::accumulate(processesCollisions.begin(), processesCollisions.end(), 0); + if (nProcessesCollisions > 1) { + LOGP(fatal, "At most one process function for collision monitoring can be enabled at a time."); + } + if (nProcessesCollisions == 1) { + if (doprocessNoCent && !doprocessCollisions) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisions\"?"); + } + if (doprocessCentFT0C && !doprocessCollisionsCentFT0C) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisionsCentFT0C\"?"); + } + if (doprocessCentFT0M && !doprocessCollisionsCentFT0M) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisionsCentFT0M\"?"); + } + } + massP = MassProton; massK0s = MassK0Short; massPi = MassPiPlus; @@ -108,9 +128,12 @@ struct HfCandidateCreatorCascade { ccdb->setLocalObjectValidityChecking(); lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); runNumber = 0; + + /// collision monitoring + setLabelHistoEvSel(hCollisions.object); } - template + template void runCreatorCascade(Coll const&, aod::HfCascades const& rowsTrackIndexCasc, aod::V0sLinked const&, @@ -122,24 +145,11 @@ struct HfCandidateCreatorCascade { // loop over pairs of track indices for (const auto& casc : rowsTrackIndexCasc) { - // reject candidates in collisions outside the centrality range + /// reject candidates in collisions not satisfying the event selections auto collision = casc.template collision_as(); - float centrality = -1.; - if constexpr (centEstimator != CentralityEstimator::None) { - if constexpr (centEstimator == CentralityEstimator::FT0C) { - centrality = collision.centFT0C(); - } else if constexpr (centEstimator == CentralityEstimator::FT0M) { - centrality = collision.centFT0M(); - } else { - LOGP(fatal, "Centrality estimator different from FT0C and FT0M, fix it!"); - } - if (centrality < centralityMin || centrality > centralityMax) { - continue; - } - } - - /// event selection: sel8, PV posZ, TF border cut - if (!isHfCollisionSelected(collision, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut)) { + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + if (rejectionMask != 0) { + /// at least one event selection not satisfied --> reject the candidate continue; } @@ -344,6 +354,60 @@ struct HfCandidateCreatorCascade { runCreatorCascade(collisions, rowsTrackIndexCasc, v0sLinked, v0Data, v0fCDatas, tracks, bcs); } PROCESS_SWITCH(HfCandidateCreatorCascade, processCentFT0M, " Run candidate creator w/ centrality selection on FT0M", false); + + /////////////////////////////////////////////////////////// + /// /// + /// Process functions only for collision monitoring /// + /// /// + /////////////////////////////////////////////////////////// + + /// @brief process function to monitor collisions - no centrality + void processCollisions(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreatorCascade, processCollisions, "Collision monitoring - no centrality", true); + + /// @brief process function to monitor collisions - FT0C centrality + void processCollisionsCentFT0C(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreatorCascade, processCollisionsCentFT0C, "Collision monitoring - FT0C centrality", false); + + /// @brief process function to monitor collisions - FT0M centrality + void processCollisionsCentFT0M(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreatorCascade, processCollisionsCentFT0M, "Collision monitoring - FT0M centrality", false); }; /// Performs MC matching. diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index c7322121e98..8017ceee44d 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -107,6 +107,10 @@ struct HfCandidateCreatorDstar { {"QA/hPtD0", "D^{0} candidates", {HistType::kTH1F, {ptAxis}}}, {"QA/hPtDstar", "D* candidates", {HistType::kTH1F, {ptAxis}}}}}; + OutputObj hCollisions{TH1D("hCollisions", "HF event counter", ValuesEvSel::NEvSel, -0.5f, static_cast(ValuesEvSel::NEvSel) - 0.5f)}; + OutputObj hPosZBeforeEvSel{TH1D("hPosZBeforeEvSel", "PV position Z before ev. selection;posZ (cm);entries", 400, -20, 20)}; + OutputObj hPosZAfterEvSel{TH1D("hPosZAfterEvSel", "PV position Z after ev. selection;posZ (cm);entries", 400, -20, 20)}; + /// @brief This function initializes the ccdb setting, vertex fitter and runs function MatLayerCylSet::rectifyPtrFromFile(..args..) void init(InitContext const&) { @@ -116,6 +120,24 @@ struct HfCandidateCreatorDstar { if (std::accumulate(processes.begin(), processes.end(), 0) != 1) { LOGP(fatal, "One and only one process function must be enabled at a time."); } + + std::array processesCollisions = {doprocessCollisions, doprocessCollisionsCentFT0C, doprocessCollisionsCentFT0M}; + const int nProcessesCollisions = std::accumulate(processesCollisions.begin(), processesCollisions.end(), 0); + if (nProcessesCollisions > 1) { + LOGP(fatal, "At most one process function for collision monitoring can be enabled at a time."); + } + if (nProcessesCollisions == 1) { + if ((doprocessPvRefit || doprocessNoPvRefit) && !doprocessCollisions) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisions\"?"); + } + if ((doprocessPvRefitCentFT0C || doprocessNoPvRefitCentFT0C) && !doprocessCollisionsCentFT0C) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisionsCentFT0C\"?"); + } + if ((doprocessPvRefitCentFT0M || doprocessNoPvRefitCentFT0M) && !doprocessCollisionsCentFT0M) { + LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisionsCentFT0M\"?"); + } + } + // LOG(info) << "Init Function Invoked"; massPi = MassPiPlus; massK = MassKPlus; @@ -135,6 +157,9 @@ struct HfCandidateCreatorDstar { ccdb->setLocalObjectValidityChecking(); // set the flag to check object validity before CCDB query runNumber = 0; bz = 0; + + /// collision monitoring + setLabelHistoEvSel(hCollisions.object); } /// @brief function for secondary vertex reconstruction and candidate creator @@ -145,7 +170,7 @@ struct HfCandidateCreatorDstar { /// @param rowsTrackIndexD0 D0 table object from trackIndexSkimCreator.cxx /// @param tracks track table with Cov object /// @param bcWithTimeStamps Bunch Crossing with timestamps - template + template void runCreatorDstar(Coll const& collisions, CandsDstar const& rowsTrackIndexDstar, aod::Hf2Prongs const& rowsTrackIndexD0, @@ -157,24 +182,11 @@ struct HfCandidateCreatorDstar { // loop over suspected Dstar Candidate for (const auto& rowTrackIndexDstar : rowsTrackIndexDstar) { - // reject candidates in collisions outside the centrality range + /// reject candidates in collisions not satisfying the event selections auto collision = rowTrackIndexDstar.template collision_as(); - float centrality = -1.; - if constexpr (centEstimator != CentralityEstimator::None) { - if constexpr (centEstimator == CentralityEstimator::FT0C) { - centrality = collision.centFT0C(); - } else if constexpr (centEstimator == CentralityEstimator::FT0M) { - centrality = collision.centFT0M(); - } else { - LOGP(fatal, "Centrality estimator different from FT0C and FT0M, fix it!"); - } - if (centrality < centralityMin || centrality > centralityMax) { - continue; - } - } - - /// event selection: sel8, PV posZ, TF border cut - if (!isHfCollisionSelected(collision, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut)) { + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + if (rejectionMask != 0) { + /// at least one event selection not satisfied --> reject the candidate continue; } @@ -413,6 +425,60 @@ struct HfCandidateCreatorDstar { runCreatorDstar(collisions, rowsTrackIndexDstar, rowsTrackIndexD0, tracks, bcWithTimeStamps); } PROCESS_SWITCH(HfCandidateCreatorDstar, processNoPvRefitCentFT0M, " Run candidate creator without PV refit and w/ centrality selection on FT0M", false); + + /////////////////////////////////////////////////////////// + /// /// + /// Process functions only for collision monitoring /// + /// /// + /////////////////////////////////////////////////////////// + + /// @brief process function to monitor collisions - no centrality + void processCollisions(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreatorDstar, processCollisions, "Collision monitoring - no centrality", true); + + /// @brief process function to monitor collisions - FT0C centrality + void processCollisionsCentFT0C(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreatorDstar, processCollisionsCentFT0C, "Collision monitoring - FT0C centrality", false); + + /// @brief process function to monitor collisions - FT0M centrality + void processCollisionsCentFT0M(soa::Join const& collisions) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + const auto rejectionMask = getHfCollisionRejectionMask(collision, centralityMin, centralityMax, useSel8Trigger, maxPvPosZ, useTimeFrameBorderCut); + + /// monitor the satisfied event selections + monitorCollision(collision, rejectionMask, hCollisions.object, hPosZBeforeEvSel.object, hPosZAfterEvSel.object); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreatorDstar, processCollisionsCentFT0M, "Collision monitoring - FT0M centrality", false); }; struct HfCandidateCreatorDstarExpressions { diff --git a/PWGHF/TableProducer/trackIndexSkimCreator.cxx b/PWGHF/TableProducer/trackIndexSkimCreator.cxx index c301130f013..385abbe0312 100644 --- a/PWGHF/TableProducer/trackIndexSkimCreator.cxx +++ b/PWGHF/TableProducer/trackIndexSkimCreator.cxx @@ -50,6 +50,7 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" +#include "PWGHF/Utils/utilsEvSelHf.h" using namespace o2; using namespace o2::analysis; @@ -68,19 +69,6 @@ enum CandidateType { NCandidateTypes }; -// event rejection types -enum EventRejection { - Trigger = 0, - TimeFrameBorderCut, - PositionX, - PositionY, - PositionZ, - NContrib, - Chi2, - Centrality, - NEventRejection -}; - // enum for proton PID strategy (only proton for baryons) enum ProtonPidStrategy { NoPid = 0, diff --git a/PWGHF/Utils/utilsEvSelHf.h b/PWGHF/Utils/utilsEvSelHf.h index 0b87373377c..dafa46e1df2 100644 --- a/PWGHF/Utils/utilsEvSelHf.h +++ b/PWGHF/Utils/utilsEvSelHf.h @@ -16,32 +16,124 @@ #ifndef PWGHF_UTILS_UTILSEVSELHF_H_ #define PWGHF_UTILS_UTILSEVSELHF_H_ +// event rejection types +enum EventRejection { + Trigger = 0, + TimeFrameBorderCut, + PositionX, + PositionY, + PositionZ, + NContrib, + Chi2, + Centrality, + NEventRejection +}; + +enum ValuesEvSel : int { + All = 0, + Cent, + CentSel8, + CentSel8PosZ, + CentSel8PosZTFBorder, + NEvSel +}; + +/// @brief Function to put labels on collision monitoring histogram +/// \param hCollisions is the histogram +template +void setLabelHistoEvSel(Histo& hCollisions) +{ + hCollisions->GetXaxis()->SetBinLabel(ValuesEvSel::All + 1, "All collisions"); + hCollisions->GetXaxis()->SetBinLabel(ValuesEvSel::Cent + 1, "Centrality ok"); + hCollisions->GetXaxis()->SetBinLabel(ValuesEvSel::CentSel8 + 1, "Centrality + sel8 ok"); + hCollisions->GetXaxis()->SetBinLabel(ValuesEvSel::CentSel8PosZ + 1, "Centrality + sel8 + posZ ok"); + hCollisions->GetXaxis()->SetBinLabel(ValuesEvSel::CentSel8PosZTFBorder + 1, "Centrality + sel8 + posZ + TF border ok"); +} + /// \brief Function to apply event selections in HF analyses /// \param collision collision that has to satisfy the selection criteria /// \param useSel8Trigger switch to activate the sel8() event selection /// \param zPvPosMax maximum primary-vertex z /// \param useTimeFrameBorderCut switch to activate the time frame border cut -/// \return true if collision satisfies all criteria, false otherwise -template -bool isHfCollisionSelected(const Coll& collision, bool useSel8Trigger, float maxPvPosZ, bool useTimeFrameBorderCut) +/// \return a bitmask with the event selections not satisfied by the analysed collision +template +uint16_t getHfCollisionRejectionMask(const Coll& collision, float centralityMin, float centralityMax, bool useSel8Trigger, float maxPvPosZ, bool useTimeFrameBorderCut) { + uint16_t statusCollision = 0; // 16 bits, in case new ev. selections will be added + float centrality = -1.; + + if constexpr (centEstimator != o2::aod::hf_collision_centrality::CentralityEstimator::None) { + if constexpr (centEstimator == o2::aod::hf_collision_centrality::CentralityEstimator::FT0C) { + centrality = collision.centFT0C(); + } else if constexpr (centEstimator == o2::aod::hf_collision_centrality::CentralityEstimator::FT0M) { + centrality = collision.centFT0M(); + } else { + LOGP(fatal, "Centrality estimator different from FT0C and FT0M, fix it!"); + } + if (centrality < centralityMin || centrality > centralityMax) { + SETBIT(statusCollision, EventRejection::Centrality); + } + } + /// sel8() condition if (useSel8Trigger && !collision.sel8()) { - return false; + SETBIT(statusCollision, EventRejection::Trigger); } /// primary vertex z if (std::fabs(collision.posZ()) > maxPvPosZ) { - return false; + SETBIT(statusCollision, EventRejection::PositionZ); } /// time frame border cut if (useTimeFrameBorderCut && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { - return false; + SETBIT(statusCollision, EventRejection::TimeFrameBorderCut); + } + + /// TODO: add other selections, to extend it to the trackIndexSkimCreator + + return statusCollision; +} + +/// @brief function to monitor the event selection satisfied by collisions used for HF analyses +/// \param collision is the analysed collision +/// \param rejectionMask is the bitmask storing the info about which ev. selections are not satisfied by the collision +/// \param hCollisions is a histogram to keep track of the satisfied event selections +/// \param hPosZBeforeEvSel is PV position Z for all analysed collisions +/// \param hPosZAfterEvSel is PV position Z only for collisions satisfying the event selections +template +void monitorCollision(Coll const& collision, const uint16_t rejectionMask, Hist& hCollisions, Hist& hPosZBeforeEvSel, Hist& hPosZAfterEvSel) +{ + + hCollisions->Fill(ValuesEvSel::All); // all collisions + const float posZ = collision.posZ(); + hPosZBeforeEvSel->Fill(posZ); + + /// centrality + if (TESTBIT(rejectionMask, EventRejection::Centrality)) { + return; } + hCollisions->Fill(ValuesEvSel::Cent); // Centrality ok - /// all conditions satisfied - return true; + /// sel8() + if (TESTBIT(rejectionMask, EventRejection::Trigger)) { + return; + } + hCollisions->Fill(ValuesEvSel::CentSel8); // Centrality + sel8 ok + + /// PV position Z + if (TESTBIT(rejectionMask, EventRejection::PositionZ)) { + return; + } + hCollisions->Fill(ValuesEvSel::CentSel8PosZ); // Centrality + sel8 + posZ ok + + /// Time Frame border cut + if (TESTBIT(rejectionMask, EventRejection::TimeFrameBorderCut)) { + return; + } + hCollisions->Fill(ValuesEvSel::CentSel8PosZTFBorder); // Centrality + sel8 + posZ + TF border ok + hPosZAfterEvSel->Fill(posZ); } + #endif // PWGHF_UTILS_UTILSEVSELHF_H_ diff --git a/PWGJE/Core/JetDerivedDataUtilities.h b/PWGJE/Core/JetDerivedDataUtilities.h index db5945a774a..1ee10e898ed 100644 --- a/PWGJE/Core/JetDerivedDataUtilities.h +++ b/PWGJE/Core/JetDerivedDataUtilities.h @@ -28,7 +28,10 @@ static constexpr float mPion = 0.139; // TDatabasePDG::Instance()->GetParticle(2 enum JCollisionSel { sel8 = 0, - sel7 = 1 + sel8WithoutTimeFrameBorderCut = 1, + sel7 = 2, + sel7WithoutTimeFrameBorderCut = 3, + WithoutTimeFrameBorderCut = 4 }; template @@ -57,14 +60,21 @@ uint8_t setEventSelectionBit(T const& collision) uint8_t bit = 0; if (!collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { - return bit; + SETBIT(bit, JCollisionSel::WithoutTimeFrameBorderCut); } - if (collision.sel8()) { - SETBIT(bit, JCollisionSel::sel8); + if (collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + SETBIT(bit, JCollisionSel::sel8); + } else { + SETBIT(bit, JCollisionSel::sel8WithoutTimeFrameBorderCut); + } } if (collision.sel7()) { - SETBIT(bit, JCollisionSel::sel7); + if (collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + SETBIT(bit, JCollisionSel::sel7); + } else { + SETBIT(bit, JCollisionSel::sel7WithoutTimeFrameBorderCut); + } } return bit; } diff --git a/PWGJE/Core/JetFindingUtilities.h b/PWGJE/Core/JetFindingUtilities.h index 34b7f33d284..453995c0067 100644 --- a/PWGJE/Core/JetFindingUtilities.h +++ b/PWGJE/Core/JetFindingUtilities.h @@ -149,9 +149,11 @@ bool analyseCandidateMC(std::vector& inputParticles, T const * @param doHFJetFinding set whether only jets containing a HF candidate are saved */ template -void findJets(JetFinder& jetFinder, std::vector& inputParticles, std::vector jetRadius, float jetAreaFractionMin, T const& collision, U& jetsTable, V& constituentsTable, bool doHFJetFinding = false) +void findJets(JetFinder& jetFinder, std::vector& inputParticles, float jetPtMin, float jetPtMax, std::vector jetRadius, float jetAreaFractionMin, T const& collision, U& jetsTable, V& constituentsTable, bool doHFJetFinding = false) { auto jetRValues = static_cast>(jetRadius); + jetFinder.jetPtMin = jetPtMin; + jetFinder.jetPtMax = jetPtMax; for (auto R : jetRValues) { jetFinder.jetR = R; std::vector jets; diff --git a/PWGJE/Core/JetTaggingUtilities.h b/PWGJE/Core/JetTaggingUtilities.h index 417fc74d6cd..3bc9c7380a1 100644 --- a/PWGJE/Core/JetTaggingUtilities.h +++ b/PWGJE/Core/JetTaggingUtilities.h @@ -13,6 +13,7 @@ /// \brief Jet tagging related utilities /// /// \author Nima Zardoshti +/// \author Hanseo Park #ifndef PWGJE_CORE_JETTAGGINGUTILITIES_H_ #define PWGJE_CORE_JETTAGGINGUTILITIES_H_ @@ -23,6 +24,7 @@ #include #include +#include "TF1.h" #include "Framework/Logger.h" #include "Common/Core/RecoDecay.h" #include "PWGJE/Core/JetUtilities.h" @@ -307,6 +309,111 @@ void calculateDcaXYZ(float& dcaXYZ, float& sigmaDcaXYZ2, float dcaXY, float dcaZ sigmaDcaXYZ2 = std::abs(cYY * dFdxy * dFdxy + cZZ * dFdz * dFdz + 2 * cZY * dFdxy * dFdz); } +/** + * Generates and configures a resolution function for the impact parameter distribution of jets, + * tailored to the specified jet flavour. The resolution function is a composite of exponential + * and Gaussian components, designed to model the distribution's characteristics accurately. + * + * @param jetflavour An identifier for the jet flavour (e.g., 1 for c-jet, 2 for b-jet, 3 for light-flavour jet), + * used to select the appropriate parameter set for the resolution function. + */ +// TODO: The fitting function obtained with fewer events locally. We will change to parameters with higher statistics in the future +template +TF1* getResolutionFunction(T const& jetflavour) +{ + TF1* fResoFunc = nullptr; + fResoFunc = new TF1("fResoFunc", "expo(0)+expo(2)+expo(4)+gaus(6)", -40, 0); + switch (static_cast(jetflavour)) { + case 1: // c-jet + fResoFunc->SetParameters(3.56397, 0.0977181, 4.34329, 0.497469, 1.29482, 0.494429, 7350.86, 0.27023, 1.0822); + break; + case 2: // b-jet + fResoFunc->SetParameters(5.28562, 0.754341, 2.67886, 0.0556572, 4.26838, 173.447, 1484.69, 0.0359118, -0.923933); + break; + case 3: // lf-jet (light-flavour jet) + fResoFunc->SetParameters(7.69109, 1.02418, 1.91596, 0.0589323, -5.80351, 1.06489, 6282.07, -0.0558066, 0.888488); + break; + default: + // Handle unexpected jet flavour, possibly with a warning or default function + fResoFunc->SetParameters(8.07756, 0.89488, 3.73556, 0.0628505, -0.0302361, 0.865316, 14170.4, 0.0148564, 0.915118); + break; + } + + return fResoFunc; +} + +/** + * Calculates the probability of a given track being associated with a jet, based on the geometric + * sign and the resolution function of the jet's impact parameter significance. This probability + * helps in distinguishing between tracks likely originating from the primary vertex and those from + * secondary vertices, aiding in jet flavor tagging. + * + * @param fResoFuncjet The resolution function for the jet, used to model the distribution of impact + * parameter significances for tracks associated with the jet. + * @param collision The collision event data, providing context for calculating geometric signs. + * @param jet The specific jet being analyzed. + * @param track The track for which the probability is being calculated. + * @param minSignImpXYSig The minimum significance of the impact parameter in the XY plane, used as + * the lower limit for integration of the resolution function. Defaults to -10. + * @return The calculated probability of the track being associated with the jet, based on its + * impact parameter significance. + */ +template +float getTrackProbability(T const& fResoFuncjet, U const& collision, V const& jet, W const& track, const float& minSignImpXYSig = -10) +{ + float probTrack = 0.; + auto varSignImpXYSig = getGeoSign(collision, jet, track) * TMath::Abs(track.dcaXY()) / TMath::Sqrt(track.sigmaDcaXY2()); + probTrack = fResoFuncjet->Integral(minSignImpXYSig, -1 * TMath::Abs(varSignImpXYSig)) / fResoFuncjet->Integral(minSignImpXYSig, 0); + + return probTrack; +} + +/** + * Computes the jet probability (JP) for a given jet, considering only tracks with a positive geometric + * sign. JP is calculated using the product of individual track probabilities and the sum of logarithmic + * terms derived from these probabilities, providing a measure for the likelihood of the jet being + * associated with a particular flavor based on its constituent tracks' impact parameters. + * + * @param fResoFuncjet The resolution function for the jet, applied to each track within the jet to + * assess its probability based on the impact parameter significance. + * @param collision The collision event data, necessary for geometric sign calculations. + * @param jet The jet for which the probability is being calculated. + * @param tracks The collection of tracks associated with the jet. + * @return The jet probability (JP), indicating the likelihood of the jet's association with a + * specific flavor. Returns -1 if the jet contains fewer than two tracks with a positive + * geometric sign. + */ +template +float getJetProbability(T const& fResoFuncjet, U const& collision, V const& jet, W const& jtracks, X const& tracks) +{ + std::vector jetTracksPt; + float trackjetProb = 1.; + + for (auto& jtrack : jet.template tracks_as()) { + auto track = jtrack.template track_as(); + + float probTrack = getTrackProbability(fResoFuncjet, collision, jet, track); + + auto geoSign = getGeoSign(collision, jet, track); + if (geoSign > 0) { // only take positive sign track for JP calculation + trackjetProb *= TMath::Abs(probTrack); + jetTracksPt.push_back(track.pt()); + } + } + + float JP = -1.; + if (jetTracksPt.size() < 2) + return -1; + + float sumjetProb = 0.; + for (int i = 0; i < jetTracksPt.size(); i++) { + sumjetProb += (TMath::Power(-1 * TMath::Log(trackjetProb), i) / TMath::Factorial(i)); + } + + JP = trackjetProb * sumjetProb; + return JP; +} + }; // namespace jettaggingutilities #endif // PWGJE_CORE_JETTAGGINGUTILITIES_H_ diff --git a/PWGJE/DataModel/EMCALClusters.h b/PWGJE/DataModel/EMCALClusters.h index e24d1cd54a9..c3aa23fac84 100644 --- a/PWGJE/DataModel/EMCALClusters.h +++ b/PWGJE/DataModel/EMCALClusters.h @@ -17,6 +17,7 @@ #define PWGJE_DATAMODEL_EMCALCLUSTERS_H_ #include +#include #include "Framework/AnalysisDataModel.h" #include "EMCALClusterDefinition.h" @@ -91,6 +92,17 @@ DECLARE_SOA_TABLE(EMCALAmbiguousClusters, "AOD", "EMCALAMBCLUS", //! using EMCALCluster = EMCALClusters::iterator; using EMCALAmbiguousCluster = EMCALAmbiguousClusters::iterator; +namespace emcalclustermc +{ +DECLARE_SOA_ARRAY_INDEX_COLUMN(McParticle, mcParticle); //! Array of MC particles that deposited energy in this calo cell +DECLARE_SOA_COLUMN(AmplitudeA, amplitudeA, std::vector); //! Energy fraction deposited by a particle inside this calo cell. +} // namespace emcalclustermc +// table of cluster MC info that could be matched to a collision +DECLARE_SOA_TABLE(EMCALMCClusters, "AOD", "EMCALMCCLUSTERS", //! + emcalclustermc::McParticleIds, emcalclustermc::AmplitudeA); + +using EMCALMCCluster = EMCALMCClusters::iterator; + namespace emcalclustercell { // declare index column pointing to cluster table diff --git a/PWGJE/DataModel/JetTagging.h b/PWGJE/DataModel/JetTagging.h index 09b9ca74c05..6435bce2eee 100644 --- a/PWGJE/DataModel/JetTagging.h +++ b/PWGJE/DataModel/JetTagging.h @@ -26,16 +26,29 @@ using namespace o2::analysis; namespace o2::aod { +// Defines derived extension data inside jets for tagging +namespace jtracktag +{ +DECLARE_SOA_COLUMN(DcaXYZ, dcaXYZ, float); +DECLARE_SOA_COLUMN(SigmaDcaXYZ2, sigmaDcaXYZ2, float); +} // namespace jtracktag + +DECLARE_SOA_TABLE(JTracksTag, "AOD", "JTracksTag", + jtracktag::DcaXYZ, + jtracktag::SigmaDcaXYZ2); + +using JTrackTag = JTracksTag::iterator; + // Defines the jet substrcuture table definition #define JETTAGGING_TABLE_DEF(_jet_type_, _name_, _description_) \ namespace _name_##tagging \ { \ DECLARE_SOA_COLUMN(Origin, origin, int); \ - DECLARE_SOA_COLUMN(Algorithm1, algorithm1, int); \ + DECLARE_SOA_COLUMN(JetProb, jetProb, float); \ DECLARE_SOA_COLUMN(Algorithm2, algorithm2, int); \ DECLARE_SOA_COLUMN(Algorithm3, algorithm3, int); \ } \ - DECLARE_SOA_TABLE(_jet_type_##Tags, "AOD", _description_ "Tags", _name_##tagging::Origin, _name_##tagging::Algorithm1, _name_##tagging::Algorithm2, _name_##tagging::Algorithm3); + DECLARE_SOA_TABLE(_jet_type_##Tags, "AOD", _description_ "Tags", _name_##tagging::Origin, _name_##tagging::JetProb, _name_##tagging::Algorithm2, _name_##tagging::Algorithm3); #define JETTAGGING_TABLES_DEF(_jet_type_, _description_) \ JETTAGGING_TABLE_DEF(_jet_type_##Jet, _jet_type_##jet, _description_) \ diff --git a/PWGJE/JetFinders/jetfinder.cxx b/PWGJE/JetFinders/jetfinder.cxx index 84bf176a68f..c72ee89167d 100644 --- a/PWGJE/JetFinders/jetfinder.cxx +++ b/PWGJE/JetFinders/jetfinder.cxx @@ -61,6 +61,8 @@ struct JetFinderTask { Configurable> jetRadius{"jetRadius", {0.4}, "jet resolution parameters"}; Configurable jetPtMin{"jetPtMin", 0.0, "minimum jet pT"}; Configurable jetPtMax{"jetPtMax", 1000.0, "maximum jet pT"}; + Configurable jetEWSPtMin{"jetEWSPtMin", 0.0, "minimum event-wise subtracted jet pT"}; + Configurable jetEWSPtMax{"jetEWSPtMax", 1000.0, "maximum event-wise subtracted jet pT"}; Configurable jetEtaMin{"jetEtaMin", -99.0, "minimum jet pseudorapidity"}; Configurable jetEtaMax{"jetEtaMax", 99.0, "maximum jet pseudorapidity"}; Configurable jetAlgorithm{"jetAlgorithm", 2, "jet clustering algorithm. 0 = kT, 1 = C/A, 2 = Anti-kT"}; @@ -86,8 +88,6 @@ struct JetFinderTask { jetFinder.etaMin = trackEtaMin; jetFinder.etaMax = trackEtaMax; - jetFinder.jetPtMin = jetPtMin; - jetFinder.jetPtMax = jetPtMax; jetFinder.jetEtaMin = jetEtaMin; jetFinder.jetEtaMax = jetEtaMax; if (jetEtaMin < -98.0) { @@ -118,7 +118,7 @@ struct JetFinderTask { } inputParticles.clear(); jetfindingutilities::analyseTracks, soa::Filtered::iterator>(inputParticles, tracks, trackSelection); - jetfindingutilities::findJets(jetFinder, inputParticles, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); + jetfindingutilities::findJets(jetFinder, inputParticles, jetPtMin, jetPtMax, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); } PROCESS_SWITCH(JetFinderTask, processChargedJets, "Data and reco level jet finding for charged jets", false); @@ -131,7 +131,7 @@ struct JetFinderTask { } inputParticles.clear(); jetfindingutilities::analyseTracks, soa::Filtered::iterator>(inputParticles, tracks, trackSelection); - jetfindingutilities::findJets(jetFinder, inputParticles, jetRadius, jetAreaFractionMin, collision, jetsEvtWiseSubTable, constituentsEvtWiseSubTable); + jetfindingutilities::findJets(jetFinder, inputParticles, jetEWSPtMin, jetEWSPtMax, jetRadius, jetAreaFractionMin, collision, jetsEvtWiseSubTable, constituentsEvtWiseSubTable); } PROCESS_SWITCH(JetFinderTask, processChargedEvtWiseSubJets, "Data and reco level jet finding for charged jets with event-wise constituent subtraction", false); @@ -144,7 +144,7 @@ struct JetFinderTask { } inputParticles.clear(); jetfindingutilities::analyseClusters(inputParticles, &clusters); - jetfindingutilities::findJets(jetFinder, inputParticles, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); + jetfindingutilities::findJets(jetFinder, inputParticles, jetPtMin, jetPtMax, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); } PROCESS_SWITCH(JetFinderTask, processNeutralJets, "Data and reco level jet finding for neutral jets", false); @@ -158,7 +158,7 @@ struct JetFinderTask { inputParticles.clear(); jetfindingutilities::analyseTracks, soa::Filtered::iterator>(inputParticles, tracks, trackSelection); jetfindingutilities::analyseClusters(inputParticles, &clusters); - jetfindingutilities::findJets(jetFinder, inputParticles, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); + jetfindingutilities::findJets(jetFinder, inputParticles, jetPtMin, jetPtMax, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); } PROCESS_SWITCH(JetFinderTask, processFullJets, "Data and reco level jet finding for full and neutral jets", false); @@ -167,7 +167,7 @@ struct JetFinderTask { // TODO: MC event selection? inputParticles.clear(); jetfindingutilities::analyseParticles, soa::Filtered::iterator>(inputParticles, particleSelection, 1, particles, pdgDatabase); - jetfindingutilities::findJets(jetFinder, inputParticles, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); + jetfindingutilities::findJets(jetFinder, inputParticles, jetPtMin, jetPtMax, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); } PROCESS_SWITCH(JetFinderTask, processParticleLevelChargedJets, "Particle level charged jet finding", false); @@ -176,7 +176,7 @@ struct JetFinderTask { // TODO: MC event selection? inputParticles.clear(); jetfindingutilities::analyseParticles, soa::Filtered::iterator>(inputParticles, particleSelection, 2, particles, pdgDatabase); - jetfindingutilities::findJets(jetFinder, inputParticles, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); + jetfindingutilities::findJets(jetFinder, inputParticles, jetPtMin, jetPtMax, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); } PROCESS_SWITCH(JetFinderTask, processParticleLevelNeutralJets, "Particle level neutral jet finding", false); @@ -185,7 +185,7 @@ struct JetFinderTask { // TODO: MC event selection? inputParticles.clear(); jetfindingutilities::analyseParticles, soa::Filtered::iterator>(inputParticles, particleSelection, 0, particles, pdgDatabase); - jetfindingutilities::findJets(jetFinder, inputParticles, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); + jetfindingutilities::findJets(jetFinder, inputParticles, jetPtMin, jetPtMax, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable); } PROCESS_SWITCH(JetFinderTask, processParticleLevelFullJets, "Particle level full jet finding", false); diff --git a/PWGJE/JetFinders/jetfinderhf.cxx b/PWGJE/JetFinders/jetfinderhf.cxx index 166198683e8..51054425c27 100644 --- a/PWGJE/JetFinders/jetfinderhf.cxx +++ b/PWGJE/JetFinders/jetfinderhf.cxx @@ -90,6 +90,8 @@ struct JetFinderHFTask { Configurable> jetRadius{"jetRadius", {0.4}, "jet resolution parameters"}; Configurable jetPtMin{"jetPtMin", 0.0, "minimum jet pT"}; Configurable jetPtMax{"jetPtMax", 1000.0, "maximum jet pT"}; + Configurable jetEWSPtMin{"jetEWSPtMin", 0.0, "minimum event-wise subtracted jet pT"}; + Configurable jetEWSPtMax{"jetEWSPtMax", 1000.0, "maximum event-wise subtracted jet pT"}; Configurable jetEtaMin{"jetEtaMin", -99.0, "minimum jet pseudorapidity"}; Configurable jetEtaMax{"jetEtaMax", 99.0, "maximum jet pseudorapidity"}; Configurable jetTypeParticleLevel{"jetTypeParticleLevel", 1, "Type of stored jets. 0 = full, 1 = charged, 2 = neutral"}; @@ -146,7 +148,7 @@ struct JetFinderHFTask { // function that generalically processes Data and reco level events template - void analyseCharged(T const& collision, U const& tracks, V const& candidate, M& jetsTableInput, N& constituentsTableInput, O& originalTracks) + void analyseCharged(T const& collision, U const& tracks, V const& candidate, M& jetsTableInput, N& constituentsTableInput, O& originalTracks, float minJetPt, float maxJetPt) { if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) { return; @@ -169,12 +171,12 @@ struct JetFinderHFTask { } else { jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, std::optional{candidate}); } - jetfindingutilities::findJets(jetFinder, inputParticles, jetRadius, jetAreaFractionMin, collision, jetsTableInput, constituentsTableInput, true); + jetfindingutilities::findJets(jetFinder, inputParticles, minJetPt, maxJetPt, jetRadius, jetAreaFractionMin, collision, jetsTableInput, constituentsTableInput, true); } // function that generalically processes gen level events template - void analyseMCP(T const& collision, U const& particles, V const& candidate, int jetTypeParticleLevel) + void analyseMCP(T const& collision, U const& particles, V const& candidate, int jetTypeParticleLevel, float minJetPt, float maxJetPt) { if (rejectIncorrectDecaysMCP && !jethfutilities::isMatchedHFCandidate(candidate)) { // is this even needed in the new derived format? it means any simulations run have to force the decay channel return; @@ -185,7 +187,7 @@ struct JetFinderHFTask { return; } jetfindingutilities::analyseParticles(inputParticles, particleSelection, jetTypeParticleLevel, particles, pdgDatabase, std::optional{candidate}); - jetfindingutilities::findJets(jetFinder, inputParticles, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable, true); + jetfindingutilities::findJets(jetFinder, inputParticles, minJetPt, maxJetPt, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable, true); } void processDummy(JetCollisions const& collisions) @@ -196,7 +198,7 @@ struct JetFinderHFTask { void processChargedJetsData(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, CandidateTableData const& candidates) { for (typename CandidateTableData::iterator const& candidate : candidates) { // why can the type not be auto? try const auto - analyseCharged(collision, tracks, candidate, jetsTable, constituentsTable, tracks); + analyseCharged(collision, tracks, candidate, jetsTable, constituentsTable, tracks, jetPtMin, jetPtMax); } } PROCESS_SWITCH(JetFinderHFTask, processChargedJetsData, "charged hf jet finding on data", false); @@ -204,7 +206,7 @@ struct JetFinderHFTask { void processChargedEvtWiseSubJetsData(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, CandidateTableData const& candidates) { for (typename CandidateTableData::iterator const& candidate : candidates) { - analyseCharged(collision, jethfutilities::slicedPerCandidate(tracks, candidate, perD0Candidate, perLcCandidate, perBplusCandidate), candidate, jetsEvtWiseSubTable, constituentsEvtWiseSubTable, tracks); + analyseCharged(collision, jethfutilities::slicedPerCandidate(tracks, candidate, perD0Candidate, perLcCandidate, perBplusCandidate), candidate, jetsEvtWiseSubTable, constituentsEvtWiseSubTable, tracks, jetEWSPtMin, jetEWSPtMax); } } PROCESS_SWITCH(JetFinderHFTask, processChargedEvtWiseSubJetsData, "charged hf jet finding on data with event-wise constituent subtraction", false); @@ -212,7 +214,7 @@ struct JetFinderHFTask { void processChargedJetsMCD(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, CandidateTableMCD const& candidates) { for (typename CandidateTableMCD::iterator const& candidate : candidates) { - analyseCharged(collision, tracks, candidate, jetsTable, constituentsTable, tracks); + analyseCharged(collision, tracks, candidate, jetsTable, constituentsTable, tracks, jetPtMin, jetPtMax); } } PROCESS_SWITCH(JetFinderHFTask, processChargedJetsMCD, "charged hf jet finding on MC detector level", false); @@ -220,7 +222,7 @@ struct JetFinderHFTask { void processChargedEvtWiseSubJetsMCD(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, CandidateTableMCD const& candidates) { for (typename CandidateTableMCD::iterator const& candidate : candidates) { - analyseCharged(collision, jethfutilities::slicedPerCandidate(tracks, candidate, perD0Candidate, perLcCandidate, perBplusCandidate), candidate, jetsEvtWiseSubTable, constituentsEvtWiseSubTable, tracks); + analyseCharged(collision, jethfutilities::slicedPerCandidate(tracks, candidate, perD0Candidate, perLcCandidate, perBplusCandidate), candidate, jetsEvtWiseSubTable, constituentsEvtWiseSubTable, tracks, jetEWSPtMin, jetEWSPtMax); } } PROCESS_SWITCH(JetFinderHFTask, processChargedEvtWiseSubJetsMCD, "charged hf jet finding on MC detector level with event-wise constituent subtraction", false); @@ -230,7 +232,7 @@ struct JetFinderHFTask { CandidateTableMCP const& candidates) { for (typename CandidateTableMCP::iterator const& candidate : candidates) { - analyseMCP(collision, particles, candidate, 1); + analyseMCP(collision, particles, candidate, 1, jetPtMin, jetPtMax); } } PROCESS_SWITCH(JetFinderHFTask, processChargedJetsMCP, "hf jet finding on MC particle level", false); diff --git a/PWGJE/TableProducer/emcalCorrectionTask.cxx b/PWGJE/TableProducer/emcalCorrectionTask.cxx index dd3fed739cf..3b64374ed40 100644 --- a/PWGJE/TableProducer/emcalCorrectionTask.cxx +++ b/PWGJE/TableProducer/emcalCorrectionTask.cxx @@ -34,6 +34,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" #include "DataFormatsEMCAL/Cell.h" +#include "DataFormatsEMCAL/CellLabel.h" #include "DataFormatsEMCAL/Constants.h" #include "DataFormatsEMCAL/AnalysisCluster.h" #include "EMCALBase/Geometry.h" @@ -55,6 +56,7 @@ using filteredMCCells = o2::soa::Filtered; struct EmcalCorrectionTask { Produces clusters; + Produces mcclusters; Produces clustersAmbiguous; Produces clustercells; // cells belonging to given cluster Produces clustercellsambiguous; @@ -101,6 +103,7 @@ struct EmcalCorrectionTask { o2::emcal::NonlinearityHandler mNonlinearityHandler; // Cells and clusters std::vector mAnalysisClusters; + std::vector mClusterLabels; std::vector mClusterDefinitions; // QA @@ -355,6 +358,7 @@ struct EmcalCorrectionTask { countBC(collisionsInFoundBC.size(), true); std::vector cellsBC; std::vector cellIndicesBC; + std::vector cellLabels; for (auto& cell : cellsInBC) { mHistManager.fill(HIST("hContributors"), cell.mcParticle_as().size()); auto cellParticles = cell.mcParticle_as(); @@ -370,6 +374,7 @@ struct EmcalCorrectionTask { cell.time(), o2::emcal::intToChannelType(cell.cellType())); cellIndicesBC.emplace_back(cell.globalIndex()); + cellLabels.emplace_back(cell.mcParticleIds(), cell.amplitudeA()); } LOG(detail) << "Number of cells for BC (CF): " << cellsBC.size(); nCellsProcessed += cellsBC.size(); @@ -387,7 +392,7 @@ struct EmcalCorrectionTask { // Run the clusterizers LOG(debug) << "Running clusterizers"; for (size_t iClusterizer = 0; iClusterizer < mClusterizers.size(); iClusterizer++) { - cellsToCluster(iClusterizer, cellsBC); + cellsToCluster(iClusterizer, cellsBC, cellLabels); if (collisionsInFoundBC.size() == 1) { // dummy loop to get the first collision @@ -420,7 +425,6 @@ struct EmcalCorrectionTask { } FillAmbigousClusterTable(bc, iClusterizer, cellIndicesBC, hasCollision); } - LOG(debug) << "Cluster loop done for clusterizer " << iClusterizer; } // end of clusterizer loop LOG(debug) << "Done with process BC."; @@ -512,7 +516,7 @@ struct EmcalCorrectionTask { } PROCESS_SWITCH(EmcalCorrectionTask, processStandalone, "run stand alone analysis", false); - void cellsToCluster(size_t iClusterizer, const gsl::span cellsBC) + void cellsToCluster(size_t iClusterizer, const gsl::span cellsBC, std::optional> cellLabels = std::nullopt) { mClusterizers.at(iClusterizer)->findClusters(cellsBC); @@ -524,15 +528,21 @@ struct EmcalCorrectionTask { // First, the cluster factory requires cluster and cell information in order // to build the clusters. mAnalysisClusters.clear(); + mClusterLabels.clear(); mClusterFactories.reset(); - mClusterFactories.setContainer(*emcalClusters, cellsBC, *emcalClustersInputIndices); + if (cellLabels) { + mClusterFactories.setContainer(*emcalClusters, cellsBC, *emcalClustersInputIndices, cellLabels); + } else { + mClusterFactories.setContainer(*emcalClusters, cellsBC, *emcalClustersInputIndices); + } LOG(debug) << "Cluster factory set up."; // Convert to analysis clusters. - for (int icl = 0; icl < mClusterFactories.getNumberOfClusters(); - icl++) { - auto analysisCluster = mClusterFactories.buildCluster(icl); + for (int icl = 0; icl < mClusterFactories.getNumberOfClusters(); icl++) { + o2::emcal::ClusterLabel clusterLabel; + auto analysisCluster = mClusterFactories.buildCluster(icl, &clusterLabel); mAnalysisClusters.emplace_back(analysisCluster); + mClusterLabels.push_back(clusterLabel); LOG(debug) << "Cluster " << icl << ": E: " << analysisCluster.E() << ", NCells " << analysisCluster.getNCells(); } @@ -544,6 +554,9 @@ struct EmcalCorrectionTask { { // we found a collision, put the clusters into the none ambiguous table clusters.reserve(mAnalysisClusters.size()); + if (mClusterLabels.size() > 0) { + mcclusters.reserve(mClusterLabels.size()); + } int cellindex = -1; unsigned int iCluster = 0; for (const auto& cluster : mAnalysisClusters) { @@ -574,7 +587,9 @@ struct EmcalCorrectionTask { cluster.getClusterTime(), cluster.getIsExotic(), cluster.getDistanceToBadChannel(), cluster.getNExMax(), static_cast(mClusterDefinitions.at(iClusterizer))); - + if (mClusterLabels.size() > 0) { + mcclusters(mClusterLabels[iCluster].getLabels(), mClusterLabels[iCluster].getEnergyFractions()); + } clustercells.reserve(cluster.getNCells()); // loop over cells in cluster and save to table for (int ncell = 0; ncell < cluster.getNCells(); ncell++) { diff --git a/PWGJE/TableProducer/jetderiveddatawriter.cxx b/PWGJE/TableProducer/jetderiveddatawriter.cxx index 4d63efd567e..3c6e4e3fae1 100644 --- a/PWGJE/TableProducer/jetderiveddatawriter.cxx +++ b/PWGJE/TableProducer/jetderiveddatawriter.cxx @@ -88,7 +88,6 @@ struct JetDerivedDataWriter { std::vector collisionFlag; std::vector McCollisionFlag; std::vector bcIndicies; - std::map bcMapping; uint32_t precisionPositionMask; uint32_t precisionMomentumMask; @@ -169,6 +168,7 @@ struct JetDerivedDataWriter { void processData(soa::Join::iterator const& collision, soa::Join const& bcs, soa::Join const& tracks, soa::Join const& clusters, aod::HfD0CollBases const& D0Collisions, CandidatesD0Data const& D0s) { + std::map bcMapping; std::map trackMapping; if (collisionFlag[collision.globalIndex()]) { @@ -254,7 +254,7 @@ struct JetDerivedDataWriter { void processMC(soa::Join const& mcCollisions, soa::Join const& collisions, soa::Join const& bcs, soa::Join const& tracks, soa::Join const& clusters, soa::Join const& particles, aod::HfD0CollBases const& D0Collisions, CandidatesD0MCD const& D0s, soa::Join const& D0Particles) { - + std::map bcMapping; std::map paticleMapping; std::map mcCollisionMapping; int particleTableIndex = 0; diff --git a/PWGJE/TableProducer/jettaggerhf.cxx b/PWGJE/TableProducer/jettaggerhf.cxx index 2eed8520d8b..5109e3de5da 100644 --- a/PWGJE/TableProducer/jettaggerhf.cxx +++ b/PWGJE/TableProducer/jettaggerhf.cxx @@ -14,11 +14,15 @@ /// \author Nima Zardoshti /// \author Hanseo Park +#include +#include + #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoA.h" #include "Framework/O2DatabasePDGPlugin.h" #include "Framework/runDataProcessing.h" +#include "Common/Core/trackUtilities.h" #include "PWGJE/DataModel/Jet.h" #include "PWGJE/DataModel/JetTagging.h" @@ -38,48 +42,80 @@ struct JetTaggerHFTask { Configurable doWShower{"doWShower", false, "find jet origin included gluon spliting"}; // true:: remove gluon spliting Configurable doTC{"doTC", false, "fill table for track counting algorithm"}; Configurable doSV{"doSV", false, "fill table for secondary vertex algorithm"}; - Configurable doML{"doML", false, "fill table for machine learning"}; Configurable maxDeltaR{"maxDeltaR", 0.25, "maximum distance of jet axis from flavour initiating parton"}; + using JetTagTracksData = soa::Join; + using JetTagTracksMCD = soa::Join; + using OriTracksData = soa::Join; + using OriTracksMCD = soa::Join; + void processDummy(JetCollisions const& collision) { } PROCESS_SWITCH(JetTaggerHFTask, processDummy, "Dummy process", true); - void processData(JetCollision const& collision, JetTableData const& jets, aod::JTracks const& tracks) + void processData(JetCollision const& collision, JetTableData const& jets, JetTagTracksData const& jtracks, OriTracksData const& tracks) { for (auto& jet : jets) { - - int algorithm1 = jet.globalIndex(); // This needs to be changed. It is only done because O2Physics compilation breaks if jet is unused + float jetProb = 0; int algorithm2 = 0; int algorithm3 = 0; - // if (doTC) algorithm1 = jettaggingutilities::Algorithm1((mcdjet, tracks); + TF1* fSignImpXYSig = jettaggingutilities::getResolutionFunction(0); + if (doTC) { + jetProb = jettaggingutilities::getJetProbability(fSignImpXYSig, collision, jet, jtracks, tracks); + } // if (doSV) algorithm2 = jettaggingutilities::Algorithm2((mcdjet, tracks); - // if (doML) algorithm3 = jettaggingutilities::Algorithm3((mcdjet, tracks); - taggingTableData(0, algorithm1, algorithm2, algorithm3); + taggingTableData(0, jetProb, algorithm2, algorithm3); } } PROCESS_SWITCH(JetTaggerHFTask, processData, "Fill tagging decision for data jets", false); - void processMCD(JetCollision const& collision, JetTableMCD const& mcdjets, JetTracksMCD const& tracks, JetParticles const& particles) + void processMCD(JetCollision const& collision, JetTableMCD const& mcdjets, JetTagTracksMCD const& jtracks, OriTracksMCD const& tracks, JetParticles const& particles) { for (auto& mcdjet : mcdjets) { - typename JetTracksMCD::iterator hftrack; + typename JetTagTracksMCD::iterator hftrack; int origin = 0; if (!doWShower) - origin = jettaggingutilities::mcdJetFromHFShower(mcdjet, tracks, particles, maxDeltaR); // TODO: it is not working due to getOriginalMotherIndex + origin = jettaggingutilities::mcdJetFromHFShower(mcdjet, jtracks, particles, maxDeltaR); else - origin = jettaggingutilities::jetTrackFromHFShower(mcdjet, tracks, particles, hftrack); - int algorithm1 = 0; + origin = jettaggingutilities::jetTrackFromHFShower(mcdjet, jtracks, particles, hftrack); + float jetProb = 0; int algorithm2 = 0; int algorithm3 = 0; - // if (doTC) algorithm1 = jettaggingutilities::Algorithm1((mcdjet, tracks); + TF1* fSignImpXYSig = jettaggingutilities::getResolutionFunction(origin); + if (doTC) { + jetProb = jettaggingutilities::getJetProbability(fSignImpXYSig, collision, mcdjet, jtracks, tracks); + } // if (doSV) algorithm2 = jettaggingutilities::Algorithm2((mcdjet, tracks); - // if (doML) algorithm3 = jettaggingutilities::Algorithm3((mcdjet, tracks); - taggingTableMCD(origin, algorithm1, algorithm2, algorithm3); + taggingTableMCD(origin, jetProb, algorithm2, algorithm3); } } PROCESS_SWITCH(JetTaggerHFTask, processMCD, "Fill tagging decision for mcd jets", false); + + void processTraining(JetCollision const& collision, JetTableMCD const& mcdjets, JetTagTracksMCD const& tracks) + { + // To create table for ML + } + PROCESS_SWITCH(JetTaggerHFTask, processTraining, "Fill tagging decision for mcd jets", false); +}; + +struct JetTaggerHFExtTask { + + Produces jTracksTagTable; + + void init(InitContext const&) + { + } + + void processTracks(soa::Join::iterator const& track) + { + float dcaXYZ = 0; + float sigmaDcaXYZ2 = 0; + + jettaggingutilities::calculateDcaXYZ(dcaXYZ, sigmaDcaXYZ2, track.dcaXY(), track.dcaZ(), track.cYY(), track.cZY(), track.cZZ(), track.sigmaDcaXY2(), track.sigmaDcaZ2()); + jTracksTagTable(dcaXYZ, sigmaDcaXYZ2); + } + PROCESS_SWITCH(JetTaggerHFExtTask, processTracks, "produces derived track table for tagging", true); }; using JetTaggerChargedJets = JetTaggerHFTask, soa::Join, aod::ChargedJetTags, aod::ChargedMCDetectorLevelJetTags>; @@ -91,6 +127,10 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) std::vector tasks; + tasks.emplace_back( + adaptAnalysisTask(cfgc, + SetDefaultProcesses{}, TaskName{"jet-taggerhf-extension"})); + tasks.emplace_back( adaptAnalysisTask(cfgc, SetDefaultProcesses{}, TaskName{"jet-taggerhf-charged"})); diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index fd2cbd5b155..00b918497f7 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -124,4 +124,8 @@ if(FastJet_FOUND) SOURCES jetLundReclustering.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore FastJet::FastJet FastJet::Contrib COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-hf-fragmentation + SOURCES hffragmentationfunction.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore + COMPONENT_NAME Analysis) endif() diff --git a/PWGJE/Tasks/hffragmentationfunction.cxx b/PWGJE/Tasks/hffragmentationfunction.cxx new file mode 100644 index 00000000000..d1e16904d6c --- /dev/null +++ b/PWGJE/Tasks/hffragmentationfunction.cxx @@ -0,0 +1,153 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// charm lambda/d0 ratio hadronization task +// +/// \author Christian Reckziegel +// +#include "TVector3.h" + +#include "fastjet/PseudoJet.hh" +#include "fastjet/ClusterSequenceArea.hh" + +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoA.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/HistogramRegistry.h" + +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" + +#include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetSubstructure.h" +#include "PWGJE/Core/JetFinder.h" +#include "PWGJE/Core/FastJetUtilities.h" +#include "PWGJE/Core/JetHFUtilities.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +// creating table for storing distance data +namespace o2::aod +{ +namespace DistanceSpace +{ +DECLARE_SOA_COLUMN(JetHfDist, jethfdist, float); +DECLARE_SOA_COLUMN(JetPt, jetpt, float); +DECLARE_SOA_COLUMN(JetEta, jeteta, float); +DECLARE_SOA_COLUMN(JetPhi, jetphi, float); +DECLARE_SOA_COLUMN(HfPt, hfpt, float); +DECLARE_SOA_COLUMN(HfEta, hfeta, float); +DECLARE_SOA_COLUMN(HfPhi, hfphi, float); +DECLARE_SOA_COLUMN(HfMass, hfmass, float); +DECLARE_SOA_COLUMN(HfY, hfy, float); +} // namespace DistanceSpace +DECLARE_SOA_TABLE(JetDistanceTable, "AOD", "JETDISTTABLE", + DistanceSpace::JetHfDist, + DistanceSpace::JetPt, + DistanceSpace::JetEta, + DistanceSpace::JetPhi, + DistanceSpace::HfPt, + DistanceSpace::HfEta, + DistanceSpace::HfPhi, + DistanceSpace::HfMass, + DistanceSpace::HfY); +} // namespace o2::aod + +// NB: runDataProcessing.h must be included after customize! +#include "Framework/runDataProcessing.h" + +struct HfFragmentationFunctionTask { + // producing new table + Produces distJetTable; + + // Histogram registry: an object to hold your histograms + HistogramRegistry registry{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(InitContext const&) + { + + // create histograms + // D0 candidate histograms + registry.add("h_jet_counter", ";# jets;", {HistType::kTH1F, {{2, 0., 1.}}}); + registry.add("h_d0_jet_projection", ";z^{D^{0},jet}_{||};dN/dz^{D^{0},jet}_{||}", {HistType::kTH1F, {{1000, 0., 10.}}}); + registry.add("h_d0_jet_distance_vs_projection", ";#DeltaR_{D^{0},jet};z^{D^{0},jet}_{||}", {HistType::kTH2F, {{1000, 0., 10.}, {1000, 0., 10.}}}); + registry.add("h_d0_jet_distance", ";#DeltaR_{D^{0},jet};dN/d(#DeltaR)", {HistType::kTH1F, {{1000, 0., 10.}}}); + registry.add("h_d0_jet_pt", ";p_{T,D^{0} jet};dN/dp_{T,D^{0} jet}", {HistType::kTH1F, {{200, 0., 10.}}}); + registry.add("h_d0_jet_eta", ";#eta_{T,D^{0} jet};dN/d#eta_{D^{0} jet}", {HistType::kTH1F, {{250, -5., 5.}}}); + registry.add("h_d0_jet_phi", ";#phi_{T,D^{0} jet};dN/d#phi_{D^{0} jet}", {HistType::kTH1F, {{250, -10., 10.}}}); + registry.add("h_d0_mass", ";m_{D^{0}} (GeV/c^{2});dN/dm_{D^{0}}", {HistType::kTH1F, {{1000, 0., 10.}}}); + registry.add("h_d0_eta", ";#eta_{D^{0}} (GeV/c^{2});dN/d#eta_{D^{0}}", {HistType::kTH1F, {{250, -5., 5.}}}); + registry.add("h_d0_phi", ";#phi_{D^{0}} (GeV/c^{2});dN/d#phi_{D^{0}}", {HistType::kTH1F, {{250, -10., 10.}}}); + } + + void processDummy(aod::TracksIU const& tracks) {} + PROCESS_SWITCH(HfFragmentationFunctionTask, processDummy, "Dummy process function turned on by default", false); + + void processDataChargedSubstructure(JetCollision const& collision, + soa::Join const& jets, + JetTracks const& tracks, + CandidatesD0Data const& d0cands) + { + // CandidatesLcData const& lccands) { + + double axisDistance = 0; + + for (auto& jet : jets) { + // fill jet counter histogram + registry.fill(HIST("h_jet_counter"), 0.5); + // obtaining jet 3-vector + TVector3 jetVector(jet.px(), jet.py(), jet.pz()); + + for (auto& d0Candidate : jet.hfcandidates_as()) { // for jet constituents use -> auto& jetConstituent : jet.tracks_as() + + // obtaining jet 3-vector + TVector3 d0Vector(d0Candidate.px(), d0Candidate.py(), d0Candidate.pz()); + // calculating fraction of the jet momentum carried by the D0 along the direction of the jet axis + double z_parallel = (jetVector * d0Vector) / (jetVector * jetVector); + + // calculating angular distance in eta-phi plane + axisDistance = sqrt(pow(jet.eta() - d0Candidate.eta(), 2) + pow(jet.phi() - d0Candidate.phi(), 2)); + + // filling histograms + registry.fill(HIST("h_d0_jet_projection"), z_parallel); + registry.fill(HIST("h_d0_jet_distance_vs_projection"), axisDistance, z_parallel); + registry.fill(HIST("h_d0_jet_distance"), axisDistance); + registry.fill(HIST("h_d0_jet_pt"), jet.pt()); + registry.fill(HIST("h_d0_jet_eta"), jet.eta()); + registry.fill(HIST("h_d0_jet_phi"), jet.phi()); + registry.fill(HIST("h_d0_mass"), d0Candidate.m()); + registry.fill(HIST("h_d0_eta"), d0Candidate.eta()); + registry.fill(HIST("h_d0_phi"), d0Candidate.phi()); + // filling table + distJetTable(axisDistance, jet.pt(), jet.eta(), jet.phi(), d0Candidate.pt(), d0Candidate.eta(), d0Candidate.phi(), d0Candidate.m(), d0Candidate.y()); + break; // get out of candidates' loop after first HF particle is found in jet + } // end of D0 candidates loop + + } // end of jets loop + + } // end of process function + PROCESS_SWITCH(HfFragmentationFunctionTask, processDataChargedSubstructure, "charged HF jet substructure", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"jet-charm-hadronization"})}; +} diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 49184948880..8639e4d2d0e 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -139,7 +139,7 @@ struct hJetAnalysis { n_TT++; } if (!is_sig_col && track.pt() < pt_TTref_max && track.pt() > pt_TTref_min) { - phi_TT_ar.push_back(track.pt()); + phi_TT_ar.push_back(track.phi()); n_TT++; } registry.fill(HIST("hPtTrack"), track.pt()); @@ -222,7 +222,7 @@ struct hJetAnalysis { n_TT++; } if (!is_sig_col && particle.pt() < pt_TTref_max && particle.pt() > pt_TTref_min) { - phi_TT_ar.push_back(particle.pt()); + phi_TT_ar.push_back(particle.phi()); n_TT++; } registry.fill(HIST("hPtPart"), particle.pt()); diff --git a/PWGJE/Tasks/jetfinderfullQA.cxx b/PWGJE/Tasks/jetfinderfullQA.cxx index c4d0d341c91..f943fc1c449 100644 --- a/PWGJE/Tasks/jetfinderfullQA.cxx +++ b/PWGJE/Tasks/jetfinderfullQA.cxx @@ -61,13 +61,13 @@ struct JetFinderFullQATask { // cluster level configurables Configurable clusterDefinitionS{"clusterDefinition", "kV3Default", "cluster definition to be selected, e.g. V3Default"}; - Configurable clusterEtaMin{"clusterEtaMin", -0.7, "minimum cluster eta"}; // For ECMAL: |eta| < 0.7, phi = 1.40 - 3.26 - Configurable clusterEtaMax{"clusterEtaMax", 0.7, "maximum cluster eta"}; // For ECMAL: |eta| < 0.7, phi = 1.40 - 3.26 - Configurable clusterPhiMin{"clusterPhiMin", -999, "minimum cluster phi"}; - Configurable clusterPhiMax{"clusterPhiMax", 999, "maximum cluster phi"}; + Configurable clusterEtaMin{"clusterEtaMin", -0.71, "minimum cluster eta"}; // For ECMAL: |eta| < 0.7, phi = 1.40 - 3.26 + Configurable clusterEtaMax{"clusterEtaMax", 0.71, "maximum cluster eta"}; // For ECMAL: |eta| < 0.7, phi = 1.40 - 3.26 + Configurable clusterPhiMin{"clusterPhiMin", 1.39, "minimum cluster phi"}; + Configurable clusterPhiMax{"clusterPhiMax", 3.27, "maximum cluster phi"}; Configurable clusterEnergyMin{"clusterEnergyMin", 0.5, "minimum cluster energy in EMCAL (GeV)"}; - Configurable clusterTimeMin{"clusterTimeMin", -999., "minimum Cluster time (ns)"}; - Configurable clusterTimeMax{"clusterTimeMax", 999., "maximum Cluster time (ns)"}; + Configurable clusterTimeMin{"clusterTimeMin", -25., "minimum Cluster time (ns)"}; + Configurable clusterTimeMax{"clusterTimeMax", 25., "maximum Cluster time (ns)"}; Configurable clusterRejectExotics{"clusterRejectExotics", true, "Reject exotic clusters"}; Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; diff --git a/PWGJE/Tasks/jetfragmentation.cxx b/PWGJE/Tasks/jetfragmentation.cxx index df3282261b1..ebe2915308e 100644 --- a/PWGJE/Tasks/jetfragmentation.cxx +++ b/PWGJE/Tasks/jetfragmentation.cxx @@ -105,7 +105,7 @@ struct JetFragmentation { ConfigurableAxis trackCount{"trackCount", {1000, -.5f, 999.5f}, ""}; ConfigurableAxis v0Count{"v0Count", {50, -.5f, 49.5f}, ""}; - ConfigurableAxis binV0Pt{"binV0Pt", {600, 0.0f, 60.0f}, ""}; + ConfigurableAxis binV0Pt{"binV0Pt", {120, 0.0f, 60.0f}, ""}; ConfigurableAxis binV0Eta{"binV0Eta", {20, -1.f, 1.f}, ""}; ConfigurableAxis binV0Phi{"binV0Phi", {18 * 8, 0.f, 2. * TMath::Pi()}, ""}; ConfigurableAxis binV0Ctau{"binV0Ctau", {200, 0.0f, 40.0f}, ""}; @@ -1384,10 +1384,12 @@ struct JetFragmentation { for (const auto& track : detJet.tracks_as()) { bool isTrackMatched = false; + if (!track.has_mcParticle()) { + isFake = true; + fillMatchingFakeOrMiss(detJet, track, isFake, weight); + continue; + } for (const auto& particle : partJet.tracks_as()) { - if (!track.has_mcParticle()) { - continue; - } if (particle.globalIndex() == track.template mcParticle_as().globalIndex()) { isTrackMatched = true; fillMatchingHistogramsConstituent(detJet, partJet, track, particle, weight); @@ -1524,10 +1526,12 @@ struct JetFragmentation { isV0Used[iv0] = true; if (!v0.has_mcParticle()) { fillMatchingV0Fake(collision, detJet, v0, weight); + continue; } const auto& particle = v0.template mcParticle_as(); if (!((particle.pdgCode() == 310) || (particle.pdgCode() == 3122) || (particle.pdgCode() == -3122))) { fillMatchingV0Fake(collision, detJet, v0, weight); + continue; } // Found a matched V0 in the jet // TODO: How to count nK0SinJet, nLambdainJet, nAntiLambdainJet? Use pdg or v0 identification? @@ -1570,8 +1574,8 @@ struct JetFragmentation { isParticleUsed[iparticle] = true; continue; } + // If the particle has been used or it is not a particle of interest, skip it if (isParticleUsed[iparticle]) { - isParticleUsed[iparticle] = true; continue; } if (jetutilities::deltaR(partJet, particle) >= partJet.r() * 1e-2) { @@ -1582,6 +1586,7 @@ struct JetFragmentation { if (!partJet.has_matchedJetGeo()) { isParticleUsed[iparticle] = true; fillMatchingV0Miss(partJet, particle, weight); + continue; } for (const auto& detJet : partJet.template matchedJetGeo_as()) { for (const auto& v0 : v0s) { diff --git a/PWGJE/Tasks/jetsubstructurehfoutput.cxx b/PWGJE/Tasks/jetsubstructurehfoutput.cxx index 341355ebb2e..5cc34d42ae9 100644 --- a/PWGJE/Tasks/jetsubstructurehfoutput.cxx +++ b/PWGJE/Tasks/jetsubstructurehfoutput.cxx @@ -245,15 +245,24 @@ struct JetSubstructureHFOutputTask { } } - void processDummy(JetCollisions const& collisions) {} - PROCESS_SWITCH(JetSubstructureHFOutputTask, processDummy, "Dummy process function turned on by default", true); + void processClearMaps(JetCollisions const& collisions) + { + + candidateMapping.clear(); + candidateCollisionMapping.clear(); + candidateMappingMCP.clear(); + jetMappingData.clear(); + jetMappingDataSub.clear(); + jetMappingMCD.clear(); + jetMappingMCP.clear(); + } + PROCESS_SWITCH(JetSubstructureHFOutputTask, processClearMaps, "process function that clears all the maps in each dataframe", true); void processOutputCandidatesData(JetCollision const& collision, JetTableData const& jets, CandidateCollisionTable const& canidateCollisions, CandidateTable const& candidates) { - analyseCandidates(jets, canidateCollisions, candidates, candidateMapping, jetPtMinData); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCandidatesData, "hf candidate and collision output data", false); @@ -263,7 +272,6 @@ struct JetSubstructureHFOutputTask { CandidateCollisionTable const& canidateCollisions, CandidateTable const& candidates) { - analyseCandidates(jets, canidateCollisions, candidates, candidateMapping, jetPtMinDataSub); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCandidatesDataSub, "hf candidate and collision output data eventwise constituent subtracted", false); diff --git a/PWGJE/Tasks/jetsubstructureoutput.cxx b/PWGJE/Tasks/jetsubstructureoutput.cxx index 321cc685be6..e8501c7af8c 100644 --- a/PWGJE/Tasks/jetsubstructureoutput.cxx +++ b/PWGJE/Tasks/jetsubstructureoutput.cxx @@ -168,8 +168,14 @@ struct JetSubstructureOutputTask { } } - void processDummy(JetCollisions const& collisions) {} - PROCESS_SWITCH(JetSubstructureOutputTask, processDummy, "Dummy process function turned on by default", true); + void processClearMaps(JetCollisions const& collisions) + { + jetMappingData.clear(); + jetMappingDataSub.clear(); + jetMappingMCD.clear(); + jetMappingMCP.clear(); + } + PROCESS_SWITCH(JetSubstructureOutputTask, processClearMaps, "process function that clears all the maps in each dataframe", true); void processOutputData(JetCollision const& collision, soa::Join const& jets) diff --git a/PWGJE/Tasks/jettaggerhfQA.cxx b/PWGJE/Tasks/jettaggerhfQA.cxx index a8ff99a37cb..8899a5b262a 100644 --- a/PWGJE/Tasks/jettaggerhfQA.cxx +++ b/PWGJE/Tasks/jettaggerhfQA.cxx @@ -40,8 +40,6 @@ template eventSelections{"eventSelections", "sel8", "choose event selection"}; - Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; @@ -49,20 +47,31 @@ struct JetTaggerHFQA { Configurable trackPtMax{"trackPtMax", 100.0, "maximum pT acceptance for tracks"}; Configurable jetEtaMin{"jetEtaMin", -99.0, "minimum jet pseudorapidity"}; Configurable jetEtaMax{"jetEtaMax", 99.0, "maximum jet pseudorapidity"}; + Configurable numFlavourSpecies{"numFlavourSpecies", 6, "number of jet flavour species"}; + Configurable numOrder{"numOrder", 6, "number of ordering"}; // Binning ConfigurableAxis binJetFlavour{"binJetFlavour", {6, -0.5, 5.5}, ""}; - ConfigurableAxis binJetPt{"binJetPt", {201, -0.5f, 200.5f}, ""}; + ConfigurableAxis binJetPt{"binJetPt", {200, 0., 200.}, ""}; ConfigurableAxis binEta{"binEta", {100, -1.f, 1.f}, ""}; ConfigurableAxis binPhi{"binPhi", {18 * 8, 0.f, 2. * TMath::Pi()}, ""}; - ConfigurableAxis binNtracks{"binNtracks", {100, -0.5, 99.5}, ""}; + ConfigurableAxis binNtracks{"binNtracks", {100, 0., 100.}, ""}; ConfigurableAxis binTrackPt{"binTrackPt", {200, 0.f, 100.f}, ""}; ConfigurableAxis binImpactParameterXY{"binImpactParameterXY", {801, -400.5f, 400.5f}, ""}; - ConfigurableAxis binImpactParameterXYSignificance{"binImpactParameterXYSignificance", {801, -40.5f, 40.5f}, ""}; // test + ConfigurableAxis binImpactParameterXYSignificance{"binImpactParameterXYSignificance", {801, -40.5f, 40.5f}, ""}; ConfigurableAxis binImpactParameterZ{"binImpactParameterZ", {801, -400.5f, 400.5f}, ""}; - ConfigurableAxis binImpactParameterZSignificance{"binImpactParameterZSignificance", {801, -40.5f, 40.5f}, ""}; // test + ConfigurableAxis binImpactParameterZSignificance{"binImpactParameterZSignificance", {801, -40.5f, 40.5f}, ""}; ConfigurableAxis binImpactParameterXYZ{"binImpactParameterXYZ", {2001, -1000.5f, 1000.5f}, ""}; - ConfigurableAxis binImpactParameterXYZSignificance{"binImpactParameterXYZSignificance", {2001, -1000.5f, 1000.5f}, ""}; + ConfigurableAxis binImpactParameterXYZSignificance{"binImpactParameterXYZSignificance", {2001, -100.5f, 100.5f}, ""}; + ConfigurableAxis binNumOrder{"binNumOrder", {6, 0.5, 6.5}, ""}; + ConfigurableAxis binJetProbability{"binJetProbability", {100, 0.f, 1.f}, ""}; + ConfigurableAxis binJetProbabilityLog{"binJetProbabilityLog", {100, 0.f, 10.f}, ""}; + ConfigurableAxis binLxy{"binLxy", {100, 0, 1.f}, ""}; + ConfigurableAxis binSxy{"binSxy", {100, 0, 100.f}, ""}; + ConfigurableAxis binLxyz{"binLxyz", {100, 0, 1.f}, ""}; + ConfigurableAxis binSxyz{"binSxyz", {100, 0, 100.f}, ""}; + ConfigurableAxis binSigmaLxy{"binSigmaLxy", {100, 0., 0.1}, ""}; + ConfigurableAxis binSigmaLxyz{"binSigmaLxyz", {100, 0., 0.1}, ""}; // Axis AxisSpec jetFlavourAxis = {binJetFlavour, "Jet flavour"}; @@ -77,40 +86,52 @@ struct JetTaggerHFQA { AxisSpec impactParameterZSignificanceAxis = {binImpactParameterZSignificance, "IPs_{Z}"}; AxisSpec impactParameterXYZAxis = {binImpactParameterXYZ, "IP_{XYZ} [#mum]"}; AxisSpec impactParameterXYZSignificanceAxis = {binImpactParameterXYZSignificance, "IPs_{XYZ}"}; - - int eventSelection = -1; - int trackSelection = -1; + AxisSpec numOrderAxis = {binNumOrder, "N_{order}"}; + AxisSpec JetProbabilityAxis = {binJetProbability, "JP"}; + AxisSpec JetProbabilityLogAxis = {binJetProbabilityLog, "-Log(JP)"}; + AxisSpec LxyAxis = {binLxy, "L_{XY} [cm]"}; + AxisSpec SxyAxis = {binSxy, "S_{XY}"}; + AxisSpec LxyzAxis = {binLxyz, "L_{XYZ} [cm]"}; + AxisSpec SxyzAxis = {binSxyz, "S_{XYZ}"}; + AxisSpec sigmaLxyAxis = {binSigmaLxy, "#simga_{L_{XY}} [cm]"}; + AxisSpec sigmaLxyzAxis = {binSigmaLxyz, "#simga_{L_{XYZ}} [cm]"}; + + int numberOfJetFlavourSpecies = 6; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(InitContext const&) { - eventSelection = jetderiveddatautilities::initialiseEventSelection(static_cast(eventSelections)); - trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); + numberOfJetFlavourSpecies = static_cast(numFlavourSpecies); if (doprocessIPsData) { registry.add("h3_jet_pt_track_pt_track_eta", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {etaAxis}}}); registry.add("h3_jet_pt_track_pt_track_phi", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {phiAxis}}}); - registry.add("h3_jet_pt_track_pt_impact_parameter_xy", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYAxis}}}); - registry.add("h3_jet_pt_track_pt_sign_impact_parameter_xy", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYAxis}}}); - registry.add("h3_jet_pt_track_pt_impact_parameter_xy_significance", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYSignificanceAxis}}}); + registry.add("h2_jet_pt_impact_parameter_xy", "", {HistType::kTH2F, {{jetPtAxis}, {impactParameterXYAxis}}}); + registry.add("h2_jet_pt_sign_impact_parameter_xy", "", {HistType::kTH2F, {{jetPtAxis}, {impactParameterXYAxis}}}); + registry.add("h2_jet_pt_impact_parameter_xy_significance", "", {HistType::kTH2F, {{jetPtAxis}, {impactParameterXYSignificanceAxis}}}); registry.add("h3_jet_pt_track_pt_sign_impact_parameter_xy_significance", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYSignificanceAxis}}}); - - registry.add("h3_jet_pt_track_pt_impact_parameter_z", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterZAxis}}}); - registry.add("h3_jet_pt_track_pt_sign_impact_parameter_z", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterZAxis}}}); - registry.add("h3_jet_pt_track_pt_impact_parameter_z_significance", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterZSignificanceAxis}}}); + registry.add("h2_jet_pt_impact_parameter_z", "", {HistType::kTH2F, {{jetPtAxis}, {impactParameterZAxis}}}); + registry.add("h2_jet_pt_sign_impact_parameter_z", "", {HistType::kTH2F, {{jetPtAxis}, {impactParameterZAxis}}}); + registry.add("h2_jet_pt_impact_parameter_z_significance", "", {HistType::kTH2F, {{jetPtAxis}, {impactParameterZSignificanceAxis}}}); registry.add("h3_jet_pt_track_pt_sign_impact_parameter_z_significance", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterZSignificanceAxis}}}); - registry.add("h3_jet_pt_track_pt_impact_parameter_xyz", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYZAxis}}}); - registry.add("h3_jet_pt_track_pt_sign_impact_parameter_xyz", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYZAxis}}}); - registry.add("h3_jet_pt_track_pt_impact_parameter_xyz_significance", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYZSignificanceAxis}}}); + registry.add("h2_jet_pt_impact_parameter_xyz", "", {HistType::kTH2F, {{jetPtAxis}, {impactParameterXYZAxis}}}); + registry.add("h2_jet_pt_sign_impact_parameter_xyz", "", {HistType::kTH2F, {{jetPtAxis}, {impactParameterXYZAxis}}}); + registry.add("h2_jet_pt_impact_parameter_xyz_significance", "", {HistType::kTH2F, {{jetPtAxis}, {impactParameterXYZSignificanceAxis}}}); registry.add("h3_jet_pt_track_pt_sign_impact_parameter_xyz_significance", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYZSignificanceAxis}}}); // TC - registry.add("h3_jet_pt_track_pt_sign_impact_parameter_xy_significance_N1", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYSignificanceAxis}}}); - registry.add("h3_jet_pt_track_pt_sign_impact_parameter_xy_significance_N2", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYSignificanceAxis}}}); - registry.add("h3_jet_pt_track_pt_sign_impact_parameter_xy_significance_N3", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {impactParameterXYSignificanceAxis}}}); + registry.add("h3_jet_pt_sign_impact_parameter_xy_significance_tc", "", {HistType::kTH3F, {{jetPtAxis}, {impactParameterXYSignificanceAxis}, {numOrderAxis}}}); + registry.add("h3_jet_pt_sign_impact_parameter_z_significance_tc", "", {HistType::kTH3F, {{jetPtAxis}, {impactParameterZSignificanceAxis}, {numOrderAxis}}}); + registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_tc", "", {HistType::kTH3F, {{jetPtAxis}, {impactParameterXYZSignificanceAxis}, {numOrderAxis}}}); + registry.add("h3_track_pt_sign_impact_parameter_xy_significance_tc", "", {HistType::kTH3F, {{trackPtAxis}, {impactParameterXYSignificanceAxis}, {numOrderAxis}}}); + registry.add("h3_track_pt_sign_impact_parameter_z_significance_tc", "", {HistType::kTH3F, {{trackPtAxis}, {impactParameterZSignificanceAxis}, {numOrderAxis}}}); + registry.add("h3_track_pt_sign_impact_parameter_xyz_significance_tc", "", {HistType::kTH3F, {{trackPtAxis}, {impactParameterXYZSignificanceAxis}, {numOrderAxis}}}); } if (doprocessIPsMCD) { + registry.add("h2_jet_pt_flavour", "", {HistType::kTH2F, {{jetPtAxis}, {jetFlavourAxis}}}); + registry.add("h2_jet_eta_flavour", "", {HistType::kTH2F, {{jetPtAxis}, {jetFlavourAxis}}}); + registry.add("h2_jet_phi_flavour", "", {HistType::kTH2F, {{jetPtAxis}, {jetFlavourAxis}}}); registry.add("h3_jet_pt_track_pt_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {trackPtAxis}, {jetFlavourAxis}}}); registry.add("h3_jet_pt_track_eta_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {etaAxis}, {jetFlavourAxis}}}); registry.add("h3_jet_pt_track_phi_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {phiAxis}, {jetFlavourAxis}}}); @@ -150,29 +171,80 @@ struct JetTaggerHFQA { registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N1", "", {HistType::kTH3F, {{jetPtAxis}, {impactParameterXYZSignificanceAxis}, {jetFlavourAxis}}}); registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N2", "", {HistType::kTH3F, {{jetPtAxis}, {impactParameterXYZSignificanceAxis}, {jetFlavourAxis}}}); registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N3", "", {HistType::kTH3F, {{jetPtAxis}, {impactParameterXYZSignificanceAxis}, {jetFlavourAxis}}}); + registry.add("h3_sign_impact_parameter_xy_significance_tc_flavour", "", {HistType::kTH3F, {{impactParameterXYSignificanceAxis}, {numOrderAxis}, {jetFlavourAxis}}}); + registry.add("h3_sign_impact_parameter_z_significance_tc_flavour", "", {HistType::kTH3F, {{impactParameterZSignificanceAxis}, {numOrderAxis}, {jetFlavourAxis}}}); + registry.add("h3_sign_impact_parameter_xyz_significance_tc_flavour", "", {HistType::kTH3F, {{impactParameterXYZSignificanceAxis}, {numOrderAxis}, {jetFlavourAxis}}}); + } + if (doprocessJP) { + registry.add("h3_jet_pt_JP_flavour", "jet pt jet probability flavour", {HistType::kTH3F, {{jetPtAxis}, {JetProbabilityAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_neg_log_JP_flavour", "jet pt jet probability flavour", {HistType::kTH3F, {{jetPtAxis}, {JetProbabilityLogAxis}, {jetFlavourAxis}}}); + } + if (doprocessSV2ProngMCD) { + registry.add("h3_jet_pt_2prong_Lxy_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {LxyAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_2prong_Sxy_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {SxyAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_2prong_Lxyz_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {LxyzAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_2prong_Sxyz_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {SxyzAxis}, {jetFlavourAxis}}}); + registry.add("h3_2prong_Sxy_sigmaLxy_flavour", "", {HistType::kTH3F, {{SxyAxis}, {sigmaLxyAxis}, {jetFlavourAxis}}}); + registry.add("h3_2prong_Sxyz_sigmaLxyz_flavour", "", {HistType::kTH3F, {{SxyzAxis}, {sigmaLxyzAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_2prong_sigmaLxy_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {sigmaLxyAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_2prong_sigmaLxyz_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {sigmaLxyzAxis}, {jetFlavourAxis}}}); + } + if (doprocessSV3ProngMCD) { + registry.add("h3_jet_pt_3prong_Lxy_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {LxyAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_3prong_Sxy_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {SxyAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_3prong_Lxyz_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {LxyzAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_3prong_Sxyz_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {SxyzAxis}, {jetFlavourAxis}}}); + registry.add("h3_3prong_Sxy_sigmaLxy_flavour", "", {HistType::kTH3F, {{SxyAxis}, {sigmaLxyAxis}, {jetFlavourAxis}}}); + registry.add("h3_3prong_Sxyz_sigmaLxyz_flavour", "", {HistType::kTH3F, {{SxyzAxis}, {sigmaLxyzAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_3prong_sigmaLxy_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {sigmaLxyAxis}, {jetFlavourAxis}}}); + registry.add("h3_jet_pt_3prong_sigmaLxyz_flavour", "", {HistType::kTH3F, {{jetPtAxis}, {sigmaLxyzAxis}, {jetFlavourAxis}}}); } } // Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); - // Filter eventCuts = (nabs(aod::jcollision::posZ) < vertexZCut); + Filter eventCuts = (nabs(aod::jcollision::posZ) < vertexZCut); + + using JetTagTracksData = soa::Join; + using JetTagTracksMCD = soa::Join; + using OriTracksData = soa::Join; + using OriTracksMCD = soa::Join; - using JetTagTracksData = soa::Join; - using JetTagTracksMCD = soa::Join; - using OriTracksData = soa::Join; - using OriTracksMCD = soa::Join; + std::function&, const std::vector&)> sortImp = + [](const std::vector& a, const std::vector& b) { + return a[0] > b[0]; + }; + + template + bool trackAcceptance(T const& track) + { + if (track.pt() < trackPtMin || track.pt() > trackPtMax) + return 0; + + return 1; + } + + template + bool prongAcceptance(T const& prong) + { + auto Sxy = prong.decayLengthXY() / prong.errorDecayLengthXY(); + if (prong.errorDecayLengthXY() < 0.03 || Sxy > 7) + return 0; + + return 1; + } template - void fillHistogramIPsData(T const& collision, U const& jets) + void fillHistogramIPsData(T const& collision, U const& jets, V const& jtracks, W const& tracks) { for (auto& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; } - std::vector> TracksImpXY, TracksSignImpXY, TracksImpXYSig, TracksSignImpXYSig; - std::vector> TracksImpZ, TracksSignImpZ, TracksImpZSig, TracksSignImpZSig; - std::vector> TracksImpXYZ, TracksSignImpXYZ, TracksImpXYZSig, TracksSignImpXYZSig; - for (auto& jtrack : jet.template tracks_as()) { - auto track = jtrack.template track_as(); + std::vector> vecSignImpXYSig, vecSignImpZSig, vecSignImpXYZSig; + for (auto& jtrack : jet.template tracks_as()) { + auto track = jtrack.template track_as(); + if (!trackAcceptance(track)) + continue; // General parameters registry.fill(HIST("h3_jet_pt_track_pt_track_eta"), jet.pt(), track.pt(), track.eta()); @@ -188,72 +260,80 @@ struct JetTaggerHFQA { varSignImpZ = geoSign * TMath::Abs(track.dcaZ()) * jettaggingutilities::cmTomum; varImpZSig = track.dcaZ() / TMath::Sqrt(track.sigmaDcaZ2()); varSignImpZSig = geoSign * TMath::Abs(track.dcaZ()) / TMath::Sqrt(track.sigmaDcaZ2()); - float dcaXYZ, sigmaDcaXYZ2; - jettaggingutilities::calculateDcaXYZ(dcaXYZ, sigmaDcaXYZ2, track.dcaXY(), track.dcaZ(), track.cYY(), track.cZY(), track.cZZ(), track.sigmaDcaXY2(), track.sigmaDcaZ2()); + float dcaXYZ = jtrack.dcaXYZ(); + float sigmaDcaXYZ2 = jtrack.sigmaDcaXYZ2(); varImpXYZ = dcaXYZ * jettaggingutilities::cmTomum; varSignImpXYZ = geoSign * TMath::Abs(dcaXYZ) * jettaggingutilities::cmTomum; varImpXYZSig = dcaXYZ / TMath::Sqrt(sigmaDcaXYZ2); varSignImpXYZSig = geoSign * TMath::Abs(dcaXYZ) / TMath::Sqrt(sigmaDcaXYZ2); - registry.fill(HIST("h3_jet_pt_track_pt_impact_parameter_xy"), jet.pt(), track.pt(), varImpXY); - registry.fill(HIST("h3_jet_pt_track_pt_sign_impact_parameter_xy"), jet.pt(), track.pt(), varSignImpXY); - registry.fill(HIST("h3_jet_pt_track_pt_impact_parameter_xy_significance"), jet.pt(), track.pt(), varImpXYSig); + registry.fill(HIST("h2_jet_pt_impact_parameter_xy"), jet.pt(), varImpXY); + registry.fill(HIST("h2_jet_pt_sign_impact_parameter_xy"), jet.pt(), varSignImpXY); + registry.fill(HIST("h2_jet_pt_impact_parameter_xy_significance"), jet.pt(), varImpXYSig); registry.fill(HIST("h3_jet_pt_track_pt_sign_impact_parameter_xy_significance"), jet.pt(), track.pt(), varSignImpXYSig); - registry.fill(HIST("h3_jet_pt_track_pt_impact_parameter_z"), jet.pt(), track.pt(), varImpZ); - registry.fill(HIST("h3_jet_pt_track_pt_sign_impact_parameter_z"), jet.pt(), track.pt(), varSignImpZ); - registry.fill(HIST("h3_jet_pt_track_pt_impact_parameter_z_significance"), jet.pt(), track.pt(), varImpZSig); + registry.fill(HIST("h2_jet_pt_impact_parameter_z"), jet.pt(), varImpZ); + registry.fill(HIST("h2_jet_pt_sign_impact_parameter_z"), jet.pt(), varSignImpZ); + registry.fill(HIST("h2_jet_pt_impact_parameter_z_significance"), jet.pt(), varImpZSig); registry.fill(HIST("h3_jet_pt_track_pt_sign_impact_parameter_z_significance"), jet.pt(), track.pt(), varSignImpZSig); - registry.fill(HIST("h3_jet_pt_track_pt_impact_parameter_xyz"), jet.pt(), track.pt(), varImpXYZ); - registry.fill(HIST("h3_jet_pt_track_pt_sign_impact_parameter_xyz"), jet.pt(), track.pt(), varSignImpXYZ); - registry.fill(HIST("h3_jet_pt_track_pt_impact_parameter_xyz_significance"), jet.pt(), track.pt(), varImpXYZSig); + registry.fill(HIST("h2_jet_pt_impact_parameter_xyz"), jet.pt(), varImpXYZ); + registry.fill(HIST("h2_jet_pt_sign_impact_parameter_xyz"), jet.pt(), varSignImpXYZ); + registry.fill(HIST("h2_jet_pt_impact_parameter_xyz_significance"), jet.pt(), varImpXYZSig); registry.fill(HIST("h3_jet_pt_track_pt_sign_impact_parameter_xyz_significance"), jet.pt(), track.pt(), varSignImpXYZSig); - TracksImpXY.push_back({varImpXY, track.pt()}); - TracksSignImpXY.push_back({varSignImpXY, track.pt()}); - TracksImpXYSig.push_back({varImpXYSig, track.pt()}); - TracksSignImpXYSig.push_back({varSignImpXYSig, track.pt()}); + vecSignImpXYSig.push_back({varSignImpXYSig, track.pt()}); + vecSignImpZSig.push_back({varSignImpXYSig, track.pt()}); + vecSignImpXYZSig.push_back({varSignImpXYSig, track.pt()}); } - auto sortImp = [](const std::vector& a, const std::vector& b) { - return a[0] > b[0]; - }; - std::sort(TracksImpXY.begin(), TracksImpXY.end(), sortImp); - std::sort(TracksSignImpXY.begin(), TracksSignImpXY.end(), sortImp); - std::sort(TracksImpXYSig.begin(), TracksImpXYSig.end(), sortImp); - std::sort(TracksSignImpXYSig.begin(), TracksSignImpXYSig.end(), sortImp); + std::sort(vecSignImpXYSig.begin(), vecSignImpXYSig.end(), sortImp); + std::sort(vecSignImpZSig.begin(), vecSignImpZSig.end(), sortImp); + std::sort(vecSignImpXYZSig.begin(), vecSignImpXYZSig.end(), sortImp); - if (TracksImpXY.size() > 0) { // N1 - registry.fill(HIST("h3_jet_pt_track_pt_sign_impact_parameter_xy_significance_N1"), jet.pt(), TracksSignImpXYSig[0][1], TracksSignImpXYSig[0][0]); - } - - if (TracksImpXY.size() > 1) { // N2 - registry.fill(HIST("h3_jet_pt_track_pt_sign_impact_parameter_xy_significance_N2"), jet.pt(), TracksSignImpXYSig[1][1], TracksSignImpXYSig[1][0]); - } - - if (TracksImpXY.size() > 2) { // N3 - registry.fill(HIST("h3_jet_pt_track_pt_sign_impact_parameter_xy_significance_N3"), jet.pt(), TracksSignImpXYSig[2][1], TracksSignImpXYSig[2][0]); + if (vecSignImpXYSig.empty() || vecSignImpZSig.empty() || vecSignImpXYZSig.empty()) + continue; + for (int order = 1; order <= numOrder; order++) { + if (order < vecSignImpXYSig.size()) { + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xy_significance_tc"), jet.pt(), vecSignImpXYSig[order][0], order); + registry.fill(HIST("h3_track_pt_sign_impact_parameter_xy_significance_tc"), vecSignImpXYSig[order][1], vecSignImpXYSig[order][0], order); + } + if (order < vecSignImpZSig.size()) { + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_z_significance_tc"), jet.pt(), vecSignImpZSig[order][0], order); + registry.fill(HIST("h3_track_pt_sign_impact_parameter_z_significance_tc"), vecSignImpZSig[order][1], vecSignImpZSig[order][0], order); + } + if (order < vecSignImpXYZSig.size()) { + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xyz_significance_tc"), jet.pt(), vecSignImpXYZSig[order][0], order); + registry.fill(HIST("h3_track_pt_sign_impact_parameter_xyz_significance_tc"), vecSignImpXYZSig[order][1], vecSignImpXYZSig[order][0], order); + } } } } template - void fillHistogramIPsMCD(T const& collision, U const& mcdjets) + void fillHistogramIPsMCD(T const& collision, U const& mcdjets, V const& jtracks, W const& tracks) { - int numberOfJetFlavourSpecies = 6; for (auto& mcdjet : mcdjets) { if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; } - std::vector TracksImpXY[numberOfJetFlavourSpecies], TracksSignImpXY[numberOfJetFlavourSpecies], TracksImpXYSig[numberOfJetFlavourSpecies], TracksSignImpXYSig[numberOfJetFlavourSpecies]; - std::vector TracksImpZ[numberOfJetFlavourSpecies], TracksSignImpZ[numberOfJetFlavourSpecies], TracksImpZSig[numberOfJetFlavourSpecies], TracksSignImpZSig[numberOfJetFlavourSpecies]; - std::vector TracksImpXYZ[numberOfJetFlavourSpecies], TracksSignImpXYZ[numberOfJetFlavourSpecies], TracksImpXYZSig[numberOfJetFlavourSpecies], TracksSignImpXYZSig[numberOfJetFlavourSpecies]; + std::vector vecImpXY[numberOfJetFlavourSpecies], vecSignImpXY[numberOfJetFlavourSpecies], vecImpXYSig[numberOfJetFlavourSpecies], vecSignImpXYSig[numberOfJetFlavourSpecies]; + std::vector vecImpZ[numberOfJetFlavourSpecies], vecSignImpZ[numberOfJetFlavourSpecies], vecImpZSig[numberOfJetFlavourSpecies], vecSignImpZSig[numberOfJetFlavourSpecies]; + std::vector vecImpXYZ[numberOfJetFlavourSpecies], vecSignImpXYZ[numberOfJetFlavourSpecies], vecImpXYZSig[numberOfJetFlavourSpecies], vecSignImpXYZSig[numberOfJetFlavourSpecies]; + std::vector> vecSignImpXYSigTC, vecSignImpZSigTC, vecSignImpXYZSigTC; int jetflavour = mcdjet.origin(); if (jetflavour == JetTaggingSpecies::none) { LOGF(debug, "NOT DEFINE JET FLAVOR"); } - for (auto& jtrack : mcdjet.template tracks_as()) { - auto track = jtrack.template track_as(); + registry.fill(HIST("h2_jet_pt_flavour"), mcdjet.pt(), jetflavour); + registry.fill(HIST("h2_jet_eta_flavour"), mcdjet.eta(), jetflavour); + registry.fill(HIST("h2_jet_phi_flavour"), mcdjet.phi(), jetflavour); + for (auto& jtrack : mcdjet.template tracks_as()) { + auto track = jtrack.template track_as(); + if (!trackAcceptance(track)) + continue; + // auto deltaR = jetutilities::deltaR(mcdjet, track); + // if (deltaR*100>40) LOG(info) << "deltaR: " << deltaR*100 << " jetR: " << mcdjet.r(); + // General parameters registry.fill(HIST("h3_jet_pt_track_pt_flavour"), mcdjet.pt(), track.pt(), jetflavour); registry.fill(HIST("h3_jet_pt_track_eta_flavour"), mcdjet.pt(), track.eta(), jetflavour); @@ -269,8 +349,8 @@ struct JetTaggerHFQA { varSignImpZ = geoSign * TMath::Abs(track.dcaZ()) * jettaggingutilities::cmTomum; varImpZSig = track.dcaZ() / TMath::Sqrt(track.sigmaDcaZ2()); varSignImpZSig = geoSign * TMath::Abs(track.dcaZ()) / TMath::Sqrt(track.sigmaDcaZ2()); - float dcaXYZ, sigmaDcaXYZ2; - jettaggingutilities::calculateDcaXYZ(dcaXYZ, sigmaDcaXYZ2, track.dcaXY(), track.dcaZ(), track.cYY(), track.cZY(), track.cZZ(), track.sigmaDcaXY2(), track.sigmaDcaZ2()); + float dcaXYZ = jtrack.dcaXYZ(); + float sigmaDcaXYZ2 = jtrack.sigmaDcaXYZ2(); varImpXYZ = dcaXYZ * jettaggingutilities::cmTomum; varSignImpXYZ = geoSign * TMath::Abs(dcaXYZ) * jettaggingutilities::cmTomum; varImpXYZSig = dcaXYZ / TMath::Sqrt(sigmaDcaXYZ2); @@ -289,62 +369,158 @@ struct JetTaggerHFQA { registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xyz_flavour"), mcdjet.pt(), varSignImpXYZ, jetflavour); registry.fill(HIST("h3_jet_pt_impact_parameter_xyz_significance_flavour"), mcdjet.pt(), varImpXYZSig, jetflavour); registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour"), mcdjet.pt(), varSignImpXYZSig, jetflavour); - registry.fill(HIST("h3_track_pt_impact_parameter_xy_flavour"), track.pt(), varImpXY, jetflavour); - registry.fill(HIST("h3_track_pt_sign_impact_parameter_xy_flavour"), track.pt(), varSignImpXY, jetflavour); - registry.fill(HIST("h3_track_pt_impact_parameter_xy_significance_flavour"), track.pt(), varImpXYSig, jetflavour); - registry.fill(HIST("h3_track_pt_sign_impact_parameter_xy_significance_flavour"), track.pt(), varSignImpXYSig, jetflavour); - registry.fill(HIST("h3_track_pt_impact_parameter_z_flavour"), track.pt(), varImpZ, jetflavour); - registry.fill(HIST("h3_track_pt_sign_impact_parameter_z_flavour"), track.pt(), varSignImpZ, jetflavour); - registry.fill(HIST("h3_track_pt_impact_parameter_z_significance_flavour"), track.pt(), varImpZSig, jetflavour); - registry.fill(HIST("h3_track_pt_sign_impact_parameter_z_significance_flavour"), track.pt(), varSignImpZSig, jetflavour); - registry.fill(HIST("h3_track_pt_impact_parameter_xyz_flavour"), track.pt(), varImpXYZ, jetflavour); - registry.fill(HIST("h3_track_pt_sign_impact_parameter_xyz_flavour"), track.pt(), varSignImpXYZ, jetflavour); - registry.fill(HIST("h3_track_pt_impact_parameter_xyz_significance_flavour"), track.pt(), varImpXYZSig, jetflavour); - registry.fill(HIST("h3_track_pt_sign_impact_parameter_xyz_significance_flavour"), track.pt(), varSignImpXYZSig, jetflavour); + registry.fill(HIST("h3_track_pt_impact_parameter_xy_flavour"), jtrack.pt(), varImpXY, jetflavour); + registry.fill(HIST("h3_track_pt_sign_impact_parameter_xy_flavour"), jtrack.pt(), varSignImpXY, jetflavour); + registry.fill(HIST("h3_track_pt_impact_parameter_xy_significance_flavour"), jtrack.pt(), varImpXYSig, jetflavour); + registry.fill(HIST("h3_track_pt_sign_impact_parameter_xy_significance_flavour"), jtrack.pt(), varSignImpXYSig, jetflavour); + registry.fill(HIST("h3_track_pt_impact_parameter_z_flavour"), jtrack.pt(), varImpZ, jetflavour); + registry.fill(HIST("h3_track_pt_sign_impact_parameter_z_flavour"), jtrack.pt(), varSignImpZ, jetflavour); + registry.fill(HIST("h3_track_pt_impact_parameter_z_significance_flavour"), jtrack.pt(), varImpZSig, jetflavour); + registry.fill(HIST("h3_track_pt_sign_impact_parameter_z_significance_flavour"), jtrack.pt(), varSignImpZSig, jetflavour); + registry.fill(HIST("h3_track_pt_impact_parameter_xyz_flavour"), jtrack.pt(), varImpXYZ, jetflavour); + registry.fill(HIST("h3_track_pt_sign_impact_parameter_xyz_flavour"), jtrack.pt(), varSignImpXYZ, jetflavour); + registry.fill(HIST("h3_track_pt_impact_parameter_xyz_significance_flavour"), jtrack.pt(), varImpXYZSig, jetflavour); + registry.fill(HIST("h3_track_pt_sign_impact_parameter_xyz_significance_flavour"), jtrack.pt(), varSignImpXYZSig, jetflavour); // For TC - TracksImpXY[jetflavour].push_back(varImpXY); - TracksSignImpXY[jetflavour].push_back(varSignImpXY); - TracksImpXYSig[jetflavour].push_back(varImpXYSig); - TracksSignImpXYSig[jetflavour].push_back(varSignImpXYSig); - TracksImpZ[jetflavour].push_back(varImpZ); - TracksSignImpZ[jetflavour].push_back(varSignImpZ); - TracksImpZSig[jetflavour].push_back(varImpZSig); - TracksSignImpZSig[jetflavour].push_back(varSignImpZSig); - TracksImpXYZ[jetflavour].push_back(varImpXYZ); - TracksSignImpXYZ[jetflavour].push_back(varSignImpXYZ); - TracksImpXYZSig[jetflavour].push_back(varImpXYZSig); - TracksSignImpXYZSig[jetflavour].push_back(varSignImpXYZSig); + vecImpXY[jetflavour].push_back(varImpXY); + vecSignImpXY[jetflavour].push_back(varSignImpXY); + vecImpXYSig[jetflavour].push_back(varImpXYSig); + vecSignImpXYSig[jetflavour].push_back(varSignImpXYSig); + vecImpZ[jetflavour].push_back(varImpZ); + vecSignImpZ[jetflavour].push_back(varSignImpZ); + vecImpZSig[jetflavour].push_back(varImpZSig); + vecSignImpZSig[jetflavour].push_back(varSignImpZSig); + vecImpXYZ[jetflavour].push_back(varImpXYZ); + vecSignImpXYZ[jetflavour].push_back(varSignImpXYZ); + vecImpXYZSig[jetflavour].push_back(varImpXYZSig); + vecSignImpXYZSig[jetflavour].push_back(varSignImpXYZSig); + vecSignImpXYSigTC.push_back({varSignImpXYSig, jtrack.pt()}); + vecSignImpZSigTC.push_back({varSignImpXYSig, jtrack.pt()}); + vecSignImpXYZSigTC.push_back({varSignImpXYSig, jtrack.pt()}); } // For TC - sort(TracksImpXY[jetflavour].begin(), TracksImpXY[jetflavour].end(), std::greater()); - sort(TracksSignImpXY[jetflavour].begin(), TracksSignImpXY[jetflavour].end(), std::greater()); - sort(TracksImpXYSig[jetflavour].begin(), TracksImpXYSig[jetflavour].end(), std::greater()); - sort(TracksSignImpXYSig[jetflavour].begin(), TracksSignImpXYSig[jetflavour].end(), std::greater()); - sort(TracksImpZ[jetflavour].begin(), TracksImpZ[jetflavour].end(), std::greater()); - sort(TracksSignImpZ[jetflavour].begin(), TracksSignImpZ[jetflavour].end(), std::greater()); - sort(TracksImpZSig[jetflavour].begin(), TracksImpZSig[jetflavour].end(), std::greater()); - sort(TracksSignImpZSig[jetflavour].begin(), TracksSignImpZSig[jetflavour].end(), std::greater()); - sort(TracksImpXYZ[jetflavour].begin(), TracksImpXYZ[jetflavour].end(), std::greater()); - sort(TracksSignImpXYZ[jetflavour].begin(), TracksSignImpXYZ[jetflavour].end(), std::greater()); - sort(TracksImpXYZSig[jetflavour].begin(), TracksImpXYZSig[jetflavour].end(), std::greater()); - sort(TracksSignImpXYZSig[jetflavour].begin(), TracksSignImpXYZSig[jetflavour].end(), std::greater()); - - if (TracksImpXY[jetflavour].size() > 0) { // N1 - registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N1"), mcdjet.pt(), TracksSignImpXYSig[jetflavour][0], jetflavour); - registry.fill(HIST("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N1"), mcdjet.pt(), TracksSignImpZSig[jetflavour][0], jetflavour); - registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N1"), mcdjet.pt(), TracksSignImpXYZSig[jetflavour][0], jetflavour); + sort(vecImpXY[jetflavour].begin(), vecImpXY[jetflavour].end(), std::greater()); + sort(vecSignImpXY[jetflavour].begin(), vecSignImpXY[jetflavour].end(), std::greater()); + sort(vecImpXYSig[jetflavour].begin(), vecImpXYSig[jetflavour].end(), std::greater()); + sort(vecSignImpXYSig[jetflavour].begin(), vecSignImpXYSig[jetflavour].end(), std::greater()); + sort(vecImpZ[jetflavour].begin(), vecImpZ[jetflavour].end(), std::greater()); + sort(vecSignImpZ[jetflavour].begin(), vecSignImpZ[jetflavour].end(), std::greater()); + sort(vecImpZSig[jetflavour].begin(), vecImpZSig[jetflavour].end(), std::greater()); + sort(vecSignImpZSig[jetflavour].begin(), vecSignImpZSig[jetflavour].end(), std::greater()); + sort(vecImpXYZ[jetflavour].begin(), vecImpXYZ[jetflavour].end(), std::greater()); + sort(vecSignImpXYZ[jetflavour].begin(), vecSignImpXYZ[jetflavour].end(), std::greater()); + sort(vecImpXYZSig[jetflavour].begin(), vecImpXYZSig[jetflavour].end(), std::greater()); + sort(vecSignImpXYZSig[jetflavour].begin(), vecSignImpXYZSig[jetflavour].end(), std::greater()); + + if (vecImpXY[jetflavour].size() > 0) { // N1 + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N1"), mcdjet.pt(), vecSignImpXYSig[jetflavour][0], jetflavour); + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N1"), mcdjet.pt(), vecSignImpZSig[jetflavour][0], jetflavour); + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N1"), mcdjet.pt(), vecSignImpXYZSig[jetflavour][0], jetflavour); + } + if (vecImpXY[jetflavour].size() > 1) { // N2 + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N2"), mcdjet.pt(), vecSignImpXYSig[jetflavour][1], jetflavour); + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N2"), mcdjet.pt(), vecSignImpZSig[jetflavour][1], jetflavour); + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N2"), mcdjet.pt(), vecSignImpXYZSig[jetflavour][1], jetflavour); + } + if (vecImpXY[jetflavour].size() > 2) { // N3 + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N3"), mcdjet.pt(), vecSignImpXYSig[jetflavour][2], jetflavour); + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N3"), mcdjet.pt(), vecSignImpZSig[jetflavour][2], jetflavour); + registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N3"), mcdjet.pt(), vecSignImpXYZSig[jetflavour][2], jetflavour); + } + + std::sort(vecSignImpXYSigTC.begin(), vecSignImpXYSigTC.end(), sortImp); + std::sort(vecSignImpZSigTC.begin(), vecSignImpZSigTC.end(), sortImp); + std::sort(vecSignImpXYZSigTC.begin(), vecSignImpXYZSigTC.end(), sortImp); + + if (vecSignImpXYSigTC.empty() || vecSignImpZSigTC.empty() || vecSignImpXYZSigTC.empty()) + continue; + for (int order = 1; order <= numOrder; order++) { + if (order < vecSignImpXYSigTC.size()) { + registry.fill(HIST("h3_sign_impact_parameter_xy_significance_tc_flavour"), vecSignImpXYSigTC[order][0], order, jetflavour); + } + if (order < vecSignImpZSigTC.size()) { + registry.fill(HIST("h3_sign_impact_parameter_z_significance_tc_flavour"), vecSignImpZSigTC[order][0], order, jetflavour); + } + if (order < vecSignImpXYZSigTC.size()) { + registry.fill(HIST("h3_sign_impact_parameter_xyz_significance_tc_flavour"), vecSignImpXYZSigTC[order][0], order, jetflavour); + } + } + } + } + + template + void fillHistogramJP(T const& collision, U const& mcdjets) + { + for (auto& mcdjet : mcdjets) { + if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; } - if (TracksImpXY[jetflavour].size() > 1) { // N2 - registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N2"), mcdjet.pt(), TracksSignImpXYSig[jetflavour][1], jetflavour); - registry.fill(HIST("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N2"), mcdjet.pt(), TracksSignImpZSig[jetflavour][1], jetflavour); - registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N2"), mcdjet.pt(), TracksSignImpXYZSig[jetflavour][1], jetflavour); + registry.fill(HIST("h3_jet_pt_JP_flavour"), mcdjet.pt(), mcdjet.jetProb(), mcdjet.origin()); + registry.fill(HIST("h3_jet_pt_neg_log_JP_flavour"), mcdjet.pt(), -1 * TMath::Log(mcdjet.jetProb()), mcdjet.origin()); + } + } + + Preslice perColFor2Prong = aod::hf_cand::collisionId; + Preslice perColFor3Prong = aod::hf_cand::collisionId; + + template + void fillHistogramSV2ProngMCD(T const& collision, U const& mcdjets, V const& prongs) + { + for (const auto& mcdjet : mcdjets) { + if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; } - if (TracksImpXY[jetflavour].size() > 2) { // N3 - registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N2"), mcdjet.pt(), TracksSignImpXYSig[jetflavour][2], jetflavour); - registry.fill(HIST("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N2"), mcdjet.pt(), TracksSignImpZSig[jetflavour][2], jetflavour); - registry.fill(HIST("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N2"), mcdjet.pt(), TracksSignImpXYZSig[jetflavour][2], jetflavour); + auto origin = mcdjet.origin(); + auto prongsPerCol = prongs.sliceBy(perColFor2Prong, collision.globalIndex()); + for (const auto& prong : prongsPerCol) { + auto deltaR = jetutilities::deltaR(mcdjet, prong); + if (deltaR > mcdjet.r() / 100.0) { + continue; + } + auto Lxy = prong.decayLengthXY(); + auto Sxy = prong.decayLengthXY() / prong.errorDecayLengthXY(); + auto Lxyz = prong.decayLength(); + auto Sxyz = prong.decayLength() / prong.errorDecayLength(); + registry.fill(HIST("h3_jet_pt_2prong_Lxy_flavour"), mcdjet.pt(), Lxy, origin); + registry.fill(HIST("h3_jet_pt_2prong_Sxy_flavour"), mcdjet.pt(), Sxy, origin); + registry.fill(HIST("h3_jet_pt_2prong_Lxyz_flavour"), mcdjet.pt(), Lxyz, origin); + registry.fill(HIST("h3_jet_pt_2prong_Sxyz_flavour"), mcdjet.pt(), Sxyz, origin); + registry.fill(HIST("h3_2prong_Sxy_sigmaLxy_flavour"), Sxy, prong.errorDecayLengthXY(), origin); + registry.fill(HIST("h3_2prong_Sxyz_sigmaLxyz_flavour"), Sxyz, prong.errorDecayLength(), origin); + registry.fill(HIST("h3_jet_pt_2prong_sigmaLxy_flavour"), mcdjet.pt(), prong.errorDecayLengthXY(), origin); + registry.fill(HIST("h3_jet_pt_2prong_sigmaLxyz_flavour"), mcdjet.pt(), prong.errorDecayLength(), origin); + } + } + } + + template + void fillHistogramSV3ProngMCD(T const& collision, U const& mcdjets, V const& prongs) + { + for (const auto& mcdjet : mcdjets) { + if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + auto origin = mcdjet.origin(); + auto prongsPerCol = prongs.sliceBy(perColFor3Prong, collision.globalIndex()); + for (const auto& prong : prongsPerCol) { + auto deltaR = jetutilities::deltaR(mcdjet, prong); + if (deltaR > mcdjet.r() / 100.0) { + continue; + } + auto Lxy = prong.decayLengthXY(); + auto Sxy = prong.decayLengthXY() / prong.errorDecayLengthXY(); + auto Lxyz = prong.decayLength(); + auto Sxyz = prong.decayLength() / prong.errorDecayLength(); + registry.fill(HIST("h3_3prong_Lxy_flavour"), mcdjet.pt(), Lxy, origin); + registry.fill(HIST("h3_3prong_Sxy_flavour"), mcdjet.pt(), Sxy, origin); + registry.fill(HIST("h3_3prong_Lxyz_flavour"), mcdjet.pt(), Lxyz, origin); + registry.fill(HIST("h3_3prong_Sxyz_flavour"), mcdjet.pt(), Sxyz, origin); + registry.fill(HIST("h3_3prong_Sxy_sigmaLxy_flavour"), Sxy, prong.errorDecayLengthXY(), origin); + registry.fill(HIST("h3_3prong_Sxyz_sigmaLxyz_flavour"), Sxyz, prong.errorDecayLength(), origin); + registry.fill(HIST("h3_jet_pt_3prong_sigmaLxy_flavour"), mcdjet.pt(), prong.errorDecayLengthXY(), origin); + registry.fill(HIST("h3_jet_pt_3prong_sigmaLxyz_flavour"), mcdjet.pt(), prong.errorDecayLength(), origin); } } } @@ -354,19 +530,35 @@ struct JetTaggerHFQA { } PROCESS_SWITCH(JetTaggerHFQA, processDummy, "Dummy process", true); - void processIPsData(soa::Join::iterator const& jcollision, aod::Collisions&, JetTagTableData const& jets, JetTagTracksData const& jtracks, OriTracksData const& tracks) + void processIPsData(soa::Filtered::iterator const& jcollision, JetTagTableData const& jets, JetTagTracksData const& jtracks, OriTracksData const& tracks) { - auto oricoll = jcollision.template collision_as(); - fillHistogramIPsData(oricoll, jets); + fillHistogramIPsData(jcollision, jets, jtracks, tracks); } PROCESS_SWITCH(JetTaggerHFQA, processIPsData, "Fill impact parameter inpormation for data jets", false); - void processIPsMCD(soa::Join::iterator const& jcollision, aod::Collisions&, JetTagTableMCD const& mcdjets, JetTagTracksMCD const& jtracks, OriTracksMCD const& tracks, JetParticles&) + void processIPsMCD(soa::Filtered::iterator const& jcollision, JetTagTableMCD const& mcdjets, JetTagTracksMCD const& jtracks, OriTracksMCD const& tracks, JetParticles&) { - auto oricoll = jcollision.template collision_as(); - fillHistogramIPsMCD(oricoll, mcdjets); + fillHistogramIPsMCD(jcollision, mcdjets, jtracks, tracks); } PROCESS_SWITCH(JetTaggerHFQA, processIPsMCD, "Fill impact parameter inpormation for mcd jets", false); + + void processJP(soa::Filtered::iterator const& jcollision, JetTagTableMCD const& mcdjets, JetTagTracksMCD const& jtracks) + { + fillHistogramJP(jcollision, mcdjets); + } + PROCESS_SWITCH(JetTaggerHFQA, processJP, "Fill jet probability imformation for mcd jets", false); + + void processSV2ProngMCD(soa::Filtered::iterator const& jcollision, JetTagTableMCD const& mcdjets, aod::HfCand2Prong const& prongs) + { + fillHistogramSV2ProngMCD(jcollision, mcdjets, prongs); + } + PROCESS_SWITCH(JetTaggerHFQA, processSV2ProngMCD, "Fill 2prong inpormation for mcd jets", false); + + void processSV3ProngMCD(soa::Filtered::iterator const& jcollision, JetTagTableMCD const& mcdjets, aod::HfCand3Prong const& prongs) + { + fillHistogramSV3ProngMCD(jcollision, mcdjets, prongs); + } + PROCESS_SWITCH(JetTaggerHFQA, processSV3ProngMCD, "Fill 3prong inpormation for mcd jets", false); }; using JetTaggerQAChargedDataJets = soa::Join; diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index 6475e34ba75..07041036dba 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -73,7 +73,9 @@ DECLARE_SOA_COLUMN(Indices, indices, int[2]); //! Field f DECLARE_SOA_COLUMN(CascadeIndices, cascIndices, int[3]); //! Field for the track indices to remove auto-correlations (ordered: positive, negative, bachelor) DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! Sign of the track charge DECLARE_SOA_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows, uint8_t); //! Number of TPC crossed rows +DECLARE_SOA_COLUMN(TPCNClsFound, tpcNClsFound, uint8_t); //! Number of TPC clusters found DECLARE_SOA_COLUMN(IsGlobalTrackWoDCA, isGlobalTrackWoDCA, bool); //! Is global track without DCA +DECLARE_SOA_COLUMN(IsGlobalTrack, isGlobalTrack, bool); //! Is global track DECLARE_SOA_COLUMN(IsPrimaryTrack, isPrimaryTrack, bool); //! Is primary track DECLARE_SOA_COLUMN(IsPVContributor, isPVContributor, bool); //! Is primary vertex contributor DECLARE_SOA_COLUMN(HasTOF, hasTOF, bool); //! Has TOF @@ -116,6 +118,7 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACKS", resodaughter::Phi, resodaughter::Sign, resodaughter::TPCNClsCrossedRows, + resodaughter::TPCNClsFound, o2::aod::track::DcaXY, o2::aod::track::DcaZ, o2::aod::track::X, @@ -131,6 +134,7 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACKS", o2::aod::track::PassedITSRefit, o2::aod::track::PassedTPCRefit, resodaughter::IsGlobalTrackWoDCA, + resodaughter::IsGlobalTrack, resodaughter::IsPrimaryTrack, resodaughter::IsPVContributor, resodaughter::TPCCrossedRowsOverFindableCls, diff --git a/PWGLF/DataModel/LFSlimNucleiTables.h b/PWGLF/DataModel/LFSlimNucleiTables.h index 90828413df1..8f39da3b60f 100644 --- a/PWGLF/DataModel/LFSlimNucleiTables.h +++ b/PWGLF/DataModel/LFSlimNucleiTables.h @@ -51,28 +51,18 @@ DECLARE_SOA_COLUMN(SurvivedEventSelection, survivedEventSelection, bool); } // namespace NucleiTableNS namespace NucleiFlowTableNS { -DECLARE_SOA_COLUMN(CentFV0A, centFV0A, float); -DECLARE_SOA_COLUMN(CentFT0M, centFT0M, float); -DECLARE_SOA_COLUMN(CentFT0A, centFT0A, float); -DECLARE_SOA_COLUMN(CentFT0C, centFT0C, float); -DECLARE_SOA_COLUMN(XQvecFV0A, xQvecFV0A, float); -DECLARE_SOA_COLUMN(YQvecFV0A, yQvecFV0A, float); -DECLARE_SOA_COLUMN(AmplQvecFV0A, amplQvecFV0A, float); -DECLARE_SOA_COLUMN(XQvecFT0M, xQvecFT0M, float); -DECLARE_SOA_COLUMN(YQvecFT0M, yQvecFT0M, float); -DECLARE_SOA_COLUMN(AmplQvecFT0M, amplQvecFT0M, float); -DECLARE_SOA_COLUMN(XQvecFT0A, xQvecFT0A, float); -DECLARE_SOA_COLUMN(YQvecFT0A, yQvecFT0A, float); -DECLARE_SOA_COLUMN(AmplQvecFT0A, amplQvecFT0A, float); -DECLARE_SOA_COLUMN(XQvecFT0C, xQvecFT0C, float); -DECLARE_SOA_COLUMN(YQvecFT0C, yQvecFT0C, float); -DECLARE_SOA_COLUMN(AmplQvecFT0C, amplQvecFT0C, float); -DECLARE_SOA_COLUMN(XQvecTPCpos, xQvecTPCpos, float); -DECLARE_SOA_COLUMN(YQvecTPCpos, yQvecTPCpos, float); -DECLARE_SOA_COLUMN(AmplQvecTPCpos, amplQvecTPCpos, int); -DECLARE_SOA_COLUMN(XQvecTPCneg, xQvecTPCneg, float); -DECLARE_SOA_COLUMN(YQvecTPCneg, yQvecTPCneg, float); -DECLARE_SOA_COLUMN(AmplQvecTPCneg, amplQvecTPCneg, int); +DECLARE_SOA_COLUMN(CentFV0A, centFV0A, float); // centrality with FT0A estimator +DECLARE_SOA_COLUMN(CentFT0A, centFT0A, float); // centrality with FT0A estimator +DECLARE_SOA_COLUMN(CentFT0C, centFT0C, float); // centrality with FT0C estimator +DECLARE_SOA_COLUMN(CentFT0M, centFT0M, float); // centrality with FT0M estimator +DECLARE_SOA_COLUMN(PsiFT0A, psiFT0A, float); // Psi with FT0A estimator +DECLARE_SOA_COLUMN(MultFT0A, multFT0A, float); // Multiplicity with FT0A estimator +DECLARE_SOA_COLUMN(PsiFT0C, psiFT0C, float); // Psi with FT0C estimator +DECLARE_SOA_COLUMN(MultFT0C, multFT0C, float); // Multiplicity with FT0C estimator +DECLARE_SOA_COLUMN(PsiTPC, psiTPC, float); // Psi with TPC estimator +DECLARE_SOA_COLUMN(PsiTPCl, psiTPCl, float); // Psi with TPC estimator (left) +DECLARE_SOA_COLUMN(PsiTPCr, psiTPCr, float); // Psi with TPC estimator (right) +DECLARE_SOA_COLUMN(MultTPC, multTPC, int); // Multiplicity with TPC estimator } // namespace NucleiFlowTableNS DECLARE_SOA_TABLE(NucleiTable, "AOD", "NUCLEITABLE", @@ -99,24 +89,14 @@ DECLARE_SOA_TABLE(NucleiTableFlow, "AOD", "NUCLEITABLEFLOW", NucleiFlowTableNS::CentFT0M, NucleiFlowTableNS::CentFT0A, NucleiFlowTableNS::CentFT0C, - NucleiFlowTableNS::XQvecFV0A, - NucleiFlowTableNS::YQvecFV0A, - NucleiFlowTableNS::AmplQvecFV0A, - NucleiFlowTableNS::XQvecFT0M, - NucleiFlowTableNS::YQvecFT0M, - NucleiFlowTableNS::AmplQvecFT0M, - NucleiFlowTableNS::XQvecFT0A, - NucleiFlowTableNS::YQvecFT0A, - NucleiFlowTableNS::AmplQvecFT0A, - NucleiFlowTableNS::XQvecFT0C, - NucleiFlowTableNS::YQvecFT0C, - NucleiFlowTableNS::AmplQvecFT0C, - NucleiFlowTableNS::XQvecTPCpos, - NucleiFlowTableNS::YQvecTPCpos, - NucleiFlowTableNS::AmplQvecTPCpos, - NucleiFlowTableNS::XQvecTPCneg, - NucleiFlowTableNS::YQvecTPCneg, - NucleiFlowTableNS::AmplQvecTPCneg); + NucleiFlowTableNS::PsiFT0A, + NucleiFlowTableNS::MultFT0A, + NucleiFlowTableNS::PsiFT0C, + NucleiFlowTableNS::MultFT0C, + NucleiFlowTableNS::PsiTPC, + NucleiFlowTableNS::PsiTPCl, + NucleiFlowTableNS::PsiTPCr, + NucleiFlowTableNS::MultTPC); DECLARE_SOA_TABLE(NucleiTableMC, "AOD", "NUCLEITABLEMC", NucleiTableNS::Pt, diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index 4e0ed439311..ec414b89522 100755 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -42,10 +42,20 @@ DECLARE_SOA_TABLE_VERSIONED(StraRawCents_001, "AOD", "STRARAWCENTS", 1, //! DECLARE_SOA_TABLE_VERSIONED(StraRawCents_002, "AOD", "STRARAWCENTS", 2, //! debug information mult::MultFT0A, mult::MultFT0C, mult::MultFV0A, // FIT detectors mult::MultNTracksPVeta1, // track multiplicities with eta cut for INEL>0 - mult::MultNTracksTPCOnly, mult::MultNTracksITSTPC, // track multiplicities, PV contribs, no eta cut + mult::MultNTracksITSTPC, // track multiplicities, PV contribs, no eta cut mult::MultAllTracksTPCOnly, mult::MultAllTracksITSTPC, // track multiplicities, all, no eta cut mult::MultZNA, mult::MultZNC, mult::MultZEM1, // ZDC signals mult::MultZEM2, mult::MultZPA, mult::MultZPC); +DECLARE_SOA_TABLE_VERSIONED(StraRawCents_003, "AOD", "STRARAWCENTS", 3, //! debug information + mult::MultFT0A, mult::MultFT0C, mult::MultFV0A, // FIT detectors + mult::MultNTracksPVeta1, // track multiplicities with eta cut for INEL>0 + mult::MultPVTotalContributors, // number of PV contribs total + mult::MultNTracksGlobal, // global track multiplicities + mult::MultNTracksITSTPC, // track multiplicities, PV contribs, no eta cut + mult::MultAllTracksTPCOnly, // TPConly track multiplicities, all, no eta cut + mult::MultAllTracksITSTPC, // ITSTPC track multiplicities, all, no eta cut + mult::MultZNA, mult::MultZNC, mult::MultZEM1, // ZDC signals + mult::MultZEM2, mult::MultZPA, mult::MultZPC); DECLARE_SOA_TABLE(StraEvSels, "AOD", "STRAEVSELS", //! event selection: sel8 evsel::Sel8, evsel::Selection); DECLARE_SOA_TABLE(StraFT0AQVs, "AOD", "STRAFT0AQVS", //! t0a Qvec @@ -59,7 +69,7 @@ DECLARE_SOA_TABLE(StraFV0AQVs, "AOD", "STRAFV0AQVS", //! v0a Qvec DECLARE_SOA_TABLE(StraStamps, "AOD", "STRASTAMPS", //! information for ID-ing mag field if needed bc::RunNumber, timestamp::Timestamp); -using StraRawCents = StraRawCents_002; +using StraRawCents = StraRawCents_003; using StraCollision = StraCollisions::iterator; using StraCent = StraCents::iterator; diff --git a/PWGLF/DataModel/cascqaanalysis.h b/PWGLF/DataModel/cascqaanalysis.h index 370c4c7bebb..3eced8d6b77 100644 --- a/PWGLF/DataModel/cascqaanalysis.h +++ b/PWGLF/DataModel/cascqaanalysis.h @@ -112,7 +112,9 @@ DECLARE_SOA_DYNAMIC_COLUMN(IsINELgt1, isINELgt1, //! True if the Event belongs t namespace cascadesflow { -DECLARE_SOA_COLUMN(MultFT0M, multFT0M, float); +DECLARE_SOA_COLUMN(CentFT0A, centFT0A, float); +DECLARE_SOA_COLUMN(CentFT0C, centFT0C, float); +DECLARE_SOA_COLUMN(CentFT0M, centFT0M, float); DECLARE_SOA_COLUMN(Sign, sign, int); DECLARE_SOA_COLUMN(Pt, pt, float); DECLARE_SOA_COLUMN(Eta, eta, float); @@ -120,7 +122,8 @@ DECLARE_SOA_COLUMN(MassXi, massxi, float); DECLARE_SOA_COLUMN(MassOmega, massomega, float); DECLARE_SOA_COLUMN(V2A, v2A, float); DECLARE_SOA_COLUMN(V2C, v2C, float); -DECLARE_SOA_COLUMN(BDTResponse, bdtResponse, float); +DECLARE_SOA_COLUMN(BDTResponseXi, bdtResponseXi, float); +DECLARE_SOA_COLUMN(BDTResponseOmega, bdtResponseOmega, float); } // namespace cascadesflow @@ -149,7 +152,7 @@ DECLARE_SOA_TABLE(CascTraining, "AOD", "CascTraining", o2::soa::Index<>, mycascades::DCABachToPV, mycascades::DCACascDaughters, mycascades::DCAV0Daughters, mycascades::DCAV0ToPV, mycascades::BachBaryonCosPA, mycascades::BachBaryonDCAxyToPV, mycascades::McPdgCode); DECLARE_SOA_TABLE(CascAnalysis, "AOD", "CascAnalysis", o2::soa::Index<>, - cascadesflow::MultFT0M, cascadesflow::Sign, cascadesflow::Pt, cascadesflow::Eta, cascadesflow::MassXi, cascadesflow::MassOmega, cascadesflow::V2A, cascadesflow::V2C, cascadesflow::BDTResponse); + cascadesflow::CentFT0C, cascadesflow::Sign, cascadesflow::Pt, cascadesflow::Eta, cascadesflow::MassXi, cascadesflow::MassOmega, cascadesflow::V2C, cascadesflow::BDTResponseXi, cascadesflow::BDTResponseOmega); namespace myMCcascades { diff --git a/PWGLF/TableProducer/LFResonanceInitializer.cxx b/PWGLF/TableProducer/LFResonanceInitializer.cxx index 03eece96d9d..b39c1b586f0 100644 --- a/PWGLF/TableProducer/LFResonanceInitializer.cxx +++ b/PWGLF/TableProducer/LFResonanceInitializer.cxx @@ -445,6 +445,7 @@ struct reso2initializer { track.phi(), track.sign(), (uint8_t)track.tpcNClsCrossedRows(), + (uint8_t)track.tpcNClsFound(), track.dcaXY(), track.dcaZ(), track.x(), @@ -460,6 +461,7 @@ struct reso2initializer { track.passedITSRefit(), track.passedTPCRefit(), track.isGlobalTrackWoDCA(), + track.isGlobalTrack(), track.isPrimaryTrack(), track.isPVContributor(), track.tpcCrossedRowsOverFindableCls(), diff --git a/PWGLF/TableProducer/QC/flowQC.cxx b/PWGLF/TableProducer/QC/flowQC.cxx index cbef5ace85c..cd0a5a18333 100644 --- a/PWGLF/TableProducer/QC/flowQC.cxx +++ b/PWGLF/TableProducer/QC/flowQC.cxx @@ -27,9 +27,10 @@ #include "Common/Core/trackUtilities.h" #include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/EventSelection.h" #include "Common/Core/EventPlaneHelper.h" -#include "Common/DataModel/Qvectors.h" +#include "PWGLF/DataModel/EPCalibrationTables.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" @@ -63,12 +64,11 @@ static const std::vector centDetectorNames{"FV0A", "FT0M", "FT0A", enum qVecDetectors { kFT0C = 0, kFT0A, - kFV0A, - kBpos, - kBneg, + kTPCl, + kTPCr, kNqVecDetectors }; -static const std::vector qVecDetectorNames{"FT0C", "FT0A", "FV0A", "Bpos", "Bneg"}; +static const std::vector qVecDetectorNames{"FT0C", "FT0A", "TPCl", "TPCr"}; std::shared_ptr hQxQy[kNqVecDetectors]; std::shared_ptr hNormQxQy[kNqVecDetectors]; @@ -99,7 +99,8 @@ struct flowQC { float mBz = 0.f; // Flow analysis - using CollWithQvec = soa::Join::iterator; + using CollWithEP = soa::Join::iterator; HistogramRegistry flow{"flow", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -205,7 +206,7 @@ struct flowQC { } } - void process(CollWithQvec const& collision, aod::BCsWithTimestamps const&) + void process(CollWithEP const& collision, aod::BCsWithTimestamps const&) { auto bc = collision.template bc_as(); initCCDB(bc); @@ -222,35 +223,30 @@ struct flowQC { float centrality = getCentrality(collision); - float QxFT0C = collision.qvecFT0CRe(); - float QyFT0C = collision.qvecFT0CIm(); + float psiFT0A = collision.psiFT0A(); + float QxFT0A = std::cos(2 * psiFT0A); + float QyFT0A = std::sin(2 * psiFT0A); + float QmodFT0A = std::hypot(QxFT0A, QyFT0A); + + float psiFT0C = collision.psiFT0C(); + float QxFT0C = std::cos(2 * psiFT0C); + float QyFT0C = std::sin(2 * psiFT0C); float QmodFT0C = std::hypot(QxFT0C, QyFT0C); - float psiFT0C = std::atan2(QyFT0C, QxFT0C) / 2; - float QxFT0A = collision.qvecFT0ARe(); - float QyFT0A = collision.qvecFT0AIm(); - float QmodFT0A = std::hypot(QxFT0A, QyFT0A); - float psiFT0A = std::atan2(QyFT0A, QxFT0A) / 2; - - float QxFV0A = collision.qvecFV0ARe(); - float QyFV0A = collision.qvecFV0AIm(); - float QmodFV0A = std::hypot(QxFV0A, QyFV0A); - float psiFV0A = std::atan2(QyFV0A, QxFV0A) / 2; - - float QxBpos = collision.qvecBPosRe(); - float QyBpos = collision.qvecBPosIm(); - float QmodBpos = std::hypot(QxBpos, QyBpos); - float psiBpos = std::atan2(QyBpos, QxBpos) / 2; - - float QxBneg = collision.qvecBNegRe(); - float QyBneg = collision.qvecBNegIm(); - float QmodBneg = std::hypot(QxBneg, QyBneg); - float psiBneg = std::atan2(QyBneg, QxBneg) / 2; - - std::array vec_Qx = {QxFT0C, QxFT0A, QxFV0A, QxBpos, QxBneg}; - std::array vec_Qy = {QyFT0C, QyFT0A, QyFV0A, QyBpos, QyBneg}; - std::array vec_Qmod = {QmodFT0C, QmodFT0A, QmodFV0A, QmodBpos, QmodBneg}; - std::array vec_Qpsi = {psiFT0C, psiFT0A, psiFV0A, psiBpos, psiBneg}; + float psiTPCl = collision.psiTPCL(); + float QxTPCl = std::cos(2 * psiTPCl); + float QyTPCl = std::sin(2 * psiTPCl); + float QmodTPCl = std::hypot(QxTPCl, QyTPCl); + + float psiTPCr = collision.psiTPCR(); + float QxTPCr = std::cos(2 * psiTPCr); + float QyTPCr = std::sin(2 * psiTPCr); + float QmodTPCr = std::hypot(QxTPCr, QyTPCr); + + std::array vec_Qx = {QxFT0C, QxFT0A, QxTPCl, QxTPCr}; + std::array vec_Qy = {QyFT0C, QyFT0A, QyTPCl, QyTPCr}; + std::array vec_Qmod = {QmodFT0C, QmodFT0A, QmodTPCl, QmodTPCr}; + std::array vec_Qpsi = {psiFT0C, psiFT0A, psiTPCl, psiTPCr}; for (int iQvecDet = 0; iQvecDet < qVecDetectors::kNqVecDetectors; iQvecDet++) { hQxQy[iQvecDet]->Fill(centrality, vec_Qx[iQvecDet], vec_Qy[iQvecDet]); diff --git a/PWGLF/TableProducer/cascadeflow.cxx b/PWGLF/TableProducer/cascadeflow.cxx index 993edee88c4..7a98d42b8de 100644 --- a/PWGLF/TableProducer/cascadeflow.cxx +++ b/PWGLF/TableProducer/cascadeflow.cxx @@ -35,9 +35,7 @@ using namespace o2::framework::expressions; using std::array; using DauTracks = soa::Join; -using CollEventPlane = soa::Join::iterator; - -ROOT::Math::XYZVector eventplaneVecT0A, eventplaneVecT0C, cascphiVec; +using CollEventPlane = soa::Join::iterator; namespace cascadev2 { @@ -50,6 +48,14 @@ constexpr double massSigmaParameters[4][2]{ {1.03468e-1, 0.1898}}; static const std::vector massSigmaParameterNames{"p0", "p1", "p2", "p3"}; static const std::vector speciesNames{"Xi", "Omega"}; + +std::shared_ptr hMassBeforeSelVsPt[2]; +std::shared_ptr hMassAfterSelVsPt[2]; +std::shared_ptr hSignalScoreBeforeSel[2]; +std::shared_ptr hBkgScoreBeforeSel[2]; +std::shared_ptr hSignalScoreAfterSel[2]; +std::shared_ptr hBkgScoreAfterSel[2]; +std::shared_ptr hSparseV2C[2]; } // namespace cascadev2 namespace cascade_flow_cuts_ml @@ -80,19 +86,19 @@ auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; static const std::vector modelPaths = {""}; // default values for the cut directions -constexpr int cutDir[nCutScores] = {CutGreater, CutNot}; +constexpr int cutDir[nCutScores] = {CutSmaller, CutNot}; auto vecCutDir = std::vector{cutDir, cutDir + nCutScores}; // default values for the cuts constexpr double cuts[nBinsPt][nCutScores] = { - {0.5, 0.5}, - {0.5, 0.5}, - {0.5, 0.5}, - {0.5, 0.5}, - {0.5, 0.5}, - {0.5, 0.5}, - {0.5, 0.5}, - {0.5, 0.5}}; + {0.9, 0.5}, + {0.9, 0.5}, + {0.9, 0.5}, + {0.9, 0.5}, + {0.9, 0.5}, + {0.9, 0.5}, + {0.9, 0.5}, + {0.9, 0.5}}; // row labels static const std::vector labelsPt = { @@ -106,13 +112,11 @@ static const std::vector labelsPt = { "pT bin 7"}; // column labels -static const std::vector labelsCutScore = {"score class 1", "score class 2"}; -static const std::vector labelsDmesCutScore = {"ML score signal", "ML score bkg"}; +static const std::vector labelsCutScore = {"Signal score", "Background score"}; } // namespace cascade_flow_cuts_ml struct cascadeFlow { - Configurable isOmega{"isOmega", 0, "Xi or Omega"}; Configurable MinPt{"MinPt", 0.6, "Min pt of cascade"}; Configurable MaxPt{"MaxPt", 10, "Max pt of cascade"}; Configurable isApplyML{"isApplyML", 1, ""}; @@ -122,13 +126,13 @@ struct cascadeFlow { Configurable doNTPCSigmaCut{"doNTPCSigmaCut", 1, "doNtpcSigmaCut"}; Configurable nsigmatpcPr{"nsigmatpcPr", 5, "nsigmatpcPr"}; Configurable nsigmatpcPi{"nsigmatpcPi", 5, "nsigmatpcPi"}; - Configurable mintpccrrows{"mintpccrrows", 3, "mintpccrrows"}; + Configurable mintpccrrows{"mintpccrrows", 70, "mintpccrrows"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"Users/c/chdemart/CascadesFlow"}, "Paths of models on CCDB"}; Configurable> onnxFileNames{"onnxFileNames", std::vector{"model_onnx.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; - Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; + Configurable loadModelsFromCCDB{"loadModelsFromCCDB", true, "Flag to enable or disable the loading of models from CCDB"}; // ML inference Configurable applyMl{"applyMl", true, "Flag to apply ML selections"}; @@ -136,13 +140,12 @@ struct cascadeFlow { Configurable> cutDirMl{"cutDirMl", std::vector{cascade_flow_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; Configurable> cutsMl{"cutsMl", {cascade_flow_cuts_ml::cuts[0], cascade_flow_cuts_ml::nBinsPt, cascade_flow_cuts_ml::nCutScores, cascade_flow_cuts_ml::labelsPt, cascade_flow_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; Configurable nClassesMl{"nClassesMl", (int8_t)cascade_flow_cuts_ml::nCutScores, "Number of classes in ML model"}; - // Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; o2::ccdb::CcdbApi ccdbApi; // Add objects needed for ML inference - o2::analysis::MlResponse mlResponse; - std::vector outputMl = {}; + o2::analysis::MlResponse mlResponseXi; + o2::analysis::MlResponse mlResponseOmega; template bool IsCascAccepted(TCascade casc, TDaughter negExtra, TDaughter posExtra, TDaughter bachExtra, int& counter) // loose cuts on topological selections of cascades @@ -168,14 +171,13 @@ struct cascadeFlow { double GetPhiInRange(double phi) { - double result = phi; - while (result < 0) { - result = result + 2. * TMath::Pi() / 2; + while (phi < 0) { + phi += TMath::Pi(); } - while (result > 2. * TMath::Pi() / 2) { - result = result - 2. * TMath::Pi() / 2; + while (phi > TMath::Pi()) { + phi -= TMath::Pi(); } - return result; + return phi; } HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -198,7 +200,7 @@ struct cascadeFlow { template void fillTrainingTable(collision_t coll, cascade_t casc, int pdgCode) { - trainingSample(coll.centFT0M(), + trainingSample(coll.centFT0C(), casc.sign(), casc.pt(), casc.eta(), @@ -222,65 +224,62 @@ struct cascadeFlow { template // void fillAnalisedTable(collision_t coll, cascade_t casc, float BDTresponse) - void fillAnalysedTable(collision_t coll, cascade_t casc, float v2A, float v2C, float BDTresponse) + void fillAnalysedTable(collision_t coll, cascade_t casc, float v2C, float BDTresponseXi, float BDTresponseOmega) { - analysisSample(coll.centFT0M(), + analysisSample(coll.centFT0C(), casc.sign(), casc.pt(), casc.eta(), casc.mXi(), casc.mOmega(), - v2A, v2C, - BDTresponse); + BDTresponseXi, + BDTresponseOmega); } void init(InitContext const&) { - float MinMass = 1.28; - if (isOmega) - MinMass = 1.6; - float MaxMass = 1.36; - if (isOmega) - MaxMass = 1.73; - ConfigurableAxis vertexZ{"vertexZ", {20, -10, 10}, "vertex axis for histograms"}; - ConfigurableAxis massCascAxis{"massCascAxis", {100, MinMass, MaxMass}, ""}; - ConfigurableAxis ptAxis{"ptAxis", {100, 0, 10}, ""}; - histos.add("hEventVertexZ", "hEventVertexZ", kTH1F, {vertexZ}); + float minMass[2]{1.28, 1.6}; + float maxMass[2]{1.36, 1.73}; + const AxisSpec massCascAxis[2]{{static_cast((maxMass[0] - minMass[0]) / 0.001f), minMass[0], maxMass[0], "#Xi candidate mass (GeV/c^{2})"}, + {static_cast((maxMass[1] - minMass[1]) / 0.001f), minMass[1], maxMass[1], "#Omega candidate mass (GeV/c^{2})"}}; + const AxisSpec ptAxis{static_cast((MaxPt - MinPt) / 0.2), MinPt, MaxPt, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec v2Axis{200, -1., 1., "#it{v}_{2}"}; + const AxisSpec CentAxis{18, 0., 90., "FT0C centrality percentile"}; + histos.add("hEventVertexZ", "hEventVertexZ", kTH1F, {{120, -12., 12.}}); histos.add("hEventCentrality", "hEventCentrality", kTH1F, {{101, 0, 101}}); - histos.add("hCandidate", "hCandidate", HistType::kTH1D, {{22, -0.5, 21.5}}); - histos.add("hCascadeSignal", "hCascadeSignal", HistType::kTH1D, {{6, -0.5, 5.5}}); - histos.add("hCascade", "hCascade", HistType::kTH1D, {{6, -0.5, 5.5}}); - histos.add("hCascadePhi", "hCascadePhi", HistType::kTH1D, {{100, 0, 2 * TMath::Pi()}}); - histos.add("hcascminuspsiT0A", "hcascminuspsiT0A", HistType::kTH1D, {{100, 0, 2 * TMath::Pi()}}); - histos.add("hcascminuspsiT0C", "hcascminuspsiT0C", HistType::kTH1D, {{100, 0, 2 * TMath::Pi()}}); - histos.add("hPsiT0A", "hPsiT0A", HistType::kTH1D, {{100, 0, 2 * TMath::Pi()}}); histos.add("hPsiT0C", "hPsiT0C", HistType::kTH1D, {{100, 0, 2 * TMath::Pi()}}); - histos.add("hFT0ARe", "hFT0ARe", HistType::kTH1D, {{100, -1, 1}}); - histos.add("hFT0AIm", "hFT0AIm", HistType::kTH1D, {{100, -1, 1}}); - histos.add("hFT0A", "hFT0A", HistType::kTH2D, {{100, -1, 1}, {100, -1, 1}}); - histos.add("hv2Norm", "hv2Norm", HistType::kTH1D, {{100, 0, 1}}); - histos.add("hMassBeforeSel", "hMassBeforeSel", HistType::kTH1F, {massCascAxis}); - histos.add("hMassAfterSel", "hMassAfterSel", HistType::kTH1F, {massCascAxis}); - histos.add("hMassBeforeSelVsPt", "hMassBeforeSelVsPt", HistType::kTH2F, {{massCascAxis}, {ptAxis}}); - histos.add("hMassAfterSelVsPt", "hMassAfterSelVsPt", HistType::kTH2F, {{massCascAxis}, {ptAxis}}); - histos.add("hSignalScoreBeforeSel", "Signal score before selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); - histos.add("hBkgScoreBeforeSel", "Bkg score before selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); - histos.add("hSignalScoreAfterSel", "Signal score after selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); - histos.add("hBkgScoreAfterSel", "Bkg score after selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); + histos.add("hCandidate", "hCandidate", HistType::kTH1F, {{22, -0.5, 21.5}}); + histos.add("hCascadeSignal", "hCascadeSignal", HistType::kTH1F, {{6, -0.5, 5.5}}); + histos.add("hCascade", "hCascade", HistType::kTH1F, {{6, -0.5, 5.5}}); + histos.add("hCascadePhi", "hCascadePhi", HistType::kTH1F, {{100, 0, 2 * TMath::Pi()}}); + histos.add("hcascminuspsiT0C", "hcascminuspsiT0C", HistType::kTH1F, {{100, 0, 2 * TMath::Pi()}}); + for (int iS{0}; iS < 2; ++iS) { + cascadev2::hMassBeforeSelVsPt[iS] = histos.add(Form("hMassBeforeSelVsPt%s", cascadev2::speciesNames[iS].data()), "hMassBeforeSelVsPt", HistType::kTH2F, {massCascAxis[iS], ptAxis}); + cascadev2::hMassAfterSelVsPt[iS] = histos.add(Form("hMassAfterSelVsPt%s", cascadev2::speciesNames[iS].data()), "hMassAfterSelVsPt", HistType::kTH2F, {massCascAxis[iS], ptAxis}); + cascadev2::hSignalScoreBeforeSel[iS] = histos.add(Form("hSignalScoreBeforeSel%s", cascadev2::speciesNames[iS].data()), "Signal score before selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); + cascadev2::hBkgScoreBeforeSel[iS] = histos.add(Form("hBkgScoreBeforeSel%s", cascadev2::speciesNames[iS].data()), "Bkg score before selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); + cascadev2::hSignalScoreAfterSel[iS] = histos.add(Form("hSignalScoreAfterSel%s", cascadev2::speciesNames[iS].data()), "Signal score after selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); + cascadev2::hBkgScoreAfterSel[iS] = histos.add(Form("hBkgScoreAfterSel%s", cascadev2::speciesNames[iS].data()), "Bkg score after selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); + cascadev2::hSparseV2C[iS] = histos.add(Form("hSparseV2C%s", cascadev2::speciesNames[iS].data()), "hSparseV2C", HistType::kTHnSparseF, {massCascAxis[iS], ptAxis, v2Axis, CentAxis}); + } if (isApplyML) { // Configure and initialise the ML class - mlResponse.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); + mlResponseXi.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); + mlResponseOmega.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); // Bonus: retrieve the model from CCDB (needed for ML application on the GRID) if (loadModelsFromCCDB) { ccdbApi.init(ccdbUrl); - mlResponse.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + mlResponseXi.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + mlResponseOmega.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); // TODO: use different model for Xi and Omega } else { - mlResponse.setModelPathsLocal(onnxFileNames); + mlResponseXi.setModelPathsLocal(onnxFileNames); + mlResponseOmega.setModelPathsLocal(onnxFileNames); } - mlResponse.init(); + mlResponseXi.init(); + mlResponseOmega.init(); } } @@ -292,6 +291,8 @@ struct cascadeFlow { if (!coll.sel8() || std::abs(coll.posZ()) > 10.) { return; } + histos.fill(HIST("hEventCentrality"), coll.centFT0C()); + histos.fill(HIST("hEventVertexZ"), coll.posZ()); for (auto& casc : Cascades) { if (gRandom->Uniform() > downsample) { @@ -323,9 +324,9 @@ struct cascadeFlow { continue; histos.fill(HIST("hCandidate"), ++counter); } - } else + } else { ++counter; - + } if (posExtra.tpcCrossedRows() < mintpccrrows || negExtra.tpcCrossedRows() < mintpccrrows || bachExtra.tpcCrossedRows() < mintpccrrows) continue; histos.fill(HIST("hCandidate"), ++counter); @@ -340,6 +341,8 @@ struct cascadeFlow { if (!coll.sel8() || std::abs(coll.posZ()) > 10.) { return; } + histos.fill(HIST("hEventCentrality"), coll.centFT0C()); + histos.fill(HIST("hEventVertexZ"), coll.posZ()); for (auto& casc : Cascades) { int pdgCode{casc.pdgCode()}; @@ -363,38 +366,19 @@ struct cascadeFlow { void processAnalyseData(CollEventPlane const& coll, soa::Join const& Cascades, DauTracks const&) { - // std::cout << "onnxFileNames " << onnxFileNames.value[0] << std::endl; - if (!coll.sel8() || std::abs(coll.posZ()) > 10.) { return; } - histos.fill(HIST("hEventCentrality"), coll.centFT0M()); + histos.fill(HIST("hEventCentrality"), coll.centFT0C()); histos.fill(HIST("hEventVertexZ"), coll.posZ()); - eventplaneVecT0A = ROOT::Math::XYZVector(coll.qvecFT0ARe(), coll.qvecFT0AIm(), 0); - eventplaneVecT0C = ROOT::Math::XYZVector(coll.qvecFT0CRe(), coll.qvecFT0CIm(), 0); - float eventplaneVecT0ANorm = sqrt(eventplaneVecT0A.Dot(eventplaneVecT0A)); - float eventplaneVecT0CNorm = sqrt(eventplaneVecT0C.Dot(eventplaneVecT0C)); - // float v2Norm = eventplaneVecT0A.Dot(eventplaneVecT0C)/coll.sumAmplFT0A()/coll.sumAmplFT0C(); - float v2Norm = eventplaneVecT0A.Dot(eventplaneVecT0C) / eventplaneVecT0ANorm / eventplaneVecT0CNorm; - // std::cout << "eventplaneVecT0ANorm: " << eventplaneVecT0ANorm << " = " << sqrt(pow(coll.qvecFT0ARe(), 2) + pow(coll.qvecFT0AIm(), 2)) << std::endl; //these two are equal - // std::cout << "stored norm value: " << coll.sumAmplFT0A() << std::endl; - histos.fill(HIST("hv2Norm"), v2Norm); - - float PsiT0A = TMath::ACos(coll.qvecFT0ARe()) / 2; - float PsiT0C = TMath::ACos(coll.qvecFT0CRe()) / 2; - if (coll.qvecFT0AIm() < 0) - PsiT0A = -PsiT0A + TMath::Pi() / 2; // to get dstribution between 0 and Pi - if (coll.qvecFT0CIm() < 0) - PsiT0C = -PsiT0C + TMath::Pi() / 2; // to get dstribution between 0 and Pi - - histos.fill(HIST("hFT0ARe"), coll.qvecFT0ARe()); - histos.fill(HIST("hFT0AIm"), coll.qvecFT0AIm()); - histos.fill(HIST("hFT0A"), coll.qvecFT0ARe(), coll.qvecFT0AIm()); - histos.fill(HIST("hPsiT0A"), PsiT0A); + ROOT::Math::XYZVector eventplaneVecT0C{coll.qvecFT0CRe(), coll.qvecFT0CIm(), 0}; + + const float PsiT0C = std::atan2(coll.qvecFT0CIm(), coll.qvecFT0CRe()) * 0.5f; histos.fill(HIST("hPsiT0C"), PsiT0C); + std::vector bdtScore[2]; for (auto& casc : Cascades) { /// Add some minimal cuts for single track variables (min number of TPC clusters) @@ -407,7 +391,7 @@ struct cascadeFlow { histos.fill(HIST("hCascade"), counter); // ML selections - bool isSelectedCasc = false; + bool isSelectedCasc[2]{false, false}; std::vector inputFeaturesCasc{casc.cascradius(), casc.v0radius(), @@ -422,67 +406,60 @@ struct cascadeFlow { casc.bachBaryonCosPA(), casc.bachBaryonDCAxyToPV()}; - float massCasc = casc.mXi(); - if (isOmega) - massCasc = casc.mOmega(); + float massCasc[2]{casc.mXi(), casc.mOmega()}; // inv mass loose cut - if (casc.pt() < MinPt) + if (casc.pt() < MinPt || casc.pt() > MaxPt) { continue; - if (casc.pt() > MaxPt) - continue; - if (isOmega) { - if (massCasc < 1.6 || massCasc > 1.73) - continue; - } else { - if (massCasc < 1.28 || massCasc > 1.36) - continue; } - histos.fill(HIST("hMassBeforeSel"), massCasc); - histos.fill(HIST("hMassBeforeSelVsPt"), massCasc, casc.pt()); + cascadev2::hMassBeforeSelVsPt[0]->Fill(massCasc[0], casc.pt()); + cascadev2::hMassBeforeSelVsPt[1]->Fill(massCasc[1], casc.pt()); if (isApplyML) { // Retrieve model output and selection outcome - isSelectedCasc = mlResponse.isSelectedMl(inputFeaturesCasc, casc.pt(), outputMl); - // Fill BDT score histograms before selection - histos.fill(HIST("hSignalScoreBeforeSel"), outputMl[0]); - histos.fill(HIST("hBkgScoreBeforeSel"), outputMl[1]); - - // Fill histograms for selected candidates - if (isSelectedCasc) { - histos.fill(HIST("hSignalScoreAfterSel"), outputMl[0]); - histos.fill(HIST("hBkgScoreAfterSel"), outputMl[1]); + isSelectedCasc[0] = mlResponseXi.isSelectedMl(inputFeaturesCasc, casc.pt(), bdtScore[0]); + isSelectedCasc[1] = mlResponseOmega.isSelectedMl(inputFeaturesCasc, casc.pt(), bdtScore[1]); + + for (int iS{0}; iS < 2; ++iS) { + // Fill BDT score histograms before selection + cascadev2::hSignalScoreBeforeSel[iS]->Fill(bdtScore[0][0]); + cascadev2::hBkgScoreBeforeSel[iS]->Fill(bdtScore[1][1]); + + // Fill histograms for selected candidates + if (isSelectedCasc[iS]) { + cascadev2::hSignalScoreAfterSel[iS]->Fill(bdtScore[0][0]); + cascadev2::hBkgScoreAfterSel[iS]->Fill(bdtScore[1][1]); + cascadev2::hMassAfterSelVsPt[iS]->Fill(massCasc[iS], casc.pt()); + } } - - outputMl.clear(); // not necessary in this case but for good measure } else { - isSelectedCasc = true; - } - - if (isSelectedCasc) { - histos.fill(HIST("hMassAfterSel"), massCasc); - histos.fill(HIST("hMassAfterSelVsPt"), massCasc, casc.pt()); + isSelectedCasc[0] = true; + isSelectedCasc[1] = true; } - cascphiVec = ROOT::Math::XYZVector(cos(2 * casc.phi()), sin(2 * casc.phi()), 0); - auto v2A = cascphiVec.Dot(eventplaneVecT0A) / sqrt(eventplaneVecT0A.Dot(eventplaneVecT0A)); - auto v2C = cascphiVec.Dot(eventplaneVecT0C) / sqrt(eventplaneVecT0C.Dot(eventplaneVecT0C)); - auto cascminuspsiT0A = GetPhiInRange(casc.phi() - PsiT0A); + ROOT::Math::XYZVector cascQvec{std::cos(2 * casc.phi()), std::sin(2 * casc.phi()), 0}; + auto v2C = cascQvec.Dot(eventplaneVecT0C) / std::sqrt(eventplaneVecT0C.mag2()); auto cascminuspsiT0C = GetPhiInRange(casc.phi() - PsiT0C); - // float v2A_diff = TMath::Cos(2.0 * cascminuspsiT0A); - // float v2C_diff = TMath::Cos(2.0 * cascminuspsiT0C); - // std::cout << "v2A: " << v2A << " v2C " << v2C << std::endl; - // std::cout << "v2A_diff: " << v2A_diff << " v2C_diff " << v2C_diff << std::endl; + histos.fill(HIST("hCascadePhi"), casc.phi()); - histos.fill(HIST("hcascminuspsiT0A"), cascminuspsiT0A); histos.fill(HIST("hcascminuspsiT0C"), cascminuspsiT0C); + double values[4]{casc.mXi(), casc.pt(), v2C, coll.centFT0C()}; + if (isSelectedCasc[0]) { + cascadev2::hSparseV2C[0]->Fill(values); + } + if (isSelectedCasc[1]) { + values[0] = casc.mOmega(); + cascadev2::hSparseV2C[0]->Fill(values); + } - float BDTresponse = 0; - if (isApplyML) - BDTresponse = outputMl[0]; - if (isSelectedCasc) - fillAnalysedTable(coll, casc, v2A, v2C, BDTresponse); + float BDTresponse[2]{0.f, 0.f}; + if (isApplyML) { + BDTresponse[0] = bdtScore[0][0]; + BDTresponse[1] = bdtScore[1][0]; + } + if (isSelectedCasc[0] || isSelectedCasc[1]) + fillAnalysedTable(coll, casc, v2C, BDTresponse[0], BDTresponse[1]); } } diff --git a/PWGLF/TableProducer/converters/strarawcentsconverter.cxx b/PWGLF/TableProducer/converters/strarawcentsconverter.cxx index fcd9e5d1d39..e912c724870 100644 --- a/PWGLF/TableProducer/converters/strarawcentsconverter.cxx +++ b/PWGLF/TableProducer/converters/strarawcentsconverter.cxx @@ -17,16 +17,38 @@ using namespace o2; using namespace o2::framework; // Converts V0 version 001 to 002 - struct strarawcentsconverter { Produces straRawCents_001; + Produces straRawCents_003; - void process(aod::StraRawCents_000 const& straRawCents_000) + void process000to001(aod::StraRawCents_000 const& straRawCents_000) { for (auto& values : straRawCents_000) { straRawCents_001(values.multFT0A(), values.multFT0C(), values.multFV0A(), values.multNTracksPVeta1(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); } } + void process002to003(aod::StraRawCents_002 const& straRawCents_002) + { + for (auto& values : straRawCents_002) { + straRawCents_003(values.multFT0A(), + values.multFT0C(), + values.multFT0A(), + values.multNTracksPVeta1(), + 0, 0, + values.multNTracksITSTPC(), + values.multAllTracksTPCOnly(), + values.multAllTracksITSTPC(), + values.multZNA(), + values.multZNC(), + values.multZEM1(), + values.multZEM2(), + values.multZPA(), + values.multZPC()); + } + } + + PROCESS_SWITCH(strarawcentsconverter, process000to001, "from raw 000 to 001", false); + PROCESS_SWITCH(strarawcentsconverter, process002to003, "from raw 002 to 003", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGLF/TableProducer/epvector.cxx b/PWGLF/TableProducer/epvector.cxx index c86ab8d0c7b..6088a9177dc 100644 --- a/PWGLF/TableProducer/epvector.cxx +++ b/PWGLF/TableProducer/epvector.cxx @@ -19,6 +19,7 @@ /// // C++/ROOT includes. +#include #include #include #include @@ -45,6 +46,7 @@ #include "FT0Base/Geometry.h" #include "FV0Base/Geometry.h" #include "PWGLF/DataModel/EPCalibrationTables.h" +#include "TF1.h" // #include "Common/Core/EventPlaneHelper.h" // #include "Common/DataModel/Qvectors.h" @@ -78,18 +80,30 @@ struct epvector { std::vector qvecIm; std::vector qvecAmp; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + // Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; + // Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; Configurable cfgCutCentrality{"cfgCutCentrality", 80.0f, "Centrality cut"}; Configurable cfgCutPT{"cfgCutPT", 0.15, "PT cut on daughter track"}; Configurable cfgCutPTMax{"cfgCutPTMax", 3.0, "Max PT cut on daughter track"}; Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; + Configurable cfgMinEta{"cfgMinEta", 0.1, "Min Eta cut on daughter track"}; Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"}; Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; Configurable cfgITScluster{"cfgITScluster", 4, "Number of ITS cluster"}; + // Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; Configurable useGainCallib{"useGainCallib", true, "use gain calibration"}; Configurable useRecentere{"useRecentere", true, "use Recentering"}; Configurable ConfGainPath{"ConfGainPath", "Users/s/skundu/My/Object/test100", "Path to gain calibration"}; Configurable ConfRecentere{"ConfRecentere", "Users/s/skundu/My/Object/Finaltest2/recenereall", "Path for recentere"}; + + // Event selection cuts - Alex + TF1* fMultPVCutLow = nullptr; + TF1* fMultPVCutHigh = nullptr; + TF1* fMultCutLow = nullptr; + TF1* fMultCutHigh = nullptr; + TF1* fMultMultPVCut = nullptr; + void init(o2::framework::InitContext&) { AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; @@ -124,6 +138,20 @@ struct epvector { histos.add("ResFT0CFT0A", "ResFT0CFT0A", kTH2F, {centAxis, resAxis}); histos.add("ResFT0ATPC", "ResFT0ATPC", kTH2F, {centAxis, resAxis}); + // Event selection cut additional - Alex + // if (additionalEvsel) { + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x)", 0, 100); + fMultCutLow->SetParameters(1893.94, -53.86, 0.502913, -0.0015122, 109.625, -1.19253); + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x)", 0, 100); + fMultCutHigh->SetParameters(1893.94, -53.86, 0.502913, -0.0015122, 109.625, -1.19253); + fMultMultPVCut = new TF1("fMultMultPVCut", "[0]+[1]*x+[2]*x*x", 0, 5000); + fMultMultPVCut->SetParameters(-0.1, 0.785, -4.7e-05); + // } + ccdb->setURL(cfgCcdbParam.cfgURL); ccdbApi.init("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); @@ -138,6 +166,21 @@ struct epvector { printf("Offset for FV0-right: x = %.3f y = %.3f\n", (*offsetFV0)[1].getX(), (*offsetFV0)[1].getY()); } + template + bool eventSelected(TCollision collision, const float& centrality) + { + if (collision.alias_bit(kTVXinTRD)) { + // TRD triggered // return 0; + } + auto multNTracksPV = collision.multNTracksPV(); + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + return 0; + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + return 0; + + return 1; + } + double GetPhiFT0(int chno, double offsetX, double offsetY) { o2::ft0::Geometry ft0Det; @@ -172,7 +215,7 @@ struct epvector { template bool selectionTrack(const T& candidate) { - if (!(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster)) { + if (!(candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster)) { return false; } return true; @@ -200,7 +243,7 @@ struct epvector { float psiTPC = -99; float psiTPCL = -99; float psiTPCR = -99; - if (coll.sel8() && centrality < cfgCutCentrality && TMath::Abs(vz) < cfgCutVertex && coll.has_foundFT0()) { + if (coll.sel8() && centrality < cfgCutCentrality && TMath::Abs(vz) < cfgCutVertex && coll.has_foundFT0() && eventSelected(coll, centrality) && coll.selection_bit(aod::evsel::kNoTimeFrameBorder) && coll.selection_bit(aod::evsel::kNoITSROFrameBorder)) { triggerevent = true; if (useGainCallib && (currentRunNumber != lastRunNumber)) { gainprofile = ccdb->getForTimeStamp(ConfGainPath.value, bc.timestamp()); @@ -252,7 +295,7 @@ struct epvector { auto qyTPCR = 0.0; for (auto& trk : tracks) { - if (!selectionTrack(trk) || abs(trk.eta()) > 0.8 || trk.pt() > cfgCutPTMax) { + if (!selectionTrack(trk) || abs(trk.eta()) > 0.8 || trk.pt() > cfgCutPTMax || abs(trk.eta()) < cfgMinEta) { continue; } qxTPC = qxTPC + trk.pt() * TMath::Cos(2.0 * trk.phi()); diff --git a/PWGLF/TableProducer/nucleiSpectra.cxx b/PWGLF/TableProducer/nucleiSpectra.cxx index 29733a0edbf..6b0b21c3ee1 100644 --- a/PWGLF/TableProducer/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/nucleiSpectra.cxx @@ -28,13 +28,14 @@ #include "Common/Core/TrackSelection.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/Core/PID/PIDTOF.h" #include "Common/TableProducer/PID/pidTOFBase.h" #include "Common/Core/EventPlaneHelper.h" -#include "Common/DataModel/Qvectors.h" +#include "PWGLF/DataModel/EPCalibrationTables.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" @@ -85,24 +86,14 @@ struct NucleusCandidateFlow { float centFT0M; float centFT0A; float centFT0C; - float qvecFV0ARe; - float qvecFV0AIm; - float sumAmplFV0A; - float qvecFT0MRe; - float qvecFT0MIm; - float sumAmplFT0M; - float qvecFT0ARe; - float qvecFT0AIm; - float sumAmplFT0A; - float qvecFT0CRe; - float qvecFT0CIm; - float sumAmplFT0C; - float qvecBPosRe; - float qvecBPosIm; - int nTrkBPos; - float qvecBNegRe; - float qvecBNegIm; - int nTrkBNeg; + float psiFT0A; + float multFT0A; + float psiFT0C; + float multFT0C; + float psiTPC; + float psiTPCl; + float psiTPCr; + int multTPC; }; namespace nuclei @@ -270,7 +261,7 @@ struct nucleiSpectra { using CollWithCent = soa::Join::iterator; // Flow analysis - using CollWithQvec = soa::Join::iterator; + using CollWithEP = soa::Join::iterator; HistogramRegistry spectra{"spectra", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; o2::pid::tof::Beta responseBeta; @@ -339,10 +330,6 @@ struct nucleiSpectra { {cfgDCAxyBinsAlpha, "DCA_{z} (cm)"}}; const AxisSpec etaAxis{40, -1., 1., "#eta"}; - const AxisSpec ft0Aft0CspAxis{cfgSpBins, "#vec{Q}_{2}^{FT0A} #upoint #vec{Q}_{2}^{FT0C}"}; - const AxisSpec fv0Aft0CspAxis{cfgSpBins, "#vec{Q}_{2}^{FV0A} #upoint #vec{Q}_{2}^{FT0C}"}; - const AxisSpec fv0Aft0AspAxis{cfgSpBins, "#vec{Q}_{2}^{FV0A} #upoint #vec{Q}_{2}^{FT0A}"}; - spectra.add("hRecVtxZData", "collision z position", HistType::kTH1F, {{200, -20., +20., "z position (cm)"}}); spectra.add("hTpcSignalData", "Specific energy loss", HistType::kTH2F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {1400, 0, 1400, "d#it{E} / d#it{X} (a. u.)"}}); spectra.add("hTpcSignalDataSelected", "Specific energy loss for selected particles", HistType::kTH2F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {1400, 0, 1400, "d#it{E} / d#it{X} (a. u.)"}}); @@ -365,11 +352,6 @@ struct nucleiSpectra { nuclei::hDeltaP[iC][iS] = spectra.add(fmt::format("hDeltaP{}_{}", nuclei::matter[iC], nuclei::names[iS]).data(), fmt::format("#Delta#it{{p}}/#it{{p}} {} {}", nuclei::matter[iC], nuclei::names[iS]).data(), HistType::kTH2D, {{232, 0.2, 6., "#it{{p}} (GeV/#it{{c}})"}, {200, -1.0, 1.0, "(#it{p}_{IU} - #it{p}_{TPC}) / #it{p}"}}); } } - if (doprocessDataFlow) { - spectra.add("hScalarProductFT0AvsFT0C", "", HistType::kTH2F, {centAxis, ft0Aft0CspAxis}); - spectra.add("hScalarProductFV0AvsFT0C", "", HistType::kTH2F, {centAxis, fv0Aft0CspAxis}); - spectra.add("hScalarProductFV0AvsFT0A", "", HistType::kTH2F, {centAxis, fv0Aft0AspAxis}); - } for (int iS{0}; iS < nuclei::species; ++iS) { for (int iMax{0}; iMax < 2; ++iMax) { @@ -385,7 +367,7 @@ struct nucleiSpectra { float getCentrality(Tcoll const& collision) { float centrality = 1.; - if constexpr (std::is_same::value || std::is_same::value) { + if constexpr (std::is_same::value || std::is_same::value) { if (cfgCentralityEstimator == nuclei::centDetectors::kFV0A) { centrality = collision.centFV0A(); } else if (cfgCentralityEstimator == nuclei::centDetectors::kFT0M) { @@ -414,14 +396,6 @@ struct nucleiSpectra { float centrality = getCentrality(collision); - if constexpr (std::is_same::value) { - if (doprocessDataFlow) { - spectra.fill(HIST("hScalarProductFT0AvsFT0C"), centrality, collision.qvecFT0ARe() * collision.qvecFT0CRe() + collision.qvecFT0AIm() * collision.qvecFT0CIm()); - spectra.fill(HIST("hScalarProductFV0AvsFT0C"), centrality, collision.qvecFV0ARe() * collision.qvecFT0CRe() + collision.qvecFV0AIm() * collision.qvecFT0CIm()); - spectra.fill(HIST("hScalarProductFV0AvsFT0A"), centrality, collision.qvecFT0ARe() * collision.qvecFV0ARe() + collision.qvecFT0AIm() * collision.qvecFV0AIm()); - } - } - const double bgScalings[5][2]{ {nuclei::charges[0] * cfgMomentumScalingBetheBloch->get(0u, 0u) / nuclei::masses[0], nuclei::charges[0] * cfgMomentumScalingBetheBloch->get(0u, 1u) / nuclei::masses[0]}, {nuclei::charges[1] * cfgMomentumScalingBetheBloch->get(1u, 0u) / nuclei::masses[1], nuclei::charges[1] * cfgMomentumScalingBetheBloch->get(1u, 1u) / nuclei::masses[1]}, @@ -533,8 +507,21 @@ struct nucleiSpectra { } } if (flag & (kProton | kDeuteron | kTriton | kHe3 | kHe4)) { - if constexpr (std::is_same::value) { - nuclei::candidates_flow.emplace_back(NucleusCandidateFlow{collision.centFV0A(), collision.centFT0M(), collision.centFT0A(), collision.centFT0C(), collision.qvecFV0ARe(), collision.qvecFV0AIm(), collision.sumAmplFV0A(), collision.qvecFT0MRe(), collision.qvecFT0MIm(), collision.sumAmplFT0M(), collision.qvecFT0ARe(), collision.qvecFT0AIm(), collision.sumAmplFT0A(), collision.qvecFT0CRe(), collision.qvecFT0CIm(), collision.sumAmplFT0C(), collision.qvecBPosRe(), collision.qvecBPosIm(), collision.nTrkBPos(), collision.qvecBNegRe(), collision.qvecBNegIm(), collision.nTrkBNeg()}); + if constexpr (std::is_same::value) { + nuclei::candidates_flow.emplace_back(NucleusCandidateFlow{ + collision.centFV0A(), + collision.centFT0M(), + collision.centFT0A(), + collision.centFT0C(), + collision.psiFT0A(), + collision.multFT0A(), + collision.psiFT0C(), + collision.multFT0C(), + collision.psiTPC(), + collision.psiTPCL(), + collision.psiTPCR(), + collision.multTPC(), + }); } nuclei::candidates.emplace_back(NucleusCandidate{static_cast(track.globalIndex()), (1 - 2 * iC) * trackParCov.getPt(), trackParCov.getEta(), trackParCov.getPhi(), track.tpcInnerParam(), beta, collision.posZ(), dcaInfo[0], dcaInfo[1], track.tpcSignal(), track.itsChi2NCl(), track.tpcChi2NCl(), flag, track.tpcNClsFindable(), static_cast(track.tpcNClsCrossedRows()), track.itsClusterMap(), static_cast(track.tpcNClsFound()), static_cast(track.itsClusterSizes())}); } @@ -557,7 +544,7 @@ struct nucleiSpectra { } PROCESS_SWITCH(nucleiSpectra, processData, "Data analysis", true); - void processDataFlow(CollWithQvec const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) + void processDataFlow(CollWithEP const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) { nuclei::candidates.clear(); nuclei::candidates_flow.clear(); @@ -569,7 +556,7 @@ struct nucleiSpectra { nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.clusterSizesITS); } for (auto& c : nuclei::candidates_flow) { - nucleiTableFlow(c.centFV0A, c.centFT0M, c.centFT0A, c.centFT0C, c.qvecFV0ARe, c.qvecFV0AIm, c.sumAmplFV0A, c.qvecFT0MRe, c.qvecFT0MIm, c.sumAmplFT0M, c.qvecFT0ARe, c.qvecFT0AIm, c.sumAmplFT0A, c.qvecFT0CRe, c.qvecFT0CIm, c.sumAmplFT0C, c.qvecBPosRe, c.qvecBPosIm, c.nTrkBPos, c.qvecBNegRe, c.qvecBNegIm, c.nTrkBNeg); + nucleiTableFlow(c.centFV0A, c.centFT0M, c.centFT0A, c.centFT0C, c.psiFT0A, c.multFT0A, c.psiFT0C, c.multFT0C, c.psiTPC, c.psiTPCl, c.psiTPCr, c.multTPC); } } PROCESS_SWITCH(nucleiSpectra, processDataFlow, "Data analysis with flow", false); diff --git a/PWGLF/TableProducer/strangederivedbuilder.cxx b/PWGLF/TableProducer/strangederivedbuilder.cxx index be766b611b6..e9c19c6578f 100644 --- a/PWGLF/TableProducer/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/strangederivedbuilder.cxx @@ -47,6 +47,7 @@ #include "Common/DataModel/Qvectors.h" #include "Framework/StaticFor.h" #include "Common/DataModel/McCollisionExtra.h" +#include "PWGLF/DataModel/EPCalibrationTables.h" using namespace o2; using namespace o2::framework; @@ -236,7 +237,7 @@ struct strangederivedbuilder { } } - void processCollisionsV0sOnly(soa::Join const& collisions, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) + void processCollisionsV0sOnly(soa::Join const& collisions, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) { for (const auto& collision : collisions) { const uint64_t collIdx = collision.globalIndex(); @@ -254,9 +255,10 @@ struct strangederivedbuilder { if (fillRawFT0C || fillRawFT0C || fillRawFV0A || fillRawNTracksEta1 || fillRawZDC) { strangeRawCents(collision.multFT0A() * static_cast(fillRawFT0A), collision.multFT0C() * static_cast(fillRawFT0C), - collision.multFT0A() * static_cast(fillRawFV0A), + collision.multFV0A() * static_cast(fillRawFV0A), collision.multNTracksPVeta1() * static_cast(fillRawNTracksEta1), - collision.multNTracksTPCOnly() * static_cast(fillRawNTracksForCorrelation), + collision.multPVTotalContributors() * static_cast(fillRawNTracksForCorrelation), + collision.multNTracksGlobal() * static_cast(fillRawNTracksForCorrelation), collision.multNTracksITSTPC() * static_cast(fillRawNTracksForCorrelation), collision.multAllTracksTPCOnly() * static_cast(fillRawNTracksForCorrelation), collision.multAllTracksITSTPC() * static_cast(fillRawNTracksForCorrelation), @@ -273,7 +275,7 @@ struct strangederivedbuilder { } } - void processCollisions(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const&) + void processCollisions(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const&) { for (const auto& collision : collisions) { const uint64_t collIdx = collision.globalIndex(); @@ -304,9 +306,10 @@ struct strangederivedbuilder { if (fillRawFT0C || fillRawFT0C || fillRawFV0A || fillRawNTracksEta1 || fillRawZDC) { strangeRawCents(collision.multFT0A() * static_cast(fillRawFT0A), collision.multFT0C() * static_cast(fillRawFT0C), - collision.multFT0A() * static_cast(fillRawFV0A), + collision.multFV0A() * static_cast(fillRawFV0A), collision.multNTracksPVeta1() * static_cast(fillRawNTracksEta1), - collision.multNTracksTPCOnly() * static_cast(fillRawNTracksForCorrelation), + collision.multPVTotalContributors() * static_cast(fillRawNTracksForCorrelation), + collision.multNTracksGlobal() * static_cast(fillRawNTracksForCorrelation), collision.multNTracksITSTPC() * static_cast(fillRawNTracksForCorrelation), collision.multAllTracksTPCOnly() * static_cast(fillRawNTracksForCorrelation), collision.multAllTracksITSTPC() * static_cast(fillRawNTracksForCorrelation), @@ -329,7 +332,7 @@ struct strangederivedbuilder { } } - void processCollisionsMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const&, soa::Join const& mcCollisions, aod::McParticles const&) + void processCollisionsMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const&, soa::Join const& mcCollisions, aod::McParticles const&) { // ______________________________________________ // fill all MC collisions, correlate via index later on @@ -372,9 +375,10 @@ struct strangederivedbuilder { if (fillRawFT0C || fillRawFT0C || fillRawFV0A || fillRawNTracksEta1 || fillRawZDC) { strangeRawCents(collision.multFT0A() * static_cast(fillRawFT0A), collision.multFT0C() * static_cast(fillRawFT0C), - collision.multFT0A() * static_cast(fillRawFV0A), + collision.multFV0A() * static_cast(fillRawFV0A), collision.multNTracksPVeta1() * static_cast(fillRawNTracksEta1), - collision.multNTracksTPCOnly() * static_cast(fillRawNTracksForCorrelation), + collision.multPVTotalContributors() * static_cast(fillRawNTracksForCorrelation), + collision.multNTracksGlobal() * static_cast(fillRawNTracksForCorrelation), collision.multNTracksITSTPC() * static_cast(fillRawNTracksForCorrelation), collision.multAllTracksTPCOnly() * static_cast(fillRawNTracksForCorrelation), collision.multAllTracksITSTPC() * static_cast(fillRawNTracksForCorrelation), @@ -764,6 +768,10 @@ struct strangederivedbuilder { { StraFT0CQVs(collision.qvecFT0CRe(), collision.qvecFT0CIm(), collision.sumAmplFT0C()); } + void processFT0CQVectorsLF(soa::Join::iterator const& collision) + { + StraFT0CQVs(std::cos(2 * collision.psiFT0C()), std::sin(2 * collision.psiFT0C()), 1.f); + } void processFT0MQVectors(soa::Join::iterator const& collision) { StraFT0MQVs(collision.qvecFT0MRe(), collision.qvecFT0MIm(), collision.sumAmplFT0M()); @@ -788,6 +796,7 @@ struct strangederivedbuilder { PROCESS_SWITCH(strangederivedbuilder, processProduceCascTOFs, "Produce CascTOFs table", true); PROCESS_SWITCH(strangederivedbuilder, processFT0AQVectors, "Produce FT0A Q-vectors table", false); PROCESS_SWITCH(strangederivedbuilder, processFT0CQVectors, "Produce FT0C Q-vectors table", false); + PROCESS_SWITCH(strangederivedbuilder, processFT0CQVectorsLF, "Produce FT0C Q-vectors table using LF temporary calibration", false); PROCESS_SWITCH(strangederivedbuilder, processFT0MQVectors, "Produce FT0M Q-vectors table", false); PROCESS_SWITCH(strangederivedbuilder, processFV0AQVectors, "Produce FV0A Q-vectors table", false); }; diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index afcb304d965..73400affd00 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -109,11 +109,6 @@ o2physics_add_dpl_workflow(qa-hist PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(nuclei-flow - SOURCES nucleiFlow.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(qc-spectra-tpc SOURCES QCspectraTPC.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/Tasks/Nuspex/QAHistTask.cxx b/PWGLF/Tasks/Nuspex/QAHistTask.cxx index 89aa57a7241..04a79fca223 100644 --- a/PWGLF/Tasks/Nuspex/QAHistTask.cxx +++ b/PWGLF/Tasks/Nuspex/QAHistTask.cxx @@ -193,6 +193,7 @@ struct QAHistTask { MC_truth_reg.add("histRecVtxMC", "MC collision z position", HistType::kTH1F, {{400, -40., +40., "z position (cm)"}}); // MC reconstructed + MC_recon_reg.add("histCentrality", "Centrality", HistType::kTH1F, {centralityAxis_extended}); MC_recon_reg.add("histPhi", "#phi", HistType::kTH2F, {{100, 0., 2. * TMath::Pi()}, PDGBINNING}); MC_recon_reg.add("histEta", "#eta", HistType::kTH2F, {{102, -2.01, 2.01}, PDGBINNING}); MC_recon_reg.add("histPt", "p_{t}", HistType::kTH2F, {ptAxis, PDGBINNING}); @@ -542,10 +543,6 @@ struct QAHistTask { using TrackCandidatesData = soa::Filtered>; - using EventCandidatesMC = soa::Filtered>; - - using TrackCandidatesMC = soa::Filtered>; - void processData(EventCandidatesData::iterator const& event, TrackCandidatesData const& tracks) { fillDataHistograms(event, tracks); @@ -559,11 +556,12 @@ struct QAHistTask { } PROCESS_SWITCH(QAHistTask, processDataCent, "process data containing centralities", false); - void processMC(soa::Join::iterator const& collisions, soa::Filtered> const& tracks, + void processMC(soa::Join::iterator const& collisions, soa::Filtered> const& tracks, aod::McParticles& mcParticles, aod::McCollisions const& mcCollisions) { MC_truth_reg.fill(HIST("histRecVtxMC"), collisions.posZ()); + MC_recon_reg.fill(HIST("histCentrality"), collisions.centFT0C()); for (auto& track : tracks) { const auto particle = track.mcParticle(); diff --git a/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx b/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx index 72e986e335d..b4a457665c7 100644 --- a/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx +++ b/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx @@ -341,6 +341,7 @@ struct antidLambdaEbye { histos.add("QA/MultVsCent", ";Centrality T0C (%);Multiplicity T0C;", HistType::kTH2F, {centAxis, multFt0Axis}); } else if (doprocessRun2) { histos.add("QA/V0MvsCL0", ";Centrality CL0 (%);Centrality V0M (%)", HistType::kTH2F, {centAxis, centAxis}); + histos.add("QA/trackletsVsV0M", ";Centrality CL0 (%);Centrality V0M (%)", HistType::kTH2F, {centAxis, multAxis}); } // v0 QA @@ -767,14 +768,14 @@ struct antidLambdaEbye { } PROCESS_SWITCH(antidLambdaEbye, processRun3, "process (Run 3)", false); - void processRun2(soa::Join const& collisions, TracksFull const& tracks, soa::Filtered const& V0s, BCsWithRun2Info const&) + void processRun2(soa::Join const& collisions, TracksFull const& tracks, soa::Filtered const& V0s, BCsWithRun2Info const&) { for (const auto& collision : collisions) { if (!collision.sel7()) continue; auto bc = collision.bc_as(); - if (!(bc.eventCuts() & aod::Run2EventCuts::kAliEventCutsAccepted)) + if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) continue; if (!collision.alias_bit(kINT7)) @@ -792,9 +793,11 @@ struct antidLambdaEbye { auto centrality = collision.centRun2V0M(); auto centralityCl0 = collision.centRun2CL0(); + auto multTracklets = collision.multTracklets(); fillRecoEvent(TrackTable_thisCollision, V0Table_thisCollision, centrality); histos.fill(HIST("QA/V0MvsCL0"), centralityCl0, centrality); + histos.fill(HIST("QA/trackletsVsV0M"), centrality, multTracklets); } } PROCESS_SWITCH(antidLambdaEbye, processRun2, "process (Run 2)", false); @@ -830,16 +833,10 @@ struct antidLambdaEbye { } PROCESS_SWITCH(antidLambdaEbye, processMcRun3, "process MC (Run 3)", false); - void processMcRun2(soa::Join const& collisions, aod::McCollisions const& mcCollisions, TracksFull const& tracks, soa::Filtered const& V0s, aod::McParticles const& mcParticles, aod::McTrackLabels const& mcLab) + void processMcRun2(soa::Join const& collisions, aod::McCollisions const& mcCollisions, TracksFull const& tracks, soa::Filtered const& V0s, aod::McParticles const& mcParticles, aod::McTrackLabels const& mcLab) { std::vector> goodCollisions(mcCollisions.size(), std::make_pair(false, -999.)); for (auto& collision : collisions) { - if (!collision.sel7()) - continue; - - if (!collision.alias_bit(kINT7)) - continue; - if (std::abs(collision.posZ()) > zVtxMax) continue; diff --git a/PWGLF/Tasks/Nuspex/nucleiFlow.cxx b/PWGLF/Tasks/Nuspex/nucleiFlow.cxx deleted file mode 100644 index 6c9f1c5bc70..00000000000 --- a/PWGLF/Tasks/Nuspex/nucleiFlow.cxx +++ /dev/null @@ -1,315 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -/// -/// \file nuclei_flow.cxx -/// \brief Measure flow of nuclei using LFSlimNucleiTable data format -/// - -#include "Framework/AnalysisTask.h" -#include "Framework/runDataProcessing.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/Configurable.h" -#include "DataFormatsTPC/BetheBlochAleph.h" -#include "PWGLF/DataModel/LFSlimNucleiTables.h" -#include "Common/Core/EventPlaneHelper.h" -#include "TMath.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; -using namespace o2::constants::physics; - -namespace nuclei_spectra -{ - -constexpr float charges[5]{1.f, 1.f, 1.f, 2.f, 2.f}; - -constexpr float masses[5]{MassProton, MassDeuteron, MassTriton, MassHelium3, MassAlpha}; - -constexpr float bbMomScalingDefault[5][2]{ - {1., 1.}, - {1., 1.}, - {1., 1.}, - {1., 1.}, - {1., 1.}}; - -constexpr float betheBlochDefault[5][6]{ - {-1.e32, -1.e32, -1.e32, -1.e32, -1.e32, -1.e32}, - {-1.e32, -1.e32, -1.e32, -1.e32, -1.e32, -1.e32}, - {-1.e32, -1.e32, -1.e32, -1.e32, -1.e32, -1.e32}, - {-1.e32, -1.e32, -1.e32, -1.e32, -1.e32, -1.e32}, - {-1.e32, -1.e32, -1.e32, -1.e32, -1.e32, -1.e32}}; - -static const std::vector names{"proton", "deuteron", "triton", "He3", "alpha"}; -static const std::vector chargeLabelNames{"Positive", "Negative"}; -static const std::vector betheBlochParNames{"p0", "p1", "p2", "p3", "p4", "resolution"}; - -enum CandBits { - kProton = BIT(0), - kDeuteron = BIT(1), - kTriton = BIT(2), - kHe3 = BIT(3), - kHe4 = BIT(4), - kHasTOF = BIT(5), - kIsReconstructed = BIT(6), - kIsAmbiguous = BIT(7), /// just a placeholder now - kPositive = BIT(8), - kIsPhysicalPrimary = BIT(9), /// MC flags starting from the second half of the short - kIsSecondaryFromMaterial = BIT(10), - kIsSecondaryFromWeakDecay = BIT(11) /// the last 4 bits are reserved for the PID in tracking -}; - -} // namespace nuclei_spectra - -namespace flow -{ -enum kDetector { - kFV0A = 0, - kFT0M = 1, - kFT0A = 2, - kFT0C = 3, - kTPCpos = 4, - kTPCneg = 5 -}; -} // namespace flow - -struct nucleiFlow { - - Configurable cfgCentDetector{"cfgCentDetector", 0, "Detector for centrality estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3)"}; - Configurable cfgHarmonic{"cfgHarmonic", 2, "Harmonic number"}; - Configurable cfgQvecDetector{"cfgQvecDetector", 0, "Detector for Q vector estimation (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3, TPC Pos: 4, TPC Neg: 5)"}; - Configurable cfgSpecies{"cfgSpecies", 3, "Species under study (proton: 0, deuteron: 1, triton: 2, helion: 3, alpha: 4)"}; - - Configurable cfgNclusTPCcut{"cfgNclusTPCcut", 70, "Minimum number of TPC clusters"}; - Configurable cfgDCAxyCut{"cfgDCAxyCut", 0.1, "Cut on DCAxy (cm)"}; - Configurable cfgDCAzCut{"cfgDCAzCut", 1, "Cut on DCAz (cm)"}; - Configurable cfgItsClusSizeCut{"cfgItsClusSizeCut", 4, "Cut on the average ITS cluster size."}; - - HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - - ConfigurableAxis nSigmaBins{"nSigmaBins", {200, -5.f, 5.f}, "Binning for n sigma"}; - ConfigurableAxis centBins{"centBins", {111, -0.5f, 110.5f}, "Binning for centrality"}; - ConfigurableAxis ptBins{"ptBins", {50, 0.f, 5.f}, "Binning for pt"}; - ConfigurableAxis spBins{"spBins", {100, -1.f, 1.f}, "Binning for scalar product"}; - - /// \brief momentum scaling-factor for TPC Bethe-Bloch - Configurable> cfgMomentumScalingBetheBloch{"cfgMomentumScalingBetheBloch", {nuclei_spectra::bbMomScalingDefault[0], 5, 2, nuclei_spectra::names, nuclei_spectra::chargeLabelNames}, "TPC Bethe-Bloch momentum scaling for light nuclei"}; - - /// \brief bethe-bloch parameters - Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {nuclei_spectra::betheBlochDefault[0], 5, 6, nuclei_spectra::names, nuclei_spectra::betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; - - // Selected nuclei tracks with flow info - using TracksWithFlow = soa::Join; - using TrackWithFlow = TracksWithFlow::iterator; - - EventPlaneHelper epHelper; - - /// \brief Get n-sigma TPC - /// \tparam T type for the track - /// \param candidate track candidate - /// \param iSpecies 0: proton, 1: deuteron, 2: triton, 3: He3, 4: Alpha - /// \param iCharge 0: positive, 1: negative - /// \return n-sigma TPC for candidates with iSpecies hypothesis - template - float getNSigmaTPC(const T& candidate, int iSpecies, int iCharge) - { - float scaling_factor = nuclei_spectra::charges[iSpecies] * cfgMomentumScalingBetheBloch->get(iSpecies, iCharge) / nuclei_spectra::masses[iSpecies]; - - float expTPCSignal = o2::tpc::BetheBlochAleph(static_cast(candidate.tpcInnerParam() * scaling_factor), - cfgBetheBlochParams->get(iSpecies, 0u), - cfgBetheBlochParams->get(iSpecies, 1u), - cfgBetheBlochParams->get(iSpecies, 2u), - cfgBetheBlochParams->get(iSpecies, 3u), - cfgBetheBlochParams->get(iSpecies, 4u)); - float resolutionTPC{expTPCSignal * cfgBetheBlochParams->get(iSpecies, 5u)}; - return static_cast((candidate.tpcSignal() - expTPCSignal) / resolutionTPC); - } - - /// @brief Get average ITS cluster size - /// @tparam T type for the track - /// @param track - /// @return average cluster size in ITS - template - float getITSClSize(T const& track) - { - float sum{0.f}; - int nClus = 0; - for (int iL{0}; iL < 6; ++iL) { - auto size = (track.itsClusterSizes() >> (iL * 4)) & 0xf; - if (size > 0) { - nClus++; - sum += size; - } - } - return sum / nClus; - } - - /// @brief Get average ITS cluster size - /// @tparam T type for the track - /// @param track - /// @return true if the candidates passes all the selections - template - bool selectTrack(T const& track) - { - if (track.tpcNCls() < cfgNclusTPCcut) - return false; - if (track.dcaxy() > cfgDCAxyCut) - return false; - if (track.dcaz() > cfgDCAzCut) - return false; - if (getITSClSize(track) < cfgItsClusSizeCut) - return false; - return true; - } - - /// \brief Get the centrality with the selected detector - /// \param track track with the centrality information - /// \return centrality expressed in percentage - float getRefCentrality(TrackWithFlow const& track) - { - float cent = -999.; - switch (cfgCentDetector) { - case flow::kDetector::kFV0A: - cent = track.centFV0A(); - break; - case flow::kDetector::kFT0M: - cent = track.centFT0M(); - break; - case flow::kDetector::kFT0A: - cent = track.centFT0A(); - break; - case flow::kDetector::kFT0C: - cent = track.centFT0C(); - break; - default: - LOG(warning) << "Centrality estimator not valid. Possible values are V0A, T0M, T0A, T0C. Fallback to V0A"; - cent = track.centFV0A(); - break; - } - return cent; - } - - /// \brief Get the Q vector etimated with a particular detector - /// \param track track with the Q vector information - /// \return Q vector in format {x, y} - std::vector getQvec(TrackWithFlow const& track, int detector) - { - float xQvec = -999.; - float yQvec = -999.; - float amplQvec = -999.; - switch (detector) { - case flow::kDetector::kFV0A: - xQvec = track.xQvecFV0A(); - yQvec = track.yQvecFV0A(); - amplQvec = track.amplQvecFV0A(); - break; - case flow::kDetector::kFT0M: - xQvec = track.xQvecFT0M(); - yQvec = track.yQvecFT0M(); - amplQvec = track.amplQvecFT0M(); - break; - case flow::kDetector::kFT0A: - xQvec = track.xQvecFT0A(); - yQvec = track.yQvecFT0A(); - amplQvec = track.amplQvecFT0A(); - break; - case flow::kDetector::kFT0C: - xQvec = track.xQvecFT0M(); - yQvec = track.yQvecFT0M(); - amplQvec = track.amplQvecFT0M(); - break; - case flow::kDetector::kTPCpos: - xQvec = track.xQvecTPCpos(); - yQvec = track.yQvecTPCpos(); - amplQvec = track.amplQvecTPCpos(); - break; - case flow::kDetector::kTPCneg: - xQvec = track.xQvecTPCneg(); - yQvec = track.yQvecTPCneg(); - amplQvec = track.amplQvecTPCneg(); - break; - default: - LOG(warning) << "Q vector estimator not valid. Please choose between FV0A, FT0M, FT0A, FT0C, TPC Pos, TPC Neg. Fallback to FV0A"; - xQvec = track.xQvecFV0A(); - yQvec = track.yQvecFV0A(); - amplQvec = track.amplQvecFV0A(); - break; - } - return {xQvec, yQvec, amplQvec}; - } - - void init(o2::framework::InitContext&) - { - const AxisSpec nSigmaTPCHe3Axis{nSigmaBins, "n#sigma_{TPC}({}^{3}He)"}; - const AxisSpec ptAxis{ptBins, "#it{p}_{T} (GeV/#it{c})"}; - const AxisSpec centAxis{centBins, "centrality(%)"}; - const AxisSpec FT0AspAxis{spBins, "#hat{u}_{2} #upoint #vec{Q}_{2}^{FT0A}"}; - const AxisSpec FT0CspAxis{spBins, "#hat{u}_{2} #upoint #vec{Q}_{2}^{FT0C}"}; - const AxisSpec FV0AspAxis{spBins, "#hat{u}_{2} #upoint #vec{Q}_{2}^{FV0A}"}; - - histos.add("hSpFT0AvsNsigmaHe3VsPtvsCent", "", HistType::kTHnSparseF, {FT0AspAxis, nSigmaTPCHe3Axis, ptAxis, centAxis}); - histos.add("hSpFT0CvsNsigmaHe3VsPtvsCent", "", HistType::kTHnSparseF, {FT0CspAxis, nSigmaTPCHe3Axis, ptAxis, centAxis}); - histos.add("hSpFV0AvsNsigmaHe3VsPtvsCent", "", HistType::kTHnSparseF, {FV0AspAxis, nSigmaTPCHe3Axis, ptAxis, centAxis}); - } - - void process(TracksWithFlow const& tracks) - { - for (auto& track : tracks) { - - if (!selectTrack(track)) - return; - - // Select the centrality value to be stored in the output histograms - float ref_cent = getRefCentrality(track); - - // Get event plane with T0A - std::vector qVecFT0A = getQvec(track, flow::kDetector::kFT0A); - float xQvecFT0A = qVecFT0A[0]; - float yQvecFT0A = qVecFT0A[1]; - - // Get event plane with T0C - std::vector qVecFT0C = getQvec(track, flow::kDetector::kFT0C); - float xQvecFT0C = qVecFT0C[0]; - float yQvecFT0C = qVecFT0C[1]; - // Get event plane with V0A - std::vector qVecFV0A = getQvec(track, flow::kDetector::kFV0A); - float xQvecFV0A = qVecFV0A[0]; - float yQvecFV0A = qVecFV0A[1]; - - // Get candidate vector - float xCandVec = TMath::Cos(cfgHarmonic * track.phi()); - float yCandVec = TMath::Sin(cfgHarmonic * track.phi()); - - // Get scalar products for different event planes - float spFT0A = xCandVec * xQvecFT0A + yCandVec * yQvecFT0A; - float spFT0C = xCandVec * xQvecFT0C + yCandVec * yQvecFT0C; - float spFV0A = xCandVec * xQvecFV0A + yCandVec * yQvecFV0A; - - // Get candidate info - int iCharge = (track.flags() & nuclei_spectra::CandBits::kPositive) ? 0 : 1; - float nSigmaTPC = getNSigmaTPC(track, cfgSpecies, iCharge); - float pt = track.pt() * nuclei_spectra::charges[cfgSpecies]; - - // Fill relevant histograms - histos.fill(HIST("hSpFT0AvsNsigmaHe3VsPtvsCent"), spFT0A, nSigmaTPC, pt, ref_cent); - histos.fill(HIST("hSpFT0CvsNsigmaHe3VsPtvsCent"), spFT0C, nSigmaTPC, pt, ref_cent); - histos.fill(HIST("hSpFV0AvsNsigmaHe3VsPtvsCent"), spFV0A, nSigmaTPC, pt, ref_cent); - } - } -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"nucleiFlow"})}; -} diff --git a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx index a3dbd53fde6..04581389b0c 100644 --- a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx +++ b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx @@ -23,6 +23,7 @@ #include #include #include +#include "TF1.h" #include #include @@ -80,6 +81,9 @@ struct chargedkstaranalysis { true, true}; + HistogramRegistry rGenParticles{"genParticles", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry rRecParticles{"recParticles", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + // Configurable for histograms Configurable nBins{"nBins", 100, "N bins in all histos"}; @@ -135,6 +139,17 @@ struct chargedkstaranalysis { Configurable iscustomDCAcut{"iscustomDCAcut", false, "iscustomDCAcut"}; Configurable ismanualDCAcut{"ismanualDCAcut", true, "ismanualDCAcut"}; Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + ConfigurableAxis cMixMultBins{"cMixMultBins", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f}, "Mixing bins - multiplicity"}; + Configurable isMC{"isMC", true, "Run MC"}; + Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; + Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; + + // Event selection cuts - Alex + TF1* fMultPVCutLow = nullptr; + TF1* fMultPVCutHigh = nullptr; + TF1* fMultCutLow = nullptr; + TF1* fMultCutHigh = nullptr; + TF1* fMultMultPVCut = nullptr; void init(InitContext const&) { @@ -191,6 +206,28 @@ struct chargedkstaranalysis { histos.add("h3CKSInvMassMixed", "Invariant mass of CKS meson Mixed", kTHnSparseF, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {90, 0.6, 1.5}}, true); + + if (isMC) { + rGenParticles.add("hMC", "Gen MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); + rRecParticles.add("hMCRec", "Rec MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); + rGenParticles.add("hPtK0ShortGen", "hPtK0ShortGen", {HistType::kTH1F, {{ptAxis}}}); + rGenParticles.add("hCKSGen", "hCKSGen", {HistType::kTH1F, {{ptAxis}}}); + rRecParticles.add("hCKSRec", "hCKSRec", {HistType::kTH1F, {{ptAxis}}}); + } + + // Event selection cut additional - Alex + if (additionalEvsel) { + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x)", 0, 100); + fMultCutLow->SetParameters(1893.94, -53.86, 0.502913, -0.0015122, 109.625, -1.19253); + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x)", 0, 100); + fMultCutHigh->SetParameters(1893.94, -53.86, 0.502913, -0.0015122, 109.625, -1.19253); + fMultMultPVCut = new TF1("fMultMultPVCut", "[0]+[1]*x+[2]*x*x", 0, 5000); + fMultMultPVCut->SetParameters(-0.1, 0.785, -4.7e-05); + } } double massPi = TDatabasePDG::Instance() @@ -199,21 +236,44 @@ struct chargedkstaranalysis { double massK0s = TDatabasePDG::Instance() ->GetParticle(kK0Short) ->Mass(); // FIXME: Get from the common header + double massKa = o2::constants::physics::MassKPlus; ROOT::Math::PtEtaPhiMVector CKSVector; + template + bool eventSelected(TCollision collision, const float& centrality) + { + if (collision.alias_bit(kTVXinTRD)) { + // TRD triggered + // return 0; + } + auto multNTracksPV = collision.multNTracksPV(); + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + return 0; + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + return 0; + // if (multTrk < fMultCutLow->Eval(centrality)) + // return 0; + // if (multTrk > fMultCutHigh->Eval(centrality)) + // return 0; + // if (multTrk > fMultMultPVCut->Eval(multNTracksPV)) + // return 0; + + return 1; + } + template bool selectionTrack(const T& candidate) { if (iscustomDCAcut && - !(candidate.isGlobalTrack() || candidate.isPVContributor() || - candidate.itsNCls() > cfgITScluster)) { + (!candidate.isGlobalTrack() || !candidate.isPVContributor() || + candidate.itsNCls() < cfgITScluster)) { return false; } if (ismanualDCAcut && - !(candidate.isGlobalTrackWoDCA() || candidate.isPVContributor() || - std::abs(candidate.dcaXY()) < cfgCutDCAxy || - std::abs(candidate.dcaZ()) < cfgCutDCAz || - candidate.itsNCls() > cfgITScluster)) { + (!candidate.isGlobalTrackWoDCA() || !candidate.isPVContributor() || + std::abs(candidate.dcaXY()) > cfgCutDCAxy || + std::abs(candidate.dcaZ()) > cfgCutDCAz || + candidate.itsNCls() < cfgITScluster)) { return false; } return true; @@ -222,6 +282,7 @@ struct chargedkstaranalysis { template bool selectionPID(const T& candidate) { + if (candidate.hasTOF() && (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < @@ -232,6 +293,19 @@ struct chargedkstaranalysis { std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { return true; } + + /* + if (candidate.hasTOF() && + (candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + + candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) < + (nsigmaCutCombined * nsigmaCutCombined)) { + return true; + } + if (!candidate.hasTOF() && + std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + return true; + } + */ return false; } @@ -306,7 +380,7 @@ struct chargedkstaranalysis { { const auto eta = track.eta(); const auto tpcNClsF = track.tpcNClsFound(); - // const auto dcaXY = track.dcaXY(); + const auto dcaXY = track.dcaXY(); const auto sign = track.sign(); if (!track.hasTPC()) @@ -328,9 +402,9 @@ struct chargedkstaranalysis { if (tpcNClsF < ConfDaughTPCnclsMin) { return false; } - /*if (std::abs(dcaXY) < ConfDaughDCAMin) { + if (std::abs(dcaXY) < ConfDaughDCAMin) { return false; - }*/ + } if (std::abs(nsigmaV0Daughter) > ConfDaughPIDCuts) { return false; } @@ -341,20 +415,29 @@ struct chargedkstaranalysis { // Defining filters for events (event selection) // Processed events will be already fulfilling the event selection // requirements - // Filter eventFilter = (o2::aod::evsel::sel8 == true); + Filter eventFilter = (o2::aod::evsel::sel8 == true); Filter posZFilter = (nabs(o2::aod::collision::posZ) < cutzvertex); + Filter posZFilterMC = (nabs(o2::aod::mccollision::posZ) < cutzvertex); Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPT); Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz); - using EventCandidates = soa::Filtered< + using EventCandidatesMC = soa::Join; + /*using EventCandidates = soa::Filtered< soa::Join>; + aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>>;*/ + using EventCandidates = soa::Filtered>; + using TrackCandidates = soa::Filtered< soa::Join>; + aod::TrackSelection, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTPCFullKa, aod::pidTOFFullKa>>; + using TrackCandidatesMC = soa::Filtered< + soa::Join>; + + using V0TrackCandidatesMC = soa::Join; using V0TrackCandidate = aod::V0Datas; ConfigurableAxis axisVertex{ @@ -382,13 +465,21 @@ struct chargedkstaranalysis { BinningTypeVertexContributor binningOnPositions{ {axisVertex, axisMultiplicity}, true}; + Pair pair{binningOnPositions, cfgNoMixedEvents, -1, &cache}; + /* + SameKindPair + pair{binningOnPositions, cfgNoMixedEvents, -1, &cache}; + */ + void processSE(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::V0Datas const& V0s, aod::BCs const&) + { if (!collision.sel8()) { @@ -396,12 +487,17 @@ struct chargedkstaranalysis { } std::vector pions, kshorts; + std::vector pions2; std::vector PionIndex = {}; + std::vector PionSign = {}; std::vector PioncollIndex = {}; + std::vector PionIndex2 = {}; + std::vector PionSign2 = {}; + std::vector PioncollIndex2 = {}; std::vector V0collIndex = {}; std::vector KshortPosDaughIndex = {}; std::vector KshortNegDaughIndex = {}; - + /* float multiplicity = 0.0f; if (cfgMultFT0) multiplicity = collision.multZeqFT0A() + collision.multZeqFT0C(); @@ -409,10 +505,21 @@ struct chargedkstaranalysis { multiplicity = collision.centFT0C(); if (cfgMultFT0 == 0 && cfgCentFT0C == 0) multiplicity = collision.centFT0M(); + */ + float centrality = 0.0f; + centrality = collision.centFT0C(); + + if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + return; + } + + if (additionalEvsel && !eventSelected(collision, centrality)) { + return; + } // Fill the event counter rEventSelection.fill(HIST("hVertexZRec"), collision.posZ()); - rEventSelection.fill(HIST("hmult"), multiplicity); + rEventSelection.fill(HIST("hmult"), centrality); for (auto track1 : tracks) { @@ -441,7 +548,7 @@ struct chargedkstaranalysis { pions.push_back(temp1); PionIndex.push_back(track1.globalIndex()); PioncollIndex.push_back(track1.collisionId()); - + PionSign.push_back(track1.sign()); } // track loop ends for (auto& v0 : V0s) { @@ -458,7 +565,7 @@ struct chargedkstaranalysis { continue; } - if (!SelectionV0(collision, v0, multiplicity)) { + if (!SelectionV0(collision, v0, centrality)) { continue; } @@ -470,21 +577,26 @@ struct chargedkstaranalysis { } if (pions.size() != 0 && kshorts.size() != 0) { + // if (pions.size() != 0 && pions2.size() != 0) { for (auto ipion = pions.begin(); ipion != pions.end(); ++ipion) { auto i1 = std::distance(pions.begin(), ipion); + if (PionSign.at(i1) == 0) + continue; for (auto ikshort = kshorts.begin(); ikshort != kshorts.end(); ++ikshort) { + // for (auto ikshort = pions2.begin(); ikshort != pions2.end(); + // ++ikshort) { auto i3 = std::distance(kshorts.begin(), ikshort); if (PionIndex.at(i1) == KshortPosDaughIndex.at(i3)) continue; if (PionIndex.at(i1) == KshortNegDaughIndex.at(i3)) continue; - if (PioncollIndex.at(i1) != V0collIndex.at(i3)) - continue; - CKSVector = pions.at(i1) + kshorts.at(i3); + // if (PioncollIndex.at(i1) != V0collIndex.at(i3)) + // continue; + CKSVector = pions.at(i1) + kshorts.at(i3); if (TMath::Abs(CKSVector.Rapidity()) < 0.5) { - histos.fill(HIST("h3CKSInvMassUnlikeSign"), multiplicity, + histos.fill(HIST("h3CKSInvMassUnlikeSign"), centrality, CKSVector.Pt(), CKSVector.M()); } } @@ -492,7 +604,7 @@ struct chargedkstaranalysis { } } - PROCESS_SWITCH(chargedkstaranalysis, processSE, "Process Same event", true); + PROCESS_SWITCH(chargedkstaranalysis, processSE, "Process Same event", false); void processME(EventCandidates const& collisions, TrackCandidates const& tracks, V0TrackCandidate const& V0s) @@ -507,7 +619,7 @@ struct chargedkstaranalysis { if (!c2.sel8()) { continue; } - + /* float multiplicity = 0.0f; if (cfgMultFT0) multiplicity = c1.multZeqFT0A() + c1.multZeqFT0C(); @@ -515,15 +627,32 @@ struct chargedkstaranalysis { multiplicity = c1.centFT0C(); if (cfgMultFT0 == 0 && cfgCentFT0C == 0) multiplicity = c1.centFT0M(); + */ + auto centrality = c1.centFT0C(); + auto centrality2 = c2.centFT0C(); + + if (timFrameEvsel && (!c1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !c2.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + continue; + } + + if (additionalEvsel && !eventSelected(c1, centrality)) { + continue; + } + if (additionalEvsel && !eventSelected(c2, centrality2)) { + continue; + } for (auto& [t1, t2] : o2::soa::combinations( o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - if (!(selectionTrack(t1))) + if (!selectionTrack(t1)) continue; - if (!(selectionPID(t1))) + if (!selectionPID(t1)) continue; - if (!SelectionV0(c2, t2, multiplicity)) + if (t1.sign() == 0) + continue; + + if (!SelectionV0(c2, t2, centrality2)) continue; auto postrack = t2.template posTrack_as(); @@ -546,14 +675,251 @@ struct chargedkstaranalysis { TLorentzVector CKSmix = pi + KSh; if (TMath::Abs(CKSmix.Rapidity()) < 0.5) { - histos.fill(HIST("h3CKSInvMassMixed"), multiplicity, CKSmix.Pt(), + histos.fill(HIST("h3CKSInvMassMixed"), centrality, CKSmix.Pt(), CKSmix.M()); } } } } - PROCESS_SWITCH(chargedkstaranalysis, processME, "Process Mixed event", true); + PROCESS_SWITCH(chargedkstaranalysis, processME, "Process Mixed event", false); + + // taken from Sourav da + void processGenMC(aod::McCollision const& mcCollision, aod::McParticles& mcParticles, const soa::SmallGroups& collisions) + { + + if (std::abs(mcCollision.posZ()) < cutzvertex) + rGenParticles.fill(HIST("hMC"), 0.5); + std::vector SelectedEvents(collisions.size()); + int nevts = 0; + for (const auto& collision : collisions) { + if (!collision.sel8() || std::abs(collision.mcCollision().posZ()) > cutzvertex) { + continue; + } + rGenParticles.fill(HIST("hMC"), 1.5); + if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + continue; + } + rGenParticles.fill(HIST("hMC"), 2.5); + SelectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); + } + SelectedEvents.resize(nevts); + const auto evtReconstructedAndSelected = std::find(SelectedEvents.begin(), SelectedEvents.end(), mcCollision.globalIndex()) != SelectedEvents.end(); + + if (!evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection + return; + } + + rGenParticles.fill(HIST("hMC"), 3.5); + for (auto& mcParticle : mcParticles) { + if (std::abs(mcParticle.y()) >= 0.5) { + continue; + } + rGenParticles.fill(HIST("hMC"), 4.5); + if (std::abs(mcParticle.pdgCode()) != 323) { + continue; + } + rGenParticles.fill(HIST("hMC"), 5.5); + auto kDaughters = mcParticle.daughters_as(); + if (kDaughters.size() != 2) { + continue; + } + + rGenParticles.fill(HIST("hMC"), 6.5); + auto daughts = false; + auto daughtp = false; + int count = 0; + for (auto kCurrentDaughter : kDaughters) { + // LOG(info) << "Daughters PDG:\t" << count<<" "<(); + for (auto kCurrentDaughter2 : kDaughter2) { + if (kCurrentDaughter2.pdgCode() == 310) + daughts = true; + } + } else if (std::abs(kCurrentDaughter.pdgCode()) == 211) { + if (kCurrentDaughter.isPhysicalPrimary() == 1) + daughtp = true; + } + count += 1; + } + rGenParticles.fill(HIST("hMC"), 7.5); + if (daughtp && daughts) { + rGenParticles.fill(HIST("hCKSGen"), mcParticle.pt()); + } + } + } + + void processRecMC(EventCandidatesMC::iterator const& collision, + TrackCandidatesMC const& tracks, V0TrackCandidatesMC const& V0s, + aod::McParticles const& mcParticles, aod::McCollisions const& mcCollisions) + + { + + if (!collision.has_mcCollision()) { + return; + } + if (std::abs(collision.mcCollision().posZ()) > cutzvertex || !collision.sel8()) { + return; + } + + rRecParticles.fill(HIST("hMCRec"), 0.5); + + if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + return; + } + + rRecParticles.fill(HIST("hMCRec"), 1.5); + + float centrality = 0.0f; + + for (auto track1 : tracks) { + + if (!selectionPID(track1)) + continue; // for primary particle PID + + if (!track1.has_mcParticle()) { + continue; + } + + if (!selectionTrack(track1)) { + continue; + } + + auto mctrack1 = track1.mcParticle(); + + if (!mctrack1.isPhysicalPrimary()) { + continue; + } + + for (auto& v0 : V0s) { + + if (!v0.has_mcParticle()) { + continue; + } + + auto postrack = v0.template posTrack_as(); + auto negtrack = v0.template negTrack_as(); + + if (!postrack.has_mcParticle()) + continue; // Checking that the daughter tracks come from particles and are not fake + if (!negtrack.has_mcParticle()) // Checking that the daughter tracks come from particles and are not fake + continue; + + // auto posParticle = postrack.mcParticle(); + // auto negParticle = negtrack.mcParticle(); + + double nTPCSigmaPos[1]{postrack.tpcNSigmaPi()}; + double nTPCSigmaNeg[1]{negtrack.tpcNSigmaPi()}; + + if (!isSelectedV0Daughter(postrack, 1, nTPCSigmaPos[0])) { + continue; + } + + if (!isSelectedV0Daughter(negtrack, -1, nTPCSigmaNeg[0])) { + continue; + } + + if (!SelectionV0(collision, v0, centrality)) { + continue; + } + + auto mctrackv0 = v0.mcParticle(); + + /* + for (auto track2 : tracks) { + + if (!selectionPID(track2)) + continue; // for primary particle PID + + if (!track2.has_mcParticle()) { + continue; + } + + if (!selectionTrack(track2)) { + continue; + } + + auto mctrack2 = track2.mcParticle(); + + + if (!mctrack2.isPhysicalPrimary()) { + continue; + } + */ + + int track1PDG = std::abs(mctrack1.pdgCode()); + // int track2PDG = std::abs(mctrack2.pdgCode()); + int trackv0PDG = std::abs(mctrackv0.pdgCode()); + + if (postrack.globalIndex() == track1.globalIndex()) + continue; + if (negtrack.globalIndex() == track1.globalIndex()) + continue; + + rRecParticles.fill(HIST("hMCRec"), 2.5); + + if (track1PDG != 211) { + continue; + } + // if (track2PDG != 321) { + // continue; + // } + if (trackv0PDG != 310) { + continue; + } + + rRecParticles.fill(HIST("hMCRec"), 3.5); + + for (auto& mothertrack1 : mctrack1.mothers_as()) { + // for (auto& mothertrack2 : mctrack2.mothers_as()) { + for (auto& mothertrack2 : mctrackv0.mothers_as()) { + + rRecParticles.fill(HIST("hMCRec"), 4.5); + // LOG(info) << "Mothers PDG:\t" <= 0.5) { + continue; + } + + rRecParticles.fill(HIST("hMCRec"), 6.5); + + if (std::abs(mothertrack1.pdgCode()) != 323) { + continue; + } + + rRecParticles.fill(HIST("hMCRec"), 7.5); + + rRecParticles.fill(HIST("hCKSRec"), mothertrack1.pt()); + } + } + } + + } // track loop ends + } + + PROCESS_SWITCH(chargedkstaranalysis, processGenMC, "Process Gen event", true); + PROCESS_SWITCH(chargedkstaranalysis, processRecMC, "Process Rec event", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGLF/Tasks/Resonances/k892analysis.cxx b/PWGLF/Tasks/Resonances/k892analysis.cxx index 4941eb9734a..0d4bc27b80e 100644 --- a/PWGLF/Tasks/Resonances/k892analysis.cxx +++ b/PWGLF/Tasks/Resonances/k892analysis.cxx @@ -93,6 +93,19 @@ struct k892analysis { histos.add("k892invmassLS", "Invariant mass of K(892)0 like sign", kTH1F, {invMassAxis}); histos.add("k892invmassLSAnti", "Invariant mass of Anti-K(892)0 like sign", kTH1F, {invMassAxis}); histos.add("k892invmassME", "Invariant mass of K(892)0 mixed event", kTH1F, {invMassAxis}); + + // TPC ncluster distirbutions + histos.add("TPCncluster/TPCnclusterpi", "TPC ncluster distribution", kTH1F, {{160, 0, 160, "TPC nCluster"}}); + histos.add("TPCncluster/TPCnclusterka", "TPC ncluster distribution", kTH1F, {{160, 0, 160, "TPC nCluster"}}); + histos.add("TPCncluster/TPCnclusterPhipi", "TPC ncluster vs phi", kTH2F, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); + histos.add("TPCncluster/TPCnclusterPhika", "TPC ncluster vs phi", kTH2F, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); + + // Multiplicity correlation calibrations + histos.add("MultCalib/centglopi", "Centrality vs Global-Tracks", kTH2F, {{110, 0, 110, "Centrality"}, {500, 0, 5000, "Global Tracks"}}); + histos.add("MultCalib/centgloka", "Centrality vs Global-Tracks", kTH2F, {{110, 0, 110, "Centrality"}, {500, 0, 5000, "Global Tracks"}}); + histos.add("MultCalib/GloPVpi", "Global tracks vs PV tracks", kTH2F, {{500, 0, 5000, "Global tracks"}, {500, 0, 5000, "PV tracks"}}); + histos.add("MultCalib/GloPVka", "Global tracks vs PV tracks", kTH2F, {{500, 0, 5000, "Global tracks"}, {500, 0, 5000, "PV tracks"}}); + // DCA QA histos.add("QAbefore/trkDCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {dcaxyAxis}); histos.add("QAbefore/trkDCAxy_ka", "DCAxy distribution of kaon track candidates", HistType::kTH1F, {dcaxyAxis}); @@ -270,6 +283,32 @@ struct k892analysis { if (!selectionPIDPion(trk1) || !selectionPIDKaon(trk2)) continue; + // TPCncluster distributions + histos.fill(HIST("TPCncluster/TPCnclusterpi"), trk1.tpcNClsFound()); + histos.fill(HIST("TPCncluster/TPCnclusterka"), trk2.tpcNClsFound()); + histos.fill(HIST("TPCncluster/TPCnclusterPhipi"), trk1.tpcNClsFound(), trk1.phi()); + histos.fill(HIST("TPCncluster/TPCnclusterPhika"), trk2.tpcNClsFound(), trk2.phi()); + + // Multiplicity correlation calibration plots + int counterglo1 = 0; + int counterglo2 = 0; + int counterpv1 = 0; + int counterpv2 = 0; + + if (trk1.isGlobalTrack()) + counterglo1 = 1; + if (trk2.isGlobalTrack()) + counterglo2 = 1; + if (trk1.isPrimaryTrack()) + counterpv1 = 1; + if (trk2.isPrimaryTrack()) + counterpv2 = 1; + + histos.fill(HIST("MultCalib/centglopi"), multiplicity, counterglo1); + histos.fill(HIST("MultCalib/centgloka"), multiplicity, counterglo2); + histos.fill(HIST("MultCalib/GloPVpi"), counterglo1, counterpv1); + histos.fill(HIST("MultCalib/GloPVka"), counterglo2, counterpv2); + if constexpr (!IsMix) { //// QA plots after the selection // --- PID QA Pion diff --git a/PWGLF/Tasks/Resonances/kstarqa.cxx b/PWGLF/Tasks/Resonances/kstarqa.cxx index 446c8e3c8f3..de4ea5da852 100644 --- a/PWGLF/Tasks/Resonances/kstarqa.cxx +++ b/PWGLF/Tasks/Resonances/kstarqa.cxx @@ -84,10 +84,11 @@ struct kstarqa { Configurable nBins{"nBins", 100, "N bins in all histos"}; // Confugrable for QA histograms - Configurable QAbefore{"QAbefore", false, "QAbefore"}; - Configurable QAafter{"QAafter", false, "QAafter"}; - Configurable QAv0{"QAv0", false, "QAv0"}; - Configurable onlyTPC{"onlyTPC", false, "only TPC tracks"}; + Configurable QA{"QA", false, "QA"}; + Configurable QAbefore{"QAbefore", true, "QAbefore"}; + Configurable QAafter{"QAafter", true, "QAafter"}; + Configurable onlyTOF{"onlyTOF", false, "only TOF tracks"}; + Configurable onlyTOFHIT{"onlyTOFHIT", false, "accept only TOF hit tracks at high pt"}; // Configurable for event selection Configurable @@ -100,8 +101,14 @@ struct kstarqa { Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"}; Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; - Configurable nsigmaCutTPC{"nsigmacutTPC", 3.0, - "Value of the TPC Nsigma cut"}; + Configurable nsigmaCutTPCPi{"nsigmacutTPCPi", 3.0, + "Value of the TPC Nsigma cut for pions"}; + Configurable nsigmaCutTPCKa{"nsigmacutTPCKa", 3.0, + "Value of the TPC Nsigma cut for kaons"}; + Configurable nsigmaCutTOFPi{"nsigmacutTOFPi", 3.0, + "Value of the TOF Nsigma cut for pions"}; + Configurable nsigmaCutTOFKa{"nsigmacutTOFKa", 3.0, + "Value of the TOF Nsigma cut for kaons"}; Configurable nsigmaCutCombined{"nsigmaCutCombined", 3.0, "Value of the Combined Nsigma cut"}; Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 5, @@ -111,6 +118,8 @@ struct kstarqa { Configurable iscustomDCAcut{"iscustomDCAcut", false, "iscustomDCAcut"}; Configurable ismanualDCAcut{"ismanualDCAcut", true, "ismanualDCAcut"}; Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; + Configurable cfgRCRFC{"cfgRCRFC", 0.8f, "Crossed Rows to Findable Clusters"}; ConfigurableAxis cMixMultBins{"cMixMultBins", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f}, "Mixing bins - multiplicity"}; Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; @@ -131,31 +140,39 @@ struct kstarqa { // for primary tracks if (QAbefore && QAafter) { histos.add("hNsigmaPionTPC_before", "NsigmaPion TPC distribution before", - kTH1F, {{200, -10.0f, 10.0f}}); + kTH2F, {{100, 0.0f, 10.0f}, {200, -10.0f, 10.0f}}); histos.add("hNsigmaPionTOF_before", "NsigmaPion TOF distribution before", - kTH1F, {{200, -10.0f, 10.0f}}); + kTH2F, {{100, 0.0f, 10.0f}, {200, -10.0f, 10.0f}}); + histos.add("hNsigmaKaonTPC_before", "NsigmaKaon TPC distribution before", + kTH2F, {{100, 0.0f, 10.0f}, {200, -10.0f, 10.0f}}); + histos.add("hNsigmaKaonTOF_before", "NsigmaKaon TOF distribution before", + kTH2F, {{100, 0.0f, 10.0f}, {200, -10.0f, 10.0f}}); histos.add("hEta_after", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); - histos.add("hDcaxy_after", "Dcaxy distribution", kTH1F, - {{200, -10.0f, 10.0f}}); - histos.add("hDcaz_after", "Dcaz distribution", kTH1F, - {{200, -10.0f, 10.0f}}); - histos.add("hNsigmaPionTPC_after", "NsigmaPion TPC distribution", kTH1F, - {{200, -10.0f, 10.0f}}); - histos.add("hNsigmaPionTOF_after", "NsigmaPion TOF distribution", kTH1F, - {{200, -10.0f, 10.0f}}); + histos.add("hCRFC_after", "CRFC after distribution", kTH1F, + {{100, 0.0f, 10.0f}}); + histos.add("hCRFC_before", "CRFC before distribution", kTH1F, + {{100, 0.0f, 10.0f}}); + histos.add("hNsigmaPionTPC_after", "NsigmaPion TPC distribution", + kTH2F, {{100, 0.0f, 10.0f}, {200, -10.0f, 10.0f}}); + histos.add("hNsigmaPionTOF_after", "NsigmaPion TOF distribution", + kTH2F, {{100, 0.0f, 10.0f}, {200, -10.0f, 10.0f}}); + histos.add("hNsigmaKaonTPC_after", "NsigmaKaon TPC distribution", + kTH2F, {{100, 0.0f, 10.0f}, {200, -10.0f, 10.0f}}); + histos.add("hNsigmaKaonTOF_after", "NsigmaKaon TOF distribution", + kTH2F, {{100, 0.0f, 10.0f}, {200, -10.0f, 10.0f}}); } // CKStar histograms histos.add("h3CKSInvMassUnlikeSign", "Invariant mass of CKS meson Unlike Sign", kTHnSparseF, - {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {90, 0.6, 1.5}}, true); + {{100, 0.0, 1.0}, {200, 0.0f, 20.0f}, {90, 0.6, 1.5}}, true); histos.add("h3CKSInvMasslikeSign", "Invariant mass of CKS meson like Sign", kTHnSparseF, - {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {90, 0.6, 1.5}}, true); + {{100, 0.0, 1.0}, {200, 0.0f, 20.0f}, {90, 0.6, 1.5}}, true); histos.add("h3CKSInvMassMixed", "Invariant mass of CKS meson Mixed", kTHnSparseF, - {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {90, 0.6, 1.5}}, true); + {{100, 0.0, 1.0}, {200, 0.0f, 20.0f}, {90, 0.6, 1.5}}, true); } double massPi = TDatabasePDG::Instance() @@ -176,7 +193,7 @@ struct kstarqa { !(candidate.isGlobalTrackWoDCA() && candidate.isPVContributor() && std::abs(candidate.dcaXY()) < cfgCutDCAxy && std::abs(candidate.dcaZ()) < cfgCutDCAz && - candidate.itsNCls() > cfgITScluster)) { + candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster && candidate.tpcCrossedRowsOverFindableCls() > cfgRCRFC)) { return false; } return true; @@ -186,28 +203,57 @@ struct kstarqa { bool selectionPID(const T& candidate, int PID) { if (PID == 0) { - if (candidate.hasTOF() && - (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + - candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < - (nsigmaCutCombined * nsigmaCutCombined)) { - return true; - } - if (onlyTPC) { + if (onlyTOF) { + // LOG(info) << "************I am inside ONLYTOF****************"; + if (candidate.hasTOF() && + std::abs(candidate.tofNSigmaPi()) < nsigmaCutTOFPi) { + return true; + } + } else if (onlyTOFHIT) { + // LOG(info) << "************I am inside ONLYTOFHIT****************"; + if (candidate.hasTOF() && std::abs(candidate.tofNSigmaPi()) < nsigmaCutTOFPi) { + return true; + } if (!candidate.hasTOF() && - std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { + std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPCPi) { + return true; + } + } else { + // LOG(info) << "************I am neither in ONLYTOF or ONLYTOFHIT****************"; + if (candidate.hasTOF() && + (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < + (nsigmaCutCombined * nsigmaCutCombined)) { + return true; + } + if (!candidate.hasTOF() && + std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPCPi) { return true; } } } else if (PID == 1) { - if (candidate.hasTOF() && - (candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + - candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) < - (nsigmaCutCombined * nsigmaCutCombined)) { - return true; - } - if (onlyTPC) { + if (onlyTOF) { + if (candidate.hasTOF() && + std::abs(candidate.tofNSigmaKa()) < nsigmaCutTOFKa) { + return true; + } + } else if (onlyTOFHIT) { + if (candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) < nsigmaCutTOFKa) { + return true; + } + if (!candidate.hasTOF() && + std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPCKa) { + return true; + } + } else { + if (candidate.hasTOF() && + (candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + + candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) < + (nsigmaCutCombined * nsigmaCutCombined)) { + return true; + } if (!candidate.hasTOF() && - std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPCKa) { return true; } } @@ -264,6 +310,13 @@ struct kstarqa { BinningTypeVertexContributor> pair{binningOnPositions, cfgNoMixedEvents, -1, &cache}; + double totmomka = 0.0; + double totmompi = 0.0; + double totmomkamix = 0.0; + double totmompimix = 0.0; + double openingangle = 0.0; + double openinganglemix = 0.0; + void processSE(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) @@ -286,6 +339,15 @@ struct kstarqa { std::vector PionSign = {}; std::vector KaonSign = {}; + std::vector PionPx = {}; + std::vector KaonPx = {}; + std::vector PionPy = {}; + std::vector KaonPy = {}; + std::vector PionPz = {}; + std::vector KaonPz = {}; + std::vector PionP = {}; + std::vector KaonP = {}; + float multiplicity = 0.0f; /* if (cfgMultFT0) multiplicity = collision.multZeqFT0A() + collision.multZeqFT0C(); @@ -299,89 +361,98 @@ struct kstarqa { rEventSelection.fill(HIST("hmult"), multiplicity); for (auto track1 : tracks) { - /* + if (QAbefore) { - histos.fill(HIST("hNsigmaPionTPC_before"), track1.tpcNSigmaPi()); - histos.fill(HIST("hNsigmaPionTOF_before"), track1.tofNSigmaPi()); + histos.fill(HIST("hNsigmaKaonTPC_before"), track1.pt(), track1.tpcNSigmaKa()); + histos.fill(HIST("hNsigmaKaonTOF_before"), track1.pt(), track1.tofNSigmaKa()); + histos.fill(HIST("hCRFC_before"), track1.tpcCrossedRowsOverFindableCls()); } - */ - - if (!selectionPID(track1, 1)) - continue; // for primary particle PID if (!selectionTrack(track1)) { continue; } - /* if (QAafter) { histos.fill(HIST("hEta_after"), track1.eta()); - histos.fill(HIST("hDcaxy_after"), track1.dcaXY()); - histos.fill(HIST("hDcaz_after"), track1.dcaZ()); - histos.fill(HIST("hNsigmaPionTPC_after"), track1.tpcNSigmaPi()); - histos.fill(HIST("hNsigmaPionTOF_after"), track1.tofNSigmaPi()); + histos.fill(HIST("hCRFC_after"), track1.tpcCrossedRowsOverFindableCls()); + histos.fill(HIST("hNsigmaKaonTPC_after"), track1.pt(), track1.tpcNSigmaKa()); + histos.fill(HIST("hNsigmaKaonTOF_after"), track1.pt(), track1.tofNSigmaKa()); } - */ + + if (!selectionPID(track1, 1)) // kaon + continue; + + totmomka = TMath::Sqrt(track1.px() * track1.px() + track1.py() * track1.py() + track1.pz() * track1.pz()); + ROOT::Math::PtEtaPhiMVector temp1(track1.pt(), track1.eta(), track1.phi(), massKa); kaons.push_back(temp1); KaonIndex.push_back(track1.globalIndex()); KaoncollIndex.push_back(track1.collisionId()); KaonSign.push_back(track1.sign()); + KaonPx.push_back(track1.px()); + KaonPy.push_back(track1.py()); + KaonPz.push_back(track1.pz()); + KaonP.push_back(totmomka); } // track loop ends for (auto track2 : tracks) { - /* + if (QAbefore) { - histos.fill(HIST("hNsigmaPionTPC_before"), track1.tpcNSigmaPi()); - histos.fill(HIST("hNsigmaPionTOF_before"), track1.tofNSigmaPi()); + histos.fill(HIST("hNsigmaPionTPC_before"), track2.pt(), track2.tpcNSigmaPi()); + histos.fill(HIST("hNsigmaPionTOF_before"), track2.pt(), track2.tofNSigmaPi()); } - */ - - if (!selectionPID(track2, 0)) - continue; // for primary particle PID if (!selectionTrack(track2)) { continue; } - /* if (QAafter) { - histos.fill(HIST("hEta_after"), track1.eta()); - histos.fill(HIST("hDcaxy_after"), track1.dcaXY()); - histos.fill(HIST("hDcaz_after"), track1.dcaZ()); - histos.fill(HIST("hNsigmaPionTPC_after"), track1.tpcNSigmaPi()); - histos.fill(HIST("hNsigmaPionTOF_after"), track1.tofNSigmaPi()); + histos.fill(HIST("hNsigmaPionTPC_after"), track2.pt(), track2.tpcNSigmaPi()); + histos.fill(HIST("hNsigmaPionTOF_after"), track2.pt(), track2.tofNSigmaPi()); } - */ + + if (!selectionPID(track2, 0)) // pion + continue; + + totmompi = TMath::Sqrt(track2.px() * track2.px() + track2.py() * track2.py() + track2.pz() * track2.pz()); + ROOT::Math::PtEtaPhiMVector temp2(track2.pt(), track2.eta(), track2.phi(), massPi); pions.push_back(temp2); PionIndex.push_back(track2.globalIndex()); PioncollIndex.push_back(track2.collisionId()); PionSign.push_back(track2.sign()); - + PionPx.push_back(track2.px()); + PionPy.push_back(track2.py()); + PionPz.push_back(track2.pz()); + PionP.push_back(totmompi); } // track loop ends - if (pions.size() != 0 && kaons.size() != 0) { - for (auto ikaon = kaons.begin(); ikaon != kaons.end(); ++ikaon) { - auto i1 = std::distance(kaons.begin(), ikaon); - for (auto ipion = pions.begin(); ipion != pions.end(); - ++ipion) { - auto i3 = std::distance(pions.begin(), ipion); - - if (PionIndex.at(i3) <= KaonIndex.at(i1)) - continue; - CKSVector = kaons.at(i1) + pions.at(i3); - - if (TMath::Abs(CKSVector.Rapidity()) < 0.5) { - if (PionSign.at(i3) * KaonSign.at(i1) < 0) - histos.fill(HIST("h3CKSInvMassUnlikeSign"), multiplicity, - CKSVector.Pt(), CKSVector.M()); - else if (PionSign.at(i3) * KaonSign.at(i1) > 0) - histos.fill(HIST("h3CKSInvMasslikeSign"), multiplicity, - CKSVector.Pt(), CKSVector.M()); + if (!QA) { + if (pions.size() != 0 && kaons.size() != 0) { + for (auto ikaon = kaons.begin(); ikaon != kaons.end(); ++ikaon) { + auto i1 = std::distance(kaons.begin(), ikaon); + for (auto ipion = pions.begin(); ipion != pions.end(); + ++ipion) { + auto i3 = std::distance(pions.begin(), ipion); + + if (PionIndex.at(i3) <= KaonIndex.at(i1)) + continue; + CKSVector = kaons.at(i1) + pions.at(i3); + + openingangle = TMath::Abs((PionPx.at(i3) * KaonPx.at(i1) + PionPy.at(i3) * KaonPy.at(i1) + PionPz.at(i3) * KaonPz.at(i1)) / (PionP.at(i3) * KaonP.at(i1))); + // openingangle = (PionPx.at(i3)*KaonPx.at(i1) + PionPy.at(i3)*KaonPy.at(i1) + PionPz.at(i3)*KaonPz.at(i1)); + // LOG(info) << "opening angle" << openingangle; + if (TMath::Abs(CKSVector.Rapidity()) < 0.5) { + if (PionSign.at(i3) * KaonSign.at(i1) < 0) + histos.fill(HIST("h3CKSInvMassUnlikeSign"), openingangle, + CKSVector.Pt(), CKSVector.M()); + else if (PionSign.at(i3) * KaonSign.at(i1) > 0) + histos.fill(HIST("h3CKSInvMasslikeSign"), openingangle, + CKSVector.Pt(), CKSVector.M()); + } } } } @@ -405,16 +476,16 @@ struct kstarqa { } if (timFrameEvsel && (!c1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c2.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - return; + continue; } - float multiplicity = 0.0f; + // float multiplicity = 0.0f; /* if (cfgMultFT0) multiplicity = c1.multZeqFT0A() + c1.multZeqFT0C(); - if (cfgMultFT0 == 0 && cfgCentFT0C == 1) + if (cfgMultFT0 == 0 && cfgCentFT0C == 1) multiplicity = c1.centFT0C(); - if (cfgMultFT0 == 0 && cfgCentFT0C == 0)*/ - multiplicity = c1.centFT0M(); + if (cfgMultFT0 == 0 && cfgCentFT0C == 0)*/ + // multiplicity = c1.centFT0M(); for (auto& [t1, t2] : o2::soa::combinations( o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { @@ -433,12 +504,21 @@ struct kstarqa { TLorentzVector PION; PION.SetPtEtaPhiM(t2.pt(), t2.eta(), t2.phi(), massPi); + totmompimix = TMath::Sqrt(t2.px() * t2.px() + t2.py() * t2.py() + t2.pz() * t2.pz()); + totmomkamix = TMath::Sqrt(t1.px() * t1.px() + t1.py() * t1.py() + t1.pz() * t1.pz()); + + openinganglemix = TMath::Abs((t1.px() * t2.px() + t1.py() * t2.py() + t1.pz() * t2.pz()) / (totmomkamix * totmompimix)); + + // LOG(info) << "mix angle" << openinganglemix; + TLorentzVector CKSmix = KAON + PION; - if (TMath::Abs(CKSmix.Rapidity()) < 0.5) { - if (t1.sign() * t2.sign() < 0) - histos.fill(HIST("h3CKSInvMassMixed"), multiplicity, CKSmix.Pt(), - CKSmix.M()); + if (!QA) { + if (TMath::Abs(CKSmix.Rapidity()) < 0.5) { + if (t1.sign() * t2.sign() < 0) + histos.fill(HIST("h3CKSInvMassMixed"), openingangle, CKSmix.Pt(), + CKSmix.M()); + } } } } diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3.cxx index ab6497a0e48..c163c85f761 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3.cxx @@ -72,10 +72,12 @@ struct phianalysisrun3 { Configurable ismanualDCAcut{"ismanualDCAcut", true, "ismanualDCAcut"}; Configurable isITSOnlycut{"isITSOnlycut", true, "isITSOnlycut"}; Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; Configurable isDeepAngle{"isDeepAngle", false, "Deep Angle cut"}; Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; // MC Configurable isMC{"isMC", false, "Run MC"}; + Configurable avoidsplitrackMC{"avoidsplitrackMC", false, "avoid split track in MC"}; void init(o2::framework::InitContext&) { histos.add("hCentrality", "Centrality distribution", kTH1F, {{201, -0.5, 200.5}}); @@ -101,10 +103,10 @@ struct phianalysisrun3 { histos.add("h3PhiInvMassMixedCside", "Invariant mass of Phi meson Mixed C side", kTH3F, {{201, -0.5, 200.5}, {100, 0.0f, 10.0f}, {200, 0.9, 1.1}}); } } else if (isMC) { - histos.add("hMC", "MC Event statistics", kTH1F, {{5, 0.0f, 4.0f}}); + histos.add("hMC", "MC Event statistics", kTH1F, {{6, 0.0f, 6.0f}}); histos.add("h1PhiGen", "Phi meson Gen", kTH1F, {{100, 0.0f, 10.0f}}); - histos.add("h1PhiGensamecoll", "Phi meson Gen same coll", kTH1F, {{100, 0.0f, 10.0f}}); - histos.add("h2PhiRec", "Phi meson Rec", kTH2F, {{100, 0.0f, 10.0f}, {200, -0.1, 0.1}}); + histos.add("h1PhiRecsplit", "Phi meson Rec split", kTH1F, {{100, 0.0f, 10.0f}}); + histos.add("h3PhiRec", "Phi meson Rec", kTH3F, {{100, 0.0f, 10.0f}, {100, 0.0f, 10.0f}, {200, -0.1, 0.1}}); } } @@ -120,13 +122,13 @@ struct phianalysisrun3 { template bool selectionTrack(const T& candidate) { - if (iscustomDCAcut && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster)) { + if (iscustomDCAcut && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { return false; } - if (ismanualDCAcut && !(candidate.isGlobalTrackWoDCA() && candidate.isPVContributor() && std::abs(candidate.dcaXY()) < cfgCutDCAxy && std::abs(candidate.dcaZ()) < cfgCutDCAz && candidate.itsNCls() > cfgITScluster)) { + if (ismanualDCAcut && !(candidate.isGlobalTrackWoDCA() && candidate.isPVContributor() && std::abs(candidate.dcaXY()) < cfgCutDCAxy && std::abs(candidate.dcaZ()) < cfgCutDCAz && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { return false; } - if (isITSOnlycut && !(candidate.isPVContributor() && std::abs(candidate.dcaXY()) < cfgCutDCAxy && std::abs(candidate.dcaZ()) < cfgCutDCAz && candidate.itsNCls() > cfgITScluster)) { + if (isITSOnlycut && !(candidate.isPVContributor() && std::abs(candidate.dcaXY()) < cfgCutDCAxy && std::abs(candidate.dcaZ()) < cfgCutDCAz && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { return false; } return true; @@ -269,12 +271,12 @@ struct phianalysisrun3 { histos.fill(HIST("hDcaz"), track1.dcaZ()); histos.fill(HIST("hNsigmaKaonTPC"), track1.tpcNSigmaKa()); histos.fill(HIST("hNsigmaKaonTOF"), track1.tofNSigmaKa()); - auto track1ID = track1.globalIndex(); + auto track1ID = track1.index(); for (auto track2 : tracks) { if (!selectionTrack(track2)) { continue; } - auto track2ID = track2.globalIndex(); + auto track2ID = track2.index(); if (track2ID <= track1ID) { continue; } @@ -368,11 +370,11 @@ struct phianalysisrun3 { } SelectedEvents.resize(nevts); const auto evtReconstructedAndSelected = std::find(SelectedEvents.begin(), SelectedEvents.end(), mcCollision.globalIndex()) != SelectedEvents.end(); - + histos.fill(HIST("hMC"), 3.5); if (!evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection return; } - histos.fill(HIST("hMC"), 3.5); + histos.fill(HIST("hMC"), 4.5); for (auto& mcParticle : mcParticles) { if (std::abs(mcParticle.y()) > 0.5) { continue; @@ -411,7 +413,8 @@ struct phianalysisrun3 { if (std::abs(collision.mcCollision().posZ()) > cfgCutVertex || !collision.sel8()) { return; } - histos.fill(HIST("hMC"), 4.5); + histos.fill(HIST("hMC"), 5.5); + auto oldindex = -999; for (auto track1 : tracks) { if (!selectionTrack(track1)) { continue; @@ -419,7 +422,7 @@ struct phianalysisrun3 { if (!track1.has_mcParticle()) { continue; } - auto track1ID = track1.globalIndex(); + auto track1ID = track1.index(); for (auto track2 : tracks) { if (!track2.has_mcParticle()) { continue; @@ -427,7 +430,7 @@ struct phianalysisrun3 { if (!selectionTrack(track2)) { continue; } - auto track2ID = track2.globalIndex(); + auto track2ID = track2.index(); if (track2ID <= track1ID) { continue; } @@ -455,7 +458,10 @@ struct phianalysisrun3 { if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) { continue; } - if (mothertrack1 != mothertrack2) { + if (mothertrack1.globalIndex() != mothertrack2.globalIndex()) { + continue; + } + if (!mothertrack1.producedByGenerator()) { continue; } if (std::abs(mothertrack1.y()) > 0.5) { @@ -464,21 +470,23 @@ struct phianalysisrun3 { if (std::abs(mothertrack1.pdgCode()) != 333) { continue; } - if (!isITSOnlycut) { - if (!selectionPID(track1) || !selectionPID(track2)) { - continue; - } + if (!isITSOnlycut && !(selectionPID(track1) && selectionPID(track2))) { + continue; + } + if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { + histos.fill(HIST("h1PhiRecsplit"), mothertrack1.pt()); + continue; } + oldindex = mothertrack1.globalIndex(); pvec0 = array{track1.px(), track1.py(), track1.pz()}; pvec1 = array{track2.px(), track2.py(), track2.pz()}; auto arrMomrec = array{pvec0, pvec1}; - auto motherP = mothertrack1.p(); auto motherE = mothertrack1.e(); genMass = std::sqrt(motherE * motherE - motherP * motherP); - recMass = RecoDecay::m(arrMomrec, array{massKa, massKa}); - histos.fill(HIST("h2PhiRec"), mothertrack1.pt(), recMass - genMass); + auto recpt = TMath::Sqrt((track1.px() + track2.px()) * (track1.px() + track2.px()) + (track1.py() + track2.py()) * (track1.py() + track2.py())); + histos.fill(HIST("h3PhiRec"), mothertrack1.pt(), recpt, recMass - genMass); } } } diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx index 2dda2ffe587..dc6c0764dea 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx @@ -148,7 +148,7 @@ struct phianalysisrun3_PbPb { { if (collision.alias_bit(kTVXinTRD)) { // TRD triggered - return 0; + // return 0; } auto multNTracksPV = collision.multNTracksPV(); if (multNTracksPV < fMultPVCutLow->Eval(centrality)) @@ -162,13 +162,13 @@ struct phianalysisrun3_PbPb { template bool selectionTrack(const T& candidate) { - if (iscustomDCAcut && !(candidate.isGlobalTrack() || candidate.isPVContributor() || candidate.itsNCls() > cfgITScluster)) { + if (iscustomDCAcut && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster)) { return false; } - if (ismanualDCAcut && !(candidate.isGlobalTrackWoDCA() || candidate.isPVContributor() || std::abs(candidate.dcaXY()) < cfgCutDCAxy || std::abs(candidate.dcaZ()) < cfgCutDCAz || candidate.itsNCls() > cfgITScluster)) { + if (ismanualDCAcut && !(candidate.isGlobalTrackWoDCA() && candidate.isPVContributor() && std::abs(candidate.dcaXY()) < cfgCutDCAxy && std::abs(candidate.dcaZ()) < cfgCutDCAz && candidate.itsNCls() > cfgITScluster)) { return false; } - if (isITSOnlycut && !(candidate.isPVContributor() || std::abs(candidate.dcaXY()) < cfgCutDCAxy || std::abs(candidate.dcaZ()) < cfgCutDCAz || candidate.itsNCls() > cfgITScluster)) { + if (isITSOnlycut && !(candidate.isPVContributor() && std::abs(candidate.dcaXY()) < cfgCutDCAxy && std::abs(candidate.dcaZ()) < cfgCutDCAz && candidate.itsNCls() > cfgITScluster)) { return false; } return true; @@ -356,17 +356,17 @@ struct phianalysisrun3_PbPb { } if (timFrameEvsel && (!c1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c2.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - return; + continue; } auto multiplicity = c1.centFT0C(); auto multiplicity2 = c2.centFT0C(); if (additionalEvsel && !eventSelected(c1, multiplicity)) { - return; + continue; } if (additionalEvsel && !eventSelected(c2, multiplicity2)) { - return; + continue; } for (auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index cde3ff957ca..f4ae98e1900 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -85,6 +85,7 @@ struct phipbpb { Configurable nsigmaCutCombined{"nsigmaCutCombined", 3.0, "Value of the TOF Nsigma cut"}; Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 1, "Number of mixed events per event"}; Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; Configurable isNoTOF{"isNoTOF", false, "isNoTOF"}; Configurable isDeepAngle{"isDeepAngle", false, "Deep Angle cut"}; Configurable ispTdepPID{"ispTdepPID", true, "pT dependent PID"}; @@ -100,6 +101,7 @@ struct phipbpb { Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; Configurable isMC{"isMC", false, "use MC"}; + Configurable avoidsplitrackMC{"avoidsplitrackMC", false, "avoid split track in MC"}; Configurable islike{"islike", false, "use like"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter centralityFilter = nabs(aod::cent::centFT0C) < cfgCutCentrality; @@ -146,6 +148,7 @@ struct phipbpb { AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; histos.add("hpTvsRapidity", "pT vs Rapidity", kTH2F, {{100, 0.0f, 10.0f}, {300, -1.5f, 1.5f}}); + histos.add("hFTOCvsTPCNoCut", "Mult correlation FT0C vs. TPC without any cut", kTH2F, {{80, 0.0f, 80.0f}, {100, -0.5f, 5999.5f}}); histos.add("hFTOCvsTPC", "Mult correlation FT0C vs. TPC", kTH2F, {{80, 0.0f, 80.0f}, {100, -0.5f, 5999.5f}}); histos.add("hFTOCvsTPCSelected", "Mult correlation FT0C vs. TPC after selection", kTH2F, {{80, 0.0f, 80.0f}, {100, -0.5f, 5999.5f}}); histos.add("hCentrality", "Centrality distribution", kTH1F, {{200, 0.0, 200.0}}); @@ -191,6 +194,7 @@ struct phipbpb { // MC histogram if (isMC) { histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); + histos.add("h1PhiRecsplit", "Phi meson Rec split", kTH1F, {{100, 0.0f, 10.0f}}); histos.add("CentPercentileMCRecHist", "MC Centrality", kTH1F, {{100, 0.0f, 100.0f}}); histos.add("hSparseV2SASameEvent_costhetastarOP_MCGen", "hSparseV2SASameEvent_costhetastarOP_MCGen", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStarOP, thnAxisPhiminusPsi, thnAxisCentrality}); histos.add("hSparseV2SASameEvent_costhetastarIP_MCGen", "hSparseV2SASameEvent_costhetastarIP_MCGen", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStarOP, thnAxisPhiminusPsi, thnAxisCentrality}); @@ -246,7 +250,7 @@ struct phipbpb { template bool selectionTrack(const T& candidate) { - if (!(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster)) { + if (!(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { return false; } return true; @@ -330,7 +334,9 @@ struct phipbpb { if (!collision.sel8()) { return; } - + auto centrality = collision.centFT0C(); + auto multTPC = collision.multNTracksPV(); + histos.fill(HIST("hFTOCvsTPCNoCut"), centrality, multTPC); if (!collision.triggereventep()) { return; } @@ -339,8 +345,6 @@ struct phipbpb { } auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto centrality = collision.centFT0C(); - auto multTPC = collision.multNTracksPV(); auto psiFT0C = collision.psiFT0C(); auto psiFT0A = collision.psiFT0A(); auto psiTPC = collision.psiTPC(); @@ -512,6 +516,77 @@ struct phipbpb { } } PROCESS_SWITCH(phipbpb, processMixedEvent, "Process Mixed event", true); + void processMixedEventOpti(EventCandidates const& collisions, TrackCandidates const& tracks) + { + auto tracksTuple = std::make_tuple(tracks); + BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass, axisEPAngle}, true}; + SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; + for (auto& [collision1, tracks1, collision2, tracks2] : pair) { + if (!collision1.sel8() || !collision2.sel8()) { + continue; + } + if (!collision1.triggereventep() || !collision2.triggereventep()) { + continue; + } + if (timFrameEvsel && (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + continue; + } + auto centrality = collision1.centFT0C(); + auto centrality2 = collision2.centFT0C(); + auto psiFT0C = collision1.psiFT0C(); + if (additionalEvsel && !eventSelected(collision1, centrality)) { + continue; + } + if (additionalEvsel && !eventSelected(collision2, centrality2)) { + continue; + } + + for (auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { + if (track1.sign() * track2.sign() > 0) { + continue; + } + if (!selectionTrack(track1) || !selectionTrack(track2)) { + continue; + } + // PID check + if (ispTdepPID && (!selectionPIDpTdependent(track1) || !selectionPIDpTdependent(track2))) { + continue; + } + if (!ispTdepPID && (!selectionPID(track1) || !selectionPID(track2))) { + continue; + } + if (!selectionPair(track1, track2)) { + continue; + } + KaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); + PhiMesonMother = KaonPlus + KaonMinus; + if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { + continue; + } + ROOT::Math::Boost boost{PhiMesonMother.BoostToCM()}; + fourVecDauCM = boost(KaonMinus); + threeVecDauCM = fourVecDauCM.Vect(); + threeVecDauCMXY = ROOT::Math::XYZVector(threeVecDauCM.X(), threeVecDauCM.Y(), 0.); + eventplaneVec = ROOT::Math::XYZVector(std::cos(2.0 * psiFT0C), std::sin(2.0 * psiFT0C), 0); + eventplaneVecNorm = ROOT::Math::XYZVector(std::sin(2.0 * psiFT0C), -std::cos(2.0 * psiFT0C), 0); + + auto cosPhistarminuspsi = GetPhiInRange(fourVecDauCM.Phi() - psiFT0C); + auto SA = TMath::Cos(2.0 * cosPhistarminuspsi); + auto cosThetaStarOP = TMath::Abs(eventplaneVecNorm.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()) / std::sqrt(eventplaneVecNorm.Mag2())); + auto SA_A0 = 1 - (cosThetaStarOP * cosThetaStarOP); + auto cosThetaStarIP = TMath::Abs(eventplaneVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()) / std::sqrt(eventplaneVec.Mag2())); + auto phiminuspsi = GetPhiInRange(PhiMesonMother.Phi() - psiFT0C); + auto v2 = TMath::Cos(2.0 * phiminuspsi); + histos.fill(HIST("hSparseV2SAMixedEvent_costhetastarOP"), PhiMesonMother.M(), PhiMesonMother.Pt(), cosThetaStarOP, phiminuspsi, centrality); + histos.fill(HIST("hSparseV2SAMixedEvent_costhetastarIP"), PhiMesonMother.M(), PhiMesonMother.Pt(), cosThetaStarIP, phiminuspsi, centrality); + histos.fill(HIST("hSparseV2SAMixedEvent_SA"), PhiMesonMother.M(), PhiMesonMother.Pt(), SA, phiminuspsi, centrality); + histos.fill(HIST("hSparseV2SAMixedEvent_SA_A0"), PhiMesonMother.M(), PhiMesonMother.Pt(), SA_A0, phiminuspsi, centrality); + histos.fill(HIST("hSparseV2SAMixedEvent_V2"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2, centrality); + } + } + } + PROCESS_SWITCH(phipbpb, processMixedEventOpti, "Process Mixed event new", true); void processMC(CollisionMCTrueTable::iterator const& TrueCollision, CollisionMCRecTableCentFT0C const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) { histos.fill(HIST("hMC"), 0); @@ -541,6 +616,7 @@ struct phipbpb { histos.fill(HIST("hMC"), 7); auto centrality = RecCollision.centFT0C(); histos.fill(HIST("CentPercentileMCRecHist"), centrality); + auto oldindex = -999; auto Rectrackspart = RecTracks.sliceBy(perCollision, RecCollision.globalIndex()); // loop over reconstructed particle for (auto track1 : Rectrackspart) { @@ -556,8 +632,12 @@ struct phipbpb { if (!track1.has_mcParticle()) { continue; } - auto track1ID = track1.globalIndex(); + auto track1ID = track1.index(); for (auto track2 : Rectrackspart) { + auto track2ID = track2.index(); + if (track2ID <= track1ID) { + continue; + } if (!selectionTrack(track2)) { continue; } @@ -570,16 +650,12 @@ struct phipbpb { if (!track2.has_mcParticle()) { continue; } - auto track2ID = track2.globalIndex(); if (!selectionPair(track1, track2)) { continue; } if (track1.sign() * track2.sign() > 0) { continue; } - if (track1ID == track2ID) { - continue; - } const auto mctrack1 = track1.mcParticle(); const auto mctrack2 = track2.mcParticle(); int track1PDG = std::abs(mctrack1.pdgCode()); @@ -610,6 +686,11 @@ struct phipbpb { if (!selectionPID(track1) || !selectionPID(track2)) { continue; } + if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { + histos.fill(HIST("h1PhiRecsplit"), mothertrack1.pt()); + continue; + } + oldindex = mothertrack1.globalIndex(); KaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); PhiMesonMother = KaonPlus + KaonMinus; diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index 2282f886c29..a7e9b9566b8 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -857,50 +857,51 @@ struct derivedlambdakzeroanalysis { auto hOmegaMinus = histos.get(HIST("h2dGenOmegaMinus")); auto hOmegaPlus = histos.get(HIST("h2dGenOmegaPlus")); for (auto& gVec : geK0Short) { - if (gVec.size() != hK0Short->GetNcells()) - LOGF(fatal, "K0Short: Number of elements in generated array and number of cells in receiving histogram differ!"); + if (gVec.generatedK0Short().size() != hK0Short->GetNcells()) + LOGF(fatal, "K0Short: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedK0Short().size(), hK0Short->GetNcells()); for (uint32_t iv = 0; iv < hK0Short->GetNcells(); iv++) { - hK0Short->SetBinContent(iv + 1, hK0Short->GetBinContent(iv + 1) + gVec.generatedK0Short()[iv]); + LOGF(info, "processing element %i with content: %i", iv, gVec.generatedK0Short()[iv]); + hK0Short->SetBinContent(iv, hK0Short->GetBinContent(iv) + gVec.generatedK0Short()[iv]); } } for (auto& gVec : geLambda) { - if (gVec.size() != hLambda->GetNcells()) - LOGF(fatal, "Lambda: Number of elements in generated array and number of cells in receiving histogram differ!"); + if (gVec.generatedLambda().size() != hLambda->GetNcells()) + LOGF(fatal, "Lambda: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedLambda().size(), hLambda->GetNcells()); for (uint32_t iv = 0; iv < hLambda->GetNcells(); iv++) { hLambda->SetBinContent(iv, hLambda->GetBinContent(iv) + gVec.generatedLambda()[iv]); } } for (auto& gVec : geAntiLambda) { - if (gVec.size() != hAntiLambda->GetNcells()) - LOGF(fatal, "AntiLambda: Number of elements in generated array and number of cells in receiving histogram differ!"); + if (gVec.generatedAntiLambda().size() != hAntiLambda->GetNcells()) + LOGF(fatal, "AntiLambda: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedAntiLambda().size(), hAntiLambda->GetNcells()); for (uint32_t iv = 0; iv < hAntiLambda->GetNcells(); iv++) { hAntiLambda->SetBinContent(iv, hAntiLambda->GetBinContent(iv) + gVec.generatedAntiLambda()[iv]); } } for (auto& gVec : geXiMinus) { - if (gVec.size() != hXiMinus->GetNcells()) - LOGF(fatal, "XiMinus: Number of elements in generated array and number of cells in receiving histogram differ!"); + if (gVec.generatedXiMinus().size() != hXiMinus->GetNcells()) + LOGF(fatal, "XiMinus: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedXiMinus().size(), hXiMinus->GetNcells()); for (uint32_t iv = 0; iv < hXiMinus->GetNcells(); iv++) { hXiMinus->SetBinContent(iv, hXiMinus->GetBinContent(iv) + gVec.generatedXiMinus()[iv]); } } for (auto& gVec : geXiPlus) { - if (gVec.size() != hXiPlus->GetNcells()) - LOGF(fatal, "XiPlus: Number of elements in generated array and number of cells in receiving histogram differ!"); + if (gVec.generatedXiPlus().size() != hXiPlus->GetNcells()) + LOGF(fatal, "XiPlus: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedXiPlus().size(), hXiPlus->GetNcells()); for (uint32_t iv = 0; iv < hXiPlus->GetNcells(); iv++) { hXiPlus->SetBinContent(iv, hXiPlus->GetBinContent(iv) + gVec.generatedXiPlus()[iv]); } } for (auto& gVec : geOmegaMinus) { - if (gVec.size() != hOmegaMinus->GetNcells()) - LOGF(fatal, "OmegaMinus: Number of elements in generated array and number of cells in receiving histogram differ!"); + if (gVec.generatedOmegaMinus().size() != hOmegaMinus->GetNcells()) + LOGF(fatal, "OmegaMinus: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedOmegaMinus().size(), hOmegaMinus->GetNcells()); for (uint32_t iv = 0; iv < hOmegaMinus->GetNcells(); iv++) { hOmegaMinus->SetBinContent(iv, hOmegaMinus->GetBinContent(iv) + gVec.generatedOmegaMinus()[iv]); } } for (auto& gVec : geOmegaPlus) { - if (gVec.size() != hOmegaPlus->GetNcells()) - LOGF(fatal, "OmegaPlus: Number of elements in generated array and number of cells in receiving histogram differ!"); + if (gVec.generatedOmegaPlus().size() != hOmegaPlus->GetNcells()) + LOGF(fatal, "OmegaPlus: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedOmegaPlus().size(), hOmegaPlus->GetNcells()); for (uint32_t iv = 0; iv < hOmegaPlus->GetNcells(); iv++) { hOmegaPlus->SetBinContent(iv, hOmegaPlus->GetBinContent(iv) + gVec.generatedOmegaPlus()[iv]); } diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 799bb6c2173..b3125e0fa90 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -343,9 +343,7 @@ struct NonPromptCascadeTask { void processTrackedCascadesMC(CollisionCandidatesRun3 const& collision, aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const& cascades, aod::V0s const& v0s, TracksExtMC const& tracks, - soa::Join const& trackedcascdata, - aod::McParticles const& mcParticles, aod::BCsWithTimestamps const&, - aod::McTrackLabels const& trackLabelsMC) + aod::McParticles const& mcParticles, aod::BCsWithTimestamps const&) { candidates.clear(); bool isOmega{false}; @@ -364,10 +362,7 @@ struct NonPromptCascadeTask { df2.setMinRelChi2Change(minRelChi2Change); df2.setUseAbsDCA(useAbsDCA); - for (const auto& trackedCascadeData : trackedcascdata) { - registry.fill(HIST("h_buildermassvspt_Omega"), trackedCascadeData.mOmega(), trackedCascadeData.pt()); - registry.fill(HIST("h_buildermassvspt_Xi"), trackedCascadeData.mXi(), trackedCascadeData.pt()); - } + std::vector mcParticleId; for (const auto& trackedCascade : trackedCascades) { @@ -538,24 +533,6 @@ struct NonPromptCascadeTask { protonTrack.mcParticle().mothersIds()[0] == pionTrack.mcParticle().mothersIds()[0]) { const auto v0part = protonTrack.mcParticle().mothers_as()[0]; LOG(debug) << "v0 with PDG code: " << v0part.pdgCode(); - if (v0part.has_mothers() && bachelor.mcParticle().has_mothers() && - v0part.mothersIds()[0] == bachelor.mcParticle().mothersIds()[0]) { - int mcid = v0part.mothersIds()[0]; - for (const auto& trackedCascadeData : trackedcascdata) { - if (trackedCascadeData.mcParticleId() == mcid) { - if (isOmega) { - registry.fill(HIST("h_massvsmass_Omega"), massOmega, trackedCascadeData.mOmega()); - } else { - registry.fill(HIST("h_massvsmass_Xi"), massOmega, trackedCascadeData.mOmega()); - } - break; - } - LOG(debug) << "cascade with PDG code: " << v0part.mothers_as()[0].pdgCode(); - } - } else { - LOG(debug) << "Rejecting particle."; - continue; - } } daughtersDCA dDCA; fillDauDCA(trackedCascade, bachelor, protonTrack, pionTrack, primaryVertex, isOmega, dDCA); @@ -571,14 +548,19 @@ struct NonPromptCascadeTask { protonTrack.hasTOF(), pionTrack.hasTOF(), bachKaonHasTOF, bachPionHasTOF, protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi()}); + if (track.mcParticleId() < -1 || track.mcParticleId() >= mcParticles.size()) { + mcParticleId.push_back(-1); + } else { + mcParticleId.push_back(track.mcParticleId()); + } } // end loop over tracked cascades - for (auto& c : candidates) { - auto label = trackLabelsMC.iteratorAt(c.globalIndex); - if (label.mcParticleId() < -1 || label.mcParticleId() >= mcParticles.size()) { + for (size_t i = 0; i < candidates.size(); ++i) { + if (mcParticleId[i] < 0) { continue; } - auto particle = mcParticles.iteratorAt(label.mcParticleId()); + auto particle = mcParticles.iteratorAt(mcParticleId[i]); + auto& c = candidates[i]; NPCTableMC(c.cascPt, c.cascEta, c.cascPhi, c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, diff --git a/PWGMM/Mult/Tasks/dndeta-mft.cxx b/PWGMM/Mult/Tasks/dndeta-mft.cxx index b7ed2c6c9ca..65dd38b7ea6 100644 --- a/PWGMM/Mult/Tasks/dndeta-mft.cxx +++ b/PWGMM/Mult/Tasks/dndeta-mft.cxx @@ -83,13 +83,13 @@ struct PseudorapidityDensityMFT { "maxZDiff", 1.0f, "max allowed Z difference for reconstruced collisions (cm)"}; + Configurable usePhiCut{"usePhiCut", true, "use azimuthal angle cut"}; Configurable cfgPhiCut{"cfgPhiCut", 0.1f, "Cut on azimuthal angle of MFT tracks"}; HistogramRegistry registry{ "registry", { - {"TracksEtaZvtx", "; #eta; #it{z}_{vtx} (cm); tracks", {HistType::kTH2F, {EtaAxis, ZAxis}}}, // @@ -108,8 +108,7 @@ struct PseudorapidityDensityMFT { {"EventSelection", ";status;events", {HistType::kTH1F, {{7, 0.5, 7.5}}}}, // - - } // + } // }; void init(InitContext&) @@ -295,9 +294,6 @@ struct PseudorapidityDensityMFT { registry.add({"Events/Centrality/NtrkZvtxGen_t", "; N_{trk}; Z_{vtx} (cm); centrality", {HistType::kTH3F, {MultAxis, ZAxis, CentAxis}}}); - registry.add({"Tracks/Centrality/EtaZvtxRec", - "; #eta; Z_{vtx} (cm); centrality", - {HistType::kTH3F, {EtaAxis, ZAxis, CentAxis}}}); registry.add({"Tracks/Centrality/EtaZvtxGen_t", "; #eta; Z_{vtx} (cm); centrality", {HistType::kTH3F, {EtaAxis, ZAxis, CentAxis}}}); @@ -401,12 +397,14 @@ struct PseudorapidityDensityMFT { float phi = track.phi(); o2::math_utils::bringTo02Pi(phi); - if ((phi < cfgPhiCut) || - ((phi > M_PI - cfgPhiCut) && (phi < M_PI + cfgPhiCut)) || - (phi > 2. * M_PI - cfgPhiCut) || - ((phi > ((M_PI / 2. - 0.1) * M_PI) - cfgPhiCut) && - (phi < ((M_PI / 2. - 0.1) * M_PI) + cfgPhiCut))) - continue; + if (usePhiCut) { + if ((phi < cfgPhiCut) || + ((phi > M_PI - cfgPhiCut) && (phi < M_PI + cfgPhiCut)) || + (phi > 2. * M_PI - cfgPhiCut) || + ((phi > ((M_PI / 2. - 0.1) * M_PI) - cfgPhiCut) && + (phi < ((M_PI / 2. - 0.1) * M_PI) + cfgPhiCut))) + continue; + } registry.fill(HIST("TracksEtaZvtx"), track.eta(), z); if (midtracks.size() > 0) // INEL>0 @@ -522,12 +520,14 @@ struct PseudorapidityDensityMFT { float phi = track.phi(); o2::math_utils::bringTo02Pi(phi); - if ((phi < cfgPhiCut) || - ((phi > M_PI - cfgPhiCut) && (phi < M_PI + cfgPhiCut)) || - (phi > 2. * M_PI - cfgPhiCut) || - ((phi > ((M_PI / 2. - 0.1) * M_PI) - cfgPhiCut) && - (phi < ((M_PI / 2. - 0.1) * M_PI) + cfgPhiCut))) - continue; + if (usePhiCut) { + if ((phi < cfgPhiCut) || + ((phi > M_PI - cfgPhiCut) && (phi < M_PI + cfgPhiCut)) || + (phi > 2. * M_PI - cfgPhiCut) || + ((phi > ((M_PI / 2. - 0.1) * M_PI) - cfgPhiCut) && + (phi < ((M_PI / 2. - 0.1) * M_PI) + cfgPhiCut))) + continue; + } registry.fill(HIST("Tracks/Centrality/EtaZvtx"), track.eta(), z, c); registry.fill(HIST("Tracks/Centrality/PhiEta"), phi, track.eta(), c); @@ -679,72 +679,90 @@ struct PseudorapidityDensityMFT { PROCESS_SWITCH(PseudorapidityDensityMFT, processGen, "Process generator-level info", false); - void - processGenCent(aod::McCollisions::iterator const& mcCollision, - o2::soa::SmallGroups< - soa::Join> const& collisions, - Particles const& particles, MFTTracksLabeled const& tracks) + using ExColsGenCent = + soa::SmallGroups>; + + void processGenCent(aod::McCollisions::iterator const& mcCollision, + ExColsGenCent const& collisions, + Particles const& particles, + MFTTracksLabeled const& tracks) { LOGP(debug, "MC col {} has {} reco cols", mcCollision.globalIndex(), collisions.size()); + float c_gen = -1; + bool atLeastOne = false; for (auto& collision : collisions) { - auto c = collision.centFT0C(); - registry.fill(HIST("Events/Centrality/EventEfficiency"), 1., c); - - // auto perCollisionMCSample = particles.sliceBy(perMcCol, - // mcCollision.globalIndex()); - auto perCollisionMCSample = mcSample->sliceByCached( - aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); - - auto nCharged = 0; - for (auto& particle : perCollisionMCSample) { - auto p = pdg->GetParticle(particle.pdgCode()); - auto charge = 0; - if (p != nullptr) { - charge = static_cast(p->Charge()); - } - if (std::abs(charge) < 3.) { - continue; - } - nCharged++; + float c_rec = -1; + if constexpr (ExColsGenCent::template contains()) { + c_rec = collision.centFT0C(); } - registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, - mcCollision.posZ(), c); - // - bool atLeastOne = false; if (!useEvSel || (useEvSel && collision.sel8())) { - registry.fill(HIST("Events/Centrality/EventEfficiency"), 2., c); - registry.fill(HIST("Events/Centrality/CentPercentileMCGen"), c); + if constexpr (ExColsGenCent::template contains()) { + if (!atLeastOne) { + c_gen = c_rec; + } + } atLeastOne = true; + registry.fill(HIST("Events/Centrality/EventEfficiency"), 2., c_gen); + registry.fill(HIST("Events/Centrality/CentPercentileMCGen"), c_gen); + auto perCollisionSample = sample->sliceByCached( o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), - perCollisionSample.size(), collision.posZ(), c); + perCollisionSample.size(), collision.posZ(), c_gen); } + } - for (auto& particle : particles) { - auto p = pdg->GetParticle(particle.pdgCode()); - auto charge = 0; - if (p != nullptr) { - charge = static_cast(p->Charge()); - } - if (std::abs(charge) < 3.) { - continue; - } + registry.fill(HIST("Events/Centrality/EventEfficiency"), 1., c_gen); + + auto perCollisionMCSample = mcSample->sliceByCached( + aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + auto nCharged = 0; + + for (auto& particle : perCollisionMCSample) { + auto p = pdg->GetParticle(particle.pdgCode()); + auto charge = 0; + if (p != nullptr) { + charge = static_cast(p->Charge()); + } + if (std::abs(charge) < 3.) { + continue; + } + nCharged++; + } + + if constexpr (ExColsGenCent::template contains()) { + registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, + mcCollision.posZ(), c_gen); + } + + for (auto& particle : particles) { + auto p = pdg->GetParticle(particle.pdgCode()); + auto charge = 0; + if (p != nullptr) { + charge = static_cast(p->Charge()); + } + if (std::abs(charge) < 3.) { + continue; + } + + if constexpr (ExColsGenCent::template contains()) { registry.fill(HIST("Tracks/Centrality/EtaZvtxGen_t"), particle.eta(), - mcCollision.posZ(), c); + mcCollision.posZ(), c_gen); + } - if (atLeastOne) { + if (atLeastOne) { + if constexpr (ExColsGenCent::template contains()) { registry.fill(HIST("Tracks/Centrality/EtaZvtxGen"), particle.eta(), - mcCollision.posZ(), c); + mcCollision.posZ(), c_gen); float phi = particle.phi(); o2::math_utils::bringTo02Pi(phi); registry.fill(HIST("Tracks/Centrality/PhiEtaGen"), phi, - particle.eta(), c); + particle.eta(), c_gen); } } }