Skip to content

Commit cd054ed

Browse files
authored
[PWGCF] FemtoUniverse: add processes for analysis of MC reconstructed V0s (#10463)
1 parent 7cc51df commit cd054ed

File tree

2 files changed

+129
-44
lines changed

2 files changed

+129
-44
lines changed

PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -469,10 +469,10 @@ struct FemtoUniverseProducerTask {
469469

470470
void init(InitContext&)
471471
{
472-
if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == false) {
472+
if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3 || doprocessTruthAndFullMCCentRun3V0) == false) {
473473
LOGF(fatal, "Neither processFullData nor processFullMC enabled. Please choose one.");
474474
}
475-
if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == true) {
475+
if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3 || doprocessTruthAndFullMCCentRun3V0) == true) {
476476
LOGF(fatal,
477477
"Cannot enable process Data and process MC at the same time. "
478478
"Please choose one.");
@@ -2300,6 +2300,47 @@ struct FemtoUniverseProducerTask {
23002300
}
23012301
PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCV0, "Provide both MC truth and reco for tracks and V0s", false);
23022302

2303+
void processTruthAndFullMCCentRun3V0(
2304+
aod::McCollisions const& mccols,
2305+
aod::McParticles const& mcParticles,
2306+
aod::FemtoFullCollisionCentRun3MCs const& collisions,
2307+
soa::Filtered<soa::Join<aod::FemtoFullTracks, aod::McTrackLabels>> const& tracks,
2308+
soa::Join<o2::aod::V0Datas, aod::McV0Labels> const& fullV0s,
2309+
aod::BCsWithTimestamps const&)
2310+
{
2311+
2312+
// recos
2313+
std::set<int> recoMcIds;
2314+
for (const auto& col : collisions) {
2315+
auto groupedTracks = tracks.sliceBy(perCollisionTracks, col.globalIndex());
2316+
auto groupedV0Parts = fullV0s.sliceBy(perCollisionV0s, col.globalIndex());
2317+
getMagneticFieldTesla(col.bc_as<aod::BCsWithTimestamps>());
2318+
const auto colcheck = fillCollisionsCentRun3<false>(col);
2319+
if (colcheck) {
2320+
fillTracks<true>(groupedTracks);
2321+
fillV0<true>(col, groupedV0Parts, groupedTracks);
2322+
}
2323+
for (const auto& track : groupedTracks) {
2324+
if (trackCuts.isSelectedMinimal(track))
2325+
recoMcIds.insert(track.mcParticleId());
2326+
}
2327+
}
2328+
2329+
// truth
2330+
for (const auto& mccol : mccols) {
2331+
auto groupedCollisions = collisions.sliceBy(recoCollsPerMCCollCentPbPb, mccol.globalIndex());
2332+
for (const auto& col : groupedCollisions) {
2333+
const auto colcheck = fillMCTruthCollisionsCentRun3(col); // fills the reco collisions for mc collision
2334+
if (colcheck) {
2335+
auto groupedMCParticles = mcParticles.sliceBy(perMCCollision, mccol.globalIndex());
2336+
outputCollExtra(1.0, 1.0);
2337+
fillParticles<decltype(groupedMCParticles), true, true>(groupedMCParticles, recoMcIds); // fills mc particles
2338+
}
2339+
}
2340+
}
2341+
}
2342+
PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCCentRun3V0, "Provide both MC truth and reco for tracks and V0s with centrality", false);
2343+
23032344
Preslice<soa::Join<o2::aod::CascDatas, aod::McCascLabels>> perCollisionCascs = aod::track::collisionId;
23042345
void processTruthAndFullMCCasc(
23052346
aod::McCollisions const& mccols,

PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx

Lines changed: 86 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,12 @@
2222
#include "Framework/runDataProcessing.h"
2323
#include "Framework/HistogramRegistry.h"
2424
#include "Framework/ASoAHelpers.h"
25-
#include "Framework/RunningWorkflowInfo.h"
26-
#include "Framework/StepTHn.h"
2725
#include "PWGCF/FemtoUniverse/DataModel/FemtoDerived.h"
2826
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h"
2927
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h"
3028
#include "PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h"
3129
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h"
3230
#include "PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h"
33-
#include "PWGCF/FemtoUniverse/Core/femtoUtils.h"
3431
#include "Framework/O2DatabasePDGPlugin.h"
3532
#include <TFile.h>
3633
#include <TH1.h>
@@ -376,28 +373,12 @@ struct FemtoUniversePairTaskTrackV0Extended {
376373
}
377374
}
378375

379-
void processSameEvent(FilteredFDCollision const& col, FemtoFullParticles const& parts)
380-
{
381-
auto groupPartsOne = partsOne->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
382-
auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
383-
doSameEvent(col, parts, groupPartsOne, groupPartsTwo);
384-
}
385-
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEvent, "Enable processing same event for track - V0", false);
386-
387-
void processSameEventMCReco(FilteredFDCollision const& col, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts)
388-
{
389-
auto groupPartsOne = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
390-
auto groupPartsTwo = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
391-
doSameEvent(col, parts, groupPartsOne, groupPartsTwo, mcparts);
392-
}
393-
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventMCReco, "Enable processing same event for track - V0 MC Reco", false);
394-
395376
/// This function processes the same event for V0 - V0
396-
void processSameEventV0(FilteredFDCollision const& col, FemtoFullParticles const& parts)
377+
template <typename PartType, typename PartitionType, typename MCParticles = std::nullptr_t>
378+
void doSameEventV0(FilteredFDCollision const& col, PartType const& parts, PartitionType& groupPartsTwo, [[maybe_unused]] MCParticles mcParts = nullptr)
397379
{
398380
const auto& magFieldTesla = col.magField();
399381

400-
auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
401382
const int multCol = confUseCent ? col.multV0M() : col.multNtr();
402383

403384
eventHisto.fillQA(col);
@@ -455,8 +436,12 @@ struct FemtoUniversePairTaskTrackV0Extended {
455436
if (!isParticleTPC(posChild2, V0ChildTable[confV0Type2][0]) || !isParticleTPC(negChild2, V0ChildTable[confV0Type2][1]))
456437
return;
457438

458-
sameEventCont.setPair<false>(p1, p2, multCol, confUse3D);
439+
if constexpr (std::is_same<PartType, FemtoRecoParticles>::value)
440+
sameEventCont.setPair<true>(p1, p2, multCol, confUse3D);
441+
else
442+
sameEventCont.setPair<false>(p1, p2, multCol, confUse3D);
459443
};
444+
460445
if (confV0Type1 == confV0Type2) {
461446
/// Now build the combinations for identical V0s
462447
for (const auto& [p1, p2] : combinations(CombinationsStrictlyUpperIndexPolicy(groupPartsTwo, groupPartsTwo))) {
@@ -470,8 +455,38 @@ struct FemtoUniversePairTaskTrackV0Extended {
470455
}
471456
}
472457

458+
void
459+
processSameEvent(FilteredFDCollision const& col, FemtoFullParticles const& parts)
460+
{
461+
auto groupPartsOne = partsOne->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
462+
auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
463+
doSameEvent(col, parts, groupPartsOne, groupPartsTwo);
464+
}
465+
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEvent, "Enable processing same event for track - V0", false);
466+
467+
void processSameEventMCReco(FilteredFDCollision const& col, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts)
468+
{
469+
auto groupPartsOne = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
470+
auto groupPartsTwo = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
471+
doSameEvent(col, parts, groupPartsOne, groupPartsTwo, mcparts);
472+
}
473+
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventMCReco, "Enable processing same event for track - V0 MC Reco", false);
474+
475+
/// This function processes the same event for V0 - V0
476+
void processSameEventV0(FilteredFDCollision const& col, FemtoFullParticles const& parts)
477+
{
478+
auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
479+
doSameEventV0(col, parts, groupPartsTwo);
480+
}
473481
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventV0, "Enable processing same event for V0 - V0", false);
474482

