|
55 | 55 | #include <TMCProcess.h> |
56 | 56 | #include <TPDGCode.h> // for PDG codes |
57 | 57 | #include <TRandom3.h> |
| 58 | +#include <TDatabasePDG.h> |
| 59 | +#include <TParticlePDG.h> |
58 | 60 |
|
59 | 61 | #include <algorithm> |
60 | 62 | #include <cmath> |
@@ -334,6 +336,7 @@ struct nucleiSpectra { |
334 | 336 | ConfigurableAxis cfgNTPCClusBins{"cfgNTPCClusBins", {3, 89.5, 159.5}, "N TPC clusters binning"}; |
335 | 337 |
|
336 | 338 | Configurable<bool> cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; |
| 339 | + Configurable<std::string> cfgTriggerList{"cfgTriggerList", "fHe", "Trigger List"}; |
337 | 340 |
|
338 | 341 | // running variables for track tuner |
339 | 342 | o2::dataformats::DCA mDcaInfoCov; |
@@ -453,7 +456,7 @@ struct nucleiSpectra { |
453 | 456 | return; |
454 | 457 | } |
455 | 458 | if (cfgSkimmedProcessing) { |
456 | | - zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fHe"); |
| 459 | + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), cfgTriggerList); |
457 | 460 | zorro.populateHistRegistry(spectra, bc.runNumber()); |
458 | 461 | } |
459 | 462 | auto timestamp = bc.timestamp(); |
@@ -911,21 +914,70 @@ struct nucleiSpectra { |
911 | 914 | PROCESS_SWITCH(nucleiSpectra, processDataFlowAlternative, "Data analysis with flow - alternative framework", false); |
912 | 915 |
|
913 | 916 | Preslice<TrackCandidates> tracksPerCollisions = aod::track::collisionId; |
| 917 | + Preslice<aod::McParticles> particlesPerMcCollision = aod::mcparticle::mcCollisionId; |
914 | 918 | 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&) |
915 | 919 | { |
916 | 920 | nuclei::candidates.clear(); |
| 921 | + |
| 922 | + bool selectINELgt0 = cfgEventSelections->get(nuclei::evSel::kINELgt0); |
| 923 | + std::vector<bool> goodCollisions(mcCollisions.size(), false); |
| 924 | + |
| 925 | + auto *pdgDB = TDatabasePDG::Instance(); // Useful for evaluating the particle charge |
| 926 | + |
917 | 927 | for (const auto& c : mcCollisions) { |
918 | | - spectra.fill(HIST("hGenVtxZ"), c.posZ()); |
| 928 | + |
| 929 | + // Apply the |z| < 10 cm condition |
| 930 | + if (std::abs(c.posZ()) > 10.f) |
| 931 | + continue; |
| 932 | + |
| 933 | + const auto& slicedParticles = particlesMC.sliceBy(particlesPerMcCollision, c.globalIndex()); |
| 934 | + |
| 935 | + bool hasHitFT0A(false); |
| 936 | + bool hasHitFT0C(false); |
| 937 | + bool acceptEvent = !selectINELgt0; |
| 938 | + |
| 939 | + for (const auto& p : slicedParticles) { |
| 940 | + if (!p.isPhysicalPrimary()) |
| 941 | + continue; |
| 942 | + |
| 943 | + // Apply the TVX trigger condition |
| 944 | + if (p.eta() > 3.5f && p.eta() < 4.9f) |
| 945 | + hasHitFT0A = true; |
| 946 | + else if (p.eta() > -3.3f && p.eta() < -2.1f) |
| 947 | + hasHitFT0C = true; |
| 948 | + |
| 949 | + // Apply the INEL>0 selection (only in case of active configurable) |
| 950 | + if (selectINELgt0 && !acceptEvent) { |
| 951 | + if (std::abs(p.eta()) < 1.0f) { |
| 952 | + auto* pdg = pdgDB->GetParticle(p.pdgCode()); |
| 953 | + if (pdg && pdg->Charge()!= 0) |
| 954 | + acceptEvent = true; |
| 955 | + } |
| 956 | + } |
| 957 | + |
| 958 | + if (hasHitFT0A && hasHitFT0C && acceptEvent) |
| 959 | + break; |
| 960 | + } |
| 961 | + |
| 962 | + if (hasHitFT0A && hasHitFT0C && acceptEvent) { |
| 963 | + goodCollisions[c.globalIndex()] = true; |
| 964 | + spectra.fill(HIST("hGenVtxZ"), c.posZ()); |
| 965 | + } |
919 | 966 | } |
920 | | - std::vector<bool> goodCollisions(mcCollisions.size(), false); |
| 967 | + |
921 | 968 | for (const auto& collision : collisions) { |
922 | 969 | if (!eventSelectionWithHisto(collision)) { |
923 | 970 | continue; |
924 | 971 | } |
925 | | - goodCollisions[collision.mcCollisionId()] = true; |
| 972 | + |
| 973 | + int mcId = collision.mcCollisionId(); |
| 974 | + if (mcId < 0) continue; |
| 975 | + if(!goodCollisions[mcId]) continue; |
| 976 | + |
926 | 977 | const auto& slicedTracks = tracks.sliceBy(tracksPerCollisions, collision.globalIndex()); |
927 | 978 | fillDataInfo(collision, slicedTracks); |
928 | 979 | } |
| 980 | + |
929 | 981 | std::vector<bool> isReconstructed(particlesMC.size(), false); |
930 | 982 | for (auto& c : nuclei::candidates) { |
931 | 983 | auto label = tracks.iteratorAt(c.globalIndex); |
|
0 commit comments