2929#include " PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h"
3030#include " PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h"
3131#include " PWGCF/FemtoUniverse/Core/femtoUtils.h"
32+ #include " Framework/O2DatabasePDGPlugin.h"
3233
3334using namespace o2 ;
3435using namespace o2 ::soa;
@@ -39,16 +40,11 @@ using namespace o2::aod::pidutils;
3940
4041struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/struct
4142
43+ Service<o2::framework::O2DatabasePDG> pdgMC;
4244 SliceCache cache;
4345 using FemtoFullParticles = soa::Join<aod::FDCascParticles, aod::FDExtParticles>;
4446 Preslice<FemtoFullParticles> perCol = aod::femtouniverseparticle::fdCollisionId;
4547
46- Configurable<float > confZVertexCut{" ConfZVertexCut" , 10 .f , " Event sel: Maximum z-Vertex (cm)" }; // o2-linter: disable=name/configurable
47-
48- Filter collisionFilter = (nabs(aod::collision::posZ) < confZVertexCut);
49- using FilteredFDCollisions = soa::Filtered<o2::aod::FdCollisions>;
50- using FilteredFDCollision = FilteredFDCollisions::iterator;
51-
5248 ConfigurableAxis confChildTempFitVarpTBins{" ConfChildTempFitVarpTBins" , {20 , 0.5 , 4.05 }, " V0 child: pT binning of the pT vs. TempFitVar plot" }; // o2-linter: disable=name/configurable
5349 ConfigurableAxis confChildTempFitVarBins{" ConfChildTempFitVarBins" , {300 , -0.15 , 0.15 }, " V0 child: binning of the TempFitVar in the pT vs. TempFitVar plot" }; // o2-linter: disable=name/configurable
5450 Configurable<float > confCascInvMassLowLimit{" ConfCascInvMassLowLimit" , 1.315 , " Lower limit of the Casc invariant mass" }; // o2-linter: disable=name/configurable
@@ -58,7 +54,11 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st
5854 Configurable<float > confNSigmaTPCPion{" NSigmaTPCPion" , 4 , " NSigmaTPCPion" }; // o2-linter: disable=name/configurable
5955 Configurable<float > confNSigmaTPCProton{" NSigmaTPCProton" , 4 , " NSigmaTPCProton" }; // o2-linter: disable=name/configurable
6056
61- // configs for correlation part
57+ // / applying narrow cut
58+ Configurable<float > confZVertexCut{" ConfZVertexCut" , 10 .f , " Event sel: Maximum z-Vertex (cm)" }; // o2-linter: disable=name/configurable
59+ Configurable<float > confEta{" ConfEta" , 0.8 , " Eta cut for the global track" }; // o2-linter: disable=name/configurable
60+
61+ // configurations for correlation part
6262 Configurable<int > confTrackChoicePartOne{" ConfTrackChoicePartOne" , 0 , " 0:Proton, 1:Pion, 2:Kaon" }; // o2-linter: disable=name/configurable
6363 Configurable<int > confTrkPDGCodePartOne{" ConfTrkPDGCodePartOne" , 2212 , " Particle 1 (Track) - PDG code" }; // o2-linter: disable=name/configurable
6464 Configurable<int > confCascType1{" ConfCascType1" , 0 , " select one of the V0s (Omega = 0, Xi = 1, anti-Omega = 2, anti-Xi = 3) for track-cascade combination" }; // o2-linter: disable=name/configurable
@@ -87,11 +87,17 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st
8787 ConfigurableAxis confTrkTempFitVarpTBins{" ConfTrkTempFitVarpTBins" , {20 , 0.5 , 4.05 }, " pT binning of the pT vs. TempFitVar plot" }; // o2-linter: disable=name/configurable
8888 ConfigurableAxis confTrkTempFitVarBins{" ConfTrkDTempFitVarBins" , {300 , -0.15 , 0.15 }, " binning of the TempFitVar in the pT vs. TempFitVar plot" }; // o2-linter: disable=name/configurable
8989
90+ Filter collisionFilter = (nabs(aod::collision::posZ) < confZVertexCut);
91+ using FilteredFDCollisions = soa::Filtered<o2::aod::FdCollisions>;
92+ using FilteredFDCollision = FilteredFDCollisions::iterator;
93+
9094 // / Partition for particle 1 (track)
91- Partition<FemtoFullParticles> partsOne = (aod::femtouniverseparticle::partType == uint8_t (aod::femtouniverseparticle::ParticleType::kTrack )) && (aod::femtouniverseparticle::sign == confChargePart1) && (aod::femtouniverseparticle::pt < confHPtPart1) && (aod::femtouniverseparticle::pt > confLPtPart1);
95+ Partition<FemtoFullParticles> partsOne = (aod::femtouniverseparticle::partType == uint8_t (aod::femtouniverseparticle::ParticleType::kTrack )) && (aod::femtouniverseparticle::sign == confChargePart1) && (nabs(aod::femtouniverseparticle::eta) < confEta) && (aod::femtouniverseparticle::pt < confHPtPart1) && (aod::femtouniverseparticle::pt > confLPtPart1);
96+ Partition<FemtoFullParticles> partsOneMCgen = (aod::femtouniverseparticle::partType == uint8_t (aod::femtouniverseparticle::ParticleType::kMCTruthTrack )) && (nabs(aod::femtouniverseparticle::eta) < confEta) && (aod::femtouniverseparticle::pt < confHPtPart1) && (aod::femtouniverseparticle::pt > confLPtPart1);
9297
9398 // / Partition for particle 2 (cascade)
9499 Partition<FemtoFullParticles> partsTwo = (aod::femtouniverseparticle::partType == uint8_t (aod::femtouniverseparticle::ParticleType::kCascade )) && (aod::femtouniverseparticle::pt < confHPtPart2) && (aod::femtouniverseparticle::pt > confLPtPart2);
100+ Partition<FemtoFullParticles> partsTwoMCgen = (aod::femtouniverseparticle::partType == uint8_t (aod::femtouniverseparticle::ParticleType::kMCTruthTrack )) && (aod::femtouniverseparticle::pt < confHPtPart2) && (aod::femtouniverseparticle::pt > confLPtPart2);
95101
96102 // / Partition for cascades
97103 Partition<FemtoFullParticles> cascs = (aod::femtouniverseparticle::partType == uint8_t (aod::femtouniverseparticle::ParticleType::kCascade ));
@@ -458,6 +464,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st
458464 ColumnBinningPolicy<aod::collision::PosZ, aod::femtouniversecollision::MultNtr> colBinning{{confVtxBins, confMultBins}, true };
459465
460466 for (const auto & [collision1, collision2] : soa::selfCombinations (colBinning, 5 , -1 , cols, cols)) {
467+ const int multCol = confUseCent ? collision1.multV0M () : collision1.multNtr ();
461468
462469 auto groupPartsOne = partsTwo->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex (), cache);
463470 auto groupPartsTwo = partsTwo->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex (), cache);
@@ -493,11 +500,80 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st
493500 continue ;
494501 }
495502
496- mixedEventCont.setPair <false >(p1, p2, collision1. multNtr () , confUse3D, 1 .0f );
503+ mixedEventCont.setPair <false >(p1, p2, multCol , confUse3D, 1 .0f );
497504 }
498505 }
499506 }
500507 PROCESS_SWITCH (femtoUniversePairTaskTrackCascadeExtended, processMixedEventCasc, " Enable processing mixed event for cascade - cascade" , false );
508+ // MC truth
509+ void processSameEventMCgen (const FilteredFDCollision& col, [[maybe_unused]] const FemtoFullParticles& parts)
510+ {
511+ auto groupPartsOne = partsOneMCgen->sliceByCached (aod::femtouniverseparticle::fdCollisionId, col.globalIndex (), cache);
512+ auto groupPartsTwo = partsTwoMCgen->sliceByCached (aod::femtouniverseparticle::fdCollisionId, col.globalIndex (), cache);
513+
514+ eventHisto.fillQA (col);
515+
516+ for (const auto & part : groupPartsTwo) {
517+ int pdgCode = static_cast <int >(part.pidCut ());
518+ if ((confCascType1 == 0 && pdgCode != 3334 ) || (confCascType1 == 2 && pdgCode != -3334 ) || (confCascType1 == 1 && pdgCode != 3312 ) || (confCascType1 == 3 && pdgCode != -3312 ))
519+ continue ;
520+
521+ cascQAHistos.fillQA <false , true >(part);
522+
523+ for (const auto & part : groupPartsOne) {
524+ int pdgCode = static_cast <int >(part.pidCut ());
525+ if (pdgCode != confTrkPDGCodePartOne)
526+ continue ;
527+ const auto & pdgTrackParticle = pdgMC->GetParticle (pdgCode);
528+ if (!pdgTrackParticle) {
529+ continue ;
530+ }
531+
532+ if (pdgTrackParticle->Charge () > 0 ) {
533+ trackHistoPartOnePos.fillQA <false , false >(part);
534+ } else if (pdgTrackParticle->Charge () < 0 ) {
535+ trackHistoPartOneNeg.fillQA <false , false >(part);
536+ }
537+ }
538+
539+ for (const auto & [p1, p2] : combinations (CombinationsFullIndexPolicy (groupPartsOne, groupPartsTwo))) {
540+ if (static_cast <int >(p1.pidCut ()) != confTrkPDGCodePartOne)
541+ continue ;
542+ int pdgCodeCasc = static_cast <int >(p2.pidCut ());
543+ if ((confCascType1 == 0 && pdgCodeCasc != 3334 ) || (confCascType1 == 2 && pdgCodeCasc != -3334 ) || (confCascType1 == 1 && pdgCodeCasc != 3312 ) || (confCascType1 == 3 && pdgCodeCasc != -3312 ))
544+ continue ;
545+ sameEventCont.setPair <false >(p1, p2, col.multNtr (), confUse3D, 1 .0f );
546+ }
547+ }
548+ }
549+ PROCESS_SWITCH (femtoUniversePairTaskTrackCascadeExtended, processSameEventMCgen, " Enable processing same event MC truth for track - cascade" , false );
550+
551+ void processMixedEventMCgen (const FilteredFDCollisions& cols, [[maybe_unused]] const FemtoFullParticles& parts)
552+ {
553+ ColumnBinningPolicy<aod::collision::PosZ, aod::femtouniversecollision::MultNtr> colBinning{{confVtxBins, confMultBins}, true };
554+
555+ for (const auto & [collision1, collision2] : soa::selfCombinations (colBinning, 5 , -1 , cols, cols)) {
556+
557+ auto groupPartsOne = partsOneMCgen->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex (), cache);
558+ auto groupPartsTwo = partsTwoMCgen->sliceByCached (aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex (), cache);
559+
560+ const auto & magFieldTesla1 = collision1.magField ();
561+ const auto & magFieldTesla2 = collision2.magField ();
562+
563+ if (magFieldTesla1 != magFieldTesla2) {
564+ continue ;
565+ }
566+ for (const auto & [p1, p2] : combinations (CombinationsFullIndexPolicy (groupPartsOne, groupPartsTwo))) {
567+ if (static_cast <int >(p1.pidCut ()) != confTrkPDGCodePartOne)
568+ continue ;
569+ int pdgCodeCasc = static_cast <int >(p2.pidCut ());
570+ if ((confCascType1 == 0 && pdgCodeCasc != 3334 ) || (confCascType1 == 2 && pdgCodeCasc != -3334 ) || (confCascType1 == 1 && pdgCodeCasc != 3312 ) || (confCascType1 == 3 && pdgCodeCasc != -3312 ))
571+ continue ;
572+ mixedEventCont.setPair <false >(p1, p2, collision1.multNtr (), confUse3D, 1 .0f );
573+ }
574+ }
575+ }
576+ PROCESS_SWITCH (femtoUniversePairTaskTrackCascadeExtended, processMixedEventMCgen, " Enable processing mixed event MC truth for track - cascade" , false );
501577};
502578
503579WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments