Skip to content

Commit 38d2771

Browse files
committed
[PWGDQ] added MCH residual plots to QA task
The plots provide the residuals between the MFT tracks and the MCH clusters for all the MCH chambers
1 parent c2a0338 commit 38d2771

File tree

1 file changed

+180
-69
lines changed

1 file changed

+180
-69
lines changed

PWGDQ/Tasks/qaMuon.cxx

Lines changed: 180 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,35 @@ struct qaMuon {
136136
o2::ccdb::CcdbApi ccdbApi;
137137

138138
HistogramRegistry registry{"registry", {}};
139+
HistogramRegistry registryResiduals{"registryResiduals", {}};
140+
141+
std::array<double, 5> zRefPlane{
142+
firstMFTPlaneZ,
143+
lastMFTPlaneZ,
144+
-90.0,
145+
-300.0,
146+
//-505.0,
147+
-520.0
148+
};
149+
std::vector<std::pair<std::string, double>> referencePlanes{
150+
{"MFT-begin", 10.0},
151+
{"MFT-end", 15.0},
152+
{"absorber-begin", 20.0},
153+
{"absorber-mid", 75.0},
154+
//{"absorber-end", 100.0},
155+
{"MCH-begin", 100.0}
156+
};
157+
std::array<std::string, 4> quadrants = {"Q0", "Q1", "Q2", "Q3"};
158+
139159

140160
std::array<std::array<std::unordered_map<std::string, o2::framework::HistPtr>, 4>, 2> dcaHistos;
141161
std::array<std::array<std::unordered_map<std::string, o2::framework::HistPtr>, 4>, 2> dcaHistosMixedEvents;
142162

143-
std::array<std::array<std::unordered_map<std::string, o2::framework::HistPtr>, 4>, 4> alignmentHistos;
144-
std::array<std::array<std::unordered_map<std::string, o2::framework::HistPtr>, 4>, 4> alignmentHistosMixedEvents;
163+
std::array<std::array<std::unordered_map<std::string, o2::framework::HistPtr>, 4>, 6> alignmentHistos;
164+
std::array<std::array<std::unordered_map<std::string, o2::framework::HistPtr>, 4>, 6> alignmentHistosMixedEvents;
165+
166+
std::array<std::array<std::unordered_map<std::string, o2::framework::HistPtr>, 10>, 4> residualsHistos;
167+
std::array<std::array<std::unordered_map<std::string, o2::framework::HistPtr>, 10>, 4> residualsHistosMixedEvents;
145168

146169
// vector of all MFT-MCH(-MID) matching candidates associated to the same MCH(-MID) track,
147170
// to be sorted in descending order with respect to the matching quality
@@ -270,17 +293,8 @@ struct qaMuon {
270293

271294
void CreateAlignementHistos()
272295
{
273-
std::vector<std::pair<std::string, double>> referencePlanes = {
274-
{"MFT-begin", 15.0},
275-
{"MFT-end", 20.0},
276-
{"absorber-mid", 75.0},
277-
{"absorber-end", 100.0}
278-
};
279-
280-
std::array<std::string, 4> quadrants = {"Q0", "Q1", "Q2", "Q3"};
281-
282-
AxisSpec dcaxMFTAxis = {400, -1.0, 1.0, "DCA_{x}"};
283-
AxisSpec dcayMFTAxis = {400, -1.0, 1.0, "DCA_{y}"};
296+
AxisSpec dcaxMFTAxis = {400, -0.5, 0.5, "DCA_{x}"};
297+
AxisSpec dcayMFTAxis = {400, -0.5, 0.5, "DCA_{y}"};
284298
AxisSpec dcaxMCHAxis = {400, -10.0, 10.0, "DCA_{x}"};
285299
AxisSpec dcayMCHAxis = {400, -10.0, 10.0, "DCA_{y}"};
286300
AxisSpec dxAxis = {600, -30.0, 30.0, "#Delta x (cm)"};
@@ -347,7 +361,29 @@ struct qaMuon {
347361
alignmentHistosMixedEvents[i][j]["dthetay_vs_thetay"] = registry.add((histPath + "dthetay_vs_thetay").c_str(), std::format("#Delta #theta_y vs. |#theta_y| - {}", quadrant).c_str(), {HistType::kTH2F, {thetayAxis, dThetayAxis}});
348362
}
349363
}
350-
}
364+
365+
for (size_t j = 0; j < quadrants.size(); j++) {
366+
const auto& quadrant = quadrants[j];
367+
AxisSpec xAxis = {20, 0, 200, "|x| (cm)"};
368+
AxisSpec yAxis = {10, 0, 200, "|y| (cm)"};
369+
for (int chamber = 0; chamber < 10; chamber++) {
370+
std::string histPath = std::string("alignment/residuals/") + quadrant + "/CH" + std::to_string(chamber +1) + "/";
371+
// Delta x at cluster
372+
residualsHistos[j][chamber]["dx_vs_x"] = registryResiduals.add((histPath + "dx_vs_x").c_str(), "Cluster x residual vs. x", {HistType::kTH2F, {xAxis, dxAxis}});
373+
residualsHistos[j][chamber]["dx_vs_y"] = registryResiduals.add((histPath + "dx_vs_y").c_str(), "Cluster x residual vs. y", {HistType::kTH2F, {yAxis, dxAxis}});
374+
residualsHistos[j][chamber]["dy_vs_x"] = registryResiduals.add((histPath + "dy_vs_x").c_str(), "Cluster y residual vs. x", {HistType::kTH2F, {xAxis, dyAxis}});
375+
residualsHistos[j][chamber]["dy_vs_y"] = registryResiduals.add((histPath + "dy_vs_y").c_str(), "Cluster y residual vs. y", {HistType::kTH2F, {yAxis, dyAxis}});
376+
377+
// mixed events
378+
histPath = std::string("alignment/mixed-events/residuals/") + quadrant + "/CH" + std::to_string(chamber +1) + "/";
379+
// Delta x at cluster
380+
residualsHistosMixedEvents[j][chamber]["dx_vs_x"] = registryResiduals.add((histPath + "dx_vs_x").c_str(), "Cluster x residual vs. x", {HistType::kTH2F, {xAxis, dxAxis}});
381+
residualsHistosMixedEvents[j][chamber]["dx_vs_y"] = registryResiduals.add((histPath + "dx_vs_y").c_str(), "Cluster x residual vs. y", {HistType::kTH2F, {yAxis, dxAxis}});
382+
residualsHistosMixedEvents[j][chamber]["dy_vs_x"] = registryResiduals.add((histPath + "dy_vs_x").c_str(), "Cluster y residual vs. x", {HistType::kTH2F, {xAxis, dyAxis}});
383+
residualsHistosMixedEvents[j][chamber]["dy_vs_y"] = registryResiduals.add((histPath + "dy_vs_y").c_str(), "Cluster y residual vs. y", {HistType::kTH2F, {yAxis, dyAxis}});
384+
}
385+
}
386+
}
351387

