4141#include < memory>
4242#include < string>
4343#include < vector>
44+ #include " TDatabasePDG.h"
45+ #include " TParticlePDG.h"
4446// #include "PWGHF/Core/PDG.h"
4547#include " PWGLF/DataModel/LFNonPromptCascadeTables.h"
4648#include " PWGLF/DataModel/LFStrangenessTables.h"
@@ -124,10 +126,10 @@ struct NPCascCandidate {
124126 float bachPionTOFNSigma;
125127 bool sel8;
126128 float multFT0C;
127- float multFT0A ;
129+ float multFV0A ;
128130 float multFT0M;
129131 float centFT0C;
130- float centFT0A ;
132+ float centFV0A ;
131133 float centFT0M;
132134 int multNTracksGlobal;
133135 uint32_t toiMask;
@@ -180,8 +182,10 @@ struct NonPromptCascadeTask {
180182
181183 using TracksExtData = soa::Join<aod::TracksIU, aod::TracksCovIU, aod::TracksExtra, aod::pidTPCFullKa, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTOFFullKa, aod::pidTOFFullPi, aod::pidTOFFullPr>;
182184 using TracksExtMC = soa::Join<aod::TracksIU, aod::TracksCovIU, aod::TracksExtra, aod::McTrackLabels, aod::pidTPCFullKa, aod::pidTPCFullPi, aod::pidTPCFullPr, aod::pidTOFFullKa, aod::pidTOFFullPi, aod::pidTOFFullPr>;
183- using CollisionCandidatesRun3 = soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults, aod::CentFT0Cs, aod::CentFT0As, aod::CentFT0Ms, aod::MultsGlobal>;
184- using CollisionCandidatesRun3MC = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::FT0Mults, aod::CentFT0Cs, aod::CentFT0As, aod::CentFT0Ms, aod::MultsGlobal>;
185+ using CollisionCandidatesRun3 = soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults, aod::FV0Mults, aod::CentFT0Cs, aod::CentFV0As, aod::CentFT0Ms, aod::MultsGlobal>;
186+ using CollisionCandidatesRun3MC = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::FT0Mults, aod::FV0Mults, aod::CentFT0Cs, aod::CentFV0As, aod::CentFT0Ms, aod::MultsGlobal>;
187+ using CollisionsWithLabel = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::MultsGlobal>;
188+
185189
186190 Preslice<TracksExtData> perCollision = aod::track::collisionId;
187191 Preslice<TracksExtMC> perCollisionMC = aod::track::collisionId;
@@ -205,9 +209,10 @@ struct NonPromptCascadeTask {
205209 Configurable<LabeledArray<float >> cfgCutsPID{" particlesCutsPID" , {cutsPID[0 ], nParticles, nCutsPID, particlesNames, cutsNames}, " Nuclei PID selections" };
206210 Configurable<bool > cfgSkimmedProcessing{" cfgSkimmedProcessing" , true , " Skimmed dataset processing" };
207211
208- Configurable<std::string> cfgTriggersOfInterest{" cfgTriggersOfInterest" , " fTrackedOmega,fOmegaHighMult" , " Triggers of interest, comma separated for Zorro" };
212+ Configurable<std::string> cfgTriggersOfInterest{" cfgTriggersOfInterest" , " fTrackedOmega,fOmegaHighMult,fHighFt0Mult " , " Triggers of interest, comma separated for Zorro" };
209213
210214 Configurable<float > cfgMaxMult{" cfgMaxMult" , 8000 .f , " Upper range of multiplicty histo" };
215+ Configurable<float > cfgMaxMultFV0{" cfgMaxMultFV0" , 10000 .f , " Upper range of multiplicty FV0 histo" };
211216 Configurable<float > cfgMinMult{" cfgMinMult" , 3000 .f , " Lower range of FT0M histo in zoomed histo" };
212217 Configurable<float > cfgMaxCent{" cfgMaxCent" , 8 .0025f , " Upper range of FT0M histo" };
213218
@@ -227,13 +232,18 @@ struct NonPromptCascadeTask {
227232 std::unordered_map<std::string, std::shared_ptr<TH2>> mHistsPerRunNtracktVsCentZoom ;
228233
229234 int nBinsMult = cfgMaxMult;
235+ int nBinsMultFV0 = cfgMaxMultFV0;
230236 int nBinsMultZoom = cfgMaxMult - cfgMinMult;
231237 int nBinsCentZoom = (cfgMaxCent + 0.0025 ) / 0.005 ;
238+
232239 AxisSpec multAxis = {nBinsMult, 0 , cfgMaxMult, " Multiplicity FT0M" };
240+ AxisSpec multAxisFV0 = {nBinsMultFV0, 0 , cfgMaxMultFV0, " Multiplicity FT0M" };
233241 AxisSpec centAxis = {101 , -0.025 , 101.025 , " Centrality" };
234242 AxisSpec centAxisZoom = {nBinsCentZoom, -0.0025 , cfgMaxCent, " Centrality" };
235243 AxisSpec multAxisZoom = {nBinsMultZoom, cfgMinMult, cfgMaxMult, " Multiplicity FT0M" };
236244 AxisSpec nTracksAxis = {100 , 0 ., 100 ., " NTracksGlobal" };
245+ AxisSpec nTracksAxisMC = {100 , 0 ., 100 ., " NTracksMC" };
246+
237247
238248 void initCCDB (aod::BCsWithTimestamps::iterator const & bc)
239249 {
@@ -279,7 +289,10 @@ struct NonPromptCascadeTask {
279289 mRegistry .add (" hMultVsCentZoom" , " hMultVsCentZoom" , HistType::kTH2F , {centAxisZoom, multAxisZoom});
280290 mRegistry .add (" hNTracksVsCent" , " hNTracksVsCent" , HistType::kTH2F , {centAxis, nTracksAxis});
281291 mRegistry .add (" hNTracksVsCentZoom" , " hNTracksVsCentZoom" , HistType::kTH2F , {centAxisZoom, nTracksAxis});
282-
292+ mRegistry .add (" hMultFV0VshNTracks" , " hMultFV0VshNTracks" , HistType::kTH2F , {nTracksAxis, multAxisFV0});
293+ mRegistry .add (" hNTracksVsCentFV0A" , " hNTracksVsCentFV0A" , HistType::kTH2F , {nTracksAxis, centAxis});
294+ mRegistry .add (" hNTracksMCVsTracksReco" , " hNTracksMCVsTracksReco" , HistType::kTH2F , {nTracksAxisMC, nTracksAxis});
295+ mRegistry .add (" hNTracksMCNotInReco" ," hNTracksMCNotInReco" , HistType::kTH1F , {nTracksAxisMC});
283296 for (size_t iBin{0 }; iBin < cutsNames.size (); ++iBin) {
284297 cutsOmega->GetYaxis ()->SetBinLabel (iBin + 1 , cutsNames[iBin].c_str ());
285298 cutsXi->GetYaxis ()->SetBinLabel (iBin + 1 , cutsNames[iBin].c_str ());
@@ -345,7 +358,8 @@ struct NonPromptCascadeTask {
345358 }
346359 }
347360 }
348- void fillMultHistos (const auto & collisions)
361+ template <typename CollisionType>
362+ void fillMultHistos (CollisionType const & collisions)
349363 {
350364 // std::cout << "Filling mult histos" << std::endl;
351365 for (const auto & coll : collisions) {
@@ -368,6 +382,8 @@ struct NonPromptCascadeTask {
368382 mRegistry .fill (HIST (" hMultVsCentZoom" ), coll.centFT0M (), coll.multFT0M ());
369383 mRegistry .fill (HIST (" hNTracksVsCent" ), coll.centFT0M (), (float )coll.multNTracksGlobal ());
370384 mRegistry .fill (HIST (" hNTracksVsCentZoom" ), coll.centFT0M (), coll.multNTracksGlobal ());
385+ mRegistry .fill (HIST (" hMultFV0VshNTracks" ), coll.multNTracksGlobal (), coll.multFV0A ());
386+ mRegistry .fill (HIST (" hNTracksVsCentFV0A" ), coll.multNTracksGlobal (), coll.centFV0A ());
371387 }
372388 };
373389
@@ -590,7 +606,7 @@ struct NonPromptCascadeTask {
590606 cascITSclusters, protonTrack.itsNCls (), pionTrack.itsNCls (), bachelor.itsNCls (), protonTrack.tpcNClsFound (), pionTrack.tpcNClsFound (), bachelor.tpcNClsFound (),
591607 protonTrack.tpcNSigmaPr (), pionTrack.tpcNSigmaPi (), bachelor.tpcNSigmaKa (), bachelor.tpcNSigmaPi (),
592608 protonTrack.hasTOF (), pionTrack.hasTOF (), bachelor.hasTOF (),
593- protonTrack.tofNSigmaPr (), pionTrack.tofNSigmaPi (), bachelor.tofNSigmaKa (), bachelor.tofNSigmaPi (), collision.sel8 (), collision.multFT0C (), collision.multFT0A (), collision.multFT0M (), collision.centFT0C (), collision.centFT0A (), collision.centFT0M (), collision.multNTracksGlobal (), toiMask, collision.selection_bit (aod::evsel::kNoSameBunchPileup )});
609+ protonTrack.tofNSigmaPr (), pionTrack.tofNSigmaPi (), bachelor.tofNSigmaKa (), bachelor.tofNSigmaPi (), collision.sel8 (), collision.multFT0C (), collision.multFV0A (), collision.multFT0M (), collision.centFT0C (), collision.centFV0A (), collision.centFT0M (), collision.multNTracksGlobal (), toiMask, collision.selection_bit (aod::evsel::kNoSameBunchPileup )});
594610 }
595611 }
596612
@@ -610,7 +626,7 @@ struct NonPromptCascadeTask {
610626 c.protonTPCNSigma , c.pionTPCNSigma , c.bachKaonTPCNSigma , c.bachPionTPCNSigma ,
611627 c.protonHasTOF , c.pionHasTOF , c.bachHasTOF ,
612628 c.protonTOFNSigma , c.pionTOFNSigma , c.bachKaonTOFNSigma , c.bachPionTOFNSigma ,
613- c.sel8 , c.multFT0C , c.multFT0A , c.multFT0M , c.centFT0C , c.centFT0A , c.centFT0M , c.multNTracksGlobal , c.toiMask , c.noSameBunchPileup );
629+ c.sel8 , c.multFT0C , c.multFV0A , c.multFT0M , c.centFT0C , c.centFV0A , c.centFT0M , c.multNTracksGlobal , c.toiMask , c.noSameBunchPileup );
614630 }
615631 }
616632
@@ -646,7 +662,7 @@ struct NonPromptCascadeTask {
646662 c.cascNClusITS , c.protonNClusITS , c.pionNClusITS , c.bachNClusITS , c.protonNClusTPC , c.pionNClusTPC , c.bachNClusTPC , c.protonTPCNSigma ,
647663 c.pionTPCNSigma , c.bachKaonTPCNSigma , c.bachPionTPCNSigma , c.protonHasTOF , c.pionHasTOF , c.bachHasTOF ,
648664 c.protonTOFNSigma , c.pionTOFNSigma , c.bachKaonTOFNSigma , c.bachPionTOFNSigma ,
649- c.sel8 , c.multFT0C , c.multFT0A , c.multFT0M , c.centFT0C , c.centFT0A , c.centFT0M ,
665+ c.sel8 , c.multFT0C , c.multFV0A , c.multFT0M , c.centFT0C , c.centFV0A , c.centFT0M ,
650666 particle.pt (), particle.eta (), particle.phi (), mcCollision.posX (), mcCollision.posY (), mcCollision.posZ (),
651667 particle.pdgCode (), mcCollision.posX () - particle.vx (), mcCollision.posY () - particle.vy (),
652668 mcCollision.posZ () - particle.vz (), mcCollision.globalIndex () == recCollision.mcCollisionId (), c.hasFakeReassociation , motherDecayDaughters, c.multNTracksGlobal , c.toiMask , c.noSameBunchPileup );
@@ -689,11 +705,13 @@ struct NonPromptCascadeTask {
689705 {
690706 fillCandidatesVector<TracksExtMC>(collisions, tracks, cascades, gCandidatesNT );
691707 fillMCtable<aod::Cascades>(mcParticles, collisions, gCandidatesNT );
708+ fillMultHistos<CollisionCandidatesRun3MC>(collisions);
692709 }
693710 PROCESS_SWITCH (NonPromptCascadeTask, processCascadesMC, " process cascades: MC analysis" , false );
694711
695- void processGenParticles (aod::McParticles const & mcParticles, aod::McCollisions const &)
712+ void processGenParticles (aod::McParticles const & mcParticles, aod::McCollisions const & collisions )
696713 {
714+ // fillMultHistos<aod::McCollisions>(collisions)
697715 for (const auto & p : mcParticles) {
698716 auto absCode = std::abs (p.pdgCode ());
699717 if (absCode != 3312 && absCode != 3334 ) {
@@ -702,7 +720,6 @@ struct NonPromptCascadeTask {
702720 auto fromHF = isFromHF (p);
703721 int pdgCodeMom = p.has_mothers () ? p.template mothers_as <aod::McParticles>()[0 ].pdgCode () : 0 ;
704722 auto mcCollision = p.template mcCollision_as <aod::McCollisions>();
705-
706723 int motherDecayDaughters{0 };
707724 if (fromHF[0 ] || fromHF[1 ]) {
708725 auto mom = p.template mothers_as <aod::McParticles>()[0 ];
@@ -715,7 +732,6 @@ struct NonPromptCascadeTask {
715732 }
716733 }
717734 }
718-
719735 NPCTableGen (p.pt (), p.eta (), p.phi (), p.pdgCode (), pdgCodeMom, mcCollision.posX () - p.vx (), mcCollision.posY () - p.vy (), mcCollision.posZ () - p.vz (), fromHF[0 ], fromHF[1 ], motherDecayDaughters);
720736 }
721737 }
@@ -741,9 +757,57 @@ struct NonPromptCascadeTask {
741757 zorroAccounting (collisions);
742758 fillCandidatesVector<TracksExtData>(collisions, tracks, cascades, gCandidatesNT );
743759 fillDataTable<aod::Cascades>(gCandidatesNT );
744- fillMultHistos (collisions);
760+ fillMultHistos<CollisionCandidatesRun3> (collisions);
745761 }
746762 PROCESS_SWITCH (NonPromptCascadeTask, processCascadesData, " process cascades: Data analysis" , false );
763+
764+ int getMCMult (aod::McParticles const & mcParticles, int mcCollId )
765+ {
766+ int mult = 0 ;
767+ for (auto const & mcp : mcParticles) {
768+ if (mcp.mcCollisionId () == mcCollId) {
769+ // multiplicity definition:
770+ bool accept = mcp.isPhysicalPrimary ();
771+ accept *= (mcp.eta () < 0.5 ) && (mcp.eta () > -0.5 );
772+ int q = 0 ;
773+ auto pdgEntry = TDatabasePDG::Instance ()->GetParticle (mcp.pdgCode ());
774+ if (pdgEntry){
775+ q = int (std::round (pdgEntry->Charge () / 3.0 ));
776+ } else {
777+ // LOG(warn) << "No pdg assuming neutral";
778+ }
779+ accept *= (q != 0 );
780+ if (accept) {
781+ ++mult;
782+ }
783+ }
784+ }
785+ return mult;
786+ }
787+ void processNegMC (CollisionsWithLabel const & colls, aod::McCollisions const & mcCollisions, aod::McParticles const & mcParticles )
788+ {
789+ // std::cout << "ProcNegMC" << std::endl;
790+ std::vector<int > mcReconstructed (mcCollisions.size (),0 );
791+ for (auto const & col: colls){
792+ int mcCollId = col.mcCollisionId (); // col.template mcCollision_as<aod::McCollisions>();
793+ // auto mc = col.mcCollision();
794+ // int mcId = mc.globalIndex();
795+ // std::cout << "globalIndex:" << mcId << " colID:" << mcCollId << std::endl;
796+ int mult = getMCMult (mcParticles, mcCollId);
797+ mcReconstructed[mcCollId] = 1 ;
798+ mRegistry .fill (HIST (" hNTracksMCVsTracksReco" ), mult, col.multNTracksGlobal ());
799+ }
800+ for (auto const & mc: mcCollisions){
801+ int gindex = mc.globalIndex ();
802+ // std::cout << "mc globalIndex:" << gindex << std::endl;
803+ if (!mcReconstructed[gindex]){
804+ int mult = getMCMult (mcParticles, gindex);
805+ // std::cout << "===> unreconstructed:" << mult << std::endl;
806+ mRegistry .fill (HIST ( " hNTracksMCNotInReco" ), mult);
807+ }
808+ }
809+ }
810+ PROCESS_SWITCH (NonPromptCascadeTask, processNegMC, " process mc" , false );
747811};
748812
749813WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments