Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
336 changes: 168 additions & 168 deletions PWGLF/Tasks/Strangeness/cascadeAnalysisLightIonsDerivedData.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -908,172 +908,172 @@ struct CascadeAnalysisLightIonsDerivedData {

void processMonteCarloRec(SimCollisions::iterator const& RecCol, CascadeMCCandidates const& fullCascades, DaughterTracks const&, CascadeMCCores const&)
{
// Fill event counter before event selection
registryMC.fill(HIST("number_of_events_mc_rec"), 0);

// Initialize CCDB objects using the BC info
initCCDB(RecCol);

// Define the event centrality using different estimators
float centralityMcRec = -1;
float multiplicityMcRec = -1;

if (centralityEstimator == Option::kFT0C) {
centralityMcRec = RecCol.centFT0C();
multiplicityMcRec = RecCol.multFT0C();
}
if (centralityEstimator == Option::kFT0M) {
centralityMcRec = RecCol.centFT0M();
multiplicityMcRec = RecCol.multFT0C() + RecCol.multFT0A();
}
if (centralityEstimator == Option::kFV0A) {
centralityMcRec = RecCol.centFV0A();
multiplicityMcRec = RecCol.multFV0A();
}
if (centralityEstimator == Option::kNGlobal) {
centralityMcRec = RecCol.centNGlobal();
multiplicityMcRec = RecCol.multNTracksGlobal();
}

registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 0, centralityMcRec);

// event selections
if (applySel8 && !RecCol.sel8())
return;
registryMC.fill(HIST("number_of_events_mc_rec"), 1);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 1, centralityMcRec);

if (applyVtxZ && std::fabs(RecCol.posZ()) > zVtx)
return;
registryMC.fill(HIST("number_of_events_mc_rec"), 2);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 2, centralityMcRec);

if (rejectITSROFBorder && !RecCol.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 3 /* Not at ITS ROF border */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 3, centralityMcRec);

if (rejectTFBorder && !RecCol.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 4 /* Not at TF border */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 4, centralityMcRec);

if (requireVertexITSTPC && !RecCol.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 5 /* Contains at least one ITS-TPC track */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 5, centralityMcRec);

if (requireIsGoodZvtxFT0VsPV && !RecCol.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 6 /* PV position consistency check */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 6, centralityMcRec);

if (requireIsVertexTOFmatched && !RecCol.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 7 /* PV with at least one contributor matched with TOF */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 7, centralityMcRec);

if (requireIsVertexTRDmatched && !RecCol.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 8 /* PV with at least one contributor matched with TRD */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 8, centralityMcRec);

if (rejectSameBunchPileup && !RecCol.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 9 /* Not at same bunch pile-up */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 9, centralityMcRec);

if (requireInel0 && RecCol.multNTracksPVeta1() < 1) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 10 /* INEL > 0 */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 10, centralityMcRec);

// Store the Zvtx
registryQC.fill(HIST("hVertexZRec"), RecCol.posZ());

// Store the event centrality
registryMC.fill(HIST("hCentEstimator_truerec"), centralityMcRec);
registryMC.fill(HIST("hCentralityVsNch_truerec"), centralityMcRec, RecCol.multNTracksPVeta1());
registryMC.fill(HIST("hCentralityVsMultiplicity_truerec"), centralityMcRec, multiplicityMcRec);

