Skip to content

Commit 2541a7b

Browse files
Merge branch 'AliceO2Group:master' into master
2 parents b80ea7b + 237c3ed commit 2541a7b

4 files changed

Lines changed: 1435 additions & 2607 deletions

File tree

‎PWGCF/MultiparticleCorrelations/Tasks/multiparticleCorrelationsMei.cxx‎

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343

4444
#include <Rtypes.h>
4545

46+
#include <array>
4647
#include <cmath>
4748
#include <cstddef>
4849
#include <cstdint>
@@ -187,37 +188,37 @@ struct MultiparticleCorrelationsMei // this name is used in lower-case format to
187188
// *) Define and initialize all data members to be called in the main process* functions:
188189
// **) Task configuration:
189190
struct TaskConfiguration {
190-
bool fProcess[eProcess_N] = {false}; // Set what to process. See enum EProcess for full description. Set via implicit variables within a PROCESS_SWITCH clause.
191-
bool fDryRun = false; // book all histos and run without filling and calculating anything
192-
} tc; // you have to prepend "tc." for all objects name in this group later in the code
191+
std::array<bool, eProcess_N> fProcess{false}; // Set what to process. See enum EProcess for full description. Set via implicit variables within a PROCESS_SWITCH clause.
192+
bool fDryRun = false; // book all histos and run without filling and calculating anything
193+
} tc; // you have to prepend "tc." for all objects name in this group later in the code
193194

194195
// **) Particle histograms:
195196
struct ParticleHistograms {
196-
TList* fParticleHistogramsList = NULL; //!<! list to hold all control particle histograms
197-
TH1F* fParticleHistograms[eParticleHistograms_N][2][2] = {{{NULL}}};
197+
TList* fParticleHistogramsList = nullptr; //!<! list to hold all control particle histograms
198+
std::array<std::array<std::array<TH1F*, 2>, 2>, eParticleHistograms_N> fParticleHistograms{};
198199
} pc; // you have to prepend "pc." for all objects name in this group later in the code
199200

200201
// *) Event histograms:
201202
struct EventHistograms {
202-
TList* fEventHistogramsList = NULL; //!<! list to hold all event-level histograms
203-
TH1F* fEventHistograms[eEventHistograms_N][2][2] = {{{NULL}}}; //! [ type - see enum EEventHistograms ][reco,sim][before, after event cuts]
204-
} ec; // prepend "ec." for event counters
203+
TList* fEventHistogramsList = nullptr; //!<! list to hold all event-level histograms
204+
std::array<std::array<std::array<TH1F*, 2>, 2>, eEventHistograms_N> fEventHistograms{}; //! [ type - see enum EEventHistograms ][reco,sim][before, after event cuts]
205+
} ec; // prepend "ec." for event counters
205206

206207
// *) External histograms:
207208
struct ExternalHistograms {
208-
TList* fExternalHistogramsList = NULL;
209-
TH1D* fhistWeights = NULL;
209+
TList* fExternalHistogramsList = nullptr;
210+
TH1D* fhistWeights = nullptr;
210211
} ex;
211212

212213
struct Observables {
213-
TList* fObservablesList = NULL;
214-
TProfile* fProfTwo[2][2] = {{NULL}}; //! [reco,sim][before, after event cuts]
214+
TList* fObservablesList = nullptr;
215+
std::array<std::array<TProfile*, 2>, 2> fProfTwo{}; //! [reco,sim][before, after event cuts]
215216
} obs;
216217

217218
// *) Quality assurance histograms:
218219
struct QualityAssurance {
219-
TList* fQualityAssuranceList = NULL; //!<! list to hold all qualityAssurance histograms
220-
TH2F* fHistCentralityRecSim = NULL;
220+
TList* fQualityAssuranceList = nullptr; //!<! list to hold all qualityAssurance histograms
221+
TH2F* fHistCentralityRecSim = nullptr;
221222
} qa; // prepend "qa." for qa histograms
222223

223224
// *) functions
@@ -552,6 +553,12 @@ struct MultiparticleCorrelationsMei // this name is used in lower-case format to
552553
break; // thisCent is already FT0C
553554
}
554555

