3636#include " ReconstructionDataFormats/Vertex.h"
3737
3838#include " Math/Vector4D.h"
39+ #include " TDatabasePDG.h"
40+ #include " TParticlePDG.h"
3941
4042#include < cmath>
4143#include < memory>
@@ -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,9 @@ 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>;
185188
186189 Preslice<TracksExtData> perCollision = aod::track::collisionId;
187190 Preslice<TracksExtMC> perCollisionMC = aod::track::collisionId;
@@ -205,9 +208,10 @@ struct NonPromptCascadeTask {
205208 Configurable<LabeledArray<float >> cfgCutsPID{" particlesCutsPID" , {cutsPID[0 ], nParticles, nCutsPID, particlesNames, cutsNames}, " Nuclei PID selections" };
206209 Configurable<bool > cfgSkimmedProcessing{" cfgSkimmedProcessing" , true , " Skimmed dataset processing" };
207210
208- Configurable<std::string> cfgTriggersOfInterest{" cfgTriggersOfInterest" , " fTrackedOmega,fOmegaHighMult" , " Triggers of interest, comma separated for Zorro" };
211+ Configurable<std::string> cfgTriggersOfInterest{" cfgTriggersOfInterest" , " fTrackedOmega,fOmegaHighMult,fHighFt0Mult " , " Triggers of interest, comma separated for Zorro" };
209212
210213 Configurable<float > cfgMaxMult{" cfgMaxMult" , 8000 .f , " Upper range of multiplicty histo" };
214+ Configurable<float > cfgMaxMultFV0{" cfgMaxMultFV0" , 10000 .f , " Upper range of multiplicty FV0 histo" };
211215 Configurable<float > cfgMinMult{" cfgMinMult" , 3000 .f , " Lower range of FT0M histo in zoomed histo" };
212216 Configurable<float > cfgMaxCent{" cfgMaxCent" , 8 .0025f , " Upper range of FT0M histo" };
213217
@@ -227,13 +231,17 @@ struct NonPromptCascadeTask {
227231 std::unordered_map<std::string, std::shared_ptr<TH2>> mHistsPerRunNtracktVsCentZoom ;
228232
229233 int nBinsMult = cfgMaxMult;
234+ int nBinsMultFV0 = cfgMaxMultFV0;
230235 int nBinsMultZoom = cfgMaxMult - cfgMinMult;
231236 int nBinsCentZoom = (cfgMaxCent + 0.0025 ) / 0.005 ;
237+
232238 AxisSpec multAxis = {nBinsMult, 0 , cfgMaxMult, " Multiplicity FT0M" };
239+ AxisSpec multAxisFV0 = {nBinsMultFV0, 0 , cfgMaxMultFV0, " Multiplicity FT0M" };
233240 AxisSpec centAxis = {101 , -0.025 , 101.025 , " Centrality" };
234241 AxisSpec centAxisZoom = {nBinsCentZoom, -0.0025 , cfgMaxCent, " Centrality" };
235242 AxisSpec multAxisZoom = {nBinsMultZoom, cfgMinMult, cfgMaxMult, " Multiplicity FT0M" };
236243 AxisSpec nTracksAxis = {100 , 0 ., 100 ., " NTracksGlobal" };
244+ AxisSpec nTracksAxisMC = {100 , 0 ., 100 ., " NTracksMC" };
237245
238246 void initCCDB (aod::BCsWithTimestamps::iterator const & bc)
239247 {
@@ -279,7 +287,10 @@ struct NonPromptCascadeTask {
279287 mRegistry .add (" hMultVsCentZoom" , " hMultVsCentZoom" , HistType::kTH2F , {centAxisZoom, multAxisZoom});
280288 mRegistry .add (" hNTracksVsCent" , " hNTracksVsCent" , HistType::kTH2F , {centAxis, nTracksAxis});
281289 mRegistry .add (" hNTracksVsCentZoom" , " hNTracksVsCentZoom" , HistType::kTH2F , {centAxisZoom, nTracksAxis});
282-
290+ mRegistry .add (" hMultFV0VshNTracks" , " hMultFV0VshNTracks" , HistType::kTH2F , {nTracksAxis, multAxisFV0});
291+ mRegistry .add (" hNTracksVsCentFV0A" , " hNTracksVsCentFV0A" , HistType::kTH2F , {nTracksAxis, centAxis});
292+ mRegistry .add (" hNTracksMCVsTracksReco" , " hNTracksMCVsTracksReco" , HistType::kTH2F , {nTracksAxisMC, nTracksAxis});
293+ mRegistry .add (" hNTracksMCNotInReco" , " hNTracksMCNotInReco" , HistType::kTH1F , {nTracksAxisMC});
283294 for (size_t iBin{0 }; iBin < cutsNames.size (); ++iBin) {
284295 cutsOmega->GetYaxis ()->SetBinLabel (iBin + 1 , cutsNames[iBin].c_str ());
285296 cutsXi->GetYaxis ()->SetBinLabel (iBin + 1 , cutsNames[iBin].c_str ());
@@ -345,7 +356,8 @@ struct NonPromptCascadeTask {
345356 }
346357 }
347358 }
348- void fillMultHistos (const auto & collisions)
359+ template <typename CollisionType>
360+ void fillMultHistos (CollisionType const & collisions)
349361 {
350362 // std::cout << "Filling mult histos" << std::endl;
351363 for (const auto & coll : collisions) {
@@ -368,6 +380,8 @@ struct NonPromptCascadeTask {
368380 mRegistry .fill (HIST (" hMultVsCentZoom" ), coll.centFT0M (), coll.multFT0M ());
369381 mRegistry .fill (HIST (" hNTracksVsCent" ), coll.centFT0M (), (float )coll.multNTracksGlobal ());
370382 mRegistry .fill (HIST (" hNTracksVsCentZoom" ), coll.centFT0M (), coll.multNTracksGlobal ());
383+ mRegistry .fill (HIST (" hMultFV0VshNTracks" ), coll.multNTracksGlobal (), coll.multFV0A ());
384+ mRegistry .fill (HIST (" hNTracksVsCentFV0A" ), coll.multNTracksGlobal (), coll.centFV0A ());
371385 }
372386 };
373387
@@ -590,7 +604,7 @@ struct NonPromptCascadeTask {
590604 cascITSclusters, protonTrack.itsNCls (), pionTrack.itsNCls (), bachelor.itsNCls (), protonTrack.tpcNClsFound (), pionTrack.tpcNClsFound (), bachelor.tpcNClsFound (),
591605 protonTrack.tpcNSigmaPr (), pionTrack.tpcNSigmaPi (), bachelor.tpcNSigmaKa (), bachelor.tpcNSigmaPi (),
592606 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 )});
607+ 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 )});
594608 }
595609 }
596610
@@ -610,7 +624,7 @@ struct NonPromptCascadeTask {
610624 c.protonTPCNSigma , c.pionTPCNSigma , c.bachKaonTPCNSigma , c.bachPionTPCNSigma ,
611625 c.protonHasTOF , c.pionHasTOF , c.bachHasTOF ,
612626 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 );
627+ c.sel8 , c.multFT0C , c.multFV0A , c.multFT0M , c.centFT0C , c.centFV0A , c.centFT0M , c.multNTracksGlobal , c.toiMask , c.noSameBunchPileup );
614628 }
615629 }
616630
@@ -646,7 +660,7 @@ struct NonPromptCascadeTask {
646660 c.cascNClusITS , c.protonNClusITS , c.pionNClusITS , c.bachNClusITS , c.protonNClusTPC , c.pionNClusTPC , c.bachNClusTPC , c.protonTPCNSigma ,
647661 c.pionTPCNSigma , c.bachKaonTPCNSigma , c.bachPionTPCNSigma , c.protonHasTOF , c.pionHasTOF , c.bachHasTOF ,
648662 c.protonTOFNSigma , c.pionTOFNSigma , c.bachKaonTOFNSigma , c.bachPionTOFNSigma ,
649- c.sel8 , c.multFT0C , c.multFT0A , c.multFT0M , c.centFT0C , c.centFT0A , c.centFT0M ,
663+ c.sel8 , c.multFT0C , c.multFV0A , c.multFT0M , c.centFT0C , c.centFV0A , c.centFT0M ,
650664 particle.pt (), particle.eta (), particle.phi (), mcCollision.posX (), mcCollision.posY (), mcCollision.posZ (),
651665 particle.pdgCode (), mcCollision.posX () - particle.vx (), mcCollision.posY () - particle.vy (),
652666 mcCollision.posZ () - particle.vz (), mcCollision.globalIndex () == recCollision.mcCollisionId (), c.hasFakeReassociation , motherDecayDaughters, c.multNTracksGlobal , c.toiMask , c.noSameBunchPileup );
@@ -689,10 +703,11 @@ struct NonPromptCascadeTask {
689703 {
690704 fillCandidatesVector<TracksExtMC>(collisions, tracks, cascades, gCandidatesNT );
691705 fillMCtable<aod::Cascades>(mcParticles, collisions, gCandidatesNT );
706+ fillMultHistos<CollisionCandidatesRun3MC>(collisions);
692707 }
693708 PROCESS_SWITCH (NonPromptCascadeTask, processCascadesMC, " process cascades: MC analysis" , false );
694709
695- void processGenParticles (aod::McParticles const & mcParticles, aod::McCollisions const & )
710+ void processGenParticles (aod::McParticles const & mcParticles)
696711 {
697712 for (const auto & p : mcParticles) {
698713 auto absCode = std::abs (p.pdgCode ());
@@ -702,7 +717,6 @@ struct NonPromptCascadeTask {
702717 auto fromHF = isFromHF (p);
703718 int pdgCodeMom = p.has_mothers () ? p.template mothers_as <aod::McParticles>()[0 ].pdgCode () : 0 ;
704719 auto mcCollision = p.template mcCollision_as <aod::McCollisions>();
705-
706720 int motherDecayDaughters{0 };
707721 if (fromHF[0 ] || fromHF[1 ]) {
708722 auto mom = p.template mothers_as <aod::McParticles>()[0 ];
@@ -715,7 +729,6 @@ struct NonPromptCascadeTask {
715729 }
716730 }
717731 }
718-
719732 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);
720733 }
721734 }
@@ -741,9 +754,57 @@ struct NonPromptCascadeTask {
741754 zorroAccounting (collisions);
742755 fillCandidatesVector<TracksExtData>(collisions, tracks, cascades, gCandidatesNT );
743756 fillDataTable<aod::Cascades>(gCandidatesNT );
744- fillMultHistos (collisions);
757+ fillMultHistos<CollisionCandidatesRun3> (collisions);
745758 }
746759 PROCESS_SWITCH (NonPromptCascadeTask, processCascadesData, " process cascades: Data analysis" , false );
760+
761+ int getMCMult (aod::McParticles const & mcParticles, int mcCollId)
762+ {
763+ int mult = 0 ;
764+ for (auto const & mcp : mcParticles) {
765+ if (mcp.mcCollisionId () == mcCollId) {
766+ // multiplicity definition:
767+ bool accept = mcp.isPhysicalPrimary ();
768+ accept = accept && (mcp.eta () < 0.5 ) && (mcp.eta () > -0.5 );
769+ int q = 0 ;
770+ auto pdgEntry = TDatabasePDG::Instance ()->GetParticle (mcp.pdgCode ());
771+ if (pdgEntry) {
772+ q = int (std::round (pdgEntry->Charge () / 3.0 ));
773+ } else {
774+ // LOG(warn) << "No pdg assuming neutral";
775+ }
776+ accept = accept && (q != 0 );
777+ if (accept) {
778+ ++mult;
779+ }
780+ }
781+ }
782+ return mult;
783+ }
784+ void processNegMC (CollisionsWithLabel const & colls, aod::McCollisions const & mcCollisions, aod::McParticles const & mcParticles)
785+ {
786+ // std::cout << "ProcNegMC" << std::endl;
787+ std::vector<int > mcReconstructed (mcCollisions.size (), 0 );
788+ for (auto const & col : colls) {
789+ int mcCollId = col.mcCollisionId (); // col.template mcCollision_as<aod::McCollisions>();
790+ // auto mc = col.mcCollision();
791+ // int mcId = mc.globalIndex();
792+ // std::cout << "globalIndex:" << mcId << " colID:" << mcCollId << std::endl;
793+ int mult = getMCMult (mcParticles, mcCollId);
794+ mcReconstructed[mcCollId] = 1 ;
795+ mRegistry .fill (HIST (" hNTracksMCVsTracksReco" ), mult, col.multNTracksGlobal ());
796+ }
797+ for (auto const & mc : mcCollisions) {
798+ int gindex = mc.globalIndex ();
799+ // std::cout << "mc globalIndex:" << gindex << std::endl;
800+ if (!mcReconstructed[gindex]) {
801+ int mult = getMCMult (mcParticles, gindex);
802+ // std::cout << "===> unreconstructed:" << mult << std::endl;
803+ mRegistry .fill (HIST (" hNTracksMCNotInReco" ), mult);
804+ }
805+ }
806+ }
807+ PROCESS_SWITCH (NonPromptCascadeTask, processNegMC, " process mc" , false );
747808};
748809
749810WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments