Skip to content

Commit 1400834

Browse files
mcoquet642alibuild
andauthored
[PWGDQ] Event-mixing for cumulants (AliceO2Group#9832)
Co-authored-by: ALICE Action Bot <[email protected]>
1 parent f5909a8 commit 1400834

File tree

3 files changed

+107
-0
lines changed

3 files changed

+107
-0
lines changed

PWGDQ/Core/VarManager.cxx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,22 @@ void VarManager::SetDefaultVarNames()
10571057
fgVariableUnits[kDeltaR1] = "";
10581058
fgVariableNames[kDeltaR2] = "angular distance prong 2";
10591059
fgVariableUnits[kDeltaR2] = "";
1060+
fgVariableNames[kV22m] = "v_{2}(2)_{#mu^{-}}";
1061+
fgVariableUnits[kV22m] = "";
1062+
fgVariableNames[kV24m] = "v_{2}(4)_{#mu^{-}}";
1063+
fgVariableUnits[kV24m] = "";
1064+
fgVariableNames[kV22p] = "v_{2}(2)_{#mu^{+}}";
1065+
fgVariableUnits[kV22p] = "";
1066+
fgVariableNames[kV24p] = "v_{2}(4)_{#mu^{+}}";
1067+
fgVariableUnits[kV24p] = "";
1068+
fgVariableNames[kV22ME] = "v_{2}(2)_{ME}";
1069+
fgVariableUnits[kV22ME] = "";
1070+
fgVariableNames[kV24ME] = "v_{2}(4)_{ME}";
1071+
fgVariableUnits[kV24ME] = "";
1072+
fgVariableNames[kWV22ME] = "W_{2}(2)_{ME}";
1073+
fgVariableUnits[kWV22ME] = "";
1074+
fgVariableNames[kWV24ME] = "W_{2}(4)_{ME}";
1075+
fgVariableUnits[kWV24ME] = "";
10601076

10611077
// Set the variables short names map. This is needed for dynamic configuration via JSON files
10621078
fgVarNamesMap["kNothing"] = kNothing;
@@ -1661,4 +1677,12 @@ void VarManager::SetDefaultVarNames()
16611677
fgVarNamesMap["kBitMapIndex"] = kBitMapIndex;
16621678
fgVarNamesMap["kDeltaMass"] = kDeltaMass;
16631679
fgVarNamesMap["kDeltaMass_jpsi"] = kDeltaMass_jpsi;
1680+
fgVarNamesMap["kV22m"] = kV22m;
1681+
fgVarNamesMap["kV24m"] = kV24m;
1682+
fgVarNamesMap["kV22p"] = kV22p;
1683+
fgVarNamesMap["kV24p"] = kV24p;
1684+
fgVarNamesMap["kV22ME"] = kV22ME;
1685+
fgVarNamesMap["kV24ME"] = kV24ME;
1686+
fgVarNamesMap["kWV22ME"] = kWV22ME;
1687+
fgVarNamesMap["kWV24ME"] = kWV24ME;
16641688
}

PWGDQ/Core/VarManager.h

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,16 @@ class VarManager : public TObject
421421
kTwoR2EP2, // Event plane resolution of event2 for ME technique
422422
kNEventWiseVariables,
423423

424+
// Variables for event mixing with cumulant
425+
kV22m,
426+
kV24m,
427+
kV22p,
428+
kV24p,
429+
kV22ME,
430+
kV24ME,
431+
kWV22ME,
432+
kWV24ME,
433+
424434
// Basic track/muon/pair wise variables
425435
kX,
426436
kY,
@@ -1009,6 +1019,8 @@ class VarManager : public TObject
10091019
static void FillTwoMixEvents(T1 const& event1, T1 const& event2, T2 const& tracks1, T2 const& tracks2, float* values = nullptr);
10101020
template <typename T>
10111021
static void FillTwoMixEventsFlowResoFactor(T const& hs_sp, T const& hs_ep, float* values = nullptr);
1022+
template <typename T, typename T1, typename T2>
1023+
static void FillTwoMixEventsCumulants(T const& h_v22m, T const& h_v24m, T const& h_v22p, T const& h_v24p, T1 const& t1, T2 const& t2, float* values = nullptr);
10121024
template <uint32_t fillMap, typename T>
10131025
static void FillTrack(T const& track, float* values = nullptr);
10141026
template <uint32_t fillMap, typename T>
@@ -1949,6 +1961,42 @@ void VarManager::FillTwoMixEventsFlowResoFactor(T const& hs_sp, T const& hs_ep,
19491961
}
19501962
}
19511963

1964+
template <typename T, typename T1, typename T2>
1965+
void VarManager::FillTwoMixEventsCumulants(T const& h_v22m, T const& h_v24m, T const& h_v22p, T const& h_v24p, T1 const& t1, T2 const& t2, float* values)
1966+
{
1967+
if (!values) {
1968+
values = fgValues;
1969+
}
1970+
float ptp, ptm, centp, centm;
1971+
if (t1.sign() < 0) {
1972+
ptm = t1.sign();
1973+
ptp = t2.sign();
1974+
centm = values[kTwoEvCentFT0C1];
1975+
centp = values[kTwoEvCentFT0C2];
1976+
} else {
1977+
ptm = t2.sign();
1978+
ptp = t1.sign();
1979+
centm = values[kTwoEvCentFT0C2];
1980+
centp = values[kTwoEvCentFT0C1];
1981+
}
1982+
1983+
if (centm >= 0.) {
1984+
int idx_v22m = h_v22m->FindBin(centm, ptm);
1985+
int idx_v24m = h_v24m->FindBin(centm, ptm);
1986+
1987+
values[kV22m] = h_v22m->GetBinContent(idx_v22m);
1988+
values[kV24m] = h_v24m->GetBinContent(idx_v24m);
1989+
}
1990+
1991+
if (centp >= 0.) {
1992+
int idx_v22p = h_v22p->FindBin(centp, ptp);
1993+
int idx_v24p = h_v24p->FindBin(centp, ptp);
1994+
1995+
values[kV22p] = h_v22p->GetBinContent(idx_v22p);
1996+
values[kV24p] = h_v24p->GetBinContent(idx_v24p);
1997+
}
1998+
}
1999+
19522000
template <typename T>
19532001
void VarManager::FillTwoEvents(T const& ev1, T const& ev2, float* values)
19542002
{
@@ -3035,6 +3083,14 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values)
30353083
values[kV2ME_EP] = std::isnan(V2ME_EP) || std::isinf(V2ME_EP) ? 0. : V2ME_EP;
30363084
values[kWV2ME_EP] = std::isnan(V2ME_EP) || std::isinf(V2ME_EP) ? 0. : 1.0;
30373085

3086+
// Cumulant part
3087+
float V22ME = values[kV22m] * values[kCos2DeltaPhiMu1] + values[kV22p] * values[kCos2DeltaPhiMu2];
3088+
float V24ME = values[kV24m] * values[kCos2DeltaPhiMu1] + values[kV24p] * values[kCos2DeltaPhiMu2];
3089+
values[kV22ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : V22ME;
3090+
values[kWV22ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : 1.0;
3091+
values[kV24ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : V24ME;
3092+
values[kWV24ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : 1.0;
3093+
30383094
if constexpr ((fillMap & ReducedEventQvectorExtra) > 0) {
30393095
complex<double> Q21(values[kQ2X0A] * values[kS11A], values[kQ2Y0A] * values[kS11A]);
30403096
complex<double> Q42(values[kQ42XA], values[kQ42YA]);

PWGDQ/Tasks/tableReader.cxx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,12 +645,18 @@ struct AnalysisEventMixing {
645645
Configurable<bool> fConfigAmbiguousHist{"cfgAmbiHist", false, "Enable Ambiguous histograms for time association studies"};
646646
Configurable<string> ccdbPathFlow{"ccdb-path-flow", "Users/c/chizh/FlowResolution", "path to the ccdb object for flow resolution factors"};
647647
Configurable<bool> fConfigFlowReso{"cfgFlowReso", false, "Enable loading of flow resolution factors from CCDB"};
648+
Configurable<bool> fConfigSingleMuCumulants{"cfgSingleMuCumulants", false, "Enable loading of flow resolution factors from CCDB"};
649+
Configurable<std::string> fConfigAddJSONHistograms{"cfgAddJSONHistograms", "", "Histograms in JSON format"};
648650

649651
Service<o2::ccdb::BasicCCDBManager> ccdb;
650652

651653
o2::parameters::GRPMagField* grpmag = nullptr;
652654
TH1D* ResoFlowSP = nullptr; // Resolution factors for flow analysis, this will be loaded from CCDB
653655
TH1D* ResoFlowEP = nullptr; // Resolution factors for flow analysis, this will be loaded from CCDB
656+
TH2D* SingleMuv22m = nullptr; // Single muon v22, loaded from CCDB
657+
TH2D* SingleMuv24m = nullptr; // Single muon v24, loaded from CCDB
658+
TH2D* SingleMuv22p = nullptr; // Single antimuon v22, loaded from CCDB
659+
TH2D* SingleMuv24p = nullptr; // Single antimuon v24, loaded from CCDB
654660
int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc.
655661

656662
Filter filterEventSelected = aod::dqanalysisflags::isEventSelected == 1;
@@ -742,6 +748,8 @@ struct AnalysisEventMixing {
742748
}
743749

744750
DefineHistograms(fHistMan, histNames.Data(), fConfigAddEventMixingHistogram); // define all histograms
751+
// Additional histograms via JSON
752+
dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str());
745753
VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill
746754
fOutputList.setObject(fHistMan->GetMainHistogramList());
747755
}
@@ -770,6 +778,9 @@ struct AnalysisEventMixing {
770778
}
771779
if constexpr (TPairType == VarManager::kDecayToMuMu) {
772780
twoTrackFilter = static_cast<uint32_t>(track1.isMuonSelected()) & static_cast<uint32_t>(track2.isMuonSelected()) & fTwoMuonFilterMask;
781+
if (fConfigSingleMuCumulants) {
782+
VarManager::FillTwoMixEventsCumulants(SingleMuv22m, SingleMuv24m, SingleMuv22p, SingleMuv24p, track1, track2);
783+
}
773784
}
774785
if constexpr (TPairType == VarManager::kElectronMuon) {
775786
twoTrackFilter = static_cast<uint32_t>(track1.isBarrelSelected()) & static_cast<uint32_t>(track2.isMuonSelected()) & fTwoTrackFilterMask;
@@ -829,6 +840,20 @@ struct AnalysisEventMixing {
829840
LOGF(fatal, "Resolution factor is not available in CCDB at timestamp=%llu", events.begin().timestamp());
830841
}
831842
}
843+
if (fConfigSingleMuCumulants) {
844+
TString PathFlow = ccdbPathFlow.value;
845+
TString ccdbPathMuv22m = Form("%s/SingleMuv22m", PathFlow.Data());
846+
TString ccdbPathMuv24m = Form("%s/SingleMuv24m", PathFlow.Data());
847+
TString ccdbPathMuv22p = Form("%s/SingleMuv22p", PathFlow.Data());
848+
TString ccdbPathMuv24p = Form("%s/SingleMuv24p", PathFlow.Data());
849+
SingleMuv22m = ccdb->getForTimeStamp<TH2D>(ccdbPathMuv22m.Data(), events.begin().timestamp());
850+
SingleMuv24m = ccdb->getForTimeStamp<TH2D>(ccdbPathMuv24m.Data(), events.begin().timestamp());
851+
SingleMuv22p = ccdb->getForTimeStamp<TH2D>(ccdbPathMuv22p.Data(), events.begin().timestamp());
852+
SingleMuv24p = ccdb->getForTimeStamp<TH2D>(ccdbPathMuv24p.Data(), events.begin().timestamp());
853+
if (SingleMuv22m == nullptr || SingleMuv24m == nullptr || SingleMuv22p == nullptr || SingleMuv24p == nullptr) {
854+
LOGF(fatal, "Single muon cumulants are not available in CCDB at timestamp=%llu", events.begin().timestamp());
855+
}
856+
}
832857
fCurrentRun = events.begin().runNumber();
833858
}
834859

@@ -976,6 +1001,7 @@ struct AnalysisSameEventPairing {
9761001
Configurable<std::string> fCollisionSystem{"syst", "pp", "Collision system, pp or PbPb"};
9771002
Configurable<float> fCenterMassEnergy{"energy", 13600, "Center of mass energy in GeV"};
9781003
Configurable<bool> fConfigCumulants{"cfgCumulants", false, "If true, fill Cumulants with Weights different than 0"};
1004+
Configurable<std::string> fConfigAddJSONHistograms{"cfgAddJSONHistograms", "", "Histograms in JSON format"};
9791005

9801006
// Configurables to create output tree (flat tables or minitree)
9811007
struct : ConfigurableGroup {
@@ -1154,6 +1180,7 @@ struct AnalysisSameEventPairing {
11541180
VarManager::SetCollisionSystem((TString)fCollisionSystem, fCenterMassEnergy); // set collision system and center of mass energy
11551181

11561182
DefineHistograms(fHistMan, histNames.Data(), fConfigAddSEPHistogram); // define all histograms
1183+
dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); // ad-hoc histograms via JSON
11571184
VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill
11581185
fOutputList.setObject(fHistMan->GetMainHistogramList());
11591186
}

0 commit comments

Comments
 (0)