Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 63 additions & 5 deletions Common/Tasks/qaMuon.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,12 @@
#include "Math/Vector4D.h"
#include "TGeoGlobalMagField.h"

#include <algorithm>
#include <chrono>
#include <map>
#include <string>
#include <utility>
#include <vector>

using namespace std;
using namespace o2;
Expand Down Expand Up @@ -140,8 +145,8 @@
};

struct VarClusters {
vector<vector<float>> posClusters; // (x,y,z)

Check failure on line 148 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.
vector<vector<float>> errorClusters; // (ex,ey)

Check failure on line 149 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.
vector<int> DEIDs;
};

Expand Down Expand Up @@ -562,12 +567,34 @@
}

if (configQAs.fEnableQADimuon) {
// single muons
AxisSpec transverseMomentumAxis = {1000, 0, 100, "p_{T} (GeV/c)"};
AxisSpec etaAxis = {80, -5, -1, "#eta"};
AxisSpec rAbsAxis = {100, 0., 100.0, "R_{abs} (cm)"};
AxisSpec dcaAxis = {400, 0.0, 20.0, "DCA"};
AxisSpec phiAxis = {360, -180.0, 180.0, "#phi (degrees)"};
// dimuons
AxisSpec invMassAxis = {400, 1, 5, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"};
AxisSpec invMassCorrelationAxis = {80, 0, 8, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"};
AxisSpec invMassAxisFull = {5000, 0, 100, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"};
AxisSpec yPairAxis = {120, 0.0, 6.0, "#y_{pair}"};
AxisSpec invMassAxis2D = {750, 0, 15, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"};
AxisSpec pTAxis2D = {120, 0, 30, "p_{T} (GeV/c)"};
// Single muons - dimuons correlations
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosPt_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, transverseMomentumAxis}});
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegPt_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, transverseMomentumAxis}});
//
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosEta_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, etaAxis}});
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegEta_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, etaAxis}});
//
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosRabs_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, rAbsAxis}});
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegRabs_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, rAbsAxis}});
//
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosDca_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, dcaAxis}});
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegDca_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, dcaAxis}});
//
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosPhi_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{+}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, phiAxis}});
registryDimuon.add("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegPhi_MuonKine_MuonCuts", "#mu^{+}#mu^{-} and #mu^{-}", {HistType::kTH3F, {invMassAxis2D, pTAxis2D, phiAxis}});
// MCH-MID tracks with MCH acceptance cuts
registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_MuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}});
registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}});
Expand Down Expand Up @@ -1321,7 +1348,7 @@
{
int removable = 0;
auto clustersSliced = mchcls.sliceBy(perMuon, muon.globalIndex()); // Slice clusters by muon id
vector<vector<float>> posClusters;

Check failure on line 1351 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.

int clIndex = -1;
// Get re-aligned clusters associated to current track
Expand Down Expand Up @@ -1433,9 +1460,9 @@
fgValues.phi = propmuon.getPhi();

fgValues.p = propmuon.getP();
fgValues.px = propmuon.getP() * sin(M_PI / 2 - atan(propmuon.getTgl())) * cos(propmuon.getPhi());

Check failure on line 1463 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.
fgValues.py = propmuon.getP() * sin(M_PI / 2 - atan(propmuon.getTgl())) * sin(propmuon.getPhi());

Check failure on line 1464 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.
fgValues.pz = propmuon.getP() * cos(M_PI / 2 - atan(propmuon.getTgl()));

Check failure on line 1465 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.
}

if (endPoint == kToDCA) {
Expand Down Expand Up @@ -1505,8 +1532,8 @@
double pMCH = fgValuesMCH.p;
int sign = fgValuesMCH.sign;

double px = pMCH * sin(M_PI / 2 - atan(muon.tgl())) * cos(muon.phi());

Check failure on line 1535 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.
double py = pMCH * sin(M_PI / 2 - atan(muon.tgl())) * sin(muon.phi());

Check failure on line 1536 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.
// double pz = pMCH * cos(M_PI / 2 - atan(mft.tgl()));
double pt = std::sqrt(std::pow(px, 2) + std::pow(py, 2));

Expand Down Expand Up @@ -1572,8 +1599,8 @@
fgValues.phi = propmuon.getPhi();

fgValues.p = propmuon.getP();
fgValues.px = propmuon.getP() * sin(M_PI / 2 - atan(propmuon.getTgl())) * cos(propmuon.getPhi());

Check failure on line 1602 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.
fgValues.py = propmuon.getP() * sin(M_PI / 2 - atan(propmuon.getTgl())) * sin(propmuon.getPhi());

Check failure on line 1603 in Common/Tasks/qaMuon.cxx

View workflow job for this annotation

GitHub Actions / O2 linter

[std-prefix]

Use std:: prefix for names from the std namespace.
fgValues.pz = propmuon.getP() * cos(M_PI / 2 - atan(propmuon.getTgl()));
}

