@@ -54,13 +54,19 @@ struct FlowMc {
5454
5555 Configurable<float> minB{"minB", 0.0f, "min impact parameter"};
5656 Configurable<float> maxB{"maxB", 20.0f, "max impact parameter"};
57+ O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range")
58+ O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "Minimal pT for tracks")
59+ O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 1000.0f, "Maximal pT for tracks")
60+ O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks")
5761 O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights")
5862 O2_DEFINE_CONFIGURABLE(cfgCutPtRefMin, float, 0.2f, "Minimal pT for ref tracks")
5963 O2_DEFINE_CONFIGURABLE(cfgCutPtRefMax, float, 3.0f, "Maximal pT for ref tracks")
6064 O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks")
6165 O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks")
62- O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 70.0f, "minimum TPC clusters")
63- O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 6.0f, "minimum ITS clusters")
66+ O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 50.0f, "minimum TPC clusters")
67+ O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters")
68+ O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5f, "max chi2 per TPC clusters")
69+ O2_DEFINE_CONFIGURABLE(cfgCutTPCcrossedrows, float, 70.0f, "minimum TPC crossed rows")
6470 O2_DEFINE_CONFIGURABLE(cfgFlowAcceptance, std::string, "", "CCDB path to acceptance object")
6571 O2_DEFINE_CONFIGURABLE(cfgFlowEfficiency, std::string, "", "CCDB path to efficiency object")
6672 O2_DEFINE_CONFIGURABLE(cfgCentVsIPTruth, std::string, "", "CCDB path to centrality vs IP truth")
@@ -70,6 +76,10 @@ struct FlowMc {
7076 O2_DEFINE_CONFIGURABLE(cfgFlowCumulantNbootstrap, int, 30, "Number of subsamples")
7177 O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, false, "Use track density efficiency correction")
7278 O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrSlopeFactor, float, 1.0f, "A factor to scale the track density efficiency slope")
79+ O2_DEFINE_CONFIGURABLE(cfgRecoEvRejectMC, bool, false, "reject both MC and Reco events when reco do not pass")
80+ O2_DEFINE_CONFIGURABLE(cfgRecoEvSel8, bool, false, "require sel8 for reconstruction events")
81+ O2_DEFINE_CONFIGURABLE(cfgRecoEvkIsGoodITSLayersAll, bool, false, "require kIsGoodITSLayersAll for reconstruction events")
82+ O2_DEFINE_CONFIGURABLE(cfgRecoEvkNoSameBunchPileup, bool, false, "require kNoSameBunchPileup for reconstruction events")
7383 Configurable<std::vector<double>> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector<double>{0.6003720411, 0.6152630970, 0.6288860646, 0.6360694031, 0.6409494798, 0.6450540203, 0.6482117301, 0.6512592056, 0.6640008690, 0.6862631416, 0.7005738691, 0.7106567432, 0.7170728333}, "parameter 0 for track density efficiency correction"};
7484 Configurable<std::vector<double>> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector<double>{-1.007592e-05, -8.932635e-06, -9.114538e-06, -1.054818e-05, -1.220212e-05, -1.312304e-05, -1.376433e-05, -1.412813e-05, -1.289562e-05, -1.050065e-05, -8.635725e-06, -7.380821e-06, -6.201250e-06}, "parameter 1 for track density efficiency correction"};
7585 float maxEta = 0.8;
@@ -81,6 +91,18 @@ struct FlowMc {
8191
8292 ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f}, "pt axis"};
8393
94+ // Filter for MCcollisions
95+ Filter mccollisionFilter = nabs(aod::mccollision::posZ) < cfgCutVertex;
96+ using FilteredMcCollisions = soa::Filtered<aod::McCollisions>;
97+ // Filter for MCParticle
98+ Filter particleFilter = (nabs(aod::mcparticle::eta) < cfgCutEta) && (aod::mcparticle::pt > cfgCutPtMin) && (aod::mcparticle::pt < cfgCutPtMax);
99+ using FilteredMcParticles = soa::Filtered<soa::Join<aod::McParticles, aod::ParticlesToTracks>>;
100+ // Filter for reco tracks
101+ Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls);
102+ using FilteredTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, aod::TracksDCA, aod::McTrackLabels>>;
103+
104+ // using FilteredTracks = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TrackSelection>;
105+
84106 // Cent vs IP
85107 TH1D* mCentVsIPTruth = nullptr;
86108 bool centVsIPTruthLoaded = false;
@@ -98,7 +120,6 @@ struct FlowMc {
98120
99121 // Connect to ccdb
100122 Service<ccdb::BasicCCDBManager> ccdb;
101- Configurable<int64_t> ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"};
102123 Configurable<std::string> ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
103124
104125 OutputObj<GFWWeights> fWeights{GFWWeights("weights")};
@@ -110,10 +131,22 @@ struct FlowMc {
110131 std::vector<GFW::CorrConfig> corrconfigsTruth;
111132 std::vector<GFW::CorrConfig> corrconfigsReco;
112133 TRandom3* fRndm = new TRandom3(0);
134+ double epsilon = 1e-6;
113135
114136 void init(InitContext&)
115137 {
138+ ccdb->setURL(ccdbUrl.value);
139+ ccdb->setCaching(true);
140+ auto now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
141+ ccdb->setCreatedNotAfter(now);
142+
143+ const AxisSpec axisVertex{20, -10, 10, "Vtxz (cm)"};
144+ const AxisSpec axisEta{20, -1., 1., "#eta"};
145+ const AxisSpec axisCounter{1, 0, +1, ""};
116146 // QA histograms
147+ histos.add<TH1>("mcEventCounter", "Monte Carlo Truth EventCounter", HistType::kTH1F, {axisCounter});
148+ histos.add<TH1>("numberOfRecoCollisions", "numberOfRecoCollisions", HistType::kTH1F, {{10, -0.5f, 9.5f}});
149+ histos.add<TH1>("RecoEventCounter", "Reconstruction EventCounter", HistType::kTH1F, {axisCounter});
117150 histos.add<TH1>("hnTPCClu", "Number of found TPC clusters", HistType::kTH1D, {{100, 40, 180}});
118151 histos.add<TH1>("hnITSClu", "Number of found ITS clusters", HistType::kTH1D, {{100, 0, 20}});
119152 // pT histograms
@@ -156,7 +189,9 @@ struct FlowMc {
156189 histos.add<TH2>("hPtNchGeneratedLambda", "Reco production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch});
157190 histos.add<TH2>("hPtNchGlobalLambda", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch});
158191 histos.add<TH1>("hPtMCGen", "Monte Carlo Truth; pT (GeV/c);", {HistType::kTH1D, {axisPt}});
192+ histos.add<TH3>("hEtaPtVtxzMCGen", "Monte Carlo Truth; #eta; p_{T} (GeV/c); V_{z} (cm);", {HistType::kTH3D, {axisEta, axisPt, axisVertex}});
159193 histos.add<TH1>("hPtMCGlobal", "Monte Carlo Global; pT (GeV/c);", {HistType::kTH1D, {axisPt}});
194+ histos.add<TH3>("hEtaPtVtxzMCGlobal", "Monte Carlo Global; #eta; p_{T} (GeV/c); V_{z} (cm);", {HistType::kTH3D, {axisEta, axisPt, axisVertex}});
160195 histos.add<TH1>("hPhiWeightedTrDen", "corrected #phi distribution, considering track density", {HistType::kTH1D, {axisPhi}});
161196
162197 o2::framework::AxisSpec axis = axisPt;
@@ -318,9 +353,35 @@ struct FlowMc {
318353 }
319354 }
320355
321- using RecoTracks = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TrackSelection>;
356+ template <typename TCollision>
357+ bool eventSelected(TCollision collision)
358+ {
359+ if (std::fabs(collision.posZ()) > cfgCutVertex) {
360+ return 0;
361+ }
362+ if (cfgRecoEvSel8 && !collision.sel8()) {
363+ return 0;
364+ }
365+ if (cfgRecoEvkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) {
366+ // rejects collisions which are associated with the same "found-by-T0" bunch crossing
367+ // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof
368+ return 0;
369+ }
370+ if (cfgRecoEvkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) {
371+ // from Jan 9 2025 AOT meeting
372+ // cut time intervals with dead ITS staves
373+ return 0;
374+ }
375+ return 1;
376+ }
377+
378+ template <typename TTrack>
379+ bool trackSelected(TTrack track)
380+ {
381+ return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.tpcNClsCrossedRows() >= cfgCutTPCcrossedrows) && (track.itsNCls() >= cfgCutITSclu));
382+ }
322383
323- void process(aod::McCollision const& mcCollision, aod::BCsWithTimestamps const&, soa::Join<aod::McParticles , aod::ParticlesToTracks> const& mcParticles, RecoTracks const&)
384+ void process(FilteredMcCollisions::iterator const& mcCollision, aod::BCsWithTimestamps const&, soa::SmallGroups<soa:: Join<aod::McCollisionLabels , aod::Collisions, aod::EvSels>> const& collisions, FilteredMcParticles const& mcParticles, FilteredTracks const&)
324385 {
325386
326387 float imp = mcCollision.impactParameter();
@@ -337,6 +398,21 @@ struct FlowMc {
337398 auto bc = mcCollision.bc_as<aod::BCsWithTimestamps>();
338399 loadCorrections(bc.timestamp());
339400
401+ if (collisions.size() > -1) {
402+ histos.fill(HIST("mcEventCounter"), 0.5);
403+ histos.fill(HIST("numberOfRecoCollisions"), collisions.size()); // number of times coll was reco-ed
404+ if (cfgRecoEvRejectMC) {
405+ if (collisions.size() != 1) { // only pass those have one reconstruction event
406+ return;
407+ }
408+ for (auto const& collision : collisions) {
409+ if (!eventSelected(collision))
410+ return;
411+ }
412+ }
413+ histos.fill(HIST("RecoEventCounter"), 0.5);
414+ }
415+
340416 if (imp > minB && imp < maxB) {
341417 // event within range
342418 histos.fill(HIST("hImpactParameter"), imp);
@@ -363,9 +439,9 @@ struct FlowMc {
363439 if (std::fabs(mcParticle.eta()) > maxEta) // main acceptance
364440 continue;
365441 if (mcParticle.has_tracks()) {
366- auto const& tracks = mcParticle.tracks_as<RecoTracks >();
442+ auto const& tracks = mcParticle.tracks_as<FilteredTracks >();
367443 for (auto const& track : tracks) {
368- if (!(( track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu) )) {
444+ if (!trackSelected( track)) {
369445 continue;
370446 }
371447 if (cfgIsGlobalTrack && track.isGlobalTrack()) {
@@ -418,6 +494,7 @@ struct FlowMc {
418494 histos.fill(HIST("hBVsPtVsPhiGenerated"), imp, deltaPhi, mcParticle.pt());
419495 histos.fill(HIST("hPtNchGenerated"), mcParticle.pt(), nChGlobal);
420496 histos.fill(HIST("hPtMCGen"), mcParticle.pt());
497+ histos.fill(HIST("hEtaPtVtxzMCGen"), mcParticle.eta(), mcParticle.pt(), vtxz);
421498 if (pdgCode == PDG_t::kPiPlus)
422499 histos.fill(HIST("hPtNchGeneratedPion"), mcParticle.pt(), nChGlobal);
423500 if (pdgCode == PDG_t::kKPlus)
@@ -437,9 +514,9 @@ struct FlowMc {
437514 bool validITSTrack = false;
438515 bool validITSABTrack = false;
439516 if (mcParticle.has_tracks()) {
440- auto const& tracks = mcParticle.tracks_as<RecoTracks >();
517+ auto const& tracks = mcParticle.tracks_as<FilteredTracks >();
441518 for (auto const& track : tracks) {
442- if (!(( track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu) )) {
519+ if (!trackSelected( track)) {
443520 continue;
444521 }
445522 histos.fill(HIST("hnTPCClu"), track.tpcNClsFound());
@@ -456,10 +533,10 @@ struct FlowMc {
456533 if (track.hasTPC()) {
457534 validTPCTrack = true;
458535 }
459- if (track.hasITS() && track.itsChi2NCl() > -1e-6 ) {
536+ if (track.hasITS() && track.itsChi2NCl() > -1. * epsilon ) {
460537 validITSTrack = true;
461538 }
462- if (track.hasITS() && track.itsChi2NCl() < -1e-6 ) {
539+ if (track.hasITS() && track.itsChi2NCl() < -1. * epsilon ) {
463540 validITSABTrack = true;
464541 }
465542 }
@@ -519,6 +596,7 @@ struct FlowMc {
519596 histos.fill(HIST("hBVsPtVsPhiGlobal"), imp, deltaPhi, mcParticle.pt(), wacc * weff);
520597 histos.fill(HIST("hPtNchGlobal"), mcParticle.pt(), nChGlobal);
521598 histos.fill(HIST("hPtMCGlobal"), mcParticle.pt());
599+ histos.fill(HIST("hEtaPtVtxzMCGlobal"), mcParticle.eta(), mcParticle.pt(), vtxz);
522600 if (pdgCode == PDG_t::kPiPlus)
523601 histos.fill(HIST("hPtNchGlobalPion"), mcParticle.pt(), nChGlobal);
524602 if (pdgCode == PDG_t::kKPlus)
0 commit comments