352388
void init(o2::framework::InitContext&)
353389
{
@@ -528,10 +564,8 @@ struct qaMuon {
528564
*/
529565
}
530566

531-
template<class T>
532-
double GetQuadrant(const T& track)
567+
int GetQuadrant(double phi)
533568
{
534-
double phi = track.phi() * 180 / TMath::Pi();
535569
if (phi >= 0 && phi < 90) {
536570
return 0;
537571
}
@@ -547,6 +581,13 @@ struct qaMuon {
547581
return -1;
548582
}
549583

584+
template<class T>
585+
int GetQuadrant(const T& track)
586+
{
587+
double phi = track.phi() * 180 / TMath::Pi();
588+
return GetQuadrant(phi);
589+
}
590+
550591
template<class T, class C>
551592
double GetDCA(const T& track, const C& collision)
552593
{
@@ -1238,11 +1279,7 @@ struct qaMuon {
12381279
track.setCovariances(tcovs);
12391280
auto mchTrack = sExtrap.FwdtoMCH(track);
12401281

1241-
if (z > -505.) {
1242-
o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, z);
1243-
} else {
1244-
o2::mch::TrackExtrap::extrapToZ(mchTrack, z);
1245-
}
1282+
o2::mch::TrackExtrap::extrapToZ(mchTrack, z);
12461283

12471284
auto proptrack = sExtrap.MCHtoFwd(mchTrack);
12481285
o2::dataformats::GlobalFwdTrack propmuon;
@@ -1294,7 +1331,6 @@ struct qaMuon {
12941331
constexpr double doubleMin = std::numeric_limits<double>::min();
12951332
constexpr double doubleMax = std::numeric_limits<double>::max();
12961333

1297-
std::array<double, 4> zRefPlane = {firstMFTPlaneZ, lastMFTPlaneZ, -300.0, -505.0};
12981334

12991335
// outer loop over collisions
13001336
for (auto& [collisionIndex1, collisionInfo1] : collisionInfos) {
@@ -1318,12 +1354,10 @@ struct qaMuon {
13181354
bool isGoodMuon = IsGoodMuon(mchTrack, collision1, fTrackChi2MchUp, 20.0, fPtMchLow, {fEtaMftLow, fEtaMftUp}, {fRabsLow, fRabsUp}, fSigmaPdcaUp);
13191355
if (!isGoodMuon) continue;
13201356

1321-
std::array<o2::dataformats::GlobalFwdTrack, 4> mchTrackExtrap = {
1322-
PropagateToZMCH(mchTrack, zRefPlane[0]),
1323-
PropagateToZMCH(mchTrack, zRefPlane[1]),
1324-
PropagateToZMCH(mchTrack, zRefPlane[2]),
1325-
PropagateToZMCH(mchTrack, zRefPlane[3])
1326-
};
1357+
std::vector<o2::dataformats::GlobalFwdTrack> mchTrackExtrap;
1358+
for (double z : zRefPlane) {
1359+
mchTrackExtrap.emplace_back(PropagateToZMCH(mchTrack, z));
1360+
}
13271361

13281362
// inner loop over collisions
13291363
for (auto& [collisionIndex2, collisionInfo2] : collisionInfos) {
@@ -1348,50 +1382,36 @@ struct qaMuon {
13481382
bool isGoodMFT = IsGoodMFT(mftTrack, fTrackChi2MftUp, fTrackNClustMftLow);
13491383
if (!isGoodMFT) continue;
13501384

1385+
std::vector<o2::dataformats::GlobalFwdTrack> mftTrackExtrap;
1386+
for (double z : zRefPlane) {
1387+
mftTrackExtrap.emplace_back(PropagateToZMFT(mftTrack, mchTrackExtrap[1].getP(), z));
1388+
}
1389+
1390+
std::vector<std::array<double, 2>> xPos;
1391+
std::vector<std::array<double, 2>> yPos;
1392+
std::vector<std::array<double, 2>> thetax;
1393+
std::vector<std::array<double, 2>> thetay;
1394+
for (int zi = 0; zi < zRefPlane.size(); zi++) {
1395+
xPos.emplace_back(std::array<double, 2>{mchTrackExtrap[zi].getX(), mftTrackExtrap[zi].getX()});
1396+
yPos.emplace_back(std::array<double, 2>{mchTrackExtrap[zi].getY(), mftTrackExtrap[zi].getY()});
1397+
thetax.emplace_back(std::array<double, 2>{
1398+
std::atan2(mchTrackExtrap[zi].getPx(), -1.0 * mchTrackExtrap[zi].getPz()) * 180 / TMath::Pi(),
1399+
std::atan2(mftTrackExtrap[zi].getPx(), -1.0 * mftTrackExtrap[zi].getPz()) * 180 / TMath::Pi()
1400+
});
1401+
thetay.emplace_back(std::array<double, 2>{
1402+
std::atan2(mchTrackExtrap[zi].getPy(), -1.0 * mchTrackExtrap[zi].getPz()) * 180 / TMath::Pi(),
1403+
std::atan2(mftTrackExtrap[zi].getPy(), -1.0 * mftTrackExtrap[zi].getPz()) * 180 / TMath::Pi()
1404+
});
1405+
}
1406+
/*
13511407
std::array<o2::dataformats::GlobalFwdTrack, 4> mftTrackExtrap = {
13521408
PropagateToZMFT(mftTrack, mchTrackExtrap[1].getP(), zRefPlane[0]),
13531409
PropagateToZMFT(mftTrack, mchTrackExtrap[1].getP(), zRefPlane[1]),
13541410
PropagateToZMFT(mftTrack, mchTrackExtrap[1].getP(), zRefPlane[2]),
13551411
PropagateToZMFT(mftTrack, mchTrackExtrap[1].getP(), zRefPlane[3])
13561412
};
13571413
1358-
std::array<std::array<double, 2>, 4> xPos = {{
1359-
{{mchTrackExtrap[0].getX(), mftTrackExtrap[0].getX()}},
1360-
{{mchTrackExtrap[1].getX(), mftTrackExtrap[1].getX()}},
1361-
{{mchTrackExtrap[2].getX(), mftTrackExtrap[2].getX()}},
1362-
{{mchTrackExtrap[3].getX(), mftTrackExtrap[3].getX()}}
1363-
}};
1364-
1365-
std::array<std::array<double, 2>, 4> yPos = {{
1366-
{{mchTrackExtrap[0].getY(), mftTrackExtrap[0].getY()}},
1367-
{{mchTrackExtrap[1].getY(), mftTrackExtrap[1].getY()}},
1368-
{{mchTrackExtrap[2].getY(), mftTrackExtrap[2].getY()}},
1369-
{{mchTrackExtrap[3].getY(), mftTrackExtrap[3].getY()}}
1370-
}};
1371-
1372-
std::array<std::array<double, 2>, 4> thetax = {{
1373-
{{std::atan2(mchTrackExtrap[0].getPx(), -1.0 * mchTrackExtrap[0].getPz()) * 180 / TMath::Pi(),
1374-
std::atan2(mftTrackExtrap[0].getPx(), -1.0 * mftTrackExtrap[0].getPz()) * 180 / TMath::Pi()}},
1375-
{{std::atan2(mchTrackExtrap[1].getPx(), -1.0 * mchTrackExtrap[1].getPz()) * 180 / TMath::Pi(),
1376-
std::atan2(mftTrackExtrap[1].getPx(), -1.0 * mftTrackExtrap[1].getPz()) * 180 / TMath::Pi()}},
1377-
{{std::atan2(mchTrackExtrap[2].getPx(), -1.0 * mchTrackExtrap[2].getPz()) * 180 / TMath::Pi(),
1378-
std::atan2(mftTrackExtrap[2].getPx(), -1.0 * mftTrackExtrap[2].getPz()) * 180 / TMath::Pi()}},
1379-
{{std::atan2(mchTrackExtrap[3].getPx(), -1.0 * mchTrackExtrap[3].getPz()) * 180 / TMath::Pi(),
1380-
std::atan2(mftTrackExtrap[3].getPx(), -1.0 * mftTrackExtrap[3].getPz()) * 180 / TMath::Pi()}}
1381-
}};
1382-
1383-
std::array<std::array<double, 2>, 4> thetay = {{
1384-
{{std::atan2(mchTrackExtrap[0].getPy(), -1.0 * mchTrackExtrap[0].getPz()) * 180 / TMath::Pi(),
1385-
std::atan2(mftTrackExtrap[0].getPy(), -1.0 * mftTrackExtrap[0].getPz()) * 180 / TMath::Pi()}},
1386-
{{std::atan2(mchTrackExtrap[1].getPy(), -1.0 * mchTrackExtrap[1].getPz()) * 180 / TMath::Pi(),
1387-
std::atan2(mftTrackExtrap[1].getPy(), -1.0 * mftTrackExtrap[1].getPz()) * 180 / TMath::Pi()}},
1388-
{{std::atan2(mchTrackExtrap[2].getPy(), -1.0 * mchTrackExtrap[2].getPz()) * 180 / TMath::Pi(),
1389-
std::atan2(mftTrackExtrap[2].getPy(), -1.0 * mftTrackExtrap[2].getPz()) * 180 / TMath::Pi()}},
1390-
{{std::atan2(mchTrackExtrap[3].getPy(), -1.0 * mchTrackExtrap[3].getPz()) * 180 / TMath::Pi(),
1391-
std::atan2(mftTrackExtrap[3].getPy(), -1.0 * mftTrackExtrap[3].getPz()) * 180 / TMath::Pi()}}
1392-
}};
1393-
1394-
for (int i = 0; i < 4; i++) {
1414+
for (int i = 0; i < zRefPlane.size(); i++) {
13951415
if (sameEvent) {
13961416
//std::cout << std::format("[TOTO1] X at abosrber end: {:0.2f} {:0.2f}", xPos[3][0], xPos[3][1]) << std::endl;
13971417
//std::cout << std::format("[TOTO2] Fill({:0.2f}, {:0.2f})", std::fabs(xPos[i][1]), xPos[i][0] - xPos[i][1]) << std::endl;
@@ -1427,7 +1447,6 @@ struct qaMuon {
14271447
}
14281448
}
14291449
1430-
14311450
void FillDCAPlots(MyEvents const& collisions,
14321451
aod::BCsWithTimestamps const& bcs,
14331452
MyMuonsWithCov const& muonTracks,
@@ -1448,7 +1467,7 @@ struct qaMuon {
14481467
14491468
int quadrant = GetQuadrant(mchTrack);
14501469
1451-
bool isGoodMuon = IsGoodMuon(mchTrack, collision1, fTrackChi2MchUp, 20.0, fPtMchLow, {fEtaMftLow, fEtaMftUp}, {fRabsLow, fRabsUp}, fSigmaPdcaUp);
1470+
bool isGoodMuon = IsGoodMuon(mchTrack, collision1, fTrackChi2MchUp, 30.0, 4.0, {fEtaMftLow, fEtaMftUp}, {fRabsLow, fRabsUp}, fSigmaPdcaUp);
14521471
if (!isGoodMuon) continue;
14531472
14541473
// inner loop over collisions
@@ -1538,6 +1557,97 @@ struct qaMuon {
15381557
}
15391558
}
15401559
1560+
void FillResidualsPlots(MyEvents const& collisions,
1561+
aod::BCsWithTimestamps const& bcs,
1562+
MyMuonsWithCov const& muonTracks,
1563+
MyMFTs const& mftTracks,
1564+
aod::FwdTrkCls const& clusters,
1565+
const std::map<uint64_t, CollisionInfo>& collisionInfos)
1566+
{
1567+
constexpr double doubleMin = std::numeric_limits<double>::min();
1568+
constexpr double doubleMax = std::numeric_limits<double>::max();
1569+
1570+
1571+
// outer loop over collisions
1572+
for (auto& [collisionIndex1, collisionInfo1] : collisionInfos) {
1573+
auto const& collision1 = collisions.rawIteratorAt(collisionIndex1);
1574+
int64_t bc1 = bcs.rawIteratorAt(collision1.bcId()).globalBC();
1575+
1576+
// outer loop over global muon tracks
1577+
for (auto& [muonIndex, globalTracksVector] : collisionInfo1.globalMuonTracks) {
1578+
auto const& muonTrack = muonTracks.rawIteratorAt(globalTracksVector[0]);
1579+
const auto& mchTrack = muonTrack.template matchMCHTrack_as<MyMuonsWithCov>();
1580+
const auto& mftTrack = muonTrack.template matchMFTTrack_as<MyMFTs>();
1581+
1582+
bool isGoodMuon = IsGoodMuon(mchTrack, collision1, fTrackChi2MchUp, 20.0, fPtMchLow, {fEtaMftLow, fEtaMftUp}, {fRabsLow, fRabsUp}, fSigmaPdcaUp);
1583+
if (!isGoodMuon) continue;
1584+
1585+
bool isGoodMFT = IsGoodMFT(mftTrack, fTrackChi2MftUp, fTrackNClustMftLow);
1586+
if (!isGoodMFT) continue;
1587+
1588+
auto mchTrackAtMFT = PropagateToZMCH(mchTrack, muonTrack.z());
1589+
double mchMomentumAtMFT = mchTrackAtMFT.getP();
1590+
1591+
// inner loop over collisions
1592+
for (auto& [collisionIndex2, collisionInfo2] : collisionInfos) {
1593+
auto const& collision2 = collisions.rawIteratorAt(collisionIndex2);
1594+
int64_t bc2 = bcs.rawIteratorAt(collision2.bcId()).globalBC();
1595+
1596+
bool sameEvent = (bc1 == bc2);
1597+
bool mixedEvent = IsMixedEvent(collisionInfo1, collisionInfo2);
1598+
1599+
if (!sameEvent && !mixedEvent)
1600+
continue;
1601+
1602+
// inner loop over MCH tracks
1603+
for (auto mchIndex : collisionInfo2.mchTracks) {
1604+
auto const& mchTrack2 = muonTracks.rawIteratorAt(mchIndex);
1605+
1606+
// Loop over attached clusters
1607+
for (auto const& cluster : clusters) {
1608+
1609+
//std::cout << "Checking cluster" << std::endl;
1610+
if (cluster.template fwdtrack_as<MyMuonsWithCov>() != mchTrack2) {
1611+
continue;
1612+
}
1613+
1614+
int deId = cluster.deId();
1615+
int chamber = deId / 100 - 1;
1616+
if (chamber < 0 || chamber > 9)
1617+
continue;
1618+
1619+
double xCluster = cluster.x();
1620+
double yCluster = cluster.y();
1621+
double zCluster = cluster.z();
1622+
double phiClus = std::atan2(yCluster, xCluster) * 180 / TMath::Pi();
1623+
1624+
int quadrant = GetQuadrant(phiClus);
1625+
1626+
auto mftTrackAtCluster = PropagateToZMFT(mftTrack, mchMomentumAtMFT, zCluster);
1627+
1628+
std::array<double, 2> xPos{xCluster, mftTrackAtCluster.getX()};
1629+
std::array<double, 2> yPos{yCluster, mftTrackAtCluster.getY()};
1630+
1631+
//std::cout << std::format("quadrant={} chamber={}", quadrant, chamber) << std::endl;
1632+
if (sameEvent) {
1633+
std::get<std::shared_ptr<TH2>>(residualsHistos[quadrant][chamber]["dx_vs_x"])->Fill(std::fabs(xPos[1]), xPos[0] - xPos[1]);
1634+
std::get<std::shared_ptr<TH2>>(residualsHistos[quadrant][chamber]["dx_vs_y"])->Fill(std::fabs(yPos[1]), xPos[0] - xPos[1]);
1635+
std::get<std::shared_ptr<TH2>>(residualsHistos[quadrant][chamber]["dy_vs_x"])->Fill(std::fabs(xPos[1]), yPos[0] - yPos[1]);
1636+
std::get<std::shared_ptr<TH2>>(residualsHistos[quadrant][chamber]["dy_vs_y"])->Fill(std::fabs(yPos[1]), yPos[0] - yPos[1]);
1637+
}
1638+
if (mixedEvent) {
1639+
std::get<std::shared_ptr<TH2>>(residualsHistosMixedEvents[quadrant][chamber]["dx_vs_x"])->Fill(std::fabs(xPos[1]), xPos[0] - xPos[1]);
1640+
std::get<std::shared_ptr<TH2>>(residualsHistosMixedEvents[quadrant][chamber]["dx_vs_y"])->Fill(std::fabs(yPos[1]), xPos[0] - xPos[1]);
1641+
std::get<std::shared_ptr<TH2>>(residualsHistosMixedEvents[quadrant][chamber]["dy_vs_x"])->Fill(std::fabs(xPos[1]), yPos[0] - yPos[1]);
1642+
std::get<std::shared_ptr<TH2>>(residualsHistosMixedEvents[quadrant][chamber]["dy_vs_y"])->Fill(std::fabs(yPos[1]), yPos[0] - yPos[1]);
1643+
}
1644+
}
1645+
}
1646+
}
1647+
}
1648+
}
1649+
}
1650+
15411651
void processQA(MyEvents const& collisions,
15421652
aod::BCsWithTimestamps const& bcs,
15431653
MyMuonsWithCov const& muonTracks,
@@ -1546,7 +1656,7 @@ struct qaMuon {
15461656
auto bc = bcs.begin();
15471657
if (mRunNumber != bc.runNumber()) {
15481658
initCCDB(bc);
1549-
grpmag = ccdbManager->getForTimeStamp<o2::parameters::GRPMagField>(grpmagPath, bc.timestamp());
1659+
grpmag = ccdbManager->getForTimeStamp<o2::parameters::GRPMagField>(grpmagPath, bc.timestamp());
15501660
if (grpmag != nullptr) {
15511661
LOGF(info, "Init field from GRP");
15521662
o2::base::Propagator::initFieldFromGRP(grpmag);
@@ -1565,6 +1675,7 @@ struct qaMuon {
15651675
15661676
FillDCAPlots(collisions, bcs, muonTracks, mftTracks, collisionInfos);
15671677
FillAlignmentPlots(collisions, bcs, muonTracks, mftTracks, collisionInfos);
1678+
FillResidualsPlots(collisions, bcs, muonTracks, mftTracks, clusters, collisionInfos);
15681679
}
15691680
15701681
PROCESS_SWITCH(qaMuon, processQA, "process qa", true);

0 commit comments

Comments
 (0)