for (const auto& casc : fullCascades) {
if (etaMin > casc.bacheloreta() || casc.bacheloreta() > etaMax ||
etaMin > casc.negativeeta() || casc.negativeeta() > etaMax ||
etaMin > casc.positiveeta() || casc.positiveeta() > etaMax)
continue; // remove acceptance that's badly reproduced by MC / superfluous in future

if (!casc.has_cascMCCore())
continue;

auto cascMC = casc.template cascMCCore_as<CascadeMCCores>();

auto bach = casc.bachTrackExtra_as<DaughterTracks>();
auto pos = casc.posTrackExtra_as<DaughterTracks>();
auto neg = casc.negTrackExtra_as<DaughterTracks>();

int pdgParent = cascMC.pdgCode();
bool isPhysPrim = cascMC.isPhysicalPrimary();
if (pdgParent == 0)
continue;
if (!isPhysPrim)
continue;

float ptmc = RecoDecay::sqrtSumOfSquares(cascMC.pxMC(), cascMC.pyMC());

// ------------------------------------- Store selctions distribution for QC
registryQC.fill(HIST("hv0cosPARec"), casc.v0cosPA(RecCol.posX(), RecCol.posY(), RecCol.posZ()));
registryQC.fill(HIST("hcasccosPARec"), casc.casccosPA(RecCol.posX(), RecCol.posY(), RecCol.posZ()));
registryQC.fill(HIST("hv0radiusRec"), casc.v0radius());
registryQC.fill(HIST("hcascradiusRec"), casc.cascradius());
registryQC.fill(HIST("hdcaV0daughtersRec"), casc.dcaV0daughters());
registryQC.fill(HIST("hdcacascdaughtersRec"), casc.dcacascdaughters());
registryQC.fill(HIST("hdcapostopvRec"), casc.dcapostopv());
registryQC.fill(HIST("hdcanegtopvRec"), casc.dcanegtopv());
registryQC.fill(HIST("hdcabachtopvRec"), casc.dcabachtopv());
registryQC.fill(HIST("hdcav0topvRec"), casc.dcav0topv(RecCol.posX(), RecCol.posY(), RecCol.posZ()));

// ------------------------------------- Store selctions distribution for analysis
if (casc.sign() < 0) {
if (pdgParent == kXiMinus) {
registryMC.fill(HIST("hMassXineg_truerec"), centralityMcRec, ptmc, casc.mXi());
}
if (pdgParent == kOmegaMinus) {
registryMC.fill(HIST("hMassOmeganeg_truerec"), centralityMcRec, ptmc, casc.mOmega());
}
}

if (casc.sign() > 0) {
if (pdgParent == kXiPlusBar) {
registryMC.fill(HIST("hMassXipos_truerec"), centralityMcRec, ptmc, casc.mXi());
}
if (pdgParent == kOmegaPlusBar) {
registryMC.fill(HIST("hMassOmegapos_truerec"), centralityMcRec, ptmc, casc.mOmega());
}
}

// compute MC association
const bool isXiMC = (std::abs(pdgParent) == PDG_t::kXiMinus);
const bool isOmegaMC = (std::abs(pdgParent) == PDG_t::kOmegaMinus);
bool isTrueMCCascade = false;
bool isTrueMCCascadeDecay = false;
bool isCorrectLambdaDecay = false;

if (isPhysPrim && ( isXiMC || isOmegaMC))
isTrueMCCascade = true;
if (isTrueMCCascade && ((casc.sign() > 0 && cascMC.pdgCodePositive() == PDG_t::kPiPlus && cascMC.pdgCodeNegative() == PDG_t::kProtonBar) || (casc.sign() < 0 && cascMC.pdgCodePositive() == PDG_t::kProton && cascMC.pdgCodeNegative() == PDG_t::kPiMinus)))
isCorrectLambdaDecay = true;
if (isTrueMCCascade && isCorrectLambdaDecay && ((isXiMC && std::abs(cascMC.pdgCodeBachelor()) == PDG_t::kPiPlus) || (isOmegaMC && std::abs(cascMC.pdgCodeBachelor()) == PDG_t::kKPlus)))
isTrueMCCascadeDecay = true;

if (isTrueMCCascadeDecay){
// Fill event counter before event selection
registryMC.fill(HIST("number_of_events_mc_rec"), 0);

// Initialize CCDB objects using the BC info
initCCDB(RecCol);

// Define the event centrality using different estimators
float centralityMcRec = -1;
float multiplicityMcRec = -1;

if (centralityEstimator == Option::kFT0C) {
centralityMcRec = RecCol.centFT0C();
multiplicityMcRec = RecCol.multFT0C();
}
if (centralityEstimator == Option::kFT0M) {
centralityMcRec = RecCol.centFT0M();
multiplicityMcRec = RecCol.multFT0C() + RecCol.multFT0A();
}
if (centralityEstimator == Option::kFV0A) {
centralityMcRec = RecCol.centFV0A();
multiplicityMcRec = RecCol.multFV0A();
}
if (centralityEstimator == Option::kNGlobal) {
centralityMcRec = RecCol.centNGlobal();
multiplicityMcRec = RecCol.multNTracksGlobal();
}

registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 0, centralityMcRec);

// event selections
if (applySel8 && !RecCol.sel8())
return;
registryMC.fill(HIST("number_of_events_mc_rec"), 1);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 1, centralityMcRec);