483+
void processSameEventV0MCReco(FilteredFDCollision const& col, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts)
484+
{
485+
auto groupPartsTwo = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
486+
doSameEventV0(col, parts, groupPartsTwo, mcparts);
487+
}
488+
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventV0MCReco, "Enable processing same event for V0 - V0 MC Reco", false);
489+
475490
/// This function processes MC same events for Track - V0
476491
void processMCSameEvent(FilteredFDCollision const& col, FemtoFullParticles const& parts)
477492
{
@@ -527,7 +542,7 @@ struct FemtoUniversePairTaskTrackV0Extended {
527542
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMCSameEvent, "Enable processing same event for MC truth track - V0", false);
528543

529544
/// This function processes MC same events for V0 - V0
530-
void processMCSameEventV0(FilteredFDCollision const& col, FemtoFullParticles const& /*parts*/)
545+
void processMCSameEventV0(FilteredFDCollision const& col, FemtoFullParticles const& parts)
531546
{
532547
auto groupPartsTwo = partsTwoMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache);
533548
const int multCol = confUseCent ? col.multV0M() : col.multNtr();
@@ -536,10 +551,23 @@ struct FemtoUniversePairTaskTrackV0Extended {
536551

537552
/// Histogramming same event
538553
for (const auto& part : groupPartsTwo) {
554+
const auto& posChild = parts.iteratorAt(part.index() - 2);
555+
const auto& negChild = parts.iteratorAt(part.index() - 1);
539556
int pdgCode = static_cast<int>(part.pidCut());
540-
if ((confV0Type1 == 0 && pdgCode != 3122) || (confV0Type1 == 1 && pdgCode != -3122))
541-
continue;
542-
trackHistoPartTwo.fillQA<false, true>(part);
557+
if ((confV0Type1 == 0 && pdgCode == 3122) || (confV0Type1 == 1 && pdgCode == -3122)) {
558+
trackHistoV0Type1.fillQABase<false, true>(part, HIST("V0Type1"));
559+
posChildV0Type1.fillQABase<false, true>(posChild, HIST("posChildV0Type1"));
560+
negChildV0Type1.fillQABase<false, true>(negChild, HIST("negChildV0Type1"));
561+
qaRegistry.fill(HIST("V0Type1/hInvMassLambdaVsCent"), multCol, part.mLambda());
562+
qaRegistry.fill(HIST("V0Type1/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda());
563+
}
564+
if ((confV0Type2 == 0 && pdgCode == 3122) || (confV0Type2 == 1 && pdgCode == -3122)) {
565+
trackHistoV0Type2.fillQABase<false, true>(part, HIST("V0Type2"));
566+
posChildV0Type2.fillQABase<false, true>(posChild, HIST("posChildV0Type2"));
567+
negChildV0Type2.fillQABase<false, true>(negChild, HIST("negChildV0Type2"));
568+
qaRegistry.fill(HIST("V0Type2/hInvMassLambdaVsCent"), multCol, part.mLambda());
569+
qaRegistry.fill(HIST("V0Type2/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda());
570+
}
543571
}
544572

545573
auto pairProcessFunc = [&](auto& p1, auto& p2) -> void {
@@ -634,29 +662,18 @@ struct FemtoUniversePairTaskTrackV0Extended {
634662
}
635663
}
636664

637-
void processMixedEvent(FilteredFDCollisions const& cols, FemtoFullParticles const& parts)
638-
{
639-
doMixedEvent(cols, parts, partsOne, partsTwo);
640-
}
641-
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEvent, "Enable processing mixed event for track - V0", false);
642-
643-
void processMixedEventMCReco(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts)
644-
{
645-
doMixedEvent(cols, parts, partsOneMCReco, partsTwoMCReco, mcparts);
646-
}
647-
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEventMCReco, "Enable processing mixed event for track - V0 for MC Reco", false);
648-
649665
/// This function processes the mixed event for V0 - V0
650-
void processMixedEventV0(FilteredFDCollisions const& cols, FemtoFullParticles const& parts)
666+
template <typename PartType, typename PartitionType, typename MCParticles = std::nullptr_t>
667+
void doMixedEventV0(FilteredFDCollisions const& cols, PartType const& parts, PartitionType& partitionTwo, [[maybe_unused]] MCParticles mcParts = nullptr)
651668
{
652669
ColumnBinningPolicy<aod::collision::PosZ, aod::femtouniversecollision::MultNtr> colBinningMult{{confVtxBins, confMultBins}, true};
653670
ColumnBinningPolicy<aod::collision::PosZ, aod::femtouniversecollision::MultV0M> colBinningCent{{confVtxBins, confMultBins}, true};
654671

655672
auto mixedCollProcessFunc = [&](auto& collision1, auto& collision2) -> void {
656673
const int multCol = confUseCent ? collision1.multV0M() : collision1.multNtr();
657674

658-
auto groupPartsOne = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache);
659-
auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache);
675+
auto groupPartsOne = partitionTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache);
676+
auto groupPartsTwo = partitionTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache);
660677

661678
const auto& magFieldTesla1 = collision1.magField();
662679
const auto& magFieldTesla2 = collision2.magField();
@@ -696,7 +713,11 @@ struct FemtoUniversePairTaskTrackV0Extended {
696713
continue;
697714
}
698715
}
699-
mixedEventCont.setPair<false>(p1, p2, multCol, confUse3D);
716+
717+
if constexpr (std::is_same<PartType, FemtoRecoParticles>::value)
718+
mixedEventCont.setPair<true>(p1, p2, multCol, confUse3D);
719+
else
720+
mixedEventCont.setPair<false>(p1, p2, multCol, confUse3D);
700721
}
701722
};
702723

@@ -712,8 +733,31 @@ struct FemtoUniversePairTaskTrackV0Extended {
712733
}
713734
}
714735
}
736+
737+
void processMixedEvent(FilteredFDCollisions const& cols, FemtoFullParticles const& parts)
738+
{
739+
doMixedEvent(cols, parts, partsOne, partsTwo);
740+
}
741+
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEvent, "Enable processing mixed event for track - V0", false);
742+
743+
void processMixedEventMCReco(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts)
744+
{
745+
doMixedEvent(cols, parts, partsOneMCReco, partsTwoMCReco, mcparts);
746+
}
747+
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEventMCReco, "Enable processing mixed event for track - V0 for MC Reco", false);
748+
749+
void processMixedEventV0(FilteredFDCollisions const& cols, FemtoFullParticles const& parts)
750+
{
751+
doMixedEventV0(cols, parts, partsTwo);
752+
}
715753
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEventV0, "Enable processing mixed events for V0 - V0", false);
716754

755+
void processMixedEventV0MCReco(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts)
756+
{
757+
doMixedEventV0(cols, parts, partsTwoMCReco, mcparts);
758+
}
759+
PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEventV0MCReco, "Enable processing mixed event for V0 - V0 for MC Reco", false);
760+
717761
/// This function processes MC mixed events for Track - V0
718762
void processMCMixedEvent(FilteredFDCollisions const& cols, FemtoFullParticles const& parts)
719763
{

0 commit comments

Comments
 (0)