Skip to content

Commit be39bdd

Browse files
Add MC reco analysis (AliceO2Group#814)
* Add MC reco analysis * Minor formatting fixes
1 parent 82bd163 commit be39bdd

3 files changed

Lines changed: 151 additions & 85 deletions

File tree

PWGLF/DataModel/LFNucleiTables.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,21 @@ DECLARE_SOA_COLUMN(DCAz, dcaz, float);
7272
DECLARE_SOA_COLUMN(TPCInnerParam, tpcInnerParam, float);
7373
DECLARE_SOA_COLUMN(TPCSignal, tpcSignal, float);
7474
DECLARE_SOA_COLUMN(Beta, beta, float);
75-
//TPC and ITS QA
75+
// TPC and ITS QA
7676
DECLARE_SOA_COLUMN(NcrTPC, ncrTPC, int);
7777
DECLARE_SOA_COLUMN(RTPC, rTPC, float);
7878
DECLARE_SOA_COLUMN(Chi2TPC, chi2TPC, float);
7979
DECLARE_SOA_COLUMN(Chi2ITS, chi2ITS, float);
8080
} // namespace full
8181

82+
/*
83+
namespace fullMC
84+
{
85+
DECLARE_SOA_INDEX_COLUMN(LfCandNucleusFullEvent, lfCandNucleusFullEvent);
86+
DECLARE_SOA_COLUMN(PdgCode, pdgCode, int);
87+
}
88+
*/
89+
8290
DECLARE_SOA_TABLE(LfCandNucleusFull, "AOD", "LFNUCL",
8391
o2::soa::Index<>,
8492
full::LfCandNucleusFullEventId,
@@ -104,6 +112,8 @@ DECLARE_SOA_TABLE(LfCandNucleusFull, "AOD", "LFNUCL",
104112
full::RTPC,
105113
full::Chi2TPC,
106114
full::Chi2ITS);
115+
DECLARE_SOA_TABLE(LfCandNucleusMC, "AOD", "LFNUCLMC",
116+
mcparticle::PdgCode);
107117

108118
} // namespace o2::aod
109119
#endif

PWGLF/TableProducer/LFTreeCreatorNuclei.cxx

