Skip to content

Commit 75663e6

Browse files
authored
[PWGDQ] Implementation of single muon cumulants in muon selection (#10402)
1 parent ec2346b commit 75663e6

File tree

3 files changed

+104
-2
lines changed

3 files changed

+104
-2
lines changed

PWGDQ/Core/HistogramsLibrary.cxx

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,26 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h
838838
hm->AddHistogram(histClass, "tpcNSigmaKa_tofNSigmaKa", "", false, 200, -10., 10., VarManager::kTPCnSigmaKa, 200, -10., 10., VarManager::kTOFnSigmaKa);
839839
hm->AddHistogram(histClass, "tpcNSigmaPi_tofNSigmaPi", "", false, 200, -10., 10., VarManager::kTPCnSigmaPi, 200, -10., 10., VarManager::kTOFnSigmaPi);
840840
}
841+
if (subGroupStr.Contains("singlemucumulant")) {
842+
double PtBinEdges[67]; // 0-30GeV/c
843+
for (int i = 0; i < 67; i++) {
844+
if (i <= 39) {
845+
PtBinEdges[i] = i / 10.;
846+
} else {
847+
PtBinEdges[i] = (i - 40) * 1. + 4.;
848+
}
849+
}
850+
851+
double CentBinEdges[19]; // 0-90%
852+
for (int i = 0; i < 19; i++) {
853+
CentBinEdges[i] = i * 5;
854+
}
855+
856+
hm->AddHistogram(histClass, "Pt_centrFT0C_Corr2REFsingle", "", true, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR2REFbysinglemu, "", "", "", VarManager::kNothing, VarManager::kM11REFoverMpsingle);
857+
hm->AddHistogram(histClass, "Pt_centrFT0C_Corr4REFsingle", "", true, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR4REFbysinglemu, "", "", "", VarManager::kNothing, VarManager::kM1111REFoverMpsingle);
858+
hm->AddHistogram(histClass, "Pt_centrFT0C_Corr2POIsingle", "", true, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR2POIsingle, "", "", "", VarManager::kNothing, VarManager::kM01POIoverMpsingle);
859+
hm->AddHistogram(histClass, "Pt_centrFT0C_Corr4POIsingle", "", true, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR4POIsingle, "", "", "", VarManager::kNothing, VarManager::kM0111POIoverMpsingle);
860+
}
841861
}
842862

843863
if (!groupStr.CompareTo("mctruth_triple")) {
@@ -1121,8 +1141,26 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h
11211141
hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V24ME", "Mass_Pt_CentFT0C_V24ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV24ME, VarManager::kWV24ME);
11221142
}
11231143
if (subGroupStr.Contains("cumulantme1")) {
1124-
hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V22ME", "Mass_Pt_CentFT0C_V22ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV22ME, VarManager::kWV22ME);
1125-
hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V24ME", "Mass_Pt_CentFT0C_V24ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV24ME, VarManager::kWV24ME);
1144+
double MassBinEdges[251]; // 0-5GeV/c2
1145+
for (int i = 0; i < 251; i++) {
1146+
MassBinEdges[i] = i * 0.02;
1147+
}
1148+
1149+
double PtBinEdges[67]; // 0-30GeV/c
1150+
for (int i = 0; i < 67; i++) {
1151+
if (i <= 39) {
1152+
PtBinEdges[i] = i / 10.;
1153+
} else {
1154+
PtBinEdges[i] = (i - 40) * 1. + 4.;
1155+
}
1156+
}
1157+
1158+
double CentBinEdges[19]; // 0-90%
1159+
for (int i = 0; i < 19; i++) {
1160+
CentBinEdges[i] = i * 5;
1161+
}
1162+
hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V22ME", "Mass_Pt_CentFT0C_V22ME", true, 250, MassBinEdges, VarManager::kMass, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, "", "", "", VarManager::kV22ME, VarManager::kWV22ME);
1163+
hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V24ME", "Mass_Pt_CentFT0C_V24ME", true, 250, MassBinEdges, VarManager::kMass, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, "", "", "", VarManager::kV24ME, VarManager::kWV24ME);
11261164
}
11271165
if (subGroupStr.Contains("cumulantme2")) {
11281166
hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M11REFoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11REFoverMpME);