if (applyVtxZ && std::fabs(RecCol.posZ()) > zVtx)
return;
registryMC.fill(HIST("number_of_events_mc_rec"), 2);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 2, centralityMcRec);

if (rejectITSROFBorder && !RecCol.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 3 /* Not at ITS ROF border */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 3, centralityMcRec);

if (rejectTFBorder && !RecCol.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 4 /* Not at TF border */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 4, centralityMcRec);

if (requireVertexITSTPC && !RecCol.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 5 /* Contains at least one ITS-TPC track */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 5, centralityMcRec);

if (requireIsGoodZvtxFT0VsPV && !RecCol.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 6 /* PV position consistency check */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 6, centralityMcRec);

if (requireIsVertexTOFmatched && !RecCol.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 7 /* PV with at least one contributor matched with TOF */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 7, centralityMcRec);

if (requireIsVertexTRDmatched && !RecCol.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 8 /* PV with at least one contributor matched with TRD */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 8, centralityMcRec);

if (rejectSameBunchPileup && !RecCol.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 9 /* Not at same bunch pile-up */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 9, centralityMcRec);

if (requireInel0 && RecCol.multNTracksPVeta1() < 1) {
return;
}
registryMC.fill(HIST("number_of_events_mc_rec"), 10 /* INEL > 0 */);
registryMC.fill(HIST("number_of_events_mc_rec_vs_centrality"), 10, centralityMcRec);

// Store the Zvtx
registryQC.fill(HIST("hVertexZRec"), RecCol.posZ());

// Store the event centrality
registryMC.fill(HIST("hCentEstimator_truerec"), centralityMcRec);
registryMC.fill(HIST("hCentralityVsNch_truerec"), centralityMcRec, RecCol.multNTracksPVeta1());
registryMC.fill(HIST("hCentralityVsMultiplicity_truerec"), centralityMcRec, multiplicityMcRec);