Lines changed: 90 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -48,82 +48,118 @@ using namespace o2::framework::expressions;
4848
struct LfTreeCreatorNuclei {
4949
Produces<o2::aod::LfCandNucleusFull> rowCandidateFull;
5050
Produces<o2::aod::LfCandNucleusFullEvents> rowCandidateFullEvents;
51+
Produces<o2::aod::LfCandNucleusMC> rowCandidateMC;
5152

5253
void init(o2::framework::InitContext&)
5354
{
5455
}
5556

56-
//track
57+
// track
5758
Configurable<float> yMin{"yMin", -0.5, "Maximum rapidity"};
5859
Configurable<float> yMax{"yMax", 0.5, "Minimum rapidity"};
5960
Configurable<float> cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"};
6061
Configurable<float> cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"};
6162
Configurable<float> cfgCutEta{"cfgCutEta", 0.8f, "Eta range for tracks"};
6263
Configurable<float> nsigmacutLow{"nsigmacutLow", -8.0, "Value of the Nsigma cut"};
6364
Configurable<float> nsigmacutHigh{"nsigmacutHigh", +8.0, "Value of the Nsigma cut"};
64-
//events
65+
// events
6566
Configurable<float> cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"};
6667
Configurable<bool> useEvsel{"useEvsel", true, "Use sel8 for run3 Event Selection"};
6768

6869
Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex;
6970
Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (requireGlobalTrackInFilter());
7071
Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz);
71-
using TrackCandidates = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksExtended, aod::TrackSelection,
72-
aod::pidTOFbeta, aod::TOFSignal,
73-
aod::pidTPCFullPi, aod::pidTOFFullPi,
74-
aod::pidTPCFullKa, aod::pidTOFFullKa,
75-
aod::pidTPCFullPr, aod::pidTOFFullPr,
76-
aod::pidTPCFullDe, aod::pidTOFFullDe,
77-
aod::pidTPCFullHe, aod::pidTOFFullHe>>;
78-
79-
void process(soa::Filtered<soa::Join<aod::Collisions,
80-
aod::EvSels, aod::Mults>>::iterator const& collision,
81-
TrackCandidates const& tracks,
82-
aod::BCs const&)
72+
using TrackCandidates = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksExtended, aod::TrackSelection,
73+
aod::pidTOFbeta, aod::TOFSignal,
74+
aod::pidTPCFullPi, aod::pidTOFFullPi,
75+
aod::pidTPCFullKa, aod::pidTOFFullKa,
76+
aod::pidTPCFullPr, aod::pidTOFFullPr,
77+
aod::pidTPCFullDe, aod::pidTOFFullDe,
78+
aod::pidTPCFullHe, aod::pidTOFFullHe>;
79+
int nevs = 0;
80+
void process(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Mults>> const& collisions,
81+
soa::Filtered<TrackCandidates> const& tracks, aod::BCs const&)
8382
{
84-
if (useEvsel && !collision.sel8()) {
85-
return;
86-
}
87-
// Filling event properties
88-
rowCandidateFullEvents(
89-
collision.bcId(),
90-
collision.numContrib(),
91-
collision.posX(),
92-
collision.posY(),
93-
collision.posZ(),
94-
collision.multFV0M(),
95-
collision.sel8(),
96-
collision.bc().runNumber());
83+
for (const auto& collision : collisions) {
84+
LOG(INFO) << "nevs=" << nevs++;
85+
if (useEvsel && !collision.sel8()) {
86+
return;
87+
}
88+
// std::cout<<"mc Z-vertex ====>"<<mcColl.posZ()<<std::endl;
89+
/*for(auto& mcCollItr : mcCollisions)
90+
{}*/
91+
// Filling event properties
92+
rowCandidateFullEvents(
93+
collision.bcId(),
94+
collision.numContrib(),
95+
collision.posX(),
96+
collision.posY(),
97+
collision.posZ(),
98+
collision.multFV0M(),
99+
collision.sel8(),
100+
collision.bc().runNumber());
97101

98-
// Filling candidate properties
99-
rowCandidateFull.reserve(tracks.size());
100-
for (auto& track : tracks) {
101-
rowCandidateFull(
102-
rowCandidateFullEvents.lastIndex(),
103-
track.dcaXY(),
104-
track.dcaZ(),
105-
track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr(),
106-
track.tpcNSigmaDe(), track.tpcNSigmaHe(),
107-
track.tofNSigmaPi(), track.tofNSigmaKa(), track.tofNSigmaPr(),
108-
track.tofNSigmaDe(), track.tofNSigmaHe(),
109-
track.hasTOF(),
110-
track.tpcInnerParam(),
111-
track.tpcSignal(),
112-
track.beta(),
113-
track.px(),
114-
track.py(),
115-
track.pz(),
116-
track.pt(),
117-
track.p(),
118-
track.eta(),
119-
track.phi(),
120-
track.sign(),
121-
track.tpcNClsCrossedRows(),
122-
track.tpcCrossedRowsOverFindableCls(),
123-
track.tpcChi2NCl(),
124-
track.itsChi2NCl());
102+
// Filling candidate properties
103+
const auto& tracksInCollision = tracks.sliceBy(aod::track::collisionId, collision.globalIndex());
104+
rowCandidateFull.reserve(tracksInCollision.size());
105+
for (auto& track : tracksInCollision) {
106+
// auto const& mcParticle = track.mcParticle();
107+
// std::cout<<"mc pdg code ====>"<<mcParticle.pdgCode()<<std::endl;
108+
// std::cout<<"mc physical primary ====>"<<mcParticle.isPhysicalPrimary()<<std::endl;
109+
// std::cout<<"eta-gen ====>"<<mcParticle.eta()<<" eta-reco"<<track.eta()<<std::endl;
110+
rowCandidateFull(
111+
rowCandidateFullEvents.lastIndex(),
112+
track.dcaXY(),
113+
track.dcaZ(),
114+
track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr(),
115+
track.tpcNSigmaDe(), track.tpcNSigmaHe(),
116+
track.tofNSigmaPi(), track.tofNSigmaKa(), track.tofNSigmaPr(),
117+
track.tofNSigmaDe(), track.tofNSigmaHe(),
118+
track.hasTOF(),
119+
track.tpcInnerParam(),
120+
track.tpcSignal(),
121+
track.beta(),
122+
track.px(),
123+
track.py(),
124+
track.pz(),
125+
track.pt(),
126+
track.p(),
127+
track.eta(),
128+
track.phi(),
129+
track.sign(),
130+
track.tpcNClsCrossedRows(),
131+
track.tpcCrossedRowsOverFindableCls(),
132+
track.tpcChi2NCl(),
133+
track.itsChi2NCl());
134+
}
135+
}
136+
}
137+
int nevsmc = 0;
138+
void processMC(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Mults, aod::McCollisionLabels>> const& collisions,
139+
soa::Filtered<soa::Join<TrackCandidates, aod::McTrackLabels>> const& tracks,
140+
aod::BCs const&, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles)
141+
{
142+
for (const auto& collision : collisions) {
143+
LOG(INFO) << "nevsmc=" << nevsmc++;
144+
if (useEvsel && !collision.sel8()) {
145+
return;
146+
}
147+
const auto& tracksInCollision = tracks.sliceBy(aod::track::collisionId, collision.globalIndex());
148+
rowCandidateMC.reserve(tracksInCollision.size());
149+
LOG(info) << tracks.size() << " " << tracksInCollision.size();
150+
for (const auto& track : tracksInCollision)
151+
// for(const auto& track: tracks)
152+
{
153+
if (track.has_mcParticle()) {
154+
const auto& particle = track.mcParticle();
155+
rowCandidateMC(particle.pdgCode());
156+
continue;
157+
}
158+
rowCandidateMC(0);
159+
}
125160
}
126161
}
162+
PROCESS_SWITCH(LfTreeCreatorNuclei, processMC, "process MC", true);
127163
};
128164