PWGDQ/Core/VarManager.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ class VarManager : public TObject
236236
kMultDimuons,
237237
kMultAntiMuons,
238238
kMultMuons,
239+
kMultSingleMuons,
239240
kMultNTracksHasITS,
240241
kMultNTracksHasTPC,
241242
kMultNTracksHasTOF,
@@ -691,6 +692,7 @@ class VarManager : public TObject
691692
kM0111POI,
692693
kCORR2REF,
693694
kCORR2REFbydimuons,
695+
kCORR2REFbysinglemu,
694696
kCORR2REFetagap,
695697
kCORR2POI,
696698
kCORR2POICORR4POI,
@@ -702,6 +704,7 @@ class VarManager : public TObject
702704
kCORR2CORR4REF,
703705
kCORR4REF,
704706
kCORR4REFbydimuons,
707+
kCORR4REFbysinglemu,
705708
kCORR4POI,
706709
kM11REFoverMp,
707710
kM01POIoverMp,
@@ -713,19 +716,27 @@ class VarManager : public TObject
713716
kM0111POIplus,
714717
kM01POIminus,
715718
kM0111POIminus,
719+
kM01POIsingle,
720+
kM0111POIsingle,
716721
kM01POIoverMpminus,
717722
kM01POIoverMpplus,
723+
kM01POIoverMpsingle,
718724
kM01POIoverMpmoins,
719725
kM0111POIoverMpminus,
720726
kM0111POIoverMpplus,
727+
kM0111POIoverMpsingle,
721728
kCORR2POIplus,
722729
kCORR2POIminus,
730+
kCORR2POIsingle,
723731
kCORR4POIplus,
724732
kCORR4POIminus,
733+
kCORR4POIsingle,
725734
kM11REFoverMpplus,
726735
kM1111REFoverMpplus,
727736
kM11REFoverMpminus,
728737
kM1111REFoverMpminus,
738+
kM11REFoverMpsingle,
739+
kM1111REFoverMpsingle,
729740
kM01POIME,
730741
kMultDimuonsME,
731742
kM0111POIME,
@@ -2187,6 +2198,30 @@ void VarManager::FillTrack(T const& track, float* values)
21872198
if constexpr ((fillMap & MuonRealign) > 0) {
21882199
values[kMuonChi2] = track.chi2();
21892200
}
2201+
2202+
if (fgUsedVars[kM11REFoverMpsingle]) {
2203+
float m = o2::constants::physics::MassMuon;
2204+
ROOT::Math::PtEtaPhiMVector v(track.pt(), track.eta(), track.phi(), m);
2205+
complex<double> Q21(values[kQ2X0A] * values[kS11A], values[kQ2Y0A] * values[kS11A]);
2206+
complex<double> Q42(values[kQ42XA], values[kQ42YA]);
2207+
complex<double> Q23(values[kQ23XA], values[kQ23YA]);
2208+
complex<double> P2(TMath::Cos(2 * v.Phi()), TMath::Sin(2 * v.Phi()));
2209+
values[kM11REFoverMpsingle] = values[kMultSingleMuons] > 0 && !(std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF])) ? values[kM11REF] / values[kMultSingleMuons] : 0;
2210+
values[kM1111REFoverMpsingle] = values[kMultSingleMuons] > 0 && !(std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF]) || std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF])) ? values[kM1111REF] / values[kMultSingleMuons] : 0;
2211+
values[kCORR2REFbysinglemu] = std::isnan(values[kM11REFoverMpsingle]) || std::isinf(values[kM11REFoverMpsingle]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REFoverMpsingle]) || std::isinf(values[kM1111REFoverMpsingle]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF]) ? 0 : values[kCORR2REF];
2212+
values[kCORR4REFbysinglemu] = std::isnan(values[kM1111REFoverMpsingle]) || std::isinf(values[kM1111REFoverMpsingle]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF]) || std::isnan(values[kM11REFoverMpsingle]) || std::isinf(values[kM11REFoverMpsingle]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kCORR4REF];
2213+
values[kCORR2POIsingle] = (P2 * conj(Q21)).real() / values[kM01POI];
2214+
values[kM01POIsingle] = values[kMultSingleMuons] * values[kS11A];
2215+
values[kM0111POIsingle] = values[kMultSingleMuons] * (values[kS31A] - 3. * values[kS11A] * values[kS12A] + 2. * values[kS13A]);
2216+
values[kCORR2POIsingle] = (P2 * conj(Q21)).real() / values[kM01POIsingle];
2217+
values[kCORR4POIsingle] = (P2 * Q21 * conj(Q21) * conj(Q21) - P2 * Q21 * conj(Q42) - 2. * values[kS12A] * P2 * conj(Q21) + 2. * P2 * conj(Q23)).real() / values[kM0111POIsingle];
2218+
values[kM01POIsingle] = std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) ? 0 : values[kM01POIsingle];
2219+
values[kM0111POIsingle] = std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) ? 0 : values[kM0111POIsingle];
2220+
values[kCORR2POIsingle] = std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) ? 0 : values[kCORR2POIsingle];
2221+
values[kCORR4POIsingle] = std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) ? 0 : values[kCORR4POIsingle];
2222+
values[kM01POIoverMpsingle] = values[kMultSingleMuons] > 0 && !(std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) || std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle])) ? values[kM01POIsingle] / values[kMultSingleMuons] : 0;
2223+
values[kM0111POIoverMpsingle] = values[kMultSingleMuons] > 0 && !(std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) || std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle])) ? values[kM0111POIsingle] / values[kMultSingleMuons] : 0;
2224+
}
21902225
}
21912226

