@@ -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