Skip to content

Commit 00910dc

Browse files
committed
[Common] Added dimuon-muon correlations to muonQA
Added multidimensional histograms to study the muPos and muNeg as a function of dimuon pT and invariant mass. Fixed MegaLinter warnings
1 parent 92bff8e commit 00910dc

File tree

1 file changed

+63
-5
lines changed

1 file changed

+63
-5
lines changed

Common/Tasks/qaMuon.cxx

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@
4545
#include "Math/Vector4D.h"
4646
#include "TGeoGlobalMagField.h"
4747

48+
#include <utility>
49+
#include <string>
50+
#include <algorithm>
51+
#include <map>
52+
#include <vector>
4853
#include <chrono>
4954

5055
using namespace std;
@@ -562,12 +567,34 @@ struct muonQa {
562567
}
563568

564569
if (configQAs.fEnableQADimuon) {
570+
// single muons
571+
AxisSpec transverseMomentumAxis = {1000, 0, 100, "p_{T} (GeV/c)"};
572+
AxisSpec etaAxis = {80, -5, -1, "#eta"};
573+
AxisSpec rAbsAxis = {100, 0., 100.0, "R_{abs} (cm)"};
574+
AxisSpec dcaAxis = {400, 0.0, 20.0, "DCA"};
575+
AxisSpec phiAxis = {360, -180.0, 180.0, "#phi (degrees)"};
576+
// dimuons
565577
AxisSpec invMassAxis = {400, 1, 5, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"};
566578
AxisSpec invMassCorrelationAxis = {80, 0, 8, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"};
567579
AxisSpec invMassAxisFull = {5000, 0, 100, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"};
568580
AxisSpec yPairAxis = {120, 0.0, 6.0, "#y_{pair}"};
569581
AxisSpec invMassAxis2D = {750, 0, 15, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"};
570582
AxisSpec pTAxis2D = {120, 0, 30, "p_{T} (GeV/c)"};
583+
// Single muons - dimuons correlations
584+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosPt_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, transverseMomentumAxis}});
585+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegPt_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, transverseMomentumAxis}});
586+
//
587+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosEta_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, etaAxis}});
588+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegEta_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, etaAxis}});
589+
//
590+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosRabs_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, rAbsAxis}});
591+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegRabs_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, rAbsAxis}});
592+
//
593+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosDca_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, dcaAxis}});
594+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegDca_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, dcaAxis}});
595+
//
596+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosPhi_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, phiAxis}});
597+
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegPhi_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, phiAxis}});
571598
// MCH-MID tracks with MCH acceptance cuts
572599
registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_MuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}});
573600
registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}});
@@ -1796,7 +1823,7 @@ struct muonQa {
17961823
std::vector<std::array<double, 2>> yPos;
17971824
std::vector<std::array<double, 2>> thetax;
17981825
std::vector<std::array<double, 2>> thetay;
1799-
for (int zi = 0; zi < int(zRefPlane.size()); zi++) {
1826+
for (int zi = 0; zi < static_cast<int>(zRefPlane.size()); zi++) {
18001827
xPos.emplace_back(std::array<double, 2>{fgVectorsMCH[zi].x, fgVectorsMFT[zi].x});
18011828
yPos.emplace_back(std::array<double, 2>{fgVectorsMCH[zi].y, fgVectorsMFT[zi].y});
18021829
thetax.emplace_back(std::array<double, 2>{
@@ -1807,7 +1834,7 @@ struct muonQa {
18071834
std::atan2(fgVectorsMFT[zi].py, -1.0 * fgVectorsMFT[zi].pz) * 180 / TMath::Pi()});
18081835
}
18091836

1810-
for (int i = 0; i < int(zRefPlane.size()); i++) {
1837+
for (int i = 0; i < static_cast<int>(zRefPlane.size()); i++) {
18111838
if (same) {
18121839
std::get<std::shared_ptr<TH2>>(trackResidualsHistos[i][quadrant]["dx_vs_x"])->Fill(std::fabs(xPos[i][1]), xPos[i][0] - xPos[i][1]);
18131840
std::get<std::shared_ptr<TH2>>(trackResidualsHistos[i][quadrant]["dx_vs_y"])->Fill(std::fabs(yPos[i][1]), xPos[i][0] - xPos[i][1]);
@@ -2180,7 +2207,7 @@ struct muonQa {
21802207
}
21812208

21822209
// Loop over attached clusters
2183-
for (int iCls = 0; iCls < int(fgValuesClsTmp.posClusters.size()); iCls++) {
2210+
for (int iCls = 0; iCls < static_cast<int>(fgValuesClsTmp.posClusters.size()); iCls++) {
21842211

21852212
double phiCls = std::atan2(fgValuesClsTmp.posClusters[iCls][1], fgValuesClsTmp.posClusters[iCls][0]) * 180 / TMath::Pi();
21862213
int quadrantCls = GetQuadrantPhi(phiCls);
@@ -2327,7 +2354,7 @@ struct muonQa {
23272354
FillMatching(muontrack, fgValuesMCH, fgValuesMFT);
23282355

23292356
//// Fill global informations
2330-
registry.get<TH1>(HIST("global-muons/NCandidates"))->Fill(int(globalMuonsVector.size()));
2357+
registry.get<TH1>(HIST("global-muons/NCandidates"))->Fill(static_cast<int>(globalMuonsVector.size()));
23312358
for (size_t candidateIndex = 0; candidateIndex < globalMuonsVector.size(); candidateIndex++) {
23322359
auto const& muon = muons.rawIteratorAt(globalMuonsVector[candidateIndex]);
23332360
registry.get<TH2>(HIST("global-muons/MatchChi2"))->Fill(muon.chi2MatchMCHMFT(), candidateIndex);
@@ -2369,7 +2396,7 @@ struct muonQa {
23692396
}
23702397

23712398
//// Fill global muon candidates info
2372-
for (int i = 0; i < int(globalMuonsVector.size()); i++) {
2399+
for (int i = 0; i < static_cast<int>(globalMuonsVector.size()); i++) {
23732400
VarTrack fgValuesTmp;
23742401
auto muonCandidate = muons.rawIteratorAt(globalMuonsVector[i]);
23752402
FillTrack<0>(muonCandidate, fgValuesTmp);
@@ -2473,6 +2500,21 @@ struct muonQa {
24732500
if ((sign1 * sign2) >= 0)
24742501
continue;
24752502

2503+
const auto& muonPos = fgValuesMuon1.sign > 0 ? fgValuesMuon1 : fgValuesMuon2;
2504+
const auto& muonNeg = fgValuesMuon1.sign < 0 ? fgValuesMuon1 : fgValuesMuon2;
2505+
// μ⁺ variables
2506+
double muPosPt = muonPos.pT;
2507+
double muPosEta = muonPos.eta;
2508+
double muPosRabs = muonPos.rabs;
2509+
double muPosPhi = muonPos.phi * 180.0 / TMath::Pi();
2510+
double muPosDca = std::sqrt(muonPos.dcaX * muonPos.dcaX + muonPos.dcaY * muonPos.dcaY);
2511+
// μ⁻ variables
2512+
double muNegPt = muonNeg.pT;
2513+
double muNegEta = muonNeg.eta;
2514+
double muNegRabs = muonNeg.rabs;
2515+
double muNegPhi = muonNeg.phi * 180.0 / TMath::Pi();
2516+
double muNegDca = std::sqrt(muonNeg.dcaX * muonNeg.dcaX + muonNeg.dcaY * muonNeg.dcaY);
2517+
24762518
int Quadrant1 = GetQuadrantPhi(muonTrack1.phi() * 180.0 / TMath::Pi());
24772519
int Quadrant2 = GetQuadrantPhi(muonTrack2.phi() * 180.0 / TMath::Pi());
24782520
int TopBottom1 = (Quadrant1 == 0 || Quadrant1 == 1) ? 0 : 1;
@@ -2491,6 +2533,22 @@ struct muonQa {
24912533
if (goodMuonTracks) {
24922534
if (sameEvent) {
24932535
// same-event case
2536+
// single muons
2537+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosPt_MuonKine_MuonCuts"))->Fill(mass, pT, muPosPt);
2538+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegPt_MuonKine_MuonCuts"))->Fill(mass, pT, muNegPt);
2539+
//
2540+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosEta_MuonKine_MuonCuts"))->Fill(mass, pT, muPosEta);
2541+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegEta_MuonKine_MuonCuts"))->Fill(mass, pT, muNegEta);
2542+
//
2543+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosRabs_MuonKine_MuonCuts"))->Fill(mass, pT, muPosRabs);
2544+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegRabs_MuonKine_MuonCuts"))->Fill(mass, pT, muNegRabs);
2545+
//
2546+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosDca_MuonKine_MuonCuts"))->Fill(mass, pT, muPosDca);
2547+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegDca_MuonKine_MuonCuts"))->Fill(mass, pT, muNegDca);
2548+
//
2549+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosPhi_MuonKine_MuonCuts"))->Fill(mass, pT, muPosPhi);
2550+
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegPhi_MuonKine_MuonCuts"))->Fill(mass, pT, muNegPhi);
2551+
// dimuons
24942552
registryDimuon.get<TH1>(HIST("dimuon/same-event/invariantMass_MuonKine_MuonCuts"))->Fill(mass);
24952553
registryDimuon.get<TH1>(HIST("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts"))->Fill(mass);
24962554
registryDimuon.get<TH2>(HIST("dimuon/same-event/invariantMass_pT_MuonKine_MuonCuts"))->Fill(mass, pT);

0 commit comments

Comments
 (0)