Skip to content

Commit 0c64db8

Browse files
Cristian-MoscatelliCristian Moscatelli
andauthored
[PWGLF] Change Generated Event selection in NucleiSpectra.cxx (#15158)
Co-authored-by: Cristian Moscatelli <cmoscate@gr3srv.ts.infn.it>
1 parent 30a9baf commit 0c64db8

File tree

2 files changed

+104
-4
lines changed

2 files changed

+104
-4
lines changed

PWGLF/DataModel/LFSlimNucleiTables.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ DECLARE_SOA_COLUMN(MotherPDGcode, MotherpdgCode, int);
5555
DECLARE_SOA_COLUMN(MotherDecRad, motherDecRad, float);
5656
DECLARE_SOA_COLUMN(AbsoDecL, absoDecL, float);
5757
DECLARE_SOA_COLUMN(McProcess, mcProcess, uint64_t);
58+
DECLARE_SOA_COLUMN(gEventMask, genEventMask, uint8_t);
5859

5960
DECLARE_SOA_COLUMN(NsigmaTpc, nsigmaTpc, uint8_t);
6061
DECLARE_SOA_COLUMN(NsigmaTof, nsigmaTof, uint8_t);
@@ -206,6 +207,40 @@ DECLARE_SOA_TABLE(NucleiTableRed, "AOD", "NUCLEITABLERED",
206207
NucleiTableNS::PDGcode,
207208
NucleiTableNS::MotherPDGcode);
208209

210+
// Table for keeping track of selection of generated events
211+
DECLARE_SOA_TABLE(GenEventMCSel, "AOD", "GENEVENTMCSEL",
212+
NucleiTableNS::gEventMask);
213+
214+
DECLARE_SOA_TABLE(NucleiTableMCExtension, "AOD", "NUCTABLEMCSEL",
215+
NucleiTableNS::Pt,
216+
NucleiTableNS::Eta,
217+
NucleiTableNS::Phi,
218+
NucleiTableNS::TPCInnerParam,
219+
NucleiTableNS::Beta,
220+
NucleiTableNS::Zvertex,
221+
NucleiTableNS::NContrib,
222+
NucleiTableNS::DCAxy,
223+
NucleiTableNS::DCAz,
224+
NucleiTableNS::TPCsignal,
225+
NucleiTableNS::ITSchi2,
226+
NucleiTableNS::TPCchi2,
227+
NucleiTableNS::TOFchi2,
228+
NucleiTableNS::Flags,
229+
NucleiTableNS::TPCfindableCls,
230+
NucleiTableNS::TPCcrossedRows,
231+
NucleiTableNS::ITSclsMap,
232+
NucleiTableNS::TPCnCls,
233+
NucleiTableNS::TPCnClsShared,
234+
NucleiTableNS::ITSclusterSizes,
235+
NucleiTableNS::SurvivedEventSelection,
236+
NucleiTableNS::gPt,
237+
NucleiTableNS::gEta,
238+
NucleiTableNS::gPhi,
239+
NucleiTableNS::PDGcode,
240+
NucleiTableNS::MotherPDGcode,
241+
NucleiTableNS::MotherDecRad,
242+
NucleiTableNS::AbsoDecL,
243+
NucleiTableNS::gEventMask);
209244
// Extended table with central PID information
210245
DECLARE_SOA_TABLE(NucleiTableExt, "AOD", "NUCLEITABLEEXT",
211246
NucleiTableNS::NsigmaTpc,

PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "PWGLF/DataModel/EPCalibrationTables.h"
2323
#include "PWGLF/DataModel/LFSlimNucleiTables.h"
24+
#include "PWGLF/Utils/inelGt.h"
2425

2526
#include "Common/Core/EventPlaneHelper.h"
2627
#include "Common/Core/PID/PIDTOF.h"
@@ -52,8 +53,10 @@
5253
#include "ReconstructionDataFormats/Track.h"
5354

5455
#include <Math/Vector4D.h>
56+
#include <TDatabasePDG.h>
5557
#include <TMCProcess.h>
5658
#include <TPDGCode.h> // for PDG codes
59+
#include <TParticlePDG.h>
5760
#include <TRandom3.h>
5861

5962
#include <algorithm>
@@ -248,6 +251,13 @@ constexpr int EvSelDefault[9][1]{
248251
{0},
249252
{0},
250253
{0}};
254+
255+
enum EvGenSel : uint8_t {
256+
kGenTVX = 1 << 0,
257+
kGenZvtx = 1 << 1,
258+
kGenINELgt0 = 1 << 2,
259+
};
260+
251261
} // namespace nuclei
252262

253263
struct nucleiSpectra {
@@ -269,7 +279,9 @@ struct nucleiSpectra {
269279
Produces<o2::aod::NucleiTable> nucleiTable;
270280
Produces<o2::aod::NucleiPairTable> nucleiPairTable;
271281
Produces<o2::aod::NucleiTableMC> nucleiTableMC;
282+
Produces<o2::aod::NucleiTableMCExtension> nucleiTableMCExtension;
272283
Produces<o2::aod::NucleiTableFlow> nucleiTableFlow;
284+
Produces<o2::aod::GenEventMCSel> GenEventMCSel;
273285
Service<o2::ccdb::BasicCCDBManager> ccdb;
274286
Zorro zorro;
275287
OutputObj<ZorroSummary> zorroSummary{"zorroSummary"};
@@ -334,6 +346,7 @@ struct nucleiSpectra {
334346
ConfigurableAxis cfgNTPCClusBins{"cfgNTPCClusBins", {3, 89.5, 159.5}, "N TPC clusters binning"};
335347

336348
Configurable<bool> cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"};
349+
Configurable<std::string> cfgTriggerList{"cfgTriggerList", "fHe", "Trigger List"};
337350

338351
// running variables for track tuner
339352
o2::dataformats::DCA mDcaInfoCov;
@@ -453,7 +466,7 @@ struct nucleiSpectra {
453466
return;
454467
}
455468
if (cfgSkimmedProcessing) {
456-
zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fHe");
469+
zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), cfgTriggerList);
457470
zorro.populateHistRegistry(spectra, bc.runNumber());
458471
}
459472
auto timestamp = bc.timestamp();
@@ -911,13 +924,64 @@ struct nucleiSpectra {
911924
PROCESS_SWITCH(nucleiSpectra, processDataFlowAlternative, "Data analysis with flow - alternative framework", false);
912925

913926
Preslice<TrackCandidates> tracksPerCollisions = aod::track::collisionId;
927+
Preslice<aod::McParticles> particlesPerMcCollision = aod::mcparticle::mcCollisionId;
914928
void processMC(soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels> const& collisions, aod::McCollisions const& mcCollisions, soa::Join<TrackCandidates, aod::McTrackLabels> const& tracks, aod::McParticles const& particlesMC, aod::BCsWithTimestamps const&)
915929
{
916930
nuclei::candidates.clear();
931+
932+
bool selectINELgt0 = cfgEventSelections->get(nuclei::evSel::kINELgt0);
933+
std::vector<bool> goodCollisions(mcCollisions.size(), false);
934+
std::vector<uint8_t> eventMask(mcCollisions.size(), 0);
935+
936+
auto* pdgDB = TDatabasePDG::Instance(); // Useful for evaluating the particle charge
937+
917938
for (const auto& c : mcCollisions) {
939+
940+
uint8_t mask = 0;
941+
942+
const auto& slicedParticles = particlesMC.sliceBy(particlesPerMcCollision, c.globalIndex());
943+
944+
bool hasHitFT0A(false);
945+
bool hasHitFT0C(false);
946+
947+
// TVX trigger
948+
for (const auto& p : slicedParticles) {
949+
if (!p.isPhysicalPrimary())
950+
continue;
951+
952+
auto* pdg = pdgDB->GetParticle(p.pdgCode());
953+
if (!pdg || pdg->Charge() == 0)
954+
continue;
955+
956+
// Apply the TVX trigger condition
957+
if (p.eta() > 3.5f && p.eta() < 4.9f)
958+
hasHitFT0A = true;
959+
else if (p.eta() > -3.3f && p.eta() < -2.1f)
960+
hasHitFT0C = true;
961+
962+
if (hasHitFT0A && hasHitFT0C)
963+
break;
964+
}
965+
966+
if (hasHitFT0A && hasHitFT0C)
967+
mask |= nuclei::kGenTVX;
968+
969+
// |z| condition
970+
if (std::abs(c.posZ()) < cfgCutVertex)
971+
mask |= nuclei::kGenZvtx;
972+
973+
// INEL > 0 selection
974+
if (selectINELgt0) {
975+
if (o2::pwglf::isINELgt0mc(slicedParticles, pdgDB)) {
976+
mask |= nuclei::kGenINELgt0;
977+
}
978+
}
979+
980+
eventMask[c.globalIndex()] = mask;
981+
GenEventMCSel(mask);
918982
spectra.fill(HIST("hGenVtxZ"), c.posZ());
919983
}
920-
std::vector<bool> goodCollisions(mcCollisions.size(), false);
984+
921985
for (const auto& collision : collisions) {
922986
if (!eventSelectionWithHisto(collision)) {
923987
continue;
@@ -926,6 +990,7 @@ struct nucleiSpectra {
926990
const auto& slicedTracks = tracks.sliceBy(tracksPerCollisions, collision.globalIndex());
927991
fillDataInfo(collision, slicedTracks);
928992
}
993+
929994
std::vector<bool> isReconstructed(particlesMC.size(), false);
930995
for (auto& c : nuclei::candidates) {
931996
auto label = tracks.iteratorAt(c.globalIndex);
@@ -987,7 +1052,7 @@ struct nucleiSpectra {
9871052

9881053
isReconstructed[particle.globalIndex()] = true;
9891054
float absoDecL = computeAbsoDecL(particle);
990-
nucleiTableMC(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.nContrib, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absoDecL);
1055+
nucleiTableMCExtension(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.nContrib, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absoDecL, eventMask[particle.mcCollisionId()]);
9911056
}
9921057

9931058
int index{0};
@@ -1039,7 +1104,7 @@ struct nucleiSpectra {
10391104
continue; // skip secondaries from material if not requested
10401105
}
10411106
float absDecL = computeAbsoDecL(particle);
1042-
nucleiTableMC(999., 999., 999., 0., 0., 999., -1, 999., 999., -1, -1, -1, -1, flags, 0, 0, 0, 0, 0, 0, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absDecL);
1107+
nucleiTableMCExtension(999., 999., 999., 0., 0., 999., -1, 999., 999., -1, -1, -1, -1, flags, 0, 0, 0, 0, 0, 0, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absDecL, eventMask[particle.mcCollisionId()]);
10431108
}
10441109
break;
10451110
}

0 commit comments

Comments
 (0)