Skip to content

Commit 6d99ab7

Browse files
committed
Feat: add first part of MC processing
1 parent ef6e91f commit 6d99ab7

31 files changed

+1284
-946
lines changed

PWGCF/Femto/Core/cascadeBuilder.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,8 @@ class CascadeBuilder
379379
LOG(info) << "Initialization done...";
380380
}
381381

382-
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
383-
void fillCascades(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& cascadeProducts, T6 const& fullCascades, T7 const& fullTracks, T8& trackBuilder)
382+
template <modes::System system, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
383+
void fillCascades(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& cascadeProducts, T6 const& cascades, T7 const& tracks, T8 const& tracksWithItsPid, T9& trackBuilder)
384384
{
385385
if (!mFillAnyTable) {
386386
return;
@@ -389,18 +389,21 @@ class CascadeBuilder
389389
int64_t bachelorIndex = 0;
390390
int64_t posDaughterIndex = 0;
391391
int64_t negDaughterIndex = 0;
392-
for (const auto& cascade : fullCascades) {
392+
for (const auto& cascade : cascades) {
393393
if (!mCascadeSelection.checkFilters(cascade)) {
394394
continue;
395395
}
396-
mCascadeSelection.applySelections(cascade, fullTracks, col);
396+
mCascadeSelection.applySelections(cascade, tracks, col);
397397
if (!mCascadeSelection.passesAllRequiredSelections()) {
398398
continue;
399399
}
400400

401-
auto bachelor = cascade.template bachelor_as<T7>();
402-
auto posDaughter = cascade.template posTrack_as<T7>();
403-
auto negDaughter = cascade.template negTrack_as<T7>();
401+
// cleaner, but without ITS pid: auto bachelor = cascade.template bachelor_as<T7>();
402+
auto bachelor = tracksWithItsPid.iteratorAt(cascade.bachelorId() - tracksWithItsPid.offset());
403+
// cleaner, but without ITS pid: auto posDaughter = cascade.template posTrack_as<T7>();
404+
auto posDaughter = tracksWithItsPid.iteratorAt(cascade.posTrackId() - tracksWithItsPid.offset());
405+
// cleaner, but without ITS pid: auto negDaughter = cascade.template negTrack_as<T7>();
406+
auto negDaughter = tracksWithItsPid.iteratorAt(cascade.negTrackId() - tracksWithItsPid.offset());
404407

405408
collisionBuilder.template fillCollision<system>(collisionProducts, col);
406409

PWGCF/Femto/Core/cascadeHistManager.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -164,24 +164,24 @@ template <const char* cascadePrefix,
164164
const char* bachelorPrefix,
165165
const char* posDauPrefix,
166166
const char* negDauPrefix,
167-
modes::Mode mode,
168167
modes::Cascade cascade>
169168
class CascadeHistManager
170169
{
171170
public:
172171
CascadeHistManager() = default;
173172
~CascadeHistManager() = default;
174173

174+
template <modes::Mode mode>
175175
void init(o2::framework::HistogramRegistry* registry,
176176
std::map<CascadeHist, std::vector<o2::framework::AxisSpec>> const& cascadeSpecs,
177177
std::map<trackhistmanager::TrackHist, std::vector<o2::framework::AxisSpec>> const& BachelorSpecs,
178178
std::map<trackhistmanager::TrackHist, std::vector<o2::framework::AxisSpec>> const& PosDauSpecs,
179179
std::map<trackhistmanager::TrackHist, std::vector<o2::framework::AxisSpec>> const& NegDauSpecs)
180180
{
181181
mHistogramRegistry = registry;
182-
mBachelorManager.init(registry, BachelorSpecs);
183-
mPosDauManager.init(registry, PosDauSpecs);
184-
mNegDauManager.init(registry, NegDauSpecs);
182+
mBachelorManager.template init<mode>(registry, BachelorSpecs);
183+
mPosDauManager.template init<mode>(registry, PosDauSpecs);
184+
mNegDauManager.template init<mode>(registry, NegDauSpecs);
185185
if constexpr (modes::isFlagSet(mode, modes::Mode::kAnalysis)) {
186186
initAnalysis(cascadeSpecs);
187187
}
@@ -199,7 +199,7 @@ class CascadeHistManager
199199
mPlot2d = CascadeConfBinningQa.plot2d.value;
200200
}
201201

202-
template <typename T1, typename T2, typename T3, typename T4>
202+
template <modes::Mode mode, typename T1, typename T2, typename T3, typename T4>
203203
void init(o2::framework::HistogramRegistry* registry,
204204
std::map<CascadeHist, std::vector<o2::framework::AxisSpec>> const& cascadeSpecs,
205205
T1 const& CascadeConfBinningQa,
@@ -211,22 +211,22 @@ class CascadeHistManager
211211
T4 const& NegDauConfBinningQa)
212212
{
213213
enableOptionalHistograms(CascadeConfBinningQa, BachelorConfBinningQa, PosDauConfBinningQa, NegDauConfBinningQa);
214-
init(registry, cascadeSpecs, BachelorSpecs, PosDauSpecs, NegDauSpecs);
214+
this->template init<mode>(registry, cascadeSpecs, BachelorSpecs, PosDauSpecs, NegDauSpecs);
215215
}
216216

217-
template <typename T1, typename T2>
217+
template <modes::Mode mode, typename T1, typename T2>
218218
void fill(T1 const& cascadeCandidate, T2 const& tracks)
219219
{
220220
// this used to work, still under investigation
221221
// auto bachelor = cascadeCandidate.template bachelor_as<T2>();
222222
// auto posDaughter = cascadeCandidate.template posDau_as<T2>();
223223
// auto negDaughter = cascadeCandidate.template negDau_as<T2>();
224224
auto posDaughter = tracks.rawIteratorAt(cascadeCandidate.posDauId() - tracks.offset());
225-
mPosDauManager.fill(posDaughter, tracks);
225+
mPosDauManager.template fill<mode>(posDaughter, tracks);
226226
auto negDaughter = tracks.rawIteratorAt(cascadeCandidate.negDauId() - tracks.offset());
227-
mNegDauManager.fill(negDaughter, tracks);
227+
mNegDauManager.template fill<mode>(negDaughter, tracks);
228228
auto bachelor = tracks.rawIteratorAt(cascadeCandidate.bachelorId() - tracks.offset());
229-
mBachelorManager.fill(bachelor, tracks);
229+
mBachelorManager.template fill<mode>(bachelor, tracks);
230230

231231
if constexpr (modes::isFlagSet(mode, modes::Mode::kAnalysis)) {
232232
fillAnalysis(cascadeCandidate);
@@ -310,9 +310,9 @@ class CascadeHistManager
310310

311311
o2::framework::HistogramRegistry* mHistogramRegistry = nullptr;
312312
bool mPlot2d = true;
313-
trackhistmanager::TrackHistManager<bachelorPrefix, mode> mBachelorManager;
314-
trackhistmanager::TrackHistManager<posDauPrefix, mode> mPosDauManager;
315-
trackhistmanager::TrackHistManager<negDauPrefix, mode> mNegDauManager;
313+
trackhistmanager::TrackHistManager<bachelorPrefix> mBachelorManager;
314+
trackhistmanager::TrackHistManager<posDauPrefix> mPosDauManager;
315+
trackhistmanager::TrackHistManager<negDauPrefix> mNegDauManager;
316316
};
317317
}; // namespace cascadehistmanager
318318
}; // namespace o2::analysis::femto

PWGCF/Femto/Core/collisionBuilder.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ struct ConfCollisionFilters : o2::framework::ConfigurableGroup {
5959
o2::framework::Configurable<float> sphericityMax{"sphericityMax", 1.f, "Maximum sphericity"};
6060
o2::framework::Configurable<int> magFieldMin{"magFieldMin", -5, "Minimum magnetic field strength (kG)"};
6161
o2::framework::Configurable<int> magFieldMax{"magFieldMax", 5, "Maximum magnetic field strength (kG)"};
62+
o2::framework::Configurable<int> subGeneratorId{"subGeneratorId", 0, "MC ONLY: If positive, keep 0 = MB, <0 triggered on something"};
6263
};
6364

6465
struct ConfCollisionBits : o2::framework::ConfigurableGroup {
@@ -390,6 +391,7 @@ class CollisionBuilder
390391
mRctFlagsChecker.init(confRct.label.value, confRct.useZdc.value, confRct.treatLimitedAcceptanceAsBad.value);
391392
}
392393
mGrpPath = confCcdb.grpPath.value;
394+
mSubGeneratorId = confFilter.subGeneratorId.value;
393395

394396
mCollisionSelection.configure(registry, confFilter, confBits);
395397
mCollisionSelection.printSelections(colSelsName);
@@ -439,6 +441,28 @@ class CollisionBuilder
439441
mCollisionSelection.passesAllRequiredSelections();
440442
}
441443

444+
template <typename T1, typename T2>
445+
bool checkCollision(T1 const& col, T2 const& /*mcCols*/)
446+
{
447+
// check sub generator id of associated generated collision
448+
if (mSubGeneratorId >= 0) {
449+
if (col.has_mcCollision()) {
450+
auto mcCol = col.template mcCollision_as<T2>();
451+
if (mcCol.getSubGeneratorId() != mSubGeneratorId) {
452+
return false;
453+
}
454+
}
455+
}
456+
457+
// check RCT flags first
458+
if (mUseRctFlags && !mRctFlagsChecker(col)) {
459+
return false;
460+
}
461+
// make other checks
462+
return mCollisionSelection.checkFilters(col) &&
463+
mCollisionSelection.passesAllRequiredSelections();
464+
}
465+
442466
template <modes::System system, typename T1, typename T2>
443467
void fillCollision(T1& collisionProducts, T2 const& col)
444468
{
@@ -518,6 +542,7 @@ class CollisionBuilder
518542
aod::rctsel::RCTFlagsChecker mRctFlagsChecker;
519543
bool mUseRctFlags = false;
520544
std::string mTriggerNames = std::string("");
545+
int mSubGeneratorId = -1;
521546
bool mFillAnyTable = false;
522547
bool mProducedCollisions = false;
523548
bool mProducedCollisionMasks = false;

PWGCF/Femto/Core/collisionHistManager.h

Lines changed: 85 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,60 +51,89 @@ enum ColHist {
5151
kCentVsMult,
5252
kCentVsSphericity,
5353
kMultVsSphericity,
54+
// mc
55+
kMcCent,
56+
kMcMult,
5457
kColHistLast
5558
};
5659

5760
constexpr std::string_view ColAnalysisDir = "Collisions/Analysis/";
5861
constexpr std::string_view ColQaDir = "Collisions/QA/";
62+
constexpr std::string_view ColMcDir = "Collisions/MC/";
5963

6064
constexpr std::array<histmanager::HistInfo<ColHist>, kColHistLast> HistTable = {
6165
{
6266
{kPosZ, o2::framework::kTH1F, "hPosZ", "Vertex Z; V_{Z} (cm); Entries"},
6367
{kMult, o2::framework::kTH1F, "hMult", "Multiplicity; Multiplicity; Entries"},
6468
{kCent, o2::framework::kTH1F, "hCent", "Centrality; Centrality (%); Entries"},
6569
{kMagField, o2::framework::kTH1F, "hMagField", "Magnetic Field; B (kG); Entries"},
70+
// qa
6671
{kPosX, o2::framework::kTH1F, "hPosX", "Vertex X; V_{X} (cm); Entries"},
67-
{kPosY, o2::framework::kTH1F, "hPosY", "Vertex Z; V_{Y} (cm); Entries"},
72+
{kPosY, o2::framework::kTH1F, "hPosY", "Vertex Y; V_{Y} (cm); Entries"},
6873
{kPos, o2::framework::kTH1F, "hPos", "Primary vertex; V_{pos} (cm); Entries"},
6974
{kSphericity, o2::framework::kTH1F, "hSphericity", "Sphericity; Sphericity; Entries"},
7075
{kOccupancy, o2::framework::kTH1F, "hOccupancy", "Occupancy; Occupancy; Entries"},
76+
// 2d
7177
{kPoszVsMult, o2::framework::kTH2F, "hPoszVsMult", "Vertex Z vs Multiplicity; V_{Z} (cm); Multiplicity"},
7278
{kPoszVsCent, o2::framework::kTH2F, "hPoszVsCent", "Vertex Z vs Centrality; V_{Z} (cm); Centrality (%)"},
7379
{kCentVsMult, o2::framework::kTH2F, "hCentVsMult", "Centrality vs Multiplicity; Centrality (%); Multiplicity"},
7480
{kMultVsSphericity, o2::framework::kTH2F, "hMultVsSphericity", "Multiplicity vs Sphericity; Multiplicity; Sphericity"},
7581
{kCentVsSphericity, o2::framework::kTH2F, "hCentVsSphericity", "Centrality vs Sphericity; Centrality (%); Sphericity"},
82+
// mc
83+
{kMcCent, o2::framework::kTH1F, "hMcCent", "Monte Carlo Centrality; Centrality (%); Entries"},
84+
{kMcMult, o2::framework::kTH1F, "hMcMult", "Monte Carlo Multiplicity; Multiplicity; Entries"},
7685
}};
7786

87+
#define COL_HIST_ANALYSIS_MAP(conf) \
88+
{kPosZ, {conf.vtxZ}}, \
89+
{kMult, {conf.mult}}, \
90+
{kCent, {conf.cent}}, \
91+
{kMagField, {conf.magField}},
92+
93+
#define COL_HIST_QA_MAP(confAnalysis, confQa) \
94+
{kPosX, {confQa.vtxXY}}, \
95+
{kPosY, {confQa.vtxXY}}, \
96+
{kPos, {confQa.vtx}}, \
97+
{kSphericity, {confQa.sphericity}}, \
98+
{kOccupancy, {confQa.occupancy}}, \
99+
{kPoszVsMult, {confAnalysis.vtxZ, confAnalysis.mult}}, \
100+
{kPoszVsCent, {confAnalysis.vtxZ, confAnalysis.cent}}, \
101+
{kCentVsMult, {confAnalysis.cent, confAnalysis.mult}}, \
102+
{kMultVsSphericity, {confAnalysis.mult, confQa.sphericity}}, \
103+
{kCentVsSphericity, {confBinningAnalysis.cent, confQa.sphericity}},
104+
105+
#define COL_HIST_MC_QA_MAP(conf) \
106+
{kMcMult, {conf.mult}}, \
107+
{kMcCent, {conf.cent}},
108+
78109
template <typename T>
79110
auto makeColHistSpecMap(const T& confBinningAnalysis)
80111
{
81112
return std::map<ColHist, std::vector<framework::AxisSpec>>{
82-
{kPosZ, {confBinningAnalysis.vtxZ}},
83-
{kMult, {confBinningAnalysis.mult}},
84-
{kCent, {confBinningAnalysis.cent}},
85-
{kMagField, {confBinningAnalysis.magField}}};
113+
COL_HIST_ANALYSIS_MAP(confBinningAnalysis)};
86114
}
87115

88116
template <typename T1, typename T2>
89117
auto makeColQaHistSpecMap(const T1& confBinningAnalysis, const T2& confBinningQa)
90118
{
91119
return std::map<ColHist, std::vector<framework::AxisSpec>>{
92-
{kPosZ, {confBinningAnalysis.vtxZ}},
93-
{kMult, {confBinningAnalysis.mult}},
94-
{kCent, {confBinningAnalysis.cent}},
95-
{kMagField, {confBinningAnalysis.magField}},
96-
{kPosX, {confBinningQa.vtxXY}},
97-
{kPosY, {confBinningQa.vtxXY}},
98-
{kPos, {confBinningQa.vtx}},
99-
{kSphericity, {confBinningQa.sphericity}},
100-
{kOccupancy, {confBinningQa.occupancy}},
101-
{kPoszVsMult, {confBinningAnalysis.vtxZ, confBinningAnalysis.mult}},
102-
{kPoszVsCent, {confBinningAnalysis.vtxZ, confBinningAnalysis.cent}},
103-
{kCentVsMult, {confBinningAnalysis.cent, confBinningAnalysis.mult}},
104-
{kMultVsSphericity, {confBinningAnalysis.mult, confBinningQa.sphericity}},
105-
{kCentVsSphericity, {confBinningAnalysis.cent, confBinningQa.sphericity}}};
120+
COL_HIST_ANALYSIS_MAP(confBinningAnalysis)
121+
COL_HIST_QA_MAP(confBinningAnalysis, confBinningQa)};
122+
}
123+
124+
template <typename T1, typename T2>
125+
auto makeColMcQaHistSpecMap(const T1& confBinningAnalysis, const T2& confBinningQa)
126+
{
127+
return std::map<ColHist, std::vector<framework::AxisSpec>>{
128+
COL_HIST_ANALYSIS_MAP(confBinningAnalysis)
129+
COL_HIST_QA_MAP(confBinningAnalysis, confBinningQa)
130+
COL_HIST_MC_QA_MAP(confBinningAnalysis)};
106131
}
107132

133+
#undef COL_HIST_ANALYSIS_MAP
134+
#undef COL_HIST_QA_MAP
135+
#undef COL_HIST_MC_QA_MAP
136+
108137
struct ConfCollisionBinning : o2::framework::ConfigurableGroup {
109138
std::string prefix = std::string("CollisionBinning");
110139
o2::framework::ConfigurableAxis vtxZ{"vtxZ", {200, -10, 10}, "Vertex Z binning"};
@@ -122,14 +151,13 @@ struct ConfCollisionQaBinning : o2::framework::ConfigurableGroup {
122151
o2::framework::ConfigurableAxis occupancy{"occupancy", {500, 0.f, 5000.f}, "Spericity Binning"};
123152
};
124153

125-
template <modes::Mode mode>
126154
class CollisionHistManager
127155
{
128156
public:
129157
CollisionHistManager() = default;
130158
~CollisionHistManager() = default;
131-
/// Initializes histograms for the task
132-
/// \param registry Histogram registry to be passed
159+
160+
template <modes::Mode mode>
133161
void init(o2::framework::HistogramRegistry* registry, std::map<ColHist, std::vector<o2::framework::AxisSpec>> const& Specs)
134162
{
135163
mHistogramRegistry = registry;
@@ -139,6 +167,9 @@ class CollisionHistManager
139167
if constexpr (isFlagSet(mode, modes::Mode::kQa)) {
140168
initQa(Specs);
141169
}
170+
if constexpr (isFlagSet(mode, modes::Mode::kMc)) {
171+
initMc(Specs);
172+
}
142173
}
143174

144175
template <typename T>
@@ -147,14 +178,14 @@ class CollisionHistManager
147178
mPlot2d = ConfBinningQa.plot2d.value;
148179
}
149180

150-
template <typename T>
181+
template <modes::Mode mode, typename T>
151182
void init(o2::framework::HistogramRegistry* registry, std::map<ColHist, std::vector<o2::framework::AxisSpec>> const& Specs, T const& ConfBinningQa)
152183
{
153184
enableOptionalHistograms(ConfBinningQa);
154-
init(registry, Specs);
185+
this->template init<mode>(registry, Specs);
155186
}
156187

157-
template <typename T>
188+
template <modes::Mode mode, typename T>
158189
void fill(T const& col)
159190
{
160191
if constexpr (isFlagSet(mode, modes::Mode::kAnalysis)) {
@@ -165,6 +196,20 @@ class CollisionHistManager
165196
}
166197
}
167198

199+
template <modes::Mode mode, typename T1, typename T2>
200+
void fill(T1 const& col, T2 const& mcCols)
201+
{
202+
if constexpr (isFlagSet(mode, modes::Mode::kAnalysis)) {
203+
fillAnalysis(col);
204+
}
205+
if constexpr (isFlagSet(mode, modes::Mode::kQa)) {
206+
fillQa(col);
207+
}
208+
if constexpr (isFlagSet(mode, modes::Mode::kMc)) {
209+
fillMc(col, mcCols);
210+
}
211+
}
212+
168213
private:
169214
void initAnalysis(std::map<ColHist, std::vector<o2::framework::AxisSpec>> const& Specs)
170215
{
@@ -192,6 +237,13 @@ class CollisionHistManager
192237
}
193238
}
194239

240+
void initMc(std::map<ColHist, std::vector<o2::framework::AxisSpec>> const& Specs)
241+
{
242+
std::string mcDir = std::string(ColMcDir);
243+
mHistogramRegistry->add(mcDir + getHistNameV2(kMcMult, HistTable), getHistDesc(kMcMult, HistTable), getHistType(kMcMult, HistTable), {Specs.at(kMcMult)});
244+
mHistogramRegistry->add(mcDir + getHistNameV2(kMcCent, HistTable), getHistDesc(kMcCent, HistTable), getHistType(kMcCent, HistTable), {Specs.at(kMcCent)});
245+
}
246+
195247
template <typename T>
196248
void fillAnalysis(T const& col)
197249
{
@@ -218,6 +270,14 @@ class CollisionHistManager
218270
}
219271
}
220272

273+
template <typename T1, typename T2>
274+
void fillMc(T1 const& col, T2 const& /*mcCols*/)
275+
{
276+
auto genCol = col.template fMcCol_as<T2>();
277+
mHistogramRegistry->fill(HIST(ColMcDir) + HIST(getHistName(kMcMult, HistTable)), genCol.multMc());
278+
mHistogramRegistry->fill(HIST(ColMcDir) + HIST(getHistName(kMcCent, HistTable)), genCol.centMc());
279+
}
280+
221281
o2::framework::HistogramRegistry* mHistogramRegistry = nullptr;
222282
bool mPlot2d = true;
223283
}; // namespace femtounitedcolhistmanager

PWGCF/Femto/Core/femtoUtils.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,12 @@ using HasMass = decltype(std::declval<T&>().mass());
207207
template <typename T>
208208
using HasSign = decltype(std::declval<T&>().sign());
209209

210+
template <typename T>
211+
inline int signum(T x)
212+
{
213+
return (T(0) < x) - (x < T(0)); // works for floats too
214+
}
215+
210216
}; // namespace utils
211217
}; // namespace o2::analysis::femto
212218
#endif // PWGCF_FEMTO_CORE_FEMTOUTILS_H_

0 commit comments

Comments
 (0)