@@ -305,7 +305,6 @@ struct NonPromptCascadeTask {
305305 AxisSpec nTracksAxis = {100 , 0 ., 100 ., " NTracksGlobal" };
306306 AxisSpec nTracksAxisMC = {100 , 0 ., 100 ., " NTracksMC" };
307307 std::vector<double > centBinning;
308- std::vector<double > multBinning;
309308 std::vector<double > trackBinning;
310309 std::vector<double > runsBinning;
311310 double cent = -0.0 ;
@@ -841,6 +840,29 @@ struct NonPromptCascadeTask {
841840 return q != 0 ;
842841 };
843842
843+ static constexpr float MinEtaFT0A = 3 .5f ;
844+ static constexpr float MaxEtaFT0A = 4 .9f ;
845+ static constexpr float MinEtaFT0C = -3 .3f ;
846+ static constexpr float MaxEtaFT0C = -2 .1f ;
847+ static constexpr float InvalidEta = -999 .f ;
848+
849+ auto isAcceptedMCParticleFT0 = [&](auto const & mcp) {
850+ if (!mcp.isPhysicalPrimary ()) {
851+ return false ;
852+ }
853+
854+ const float eta = mcp.eta ();
855+ if (!((eta > MinEtaFT0A && eta < MaxEtaFT0A) || (eta > MinEtaFT0C && eta < MaxEtaFT0C))) {
856+ return false ;
857+ }
858+
859+ int q = 0 ;
860+ if (auto pdg = pdgDB->GetParticle (mcp.pdgCode ())) {
861+ q = static_cast <int >(std::round (pdg->Charge () / 3.0 ));
862+ }
863+ return q != 0 ;
864+ };
865+
844866 // ------------------------------------------------------------
845867 // Helper: accepted reconstructed track
846868 // Use same cuts as data.
@@ -866,6 +888,7 @@ struct NonPromptCascadeTask {
866888 // mcid: mc collision row of mc particle
867889 // ------------------------------------------------------------
868890 std::vector<int > mcMult (mcCollisions.size (), 0 );
891+ std::vector<int > mcMultFT0 (mcCollisions.size (), 0 );
869892 // std::cout << "mcCollisions size:" << mcCollisions.size() << std::endl;
870893 for (auto const & mcp : mcParticles) {
871894 const int mcid = mcp.mcCollisionId ();
@@ -874,10 +897,12 @@ struct NonPromptCascadeTask {
874897 LOG (info) << " 0 This should never happen ?" ;
875898 continue ;
876899 }
877- if (!isAcceptedMCParticle (mcp)) {
878- continue ;
900+ if (isAcceptedMCParticle (mcp)) {
901+ ++mcMult[mcid];
902+ }
903+ if (isAcceptedMCParticleFT0 (mcp)) {
904+ ++mcMultFT0[mcid];
879905 }
880- ++mcMult[mcid];
881906 }
882907
883908 // ------------------------------------------------------------
@@ -990,11 +1015,12 @@ struct NonPromptCascadeTask {
9901015 const int mcCollId = col.mcCollisionId ();
9911016 const float multReco = recoMultDense[dIdx];
9921017 const float ptReco = trk.pt ();
1018+ const float etaReco = trk.eta ();
9931019
9941020 if (mcCollId < 0 || static_cast <int64_t >(mcCollId) >= mcCollisions.size ()) {
9951021 if (writeRecoCollision[dIdx]) {
9961022 // Fake: accepted reco track whose reconstructed collision has no valid MC collision label.
997- NPMCNTable (-1 .f , ptReco, multReco, -1 .f );
1023+ NPMCNTable (-1 .f , ptReco, InvalidEta, etaReco, multReco, - 1 . f , -1 .f );
9981024 }
9991025 continue ;
10001026 }
@@ -1003,7 +1029,7 @@ struct NonPromptCascadeTask {
10031029 if (mcPid < 0 || static_cast <int64_t >(mcPid) >= mcParticles.size ()) {
10041030 if (writeMcCollision[mcCollId]) {
10051031 // Fake: accepted reco track with invalid or missing MC particle label.
1006- NPMCNTable (-2 .f , ptReco, multReco, -2 .f );
1032+ NPMCNTable (-2 .f , ptReco, InvalidEta, etaReco, multReco, -2 .f , mcMultFT0[mcCollId] );
10071033 }
10081034 continue ;
10091035 }
@@ -1014,15 +1040,15 @@ struct NonPromptCascadeTask {
10141040 if (mcParCollId != mcCollId) {
10151041 if (writeMcCollision[mcCollId]) {
10161042 // Fake: reco collision and particle label point to different MC collisions.
1017- NPMCNTable (-3 .f , ptReco, multReco, -3 .f );
1043+ NPMCNTable (-3 .f , ptReco, InvalidEta, etaReco, multReco, -3 .f , mcMultFT0[mcCollId] );
10181044 }
10191045 continue ;
10201046 }
10211047
10221048 if (!isAcceptedMCParticle (mcPar)) {
10231049 if (writeMcCollision[mcCollId]) {
10241050 // Feed-in: accepted reco track matched to truth outside fiducial phase space.
1025- NPMCNTable (-4 .f , ptReco, multReco, -4 .f );
1051+ NPMCNTable (-4 .f , ptReco, mcPar. eta (), etaReco, multReco, -4 .f , mcMultFT0[mcCollId] );
10261052 }
10271053 continue ;
10281054 }
@@ -1031,6 +1057,7 @@ struct NonPromptCascadeTask {
10311057
10321058 const float multMC = mcMult[mcCollId];
10331059 const float ptMC = mcPar.pt ();
1060+ const float etaMC = mcPar.eta ();
10341061
10351062 mRegistrydNdeta .fill (HIST (" hdNdetaRM/hdNdetaRM" ),
10361063 multMC,
@@ -1040,7 +1067,7 @@ struct NonPromptCascadeTask {
10401067
10411068 if (writeMcCollision[mcCollId]) {
10421069 // Matched: accepted truth particle reconstructed inside the fiducial reco phase space.
1043- NPMCNTable (ptMC, ptReco, multReco, multMC);
1070+ NPMCNTable (ptMC, ptReco, etaMC, etaReco, multReco, multMC, mcMultFT0[mcCollId] );
10441071 }
10451072 }
10461073
@@ -1069,14 +1096,15 @@ struct NonPromptCascadeTask {
10691096 }
10701097
10711098 const float multMC = mcMult[mcid];
1099+ const float multMCFT0 = mcMultFT0[mcid];
10721100
10731101 mRegistrydNdeta .fill (HIST (" hdNdetaRM/hdNdetaRMNotInRecoTrk" ),
10741102 multMC,
10751103 mcp.pt ());
10761104
10771105 if (writeMcCollision[mcid]) {
10781106 // Missed track: accepted truth particle in a reconstructed MC collision, but no accepted reco track.
1079- NPMCNTable (mcp.pt (), -1 .f , -1 .f , multMC);
1107+ NPMCNTable (mcp.pt (), -1 .f , mcp. eta (), InvalidEta, -1 .f , multMC, multMCFT0 );
10801108 }
10811109 }
10821110
@@ -1089,6 +1117,7 @@ struct NonPromptCascadeTask {
10891117 }
10901118
10911119 const float multMC = mcMult[mcid];
1120+ const float multMCFT0 = mcMultFT0[mcid];
10921121
10931122 for (auto const & mcp : mcParticles) {
10941123 if (mcp.mcCollisionId () != mcid) {
@@ -1105,7 +1134,7 @@ struct NonPromptCascadeTask {
11051134
11061135 if (writeMcCollision[mcid]) {
11071136 // Missed collision: accepted truth particle from an MC collision with no reconstructed collision.
1108- NPMCNTable (mcp.pt (), -2 .f , -2 .f , multMC);
1137+ NPMCNTable (mcp.pt (), -2 .f , mcp. eta (), InvalidEta, -2 .f , multMC, multMCFT0 );
11091138 }
11101139 }
11111140 }
@@ -1134,13 +1163,15 @@ struct NonPromptCascadeTask {
11341163 auto tracksThisColl = tracks.sliceBy (perCollisionSel, coll.globalIndex ());
11351164 int multreco = 0 ;
11361165 std::vector<float > recoPts;
1166+ std::vector<float > recoEtas;
11371167 // std::cout << "tracks:" << tracksThisColl.size() << std::endl;
11381168 for (auto const & track : tracksThisColl) {
11391169 // std::cout << track.pt() << " tracks " << track.isGlobalTrack() << std::endl;
11401170 if (std::fabs (track.eta ()) < cfgEtaCutdNdeta && track.tpcNClsFound () >= 80 && track.tpcNClsCrossedRows () >= 100 ) {
11411171 if (track.isGlobalTrack ()) {
11421172 multreco++;
11431173 recoPts.push_back (track.pt ());
1174+ recoEtas.push_back (track.eta ());
11441175 }
11451176 }
11461177 }
@@ -1158,8 +1189,8 @@ struct NonPromptCascadeTask {
11581189 coll.multFT0M (),
11591190 coll.selection_bit (aod::evsel::kNoSameBunchPileup ));
11601191 auto collIdx = NPCollsTable.lastIndex ();
1161- for (auto const & pt : recoPts) {
1162- NPRecoCandTable (collIdx, pt );
1192+ for (size_t i = 0 ; i < recoPts. size (); ++i ) {
1193+ NPRecoCandTable (collIdx, recoPts[i], recoEtas[i] );
11631194 }
11641195 }
11651196 }
0 commit comments