129165
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

PWGLF/Tasks/LFNucleiBATask.cxx

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ using namespace o2;
3535
using namespace o2::framework;
3636
using namespace o2::framework::expressions;
3737

38-
struct LFNucleiDeuteronTask {
38+
struct LFNucleiBATask {
3939
HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject};
4040
HistogramRegistry spectraGen{"spectraGen", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
4141

@@ -90,17 +90,18 @@ struct LFNucleiDeuteronTask {
9090

9191
// MC histograms
9292
AxisSpec ptAxis = {2000, 0.f, 20.f, "#it{p}_{T} (GeV/#it{c})"};
93-
spectraGen.add("histGenVetxZ", "PosZ generated events", HistType::kTH1F, {{2000, -20.f, 20.f, "Vertex Z (cm)"}});
94-
spectraGen.add("histGenPtPion", "generated particles", HistType::kTH1F, {ptAxis});
95-
spectraGen.add("histGenPtKaon", "generated particles", HistType::kTH1F, {ptAxis});
96-
spectraGen.add("histGenPtProton", "generated particles", HistType::kTH1F, {ptAxis});
97-
spectraGen.add("histGenPtD", "generated particles", HistType::kTH1F, {ptAxis});
98-
spectraGen.add("histGenPtantiD", "generated particles", HistType::kTH1F, {ptAxis});
99-
spectraGen.add("histGenPtHe", "generated particles", HistType::kTH1F, {ptAxis});
100-
spectraGen.add("histGenPtantiHe", "generated particles", HistType::kTH1F, {ptAxis});
93+
histos.add("spectraGen/histGenVetxZ", "PosZ generated events", HistType::kTH1F, {{2000, -20.f, 20.f, "Vertex Z (cm)"}});
94+
histos.add("spectraGen/histGenPtPion", "generated particles", HistType::kTH1F, {ptAxis});
95+
histos.add("spectraGen/histGenPtKaon", "generated particles", HistType::kTH1F, {ptAxis});
96+
histos.add("spectraGen/histGenPtProton", "generated particles", HistType::kTH1F, {ptAxis});
97+
histos.add("spectraGen/histGenPtD", "generated particles", HistType::kTH1F, {ptAxis});
98+
histos.add("spectraGen/histGenPtantiD", "generated particles", HistType::kTH1F, {ptAxis});
99+
histos.add("spectraGen/histGenPtHe", "generated particles", HistType::kTH1F, {ptAxis});
100+
histos.add("spectraGen/histGenPtantiHe", "generated particles", HistType::kTH1F, {ptAxis});
101101
}
102102

103-
void processData(o2::aod::LfCandNucleusFullEvents::iterator const& event, o2::aod::LfCandNucleusFull const& tracks)
103+
template <bool IsMC, typename CollisionType, typename TracksType>
104+
void fillHistograms(const CollisionType& event, const TracksType& tracks)
104105
{
105106
constexpr float fMassProton = 0.938272088f;
106107
constexpr float fMassDeuteron = 1.87561f;
@@ -173,55 +174,74 @@ struct LFNucleiDeuteronTask {
173174
if (std::abs(track.nsigTPC3He()) < nsigmaTPCcut)
174175
histos.fill(HIST("tracks/helium/h2TOFmass2HeliumVsPt"), massTOF * massTOF - fMassHelium * fMassHelium, track.pt());
175176
}
177+
if constexpr (IsMC) {
178+
track.pdgCode();
179+
}
176180
}
177-
// LOG(info)<<"Vertex Z ==="<<coll.posZ();
181+
}
182+
183+
void processData(o2::aod::LfCandNucleusFullEvents::iterator const& event,
184+
o2::aod::LfCandNucleusFull const& tracks)
185+
{
186+
fillHistograms<false>(event, tracks);
178187
} // CLOSING PROCESS DATA
188+
PROCESS_SWITCH(LFNucleiBATask, processData, "process data", true);
179189

180-
PROCESS_SWITCH(LFNucleiDeuteronTask, processData, "process data", true);
190+
void processMCReco(o2::aod::LfCandNucleusFullEvents::iterator const& event,
191+
soa::Join<o2::aod::LfCandNucleusFull, o2::aod::LfCandNucleusMC> const& tracks)
192+
{
193+
fillHistograms<true>(event, tracks);
194+
} // CLOSING PROCESS MC RECO
195+
PROCESS_SWITCH(LFNucleiBATask, processMCReco, "process mc reco", false);
181196
Int_t nCount = 0;
182197

183198
void processMCGen(aod::McCollision const& mcCollision, aod::McParticles_001& mcParticles)
184199
{
200+
constexpr int PDGPion = 211;
201+
constexpr int PDGKaon = 321;
202+
constexpr int PDGProton = 2212;
203+
constexpr int PDGDeuteron = 1000010020;
204+
constexpr int PDGHelium = 1000020030;
185205
nCount++;
186-
spectraGen.fill(HIST("histGenVetxZ"), mcCollision.posZ());
206+
histos.fill(HIST("spectraGen/histGenVetxZ"), mcCollision.posZ());
187207
for (auto& mcParticleGen : mcParticles) {
188208
if (abs(mcParticleGen.y()) > std::abs(etaCut)) {
189209
continue;
190210
}
191211

192-
if (std::abs(mcParticleGen.pdgCode()) == 211) {
193-
spectraGen.fill(HIST("histGenPtPion"), mcParticleGen.pt());
212+
if (std::abs(mcParticleGen.pdgCode()) == PDGPion) {
213+
histos.fill(HIST("spectraGen/histGenPtPion"), mcParticleGen.pt());
194214
}
195215

196-
if (std::abs(mcParticleGen.pdgCode()) == 321) {
197-
spectraGen.fill(HIST("histGenPtKaon"), mcParticleGen.pt());
216+
if (std::abs(mcParticleGen.pdgCode()) == PDGKaon) {
217+
histos.fill(HIST("spectraGen/histGenPtKaon"), mcParticleGen.pt());
198218
}
199219

200-
if (std::abs(mcParticleGen.pdgCode()) == 2212) {
201-
spectraGen.fill(HIST("histGenPtProton"), mcParticleGen.pt());
220+
if (std::abs(mcParticleGen.pdgCode()) == PDGProton) {
221+
histos.fill(HIST("spectraGen/histGenPtProton"), mcParticleGen.pt());
202222
}
203223

204-
if (mcParticleGen.pdgCode() == 1000010020) {
205-
spectraGen.fill(HIST("histGenPtD"), mcParticleGen.pt());
224+
if (mcParticleGen.pdgCode() == PDGDeuteron) {
225+
histos.fill(HIST("spectraGen/histGenPtD"), mcParticleGen.pt());
206226
}
207227

208-
if (mcParticleGen.pdgCode() == -1000010020) {
209-
spectraGen.fill(HIST("histGenPtantiD"), mcParticleGen.pt());
228+
if (mcParticleGen.pdgCode() == -PDGDeuteron) {
229+
histos.fill(HIST("spectraGen/histGenPtantiD"), mcParticleGen.pt());
210230
}
211231

212-
if (mcParticleGen.pdgCode() == 1000020030) {
213-
spectraGen.fill(HIST("histGenPtHe"), mcParticleGen.pt());
232+
if (mcParticleGen.pdgCode() == PDGHelium) {
233+
histos.fill(HIST("spectraGen/histGenPtHe"), mcParticleGen.pt());
214234
}
215235

216-
if (mcParticleGen.pdgCode() == -1000020030) {
217-
spectraGen.fill(HIST("histGenPtantiHe"), mcParticleGen.pt());
236+
if (mcParticleGen.pdgCode() == -PDGHelium) {
237+
histos.fill(HIST("spectraGen/histGenPtantiHe"), mcParticleGen.pt());
218238
}
219239
}
220-
}
221-
PROCESS_SWITCH(LFNucleiDeuteronTask, processMCGen, "process MC Generated", true);
240+
} // Close processMCGen
241+
PROCESS_SWITCH(LFNucleiBATask, processMCGen, "process MC Generated", true);
222242
};
223243

224244
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
225245
{
226-
return WorkflowSpec{adaptAnalysisTask<LFNucleiDeuteronTask>(cfgc)};
246+
return WorkflowSpec{adaptAnalysisTask<LFNucleiBATask>(cfgc)};
227247
}

0 commit comments

Comments
 (0)