21922227
// Quantities based on the barrel tables

PWGDQ/Tasks/tableReader.cxx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ struct AnalysisEventSelection {
305305
PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorMultExtra, "Run event selection on DQ skimmed events with Q vector from GFW and MultPV", false);
306306
PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorCentrMultExtra, "Run event selection on DQ skimmed events with Q vector from CFW and MultPV", false);
307307
PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorExtraRef, "Run event selection on DQ skimmed events with Q vector and subscribing to reference flow table", false);
308+
PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorMultExtraRef, "Run event selection on DQ skimmed events with Q vector and subscribing to reference flow table with MultPV", false);
308309
PROCESS_SWITCH(AnalysisEventSelection, processDummy, "Dummy function", false);
309310
// TODO: Add process functions subscribing to Framework Collision
310311
};
@@ -463,6 +464,8 @@ struct AnalysisMuonSelection {
463464
HistogramManager* fHistMan;
464465
std::vector<AnalysisCompositeCut> fMuonCuts;
465466

467+
Filter filterEventSelected = aod::dqanalysisflags::isEventSelected == 1;
468+
466469
void init(o2::framework::InitContext& context)
467470
{
468471
if (context.mOptions.get<bool>("processDummy")) {
@@ -506,6 +509,26 @@ struct AnalysisMuonSelection {
506509
uint32_t filterMap = 0;
507510
int iCut = 0;
508511

512+
// First loop to get muon multiplicity for single muon cumulants
513+
if constexpr (static_cast<bool>(TEventFillMap & VarManager::ObjTypes::ReducedEventQvector)) {
514+
int multMuon = 0;
515+
for (auto& muon : muons) {
516+
filterMap = 0;
517+
VarManager::FillTrack<TMuonFillMap>(muon);
518+
519+
iCut = 0;
520+
for (auto cut = fMuonCuts.begin(); cut != fMuonCuts.end(); cut++, iCut++) {
521+
if ((*cut).IsSelected(VarManager::fgValues)) {
522+
filterMap |= (static_cast<uint32_t>(1) << iCut);
523+
}
524+
}
525+
if (static_cast<int>(filterMap) > 0) {
526+
multMuon++;
527+
}
528+
}
529+
VarManager::fgValues[VarManager::kMultSingleMuons] = multMuon;
530+
}
531+
509532
for (auto& muon : muons) {
510533
filterMap = 0;
511534
VarManager::FillTrack<TMuonFillMap>(muon);
@@ -530,12 +553,18 @@ struct AnalysisMuonSelection {
530553
{
531554
runMuonSelection<gkEventFillMap, gkMuonFillMap>(event, muons);
532555
}
556+
void processVnSingleMuonCumulantSkimmed(soa::Filtered<MyEventsVtxCovSelectedQvectorExtraWithRefFlow>::iterator const& event, MyMuonTracks const& muons)
557+
{
558+
VarManager::FillEvent<gkEventFillMapWithCovQvectorExtraWithRefFlow>(event, VarManager::fgValues);
559+
runMuonSelection<gkEventFillMapWithCovQvectorExtraWithRefFlow, gkMuonFillMap>(event, muons);
560+
}
533561
void processDummy(MyEvents&)
534562
{
535563
// do nothing
536564
}
537565

538566
PROCESS_SWITCH(AnalysisMuonSelection, processSkimmed, "Run muon selection on DQ skimmed muons", false);
567+
PROCESS_SWITCH(AnalysisMuonSelection, processVnSingleMuonCumulantSkimmed, "Run muon selection for single muon cumulant correlators", false);
539568
PROCESS_SWITCH(AnalysisMuonSelection, processDummy, "Dummy function", false);
540569
};
541570

0 commit comments

Comments
 (0)