1616// / \author Nicolas Strangmann ([email protected] ) - Goethe University Frankfurt1717// /
1818
19- #include < CommonConstants/MathConstants.h>
20- #include < CommonConstants/PhysicsConstants.h>
21- #include < vector>
22- #include " TVector3.h"
23-
24- #include " Framework/runDataProcessing.h"
25- #include " Framework/AnalysisTask.h"
26- #include " Framework/HistogramRegistry.h"
27- #include " Common/DataModel/EventSelection.h"
28- #include " EMCALBase/Geometry.h"
29- #include " PWGJE/DataModel/EMCALClusters.h"
30- #include " Common/Core/trackUtilities.h"
31- #include " Common/DataModel/TrackSelectionTables.h"
32- #include " EventFiltering/filterTables.h"
19+ #include " PWGEM/PhotonMeson/Utils/HNMUtilities.h"
3320
3421using namespace o2 ;
3522using namespace o2 ::framework;
3623using namespace o2 ::framework::expressions;
24+ using namespace o2 ::aod::pwgem::photonmeson::utils::hnmutilities;
3725
3826using MyBCs = soa::Join<aod::BCs, aod::BcSels, aod::Timestamps>;
3927using MyCollisions = soa::Join<aod::Collisions, aod::EvSels>;
4028
4129using SelectedTracks = soa::Filtered<soa::Join<aod::FullTracks, aod::TrackSelection>>;
42- using SelectedClusters = soa::Filtered<aod::EMCALClusters>; // Clusters from collisions with only one collision in the BC
43-
44- struct Photon { // Struct to store photons (unique and ambiguous clusters that passed the cuts)
45- Photon (float eta, float phi, float energy) : eta(eta), phi(phi), e(energy), theta(2 * std::atan2 (std::exp(-eta), 1)), px(e * std::sin (theta) * std::cos(phi)), py(e * std::sin (theta) * std::sin(phi)), pz(e * std::cos (theta)), pt(std::sqrt(px * px + py * py))
46- {
47- photon.SetPxPyPzE (px, py, pz, e);
48- }
49-
50- ROOT::Math::PxPyPzEVector photon;
51- float eta, phi, e;
52- float theta;
53- float px, py, pz, pt;
54- };
55-
56- namespace HeavyNeutralMeson
57- {
58- enum MesonType {
59- kPi0 = 1 << 0 , // 0001
60- kEta = 1 << 1 , // 0010
61- kOmega = 1 << 2 , // 0100
62- kEtaPrime = 1 << 3 // 1000
63- };
64- }
65-
66- struct Meson {
67- Meson (Photon p1, Photon p2) : p1(p1), p2(p2), mesonType(0 )
68- {
69- pMeson = p1.photon + p2.photon ;
70- }
71- Meson (Meson gg, float eTracks, float pxTracks, float pyTracks, float pzTracks) : p1(gg.p1), p2(gg.p2), mesonType(0 )
72- {
73- pMeson.SetPxPyPzE (gg.pMeson .Px () + pxTracks, gg.pMeson .Py () + pyTracks, gg.pMeson .Pz () + pzTracks, gg.pMeson .e () + eTracks);
74- }
75- Photon p1, p2;
76- ROOT::Math::PxPyPzEVector pMeson;
77-
78- uint32_t mesonType;
79-
80- void addMesonType (uint32_t type) { mesonType |= type; }
81- bool hasMesonType (uint32_t type) const { return mesonType & type; }
82-
83- float m () const { return pMeson.M (); }
84- float pT () const { return pMeson.Pt (); }
85- };
8630
8731struct HeavyNeutralMesonFilter {
88-
8932 Produces<aod::HeavyNeutralMesonFilters> tags;
9033
9134 HistogramRegistry mHistManager {" HeavyNeutralMesonFilterHistograms" , {}, OutputObjHandlingPolicy::QAObject};
9235
93- Configurable<int > cfgClusterDefinition{" cfgClusterDefinition" , 13 , " Clusterizer to be selected, e.g. 13 for kV3MostSplitLowSeed" };
94- Configurable<float > cfgMinClusterEnergy{" cfgMinClusterEnergy" , 0.5 , " Minimum energy of selected clusters (GeV)" };
95- Configurable<float > cfgMinM02{" cfgMinM02" , 0 ., " Minimum M02 of selected clusters" };
96- Configurable<float > cfgMaxM02{" cfgMaxM02" , 1 , " Maximum M02 of selected clusters" };
97- Configurable<float > cfgMinTime{" cfgMinTime" , -25 , " Minimum time of selected clusters (ns)" };
98- Configurable<float > cfgMaxTime{" cfgMaxTime" , 25 , " Maximum time of selected clusters (ns)" };
99-
10036 Configurable<float > cfgTrackMinPt{" cfgTrackMinPt" , 0.1 , " Minimum momentum of tracks (GeV/c)" };
101-
37+ Configurable< int > cfgHNMMassCorrection{ " cfgHNMMassCorrection " , 1 , " Use GG PDG mass to correct HNM mass (0 = off, 1 = subDeltaPi0, 2 = subLambda) " };
10238 static constexpr float defaultMassWindows[2 ][4 ] = {{0 ., 0.4 , 0.6 , 1 .}, {0.4 , 0.8 , 0.8 , 1.2 }};
10339 Configurable<LabeledArray<float >> massWindowOmega{" massWindowOmega" , {defaultMassWindows[0 ], 4 , {" pi0_min" , " pi0_max" , " omega_min" , " omega_max" }}, " Mass window for selected omegas and their decay pi0" };
10440 Configurable<LabeledArray<float >> massWindowEtaPrime{" massWindowEtaPrime" , {defaultMassWindows[1 ], 4 , {" eta_min" , " eta_max" , " etaprime_min" , " etaprime_max" }}, " Mass window for selected eta' and their decay eta" };
10541
106- static constexpr float defaultMinPts[4 ] = {0 ., 5 ., 0 ., 5 .}; // LowPtOmega, HighPtOmega, LowPtEtaPrime, HighPtEtaPrime
107- Configurable<LabeledArray<float >> minHNMPt{" minHNMPt" , {defaultMinPts, 4 , {" omega_lowPt" , " omega_highPt" , " etaPrime_lowPt" , " etaPrime_highPt" }}, " Minimum pT values for the heavy neutral mesons of the low and high pT trigger" };
108-
109- Filter clusterDefinitionFilter = aod::emcalcluster::definition == cfgClusterDefinition;
110- Filter energyFilter = aod::emcalcluster::energy > cfgMinClusterEnergy;
111- Filter m02Filter = (aod::emcalcluster::nCells == 1 || (aod::emcalcluster::m02 > cfgMinM02 && aod::emcalcluster::m02 < cfgMaxM02));
112- Filter timeFilter = (aod::emcalcluster::time > cfgMinTime && aod::emcalcluster::time < cfgMaxTime);
113-
11442 Filter trackPtFilter = aod::track::pt > cfgTrackMinPt;
11543
116- std::vector<Photon> mPhotons ;
117- std::vector<Meson> mGGs ;
44+ std::vector<GammaGammaPair> vGGs ;
45+ std::vector<HeavyNeutralMeson> vHNMs ;
11846
119- bool colContainsLowPtOmega = false ;
120- bool colContainsHighPtOmega = false ;
121- bool colContainsLowPtEtaPrime = false ;
122- bool colContainsHighPtEtaPrime = false ;
47+ bool colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime = false ;
12348
12449 emcal::Geometry* emcalGeom;
12550
@@ -131,131 +56,117 @@ struct HeavyNeutralMesonFilter {
13156 hCollisionCounter->GetXaxis ()->SetBinLabel (2 , " kTVXinEMC" );
13257 hCollisionCounter->GetXaxis ()->SetBinLabel (3 , " L0Triggered" );
13358 hCollisionCounter->GetXaxis ()->SetBinLabel (4 , " 2+ tracks&clusters" );
134- hCollisionCounter->GetXaxis ()->SetBinLabel (5 , " Low #it{p}_{T} #omega" );
135- hCollisionCounter->GetXaxis ()->SetBinLabel (6 , " High #it{p}_{T} #omega" );
136- hCollisionCounter->GetXaxis ()->SetBinLabel (7 , " Low #it{p}_{T} #eta'" );
137- hCollisionCounter->GetXaxis ()->SetBinLabel (8 , " High #it{p}_{T} #eta'" );
138-
139- mHistManager .add (" Event/nClusters" , " Number of BCs (with (k)TVX);#bf{TVX triggered};#bf{#it{N}_{BCs}}" , HistType::kTH1F , {{51 , -0.5 , 50.5 }});
140- mHistManager .add (" Event/nGGs" , " Number of BCs (with (k)TVX);#bf{TVX triggered};#bf{#it{N}_{BCs}}" , HistType::kTH1F , {{51 , -0.5 , 50.5 }});
141- mHistManager .add (" Event/nTracks" , " Number of BCs (with (k)TVX);#bf{TVX triggered};#bf{#it{N}_{BCs}}" , HistType::kTH1F , {{51 , -0.5 , 50.5 }});
142- mHistManager .add (" Event/nHeavyNeutralMesons" , " Number of BCs (with (k)TVX);#bf{TVX triggered};#bf{#it{N}_{BCs}}" , HistType::kTH1F , {{51 , -0.5 , 50.5 }});
143-
144- mHistManager .add (" nCollisionsVsClusters" , " Number of collisions vs number of clusters;N_{Collisions};N_{Clusters}" , HistType::kTH2F , {{4 , -0.5 , 3.5 }, {21 , -0.5 , 20.5 }});
145-
146- mHistManager .add (" Track/trackP" , " Momentum of tracks;#bf{#it{p} (GeV/#it{c})};#bf{#it{N}_{tracks}}" , HistType::kTH1F , {{200 , 0 , 20 }});
147-
148- mHistManager .add (" Cluster/clusterE" , " Energy of cluster;#bf{#it{E} (GeV)};#bf{#it{N}_{clusters}}" , HistType::kTH1F , {{200 , 0 , 20 }});
149- mHistManager .add (" Cluster/clusterM02" , " Shape of cluster;#bf{#it{M}_{02}};#bf{#it{N}_{clusters}}" , HistType::kTH1F , {{200 , 0 , 2 }});
150- mHistManager .add (" Cluster/clusterTime" , " Time of cluster;#bf{#it{t} (ns)};#bf{#it{N}_{clusters}}" , HistType::kTH1F , {{200 , -100 , 100 }});
151-
152- mHistManager .add (" GG/invMassVsPt" , " Invariant mass and pT of meson candidates" , HistType::kTH2F , {{400 , massWindowOmega->get (" pi0_min" ), massWindowEtaPrime->get (" eta_max" )}, {250 , 0 ., 25 .}});
153-
154- mHistManager .add (" HeavyNeutralMeson/invMassVsPt" , " Invariant mass and pT of meson candidates" , HistType::kTH2F , {{600 , massWindowOmega->get (" omega_min" ), massWindowEtaPrime->get (" etaprime_max" )}, {250 , 0 ., 25 .}});
59+ hCollisionCounter->GetXaxis ()->SetBinLabel (5 , " PCM #omega" );
60+ hCollisionCounter->GetXaxis ()->SetBinLabel (6 , " EMC #omega" );
61+ hCollisionCounter->GetXaxis ()->SetBinLabel (7 , " PCM #eta'" );
62+ hCollisionCounter->GetXaxis ()->SetBinLabel (8 , " EMC #eta'" );
63+
64+ mHistManager .add (" Event/nGGs" , " Number of (selected) #gamma#gamma paris;#bf{#it{N}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}^{selected}}" , HistType::kTH2F , {{51 , -0.5 , 50.5 }, {51 , -0.5 , 50.5 }});
65+ mHistManager .add (" Event/nTracks" , " Number of tracks;#bf{N_{tracks}};#bf{#it{N}_{Coll}}" , HistType::kTH1F , {{51 , -0.5 , 50.5 }});
66+ mHistManager .add (" Event/nHeavyNeutralMesons" , " Number of (selected) HNM candidates;#bf{#it{N}_{HNM}};#bf{#it{N}_{HNM}^{selected}}" , HistType::kTH2F , {{51 , -0.5 , 50.5 }, {51 , -0.5 , 50.5 }});
67+ mHistManager .add (" Event/nClustersVsV0s" , " Number of clusters and V0s in the collision;#bf{#it{N}_{clusters}};#bf{#it{N}_{V0s}}" , HistType::kTH2F , {{26 , -0.5 , 25.5 }, {26 , -0.5 , 25.5 }});
68+
69+ mHistManager .add (" GG/invMassVsPt_PCM" , " Invariant mass and pT of gg candidates" , HistType::kTH2F , {{400 , 0 ., 0.8 }, {250 , 0 ., 25 .}});
70+ mHistManager .add (" GG/invMassVsPt_PCMEMC" , " Invariant mass and pT of gg candidates" , HistType::kTH2F , {{400 , 0 ., 0.8 }, {250 , 0 ., 25 .}});
71+ mHistManager .add (" GG/invMassVsPt_EMC" , " Invariant mass and pT of gg candidates" , HistType::kTH2F , {{400 , 0 ., 0.8 }, {250 , 0 ., 25 .}});
72+
73+ mHistManager .add (" HeavyNeutralMeson/invMassVsPt_PCM" , " Invariant mass and pT of HNM candidates" , HistType::kTH2F , {{600 , 0.6 , 1.2 }, {250 , 0 ., 25 .}});
74+ mHistManager .add (" HeavyNeutralMeson/invMassVsPt_PCMEMC" , " Invariant mass and pT of HNM candidates" , HistType::kTH2F , {{600 , 0.6 , 1.2 }, {250 , 0 ., 25 .}});
75+ mHistManager .add (" HeavyNeutralMeson/invMassVsPt_EMC" , " Invariant mass and pT of HNM candidates" , HistType::kTH2F , {{600 , 0.6 , 1.2 }, {250 , 0 ., 25 .}});
15576 }
15677
157- void process (MyCollisions::iterator const & collision, MyBCs const &, SelectedClusters const & clusters, SelectedTracks const & tracks)
78+ Preslice<aod::V0PhotonsKF> perCollision_pcm = aod::v0photonkf::collisionId;
79+ Preslice<aod::SkimEMCClusters> perCollision_emc = aod::skimmedcluster::collisionId;
80+
81+ void process (MyCollisions::iterator const & collision, MyBCs const &, aod::SkimEMCClusters const & clusters, aod::V0PhotonsKF const & v0s, SelectedTracks const & tracks)
15882 {
15983 mHistManager .fill (HIST (" Event/hCollisionCounter" ), 0 .);
16084
161- colContainsLowPtOmega = false ;
162- colContainsHighPtOmega = false ;
163- colContainsLowPtEtaPrime = false ;
164- colContainsHighPtEtaPrime = false ;
85+ if (collision.foundBC_as <MyBCs>().alias_bit (kTVXinEMC ))
86+ mHistManager .fill (HIST (" Event/hCollisionCounter" ), 1 .);
16587
166- if ( isBCSelected (collision. foundBC_as <MyBCs>(), clusters. size (), tracks. size () > 2 )) {
167- processClusters ( clusters);
88+ auto v0sInThisCollision = v0s. sliceBy (perCollision_pcm, collision. globalIndex ());
89+ auto clustersInThisCollision = clusters. sliceBy (perCollision_emc, collision. globalIndex () );
16890
169- processGGs ( );
170- processHeavyNeutralMesons ( tracks);
91+ mHistManager . fill ( HIST ( " Event/nClustersVsV0s " ), clustersInThisCollision. size (), v0sInThisCollision. size () );
92+ mHistManager . fill ( HIST ( " Event/nTracks " ), tracks. size () );
17193
172- mPhotons .clear ();
173- mGGs .clear ();
174- }
175-
176- if (colContainsLowPtOmega)
177- mHistManager .fill (HIST (" Event/hCollisionCounter" ), 4 .);
178- if (colContainsHighPtOmega)
179- mHistManager .fill (HIST (" Event/hCollisionCounter" ), 5 .);
180- if (colContainsLowPtEtaPrime)
181- mHistManager .fill (HIST (" Event/hCollisionCounter" ), 6 .);
182- if (colContainsHighPtEtaPrime)
183- mHistManager .fill (HIST (" Event/hCollisionCounter" ), 7 .);
184- tags (colContainsLowPtOmega, colContainsHighPtOmega, colContainsLowPtEtaPrime, colContainsHighPtEtaPrime);
185- }
94+ colContainsPCMOmega = colContainsEMCOmega = colContainsPCMEtaPrime = colContainsEMCEtaPrime = false ;
18695
187- bool isBCSelected (MyBCs::iterator const & bc, int nClusters, bool enoughTracks)
188- {
189- if (bc.alias_bit (kTVXinEMC ))
190- mHistManager .fill (HIST (" Event/hCollisionCounter" ), 1 .);
191- else if (bc.alias_bit (kEMC7 ) || bc.alias_bit (kEG1 ) || bc.alias_bit (kEG2 ) || bc.alias_bit (kDG1 ) || bc.alias_bit (kDG2 ) || bc.alias_bit (kEJ1 ) || bc.alias_bit (kEJ2 ) || bc.alias_bit (kDJ1 ) || bc.alias_bit (kDJ2 ))
192- mHistManager .fill (HIST (" Event/hCollisionCounter" ), 2 .);
193- else
194- return false ;
195- if (nClusters < 2 || !enoughTracks)
196- return false ;
197- mHistManager .fill (HIST (" Event/hCollisionCounter" ), 3 .);
96+ reconstructGGs (clustersInThisCollision, v0sInThisCollision, vGGs);
97+ processGGs (vGGs);
98+ reconstructHeavyNeutralMesons (tracks, vGGs, vHNMs);
99+ processHNMs (vHNMs);
198100
199- return true ;
101+ tags (colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime) ;
200102 }
201103
202- void processClusters (SelectedClusters const & clusters )
104+ void processGGs (std::vector<GammaGammaPair>& vGGs )
203105 {
204- for (const auto & cluster : clusters) {
205- mHistManager .fill (HIST (" Cluster/clusterE" ), cluster.energy ());
206- mHistManager .fill (HIST (" Cluster/clusterM02" ), cluster.m02 ());
207- mHistManager .fill (HIST (" Cluster/clusterTime" ), cluster.time ());
208- mPhotons .push_back (Photon (cluster.eta (), cluster.phi (), cluster.energy ()));
209- }
210- mHistManager .fill (HIST (" Event/nClusters" ), clusters.size ());
211- }
106+ int nGGsBeforeMassCuts = vGGs.size ();
107+ for (unsigned int iGG = 0 ; iGG < vGGs.size (); iGG++) {
108+ auto lightMeson = &vGGs.at (iGG);
109+
110+ if (lightMeson->reconstructionType == ReconstructionType::kPCM ) {
111+ mHistManager .fill (HIST (" GG/invMassVsPt_PCM" ), lightMeson->m (), lightMeson->pT ());
112+ } else if (lightMeson->reconstructionType == ReconstructionType::kEMC ) {
113+ mHistManager .fill (HIST (" GG/invMassVsPt_EMC" ), lightMeson->m (), lightMeson->pT ());
114+ } else {
115+ mHistManager .fill (HIST (" GG/invMassVsPt_PCMEMC" ), lightMeson->m (), lightMeson->pT ());
116+ }
212117
213- // / \brief Process light neutral meson candidates (pi0 or eta), calculate invariant mass and pT and fill histograms
214- void processGGs ()
215- {
216- // loop over all photon combinations and build meson candidates
217- for (unsigned int ig1 = 0 ; ig1 < mPhotons .size (); ++ig1) {
218- for (unsigned int ig2 = ig1 + 1 ; ig2 < mPhotons .size (); ++ig2) {
219- Meson lightMeson (mPhotons [ig1], mPhotons [ig2]); // build lightMeson from photons
220- mHistManager .fill (HIST (" GG/invMassVsPt" ), lightMeson.m (), lightMeson.pT ());
221- if (lightMeson.m () > massWindowOmega->get (" pi0_min" ) && lightMeson.m () < massWindowOmega->get (" pi0_max" ))
222- lightMeson.addMesonType (HeavyNeutralMeson::kPi0 );
223- else if (lightMeson.m () > massWindowEtaPrime->get (" eta_min" ) && lightMeson.m () < massWindowEtaPrime->get (" eta_max" ))
224- lightMeson.addMesonType (HeavyNeutralMeson::kEta );
225- else
226- continue ;
227- mGGs .push_back (lightMeson);
118+ if (lightMeson->m () > massWindowOmega->get (" pi0_min" ) && lightMeson->m () < massWindowOmega->get (" pi0_max" )) {
119+ lightMeson->isPi0 = true ;
120+ } else if (lightMeson->m () > massWindowEtaPrime->get (" eta_min" ) && lightMeson->m () < massWindowEtaPrime->get (" eta_max" )) {
121+ lightMeson->isEta = true ;
122+ } else {
123+ vGGs.erase (vGGs.begin () + iGG);
124+ iGG--;
228125 }
229126 }
230- mHistManager .fill (HIST (" Event/nGGs" ), mGGs .size ());
127+ mHistManager .fill (HIST (" Event/nGGs" ), nGGsBeforeMassCuts, vGGs .size ());
231128 }
232129
233- void processHeavyNeutralMesons (SelectedTracks const & tracks )
130+ void processHNMs (std::vector<HeavyNeutralMeson>& vHNMs )
234131 {
235- for (const auto & posTrack : tracks) {
236- if (!posTrack.isGlobalTrack () || posTrack.sign () < 0 )
237- continue ;
238- for (const auto & negTrack : tracks) {
239- if (!negTrack.isGlobalTrack () || negTrack.sign () > 0 )
240- continue ;
241- for (unsigned long iGG = 0 ; iGG < mGGs .size (); iGG++) {
242- Meson heavyNeutralMeson (mGGs .at (iGG), posTrack.energy (constants::physics::MassPiPlus) + negTrack.energy (constants::physics::MassPiPlus), posTrack.px () + negTrack.px (), posTrack.py () + negTrack.py (), posTrack.pz () + negTrack.pz ());
243- mHistManager .fill (HIST (" HeavyNeutralMeson/invMassVsPt" ), heavyNeutralMeson.m (), heavyNeutralMeson.pT ());
244- if (mGGs .at (iGG).hasMesonType (HeavyNeutralMeson::kPi0 ) && heavyNeutralMeson.m () > massWindowOmega->get (" omega_min" ) && heavyNeutralMeson.m () < massWindowOmega->get (" omega_max" )) {
245- if (minHNMPt->get (" omega_lowPt" ) < heavyNeutralMeson.pT ())
246- colContainsLowPtOmega = true ;
247- if (minHNMPt->get (" omega_highPt" ) < heavyNeutralMeson.pT ())
248- colContainsHighPtOmega = true ;
249- }
250- if (mGGs .at (iGG).hasMesonType (HeavyNeutralMeson::kEta ) && heavyNeutralMeson.m () > massWindowEtaPrime->get (" etaprime_min" ) && heavyNeutralMeson.m () < massWindowEtaPrime->get (" etaprime_max" )) {
251- if (minHNMPt->get (" etaPrime_lowPt" ) < heavyNeutralMeson.pT ())
252- colContainsLowPtEtaPrime = true ;
253- if (minHNMPt->get (" etaPrime_highPt" ) < heavyNeutralMeson.pT ())
254- colContainsHighPtEtaPrime = true ;
255- }
256- }
132+ int nHNMsBeforeMassCuts = vHNMs.size ();
133+ for (unsigned int iHNM = 0 ; iHNM < vHNMs.size (); iHNM++) {
134+ auto heavyNeutralMeson = vHNMs.at (iHNM);
135+
136+ float massHNM = heavyNeutralMeson.m (cfgHNMMassCorrection);
137+ if (heavyNeutralMeson.gg ->reconstructionType == ReconstructionType::kPCM ) {
138+ mHistManager .fill (HIST (" HeavyNeutralMeson/invMassVsPt_PCM" ), massHNM, heavyNeutralMeson.pT ());
139+ } else if (heavyNeutralMeson.gg ->reconstructionType == ReconstructionType::kEMC ) {
140+ mHistManager .fill (HIST (" HeavyNeutralMeson/invMassVsPt_EMC" ), massHNM, heavyNeutralMeson.pT ());
141+ } else {
142+ mHistManager .fill (HIST (" HeavyNeutralMeson/invMassVsPt_PCMEMC" ), massHNM, heavyNeutralMeson.pT ());
143+ }
144+
145+ if (heavyNeutralMeson.gg ->isPi0 && massHNM > massWindowOmega->get (" omega_min" ) && massHNM < massWindowOmega->get (" omega_max" )) {
146+ if (heavyNeutralMeson.gg ->reconstructionType == ReconstructionType::kPCM )
147+ colContainsPCMOmega = true ;
148+ else if (heavyNeutralMeson.gg ->reconstructionType == ReconstructionType::kEMC )
149+ colContainsEMCOmega = true ;
150+ } else if (heavyNeutralMeson.gg ->isEta && massHNM > massWindowEtaPrime->get (" etaprime_min" ) && massHNM < massWindowEtaPrime->get (" etaprime_max" )) {
151+ if (heavyNeutralMeson.gg ->reconstructionType == ReconstructionType::kPCM )
152+ colContainsPCMEtaPrime = true ;
153+ else if (heavyNeutralMeson.gg ->reconstructionType == ReconstructionType::kEMC )
154+ colContainsEMCEtaPrime = true ;
155+ } else {
156+ vHNMs.erase (vHNMs.begin () + iHNM);
157+ iHNM--;
257158 }
258159 }
160+ mHistManager .fill (HIST (" Event/nHeavyNeutralMesons" ), nHNMsBeforeMassCuts, vHNMs.size ());
161+
162+ if (colContainsPCMOmega)
163+ mHistManager .fill (HIST (" Event/hCollisionCounter" ), 4 .);
164+ if (colContainsEMCOmega)
165+ mHistManager .fill (HIST (" Event/hCollisionCounter" ), 5 .);
166+ if (colContainsPCMEtaPrime)
167+ mHistManager .fill (HIST (" Event/hCollisionCounter" ), 6 .);
168+ if (colContainsEMCEtaPrime)
169+ mHistManager .fill (HIST (" Event/hCollisionCounter" ), 7 .);
259170 }
260171};
261172
0 commit comments