Expand Down Expand Up @@ -1796,7 +1823,7 @@
std::vector<std::array<double, 2>> yPos;
std::vector<std::array<double, 2>> thetax;
std::vector<std::array<double, 2>> thetay;
for (int zi = 0; zi < int(zRefPlane.size()); zi++) {
for (int zi = 0; zi < static_cast<int>(zRefPlane.size()); zi++) {
xPos.emplace_back(std::array<double, 2>{fgVectorsMCH[zi].x, fgVectorsMFT[zi].x});
yPos.emplace_back(std::array<double, 2>{fgVectorsMCH[zi].y, fgVectorsMFT[zi].y});
thetax.emplace_back(std::array<double, 2>{
Expand All @@ -1807,7 +1834,7 @@
std::atan2(fgVectorsMFT[zi].py, -1.0 * fgVectorsMFT[zi].pz) * 180 / TMath::Pi()});
}

for (int i = 0; i < int(zRefPlane.size()); i++) {
for (int i = 0; i < static_cast<int>(zRefPlane.size()); i++) {
if (same) {
std::get<std::shared_ptr<TH2>>(trackResidualsHistos[i][quadrant]["dx_vs_x"])->Fill(std::fabs(xPos[i][1]), xPos[i][0] - xPos[i][1]);
std::get<std::shared_ptr<TH2>>(trackResidualsHistos[i][quadrant]["dx_vs_y"])->Fill(std::fabs(yPos[i][1]), xPos[i][0] - xPos[i][1]);
Expand Down Expand Up @@ -2180,7 +2207,7 @@
}

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

double phiCls = std::atan2(fgValuesClsTmp.posClusters[iCls][1], fgValuesClsTmp.posClusters[iCls][0]) * 180 / TMath::Pi();
int quadrantCls = GetQuadrantPhi(phiCls);
Expand Down Expand Up @@ -2327,7 +2354,7 @@
FillMatching(muontrack, fgValuesMCH, fgValuesMFT);

//// Fill global informations
registry.get<TH1>(HIST("global-muons/NCandidates"))->Fill(int(globalMuonsVector.size()));
registry.get<TH1>(HIST("global-muons/NCandidates"))->Fill(static_cast<int>(globalMuonsVector.size()));
for (size_t candidateIndex = 0; candidateIndex < globalMuonsVector.size(); candidateIndex++) {
auto const& muon = muons.rawIteratorAt(globalMuonsVector[candidateIndex]);
registry.get<TH2>(HIST("global-muons/MatchChi2"))->Fill(muon.chi2MatchMCHMFT(), candidateIndex);
Expand Down Expand Up @@ -2369,7 +2396,7 @@
}

//// Fill global muon candidates info
for (int i = 0; i < int(globalMuonsVector.size()); i++) {
for (int i = 0; i < static_cast<int>(globalMuonsVector.size()); i++) {
VarTrack fgValuesTmp;
auto muonCandidate = muons.rawIteratorAt(globalMuonsVector[i]);
FillTrack<0>(muonCandidate, fgValuesTmp);
Expand Down Expand Up @@ -2473,6 +2500,21 @@
if ((sign1 * sign2) >= 0)
continue;

const auto& muonPos = fgValuesMuon1.sign > 0 ? fgValuesMuon1 : fgValuesMuon2;
const auto& muonNeg = fgValuesMuon1.sign < 0 ? fgValuesMuon1 : fgValuesMuon2;
// μ⁺ variables
double muPosPt = muonPos.pT;
double muPosEta = muonPos.eta;
double muPosRabs = muonPos.rabs;
double muPosPhi = muonPos.phi * 180.0 / TMath::Pi();
double muPosDca = std::sqrt(muonPos.dcaX * muonPos.dcaX + muonPos.dcaY * muonPos.dcaY);
// μ⁻ variables
double muNegPt = muonNeg.pT;
double muNegEta = muonNeg.eta;
double muNegRabs = muonNeg.rabs;
double muNegPhi = muonNeg.phi * 180.0 / TMath::Pi();
double muNegDca = std::sqrt(muonNeg.dcaX * muonNeg.dcaX + muonNeg.dcaY * muonNeg.dcaY);

int Quadrant1 = GetQuadrantPhi(muonTrack1.phi() * 180.0 / TMath::Pi());
int Quadrant2 = GetQuadrantPhi(muonTrack2.phi() * 180.0 / TMath::Pi());
int TopBottom1 = (Quadrant1 == 0 || Quadrant1 == 1) ? 0 : 1;
Expand All @@ -2491,6 +2533,22 @@
if (goodMuonTracks) {
if (sameEvent) {
// same-event case
// single muons
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosPt_MuonKine_MuonCuts"))->Fill(mass, pT, muPosPt);
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegPt_MuonKine_MuonCuts"))->Fill(mass, pT, muNegPt);
//
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosEta_MuonKine_MuonCuts"))->Fill(mass, pT, muPosEta);
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegEta_MuonKine_MuonCuts"))->Fill(mass, pT, muNegEta);
//
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosRabs_MuonKine_MuonCuts"))->Fill(mass, pT, muPosRabs);
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegRabs_MuonKine_MuonCuts"))->Fill(mass, pT, muNegRabs);
//
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosDca_MuonKine_MuonCuts"))->Fill(mass, pT, muPosDca);
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegDca_MuonKine_MuonCuts"))->Fill(mass, pT, muNegDca);
//
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuPosPhi_MuonKine_MuonCuts"))->Fill(mass, pT, muPosPhi);
registryDimuon.get<TH3>(HIST("dimuon/same-event/single-muon-dimuon-correlations/invariantMass_pT_MuNegPhi_MuonKine_MuonCuts"))->Fill(mass, pT, muNegPhi);
// dimuons
registryDimuon.get<TH1>(HIST("dimuon/same-event/invariantMass_MuonKine_MuonCuts"))->Fill(mass);
registryDimuon.get<TH1>(HIST("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts"))->Fill(mass);
registryDimuon.get<TH2>(HIST("dimuon/same-event/invariantMass_pT_MuonKine_MuonCuts"))->Fill(mass, pT);
Expand Down
Loading