for (const auto& casc : fullCascades) {
if (etaMin > casc.bacheloreta() || casc.bacheloreta() > etaMax ||
etaMin > casc.negativeeta() || casc.negativeeta() > etaMax ||
etaMin > casc.positiveeta() || casc.positiveeta() > etaMax)
continue; // remove acceptance that's badly reproduced by MC / superfluous in future

if (!casc.has_cascMCCore())
continue;

auto cascMC = casc.template cascMCCore_as<CascadeMCCores>();

auto bach = casc.bachTrackExtra_as<DaughterTracks>();
auto pos = casc.posTrackExtra_as<DaughterTracks>();
auto neg = casc.negTrackExtra_as<DaughterTracks>();

int pdgParent = cascMC.pdgCode();
bool isPhysPrim = cascMC.isPhysicalPrimary();
if (pdgParent == 0)
continue;
if (!isPhysPrim)
continue;

float ptmc = RecoDecay::sqrtSumOfSquares(cascMC.pxMC(), cascMC.pyMC());

// ------------------------------------- Store selctions distribution for QC
registryQC.fill(HIST("hv0cosPARec"), casc.v0cosPA(RecCol.posX(), RecCol.posY(), RecCol.posZ()));
registryQC.fill(HIST("hcasccosPARec"), casc.casccosPA(RecCol.posX(), RecCol.posY(), RecCol.posZ()));
registryQC.fill(HIST("hv0radiusRec"), casc.v0radius());
registryQC.fill(HIST("hcascradiusRec"), casc.cascradius());
registryQC.fill(HIST("hdcaV0daughtersRec"), casc.dcaV0daughters());
registryQC.fill(HIST("hdcacascdaughtersRec"), casc.dcacascdaughters());
registryQC.fill(HIST("hdcapostopvRec"), casc.dcapostopv());
registryQC.fill(HIST("hdcanegtopvRec"), casc.dcanegtopv());
registryQC.fill(HIST("hdcabachtopvRec"), casc.dcabachtopv());
registryQC.fill(HIST("hdcav0topvRec"), casc.dcav0topv(RecCol.posX(), RecCol.posY(), RecCol.posZ()));

// ------------------------------------- Store selctions distribution for analysis
if (casc.sign() < 0) {
if (pdgParent == kXiMinus) {
registryMC.fill(HIST("hMassXineg_truerec"), centralityMcRec, ptmc, casc.mXi());
}
if (pdgParent == kOmegaMinus) {
registryMC.fill(HIST("hMassOmeganeg_truerec"), centralityMcRec, ptmc, casc.mOmega());
}
}

if (casc.sign() > 0) {
if (pdgParent == kXiPlusBar) {
registryMC.fill(HIST("hMassXipos_truerec"), centralityMcRec, ptmc, casc.mXi());
}
if (pdgParent == kOmegaPlusBar) {
registryMC.fill(HIST("hMassOmegapos_truerec"), centralityMcRec, ptmc, casc.mOmega());
}
}

// compute MC association
const bool isXiMC = (std::abs(pdgParent) == PDG_t::kXiMinus);
const bool isOmegaMC = (std::abs(pdgParent) == PDG_t::kOmegaMinus);
bool isTrueMCCascade = false;
bool isTrueMCCascadeDecay = false;
bool isCorrectLambdaDecay = false;

if (isPhysPrim && (isXiMC || isOmegaMC))
isTrueMCCascade = true;
if (isTrueMCCascade && ((casc.sign() > 0 && cascMC.pdgCodePositive() == PDG_t::kPiPlus && cascMC.pdgCodeNegative() == PDG_t::kProtonBar) || (casc.sign() < 0 && cascMC.pdgCodePositive() == PDG_t::kProton && cascMC.pdgCodeNegative() == PDG_t::kPiMinus)))
isCorrectLambdaDecay = true;
if (isTrueMCCascade && isCorrectLambdaDecay && ((isXiMC && std::abs(cascMC.pdgCodeBachelor()) == PDG_t::kPiPlus) || (isOmegaMC && std::abs(cascMC.pdgCodeBachelor()) == PDG_t::kKPlus)))
isTrueMCCascadeDecay = true;

if (isTrueMCCascadeDecay) {
if (pdgParent == kXiMinus && passedXiSelection(casc, pos, neg, bach, RecCol)) {
registryMC.fill(HIST("hMassXinegSelected_truerec"), centralityMcRec, ptmc, casc.mXi());
}
Expand All @@ -1086,8 +1086,8 @@ struct CascadeAnalysisLightIonsDerivedData {
if (pdgParent == kOmegaPlusBar && passedOmegaSelection(casc, pos, neg, bach, RecCol)) {
registryMC.fill(HIST("hMassOmegaposSelected_truerec"), centralityMcRec, ptmc, casc.mOmega());
}
}
} // casc loop
}
} // casc loop
}

PROCESS_SWITCH(CascadeAnalysisLightIonsDerivedData, processMonteCarloRec, "Process MC Rec", false);
Expand Down
Loading