556+
LOGF(info,
557+
"centFT0C=%.6f centFT0M=%.6f centFV0A=%.6f",
558+
collision.centFT0C(),
559+
collision.centFT0M(),
560+
collision.centFV0A());
561+
555562
auto thisRefMult = collision.multTPC(); // use auto to determine the type
556563
switch (multiplicityTables) {
557564
case eMultTPC:
@@ -605,7 +612,7 @@ struct MultiparticleCorrelationsMei // this name is used in lower-case format to
605612
if (rm == eMC) {
606613
auto thisMCCollision = collision.mcCollision(); // corresponding MC truth simulated particle
607614
int multiplicitySim = static_cast<int>(tracks.size());
608-
auto impactParameter = thisMCCollision.impactParameter() * 1e15;
615+
auto impactParameter = thisMCCollision.impactParameter();
609616
LOGF(info,
610617
"Reco collision = %d, MC collision = %d, b = %f",
611618
collision.globalIndex(),

‎PWGJE/Tasks/jetDsSpecSubs.cxx‎

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,11 @@ consteval float getValFromBin(int bin)
5252
enum BinExpColCntr { AllCollisions = 1,
5353
Sel8ZCut = 2 };
5454

55-
enum BinMCColCntr { AllMCCollisions = 1,
56-
SelectedMCCollisions = 2,
57-
AssociatedRecoCollisions = 3,
58-
SelectedAssociatedRecoCollisions = 4
55+
enum BinMCColCntr {
56+
AllMCCollisions = 1,
57+
EventSelection = 2,
58+
VertexZCut = 3,
59+
HasMCPDsJet = 4
5960
};
6061

6162
enum BinMCJetCntr {
@@ -318,13 +319,20 @@ struct JetDsSpecSubs {
318319
// Detector-level sparse histograms
319320
registry.add(
320321
"hSparse_ds_mcd1",
321-
";m_{D_{S}}^{rec};#it{p}_{T,D_{S}}^{det};#it{p}_{T,jet}^{det};z^{D_{S},jet}_{||,det};Origin(D_{S});Matching status",
322+
";m_{D_{S}}^{rec};"
323+
"#it{p}_{T,D_{S}}^{det};"
324+
"#it{p}_{T,jet}^{det};"
325+
"z^{D_{S},jet}_{||,det};"
326+
"Origin(D_{S});"
327+
"flagMcMatchRec;"
328+
"Jet matching status",
322329
{HistType::kTHnSparseF,
323330
{{350, 1.6, 2.3},
324331
{100, 0., 50.},
325332
{100, 0., 100.},
326333
{200, 0., 1.},
327334
{3, -0.5, 2.5},
335+
{21, -10.5, 10.5},
328336
{2, -0.5, 1.5}}});
329337

330338
registry.add(
@@ -356,13 +364,20 @@ struct JetDsSpecSubs {
356364
// Particle-level sparse with origin and matching status
357365
registry.add(
358366
"hSparse_ds_mcp",
359-
";#it{p}_{T,D_{S}}^{part};#it{p}_{T,jet}^{part};z^{D_{S},jet}_{||,part};#DeltaR_{D_{S},jet}^{part};Origin(D_{S});Matching status",
367+
";#it{p}_{T,D_{S}}^{part};"
368+
"#it{p}_{T,jet}^{part};"
369+
"z^{D_{S},jet}_{||,part};"
370+
"#DeltaR_{D_{S},jet}^{part};"
371+
"Origin(D_{S});"
372+
"flagMcMatchGen;"
373+
"Jet matching status",
360374
{HistType::kTHnSparseF,
361375
{{100, 0., 50.},
362376
{100, 0., 100.},
363377
{200, 0., 1.},
364378
{200, 0., 1.},
365379
{3, -0.5, 2.5},
380+
{21, -10.5, 10.5},
366381
{2, -0.5, 1.5}}});
367382

368383
// Matched detector-level Ds-tagged jets
@@ -418,10 +433,10 @@ struct JetDsSpecSubs {
418433

419434
// Counter labels
420435
auto mcCollisionCounter = registry.get<TH1>(HIST("hMCColCounter"));
421-
mcCollisionCounter->GetXaxis()->SetBinLabel(BinMCColCntr::AllMCCollisions, "All MC coll.");
422-
mcCollisionCounter->GetXaxis()->SetBinLabel(BinMCColCntr::SelectedMCCollisions, "Selected MC coll.");
423-
mcCollisionCounter->GetXaxis()->SetBinLabel(BinMCColCntr::AssociatedRecoCollisions, "MC-associated reco coll.");
424-
mcCollisionCounter->GetXaxis()->SetBinLabel(BinMCColCntr::SelectedAssociatedRecoCollisions, "Selected MC-associated reco coll.");
436+
mcCollisionCounter->GetXaxis()->SetBinLabel(BinMCColCntr::AllMCCollisions, "All MC collisions");
437+
mcCollisionCounter->GetXaxis()->SetBinLabel(BinMCColCntr::EventSelection, "Event selection");
438+
mcCollisionCounter->GetXaxis()->SetBinLabel(BinMCColCntr::VertexZCut, "|z_{vtx}| < cut");
439+
mcCollisionCounter->GetXaxis()->SetBinLabel(BinMCColCntr::HasMCPDsJet, "Has MCP D_{s}-jet");
425440

426441
auto jetCounter = registry.get<TH1>(HIST("hMCJetCounter"));
427442
jetCounter->GetXaxis()->SetBinLabel(BinMCJetCntr::MCPJets, "MCP Ds-jets");
@@ -432,12 +447,12 @@ struct JetDsSpecSubs {
432447

433448
// Matching-status labels
434449
auto hSparseMCD = registry.get<THnSparse>(HIST("hSparse_ds_mcd1"));
435-
hSparseMCD->GetAxis(5)->SetBinLabel(1, "Unmatched");
436-
hSparseMCD->GetAxis(5)->SetBinLabel(2, "Matched");
450+
hSparseMCD->GetAxis(6)->SetBinLabel(1, "Unmatched");
451+
hSparseMCD->GetAxis(6)->SetBinLabel(2, "Matched");
437452

438453
auto hSparseMCP = registry.get<THnSparse>(HIST("hSparse_ds_mcp"));
439-
hSparseMCP->GetAxis(5)->SetBinLabel(1, "Unmatched");
440-
hSparseMCP->GetAxis(5)->SetBinLabel(2, "Matched");
454+
hSparseMCP->GetAxis(6)->SetBinLabel(1, "Unmatched");
455+
hSparseMCP->GetAxis(6)->SetBinLabel(2, "Matched");
441456
}
442457

443458
void addMCPOnTheFlyHistograms()
@@ -755,17 +770,27 @@ struct JetDsSpecSubs {
755770
// All MC collisions
756771
registry.fill(HIST("hMCColCounter"), getValFromBin(BinMCColCntr::AllMCCollisions));
757772

758-
// MC collision selection
759-
if (!jetderiveddatautilities::selectCollision(mccollision, eventSelectionBits) ||
760-
!(std::abs(mccollision.posZ()) < vertexZCut)) {
773+
// Event selection
774+
if (!jetderiveddatautilities::selectCollision(mccollision, eventSelectionBits)) {
761775
continue;
762776
}
763-
// Selected MC collisions
764-
registry.fill(HIST("hMCColCounter"), getValFromBin(BinMCColCntr::SelectedMCCollisions));
777+
778+
registry.fill(HIST("hMCColCounter"), getValFromBin(BinMCColCntr::EventSelection));
779+
780+
// Vertex-z selection
781+
if (std::abs(mccollision.posZ()) >= vertexZCut) {
782+
continue;
783+
}
784+
785+
registry.fill(HIST("hMCColCounter"), getValFromBin(BinMCColCntr::VertexZCut));
765786

766787
// Particle-level jets belonging to the current MC collision
767788
const auto mcpJetsPerMCCollision = mcpjets.sliceBy(MCPJetsPerMCCollisionPreslice, mccollision.globalIndex());
768789

790+
if (mcpJetsPerMCCollision.size() > 0) {
791+
registry.fill(HIST("hMCColCounter"), getValFromBin(BinMCColCntr::HasMCPDsJet));
792+
}
793+
769794
// Particle-level Ds-tagged jets
770795
for (const auto& mcpjet : mcpJetsPerMCCollision) {
771796

@@ -806,6 +831,7 @@ struct JetDsSpecSubs {
806831
zParallelMCP,
807832
deltaRMCP,
808833
originMCP,
834+
flagMcMatchGen,
809835
static_cast<float>(isMatchedMCP));
810836

811837
// Store all particle-level Ds-tagged jets
@@ -984,14 +1010,15 @@ struct JetDsSpecSubs {
9841010
registry.fill(HIST("h_ds_phi_mcd"), mcdcand.phi());
9851011
registry.fill(HIST("h_ds_mass_mcd"), mcdcand.m());
9861012

987-
// Detector-level sparse: mass, pT Ds, pT jet, z_parallel, origin, matching status
1013+
// Detector-level sparse: mass, pT Ds, pT jet, z_parallel, origin, flagMcMatchRec, matching status
9881014
registry.fill(
9891015
HIST("hSparse_ds_mcd1"),
9901016
mcdcand.m(),
9911017
mcdcand.pt(),
9921018
mcdjet.pt(),
9931019
zParallelMCD,
9941020
originMCD,
1021+
flagMcMatchRec,
9951022
static_cast<float>(isMatchedMCD));
9961023

9971024
// Detector-level sparse: pT Ds, pT jet, DeltaR

‎PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx‎

Lines changed: 69 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ struct HStrangeCorrelation {
125125
Configurable<bool> doCorrelationOmegaPlus{"doCorrelationOmegaPlus", false, "do OmegaPlus correlation"};
126126
Configurable<bool> doCorrelationPion{"doCorrelationPion", false, "do Pion correlation"};
127127
Configurable<bool> doGenEventSelection{"doGenEventSelection", true, "use event selections when performing closure test for the gen events"};
128+
Configurable<bool> doClosureTestPureMC{"doClosureTestPureMC", false, "fill regular ClosureTest histograms without event or reconstructed-trigger selection, using MC vertex z and centrality 0.05; keep truth-particle selections"};
128129
Configurable<bool> selectINELgtZERO{"selectINELgtZERO", true, "select INEL>0 events"};
129130
Configurable<bool> selectINELgtONE{"selectINELgtONE", false, "select INEL>1 events (at least 2 charged particles in |eta| < 1)"};
130131
Configurable<float> zVertexCut{"zVertexCut", 10, "Cut on PV position"};
@@ -6181,71 +6182,82 @@ struct HStrangeCorrelation {
61816182

61826183
float bestCollisionCentpercentile = -1;
61836184
float bestCollisionVtxZ = 0.0f;
6184-
bool bestCollisionSel8 = false;
6185-
bool bestCollisionINELgtZERO = false;
6186-
bool bestCollisionINELgtONE = false;
6187-
bool bestCollisionNoSameBunchPileup = false;
6188-
bool bestCollisionGoodTriggerTVX = false;
6189-
bool bestCollisionGoodZvtxFT0vsPV = false;
6190-
bool isCollisionSelect = false;
6191-
int biggestNContribs = -1;
6192-
uint32_t bestCollisionTriggerPresenceMap = 0;
6185+
// Pure MC defines an inclusive generated-event reference, independent of
6186+
// reconstructed collisions and triggerPresenceMap. Particle/pair selections
6187+
// below still define the observable. PairLossK0 diagnostics above retain
6188+
// their own event selection.
6189+
if (masterConfigurations.doClosureTestPureMC) {
6190+
bestCollisionCentpercentile = 0.05f;
6191+
bestCollisionVtxZ = mcCollision.posZ();
6192+
} else {
6193+
bool bestCollisionSel8 = false;
6194+
bool bestCollisionINELgtZERO = false;
6195+
bool bestCollisionINELgtONE = false;
6196+
bool bestCollisionNoSameBunchPileup = false;
6197+
bool bestCollisionGoodTriggerTVX = false;
6198+
bool bestCollisionGoodZvtxFT0vsPV = false;
6199+
bool isCollisionSelect = false;
6200+
int biggestNContribs = -1;
6201+
uint32_t bestCollisionTriggerPresenceMap = 0;
61936202

6194-
for (auto const& recCollision : recCollisions) {
6195-
if (biggestNContribs < recCollision.numContrib()) {
6196-
biggestNContribs = recCollision.numContrib();
6197-
bestCollisionCentpercentile = masterConfigurations.doPPAnalysis ? recCollision.centFT0M() : recCollision.centFT0C();
6198-
if (masterConfigurations.applyNewMCSelection) {
6199-
isCollisionSelect = ((masterConfigurations.doPPAnalysis && isCollisionSelected(recCollision)) || (!masterConfigurations.doPPAnalysis && isCollisionSelectedPbPb(recCollision, false)));
6200-
} else {
6201-
bestCollisionSel8 = recCollision.sel8();
6203+
for (auto const& recCollision : recCollisions) {
6204+
if (biggestNContribs < recCollision.numContrib()) {
6205+
biggestNContribs = recCollision.numContrib();
6206+
bestCollisionCentpercentile = masterConfigurations.doPPAnalysis ? recCollision.centFT0M() : recCollision.centFT0C();
6207+
// Both branches fill the generated-level THns with this vertex position, so it
6208+
// is taken from the best collision regardless of which event selection is used.
62026209
bestCollisionVtxZ = recCollision.posZ();
6203-
bestCollisionINELgtZERO = recCollision.isInelGt0();
6204-
bestCollisionINELgtONE = recCollision.isInelGt1();
6205-
bestCollisionNoSameBunchPileup = recCollision.selection_bit(o2::aod::evsel::kNoSameBunchPileup);
6206-
bestCollisionGoodTriggerTVX = recCollision.selection_bit(aod::evsel::kIsTriggerTVX);
6207-
bestCollisionGoodZvtxFT0vsPV = recCollision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV);
6208-
}
6209-
if (triggerPresenceMap.size() > 0) {
6210-
bestCollisionTriggerPresenceMap = triggerPresenceMap[recCollision.globalIndex()];
6210+
if (masterConfigurations.applyNewMCSelection) {
6211+
isCollisionSelect = ((masterConfigurations.doPPAnalysis && isCollisionSelected(recCollision)) || (!masterConfigurations.doPPAnalysis && isCollisionSelectedPbPb(recCollision, false)));
6212+
} else {
6213+
bestCollisionSel8 = recCollision.sel8();
6214+
bestCollisionINELgtZERO = recCollision.isInelGt0();
6215+
bestCollisionINELgtONE = recCollision.isInelGt1();
6216+
bestCollisionNoSameBunchPileup = recCollision.selection_bit(o2::aod::evsel::kNoSameBunchPileup);
6217+
bestCollisionGoodTriggerTVX = recCollision.selection_bit(aod::evsel::kIsTriggerTVX);
6218+
bestCollisionGoodZvtxFT0vsPV = recCollision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV);
6219+
}
6220+
if (triggerPresenceMap.size() > 0) {
6221+
bestCollisionTriggerPresenceMap = triggerPresenceMap[recCollision.globalIndex()];
6222+
}
62116223
}
62126224
}
6213-
}
6214-
// ________________________________________________
6215-
// skip if desired trigger not found
6216-
if (triggerPresenceMap.size() > 0 && !TESTBIT(bestCollisionTriggerPresenceMap, triggerBinToSelect)) {
6217-
return;
6218-
}
6219-
6220-
if (masterConfigurations.applyNewMCSelection) {
6221-
if (!isCollisionSelect) {
6225+
// ________________________________________________
6226+
// skip if desired trigger not found
6227+
if (triggerPresenceMap.size() > 0 && !TESTBIT(bestCollisionTriggerPresenceMap, triggerBinToSelect)) {
62226228
return;
62236229
}
6224-
} else {
6225-
if (masterConfigurations.doGenEventSelection) {
6226-
if (!bestCollisionSel8) {
6227-
return;
6228-
}
6229-
if (std::abs(bestCollisionVtxZ) > masterConfigurations.zVertexCut) {
6230-
return;
6231-
}
6232-
if (!bestCollisionINELgtZERO) {
6233-
return;
6234-
}
6235-
if (masterConfigurations.selectINELgtONE && !bestCollisionINELgtONE) {
6236-
return;
6237-
}
6238-
if (masterConfigurations.rejectSameBunchPileup && !bestCollisionNoSameBunchPileup) {
6239-
return;
6240-
}
6241-
if (masterConfigurations.requireGoodTriggerTVX && !bestCollisionGoodTriggerTVX) {
6242-
return;
6243-
}
6244-
if (masterConfigurations.requireGoodZvtxFT0vsPV && !bestCollisionGoodZvtxFT0vsPV) {
6230+
6231+
if (masterConfigurations.applyNewMCSelection) {
6232+
if (!isCollisionSelect) {
62456233
return;
62466234
}
6247-
if (bestCollisionCentpercentile > axisRanges[5][1] || bestCollisionCentpercentile < axisRanges[5][0]) {
6248-
return;
6235+
} else {
6236+
if (masterConfigurations.doGenEventSelection) {
6237+
if (!bestCollisionSel8) {
6238+
return;
6239+
}
6240+
if (std::abs(bestCollisionVtxZ) > masterConfigurations.zVertexCut) {
6241+
return;
6242+
}
6243+
if (!bestCollisionINELgtZERO) {
6244+
return;
6245+
}
6246+
if (masterConfigurations.selectINELgtONE && !bestCollisionINELgtONE) {
6247+
return;
6248+
}
6249+
if (masterConfigurations.rejectSameBunchPileup && !bestCollisionNoSameBunchPileup) {
6250+
return;
6251+
}
6252+
if (masterConfigurations.requireGoodTriggerTVX && !bestCollisionGoodTriggerTVX) {
6253+
return;
6254+
}
6255+
if (masterConfigurations.requireGoodZvtxFT0vsPV && !bestCollisionGoodZvtxFT0vsPV) {
6256+
return;
6257+
}
6258+
if (bestCollisionCentpercentile > axisRanges[5][1] || bestCollisionCentpercentile < axisRanges[5][0]) {
6259+
return;
6260+
}
62496261
}
62506262
}
62516263
}

0 commit comments

Comments
 (0)