1818#include " Common/CCDB/EventSelectionParams.h"
1919#include " Common/CCDB/RCTSelectionFlags.h"
2020#include " Common/Core/RecoDecay.h"
21+ #include " Common/Core/fwdtrackUtilities.h"
2122#include " Common/DataModel/EventSelection.h"
2223#include " Common/DataModel/TrackSelectionTables.h"
23- #include " Common/Core/fwdtrackUtilities.h"
2424
2525#include < CCDB/BasicCCDBManager.h>
2626#include < CCDB/CcdbApi.h>
8181#include < random>
8282#include < string>
8383#include < unordered_map>
84+ #include < utility>
8485#include < vector>
8586
8687using namespace o2 ;
@@ -111,7 +112,6 @@ using MyMFTCovariance = MyMFTCovariances::iterator;
111112using SMatrix55 = ROOT ::Math::SMatrix<double , 5 , 5 , ROOT ::Math::MatRepSym<double , 5 >>;
112113using SMatrix5 = ROOT ::Math::SVector<Double_t, 5 >;
113114
114-
115115using o2::dataformats::GlobalFwdTrack;
116116using o2::track::TrackParCovFwd;
117117
@@ -153,7 +153,9 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
153153 Configurable<int > cfgTrackNClustMftLow{" cfgTrackNClustMftLow" , 7 , " " };
154154 Configurable<float > cfgTrackChi2MftUp{" cfgTrackChi2MftUp" , 999 .f , " " };
155155
156- Configurable<float > cfgMftDcaMatchChi2Up{" cfgMftDcaMatchChi2Up" , 10 .f , " " };
156+ Configurable<float > cfgMftDcaMatchChi2Up{" cfgMftDcaMatchChi2Up" , 50 .f , " " };
157+ Configurable<float > cfgMftMchResidualsMatchChi2Up{" cfgMftMchResidualsMatchChi2Up" , 50 .f , " " };
158+ Configurable<float > cfgDimuonMatchChi2Up{" cfgDimuonMatchChi2Up" , 50 .f , " " };
157159
158160 Configurable<float > cfgMftMchResidualsPLow{" cfgMftMchResidualsPLow" , 30 .f , " " };
159161 Configurable<float > cfgMftMchResidualsPtLow{" cfgMftMchResidualsPtLow" , 4 .f , " " };
@@ -1963,7 +1965,7 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
19631965 const auto & mftTrack = muonTrack.template matchMFTTrack_as <MyMFTs>();
19641966 // int quadrant = GetQuadrant(mchTrack);
19651967 int quadrant = GetQuadrant (mftTrack);
1966- // int quadrantMCH = GetQuadrant(mchTrack);
1968+ // int quadrantMCH = GetQuadrant(mchTrack);
19671969 int posNeg = (mchTrack.sign () >= 0 ) ? 0 : 1 ;
19681970
19691971 auto mchIndex = mchTrack.globalIndex ();
@@ -2008,10 +2010,10 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
20082010 }
20092011 const auto & mchTrackParNew = mchTrackParNewIt->second ;
20102012
2011- double matchChi2 = muonTrack.chi2MatchMCHMFT () / 5 . f ;
2013+ double matchChi2 = muonTrack.chi2MatchMCHMFT ();
20122014
20132015 // Residuals analysis between MFT tracks and MCH clusters
2014- if (cfgEnableMftMchResidualsAnalysis && (matchChi2 <= 10 . f )) {
2016+ if (cfgEnableMftMchResidualsAnalysis && (matchChi2 <= cfgMftMchResidualsMatchChi2Up. value )) {
20152017 // loop over attached clusters
20162018 auto clustersSliced = clusters.sliceBy (perMuon, mchTrack.globalIndex ()); // Slice clusters by muon id
20172019 for (auto const & cluster : clustersSliced) {
@@ -2068,14 +2070,14 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
20682070 const auto mftTrackAtClusterWithCorr = PropagateMFTtoMCH (mftTrackParNew, FwdtoMCH (mchTrackParNew), masterRealign.z ());
20692071 const auto mftTrackParamAtClusterWithCorr = FwdtoMCH (mftTrackAtClusterWithCorr);
20702072
2071- const std::array<double , 2 > xPos {masterRealign.x (), mftTrackAtClusterWithCorr.getX ()};
2072- const std::array<double , 2 > yPos {masterRealign.y (), mftTrackAtClusterWithCorr.getY ()};
2073+ const std::array<double , 2 > xPosWithCorr {masterRealign.x (), mftTrackAtClusterWithCorr.getX ()};
2074+ const std::array<double , 2 > yPosWithCorr {masterRealign.y (), mftTrackAtClusterWithCorr.getY ()};
20732075
2074- registry.get <THnSparse>(HIST (" residuals/dx_vs_chamber_corr" ))->Fill (chamber + 1 , quadrant, posNeg, xPos [0 ] - xPos [1 ]);
2075- registry.get <THnSparse>(HIST (" residuals/dy_vs_chamber_corr" ))->Fill (chamber + 1 , quadrant, posNeg, yPos [0 ] - yPos [1 ]);
2076+ registry.get <THnSparse>(HIST (" residuals/dx_vs_chamber_corr" ))->Fill (chamber + 1 , quadrant, posNeg, xPosWithCorr [0 ] - xPosWithCorr [1 ]);
2077+ registry.get <THnSparse>(HIST (" residuals/dy_vs_chamber_corr" ))->Fill (chamber + 1 , quadrant, posNeg, yPosWithCorr [0 ] - yPosWithCorr [1 ]);
20762078
2077- registry.get <THnSparse>(HIST (" residuals/dx_vs_de_corr" ))->Fill (xPos [0 ] - xPos [1 ], deIndex, quadrant, posNeg, mchTrack.p (), mftTrackParamAtClusterWithCorr.getNonBendingSlope ());
2078- registry.get <THnSparse>(HIST (" residuals/dy_vs_de_corr" ))->Fill (yPos [0 ] - yPos [1 ], deIndex, quadrant, posNeg, mchTrack.p (), mftTrackParamAtClusterWithCorr.getBendingSlope ());
2079+ registry.get <THnSparse>(HIST (" residuals/dx_vs_de_corr" ))->Fill (xPosWithCorr [0 ] - xPosWithCorr [1 ], deIndex, quadrant, posNeg, mchTrack.p (), mftTrackParamAtClusterWithCorr.getNonBendingSlope ());
2080+ registry.get <THnSparse>(HIST (" residuals/dy_vs_de_corr" ))->Fill (yPosWithCorr [0 ] - yPosWithCorr [1 ], deIndex, quadrant, posNeg, mchTrack.p (), mftTrackParamAtClusterWithCorr.getBendingSlope ());
20792081 }
20802082 }
20812083
@@ -2097,16 +2099,16 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
20972099
20982100 if (!mchTrackParNew.isRemovable ()) {
20992101 const auto mchTrackAtDCAWithCorr = PropagateMCHParam (FwdtoMCH (mchTrackParNew), collision.posZ ());
2100- const auto dcax = mchTrackAtDCAWithCorr.getX () - collision.posX ();
2101- const auto dcay = mchTrackAtDCAWithCorr.getY () - collision.posY ();
2102+ const auto dcaxWithCorr = mchTrackAtDCAWithCorr.getX () - collision.posX ();
2103+ const auto dcayWithCorr = mchTrackAtDCAWithCorr.getY () - collision.posY ();
21022104
2103- registry.get <THnSparse>(HIST (" DCA/MCH/DCA_x_vs_sign_vs_quadrant_vs_mom_corr" ))->Fill (mchTrackParNew.getP (), quadrant, posNeg, dcax );
2104- registry.get <THnSparse>(HIST (" DCA/MCH/DCA_y_vs_sign_vs_quadrant_vs_mom_corr" ))->Fill (mchTrackParNew.getP (), quadrant, posNeg, dcay );
2105+ registry.get <THnSparse>(HIST (" DCA/MCH/DCA_x_vs_sign_vs_quadrant_vs_mom_corr" ))->Fill (mchTrackParNew.getP (), quadrant, posNeg, dcaxWithCorr );
2106+ registry.get <THnSparse>(HIST (" DCA/MCH/DCA_y_vs_sign_vs_quadrant_vs_mom_corr" ))->Fill (mchTrackParNew.getP (), quadrant, posNeg, dcayWithCorr );
21052107 }
21062108 }
21072109
21082110 // MFT-MCH track residuals analysis
2109- if (cfgEnableMftMchMatchingAnalysis && !mchTrackParNew.isRemovable () && (matchChi2 <= 10 . f )) {
2111+ if (cfgEnableMftMchMatchingAnalysis && !mchTrackParNew.isRemovable () && (matchChi2 <= cfgMftMchResidualsMatchChi2Up. value )) {
21102112 static constexpr int nRefPlanes = 2 ;
21112113 const std::array<double , nRefPlanes> refPlaneZ{cfgRefPlaneZMFT, cfgRefPlaneZMCH};
21122114
@@ -2142,39 +2144,39 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
21422144 }
21432145 }
21442146
2145- #define FILL_DIMUON_PLOT (trackPar1, trackPar2, trackPar1AtVertex, trackPar2AtVertex, histName ) \
2146- { \
2147- auto mumu4mom = getMuMu4Momentum (trackPar1AtVertex, trackPar2AtVertex); \
2148- double p = mumu4mom.P (); \
2149- double pT = mumu4mom.Pt (); \
2150- double mass = mumu4mom.M (); \
2147+ #define FILL_DIMUON_PLOT (trackPar1, trackPar2, trackPar1AtVertex, trackPar2AtVertex, histName ) \
2148+ { \
2149+ auto mumu4mom = getMuMu4Momentum (trackPar1AtVertex, trackPar2AtVertex); \
2150+ double p = mumu4mom.P (); \
2151+ double pT = mumu4mom.Pt (); \
2152+ double mass = mumu4mom.M (); \
21512153 int quadrant1 = GetQuadrant (static_cast <float >(std::atan2 (trackPar1.getY (), trackPar1.getX ()))); \
21522154 int quadrant2 = GetQuadrant (static_cast <float >(std::atan2 (trackPar2.getY (), trackPar2.getX ()))); \
2153- registry.get <THnSparse>(HIST (histName))->Fill (mass, p, pT, quadrant1, quadrant2); \
2155+ registry.get <THnSparse>(HIST (histName))->Fill (mass, p, pT, quadrant1, quadrant2); \
21542156 }
21552157
21562158#define FILL_DIMUON_DCA_PLOTS (trackPar1, trackPar2, trackPar1AtVertex, trackPar2AtVertex, trackPar1AtDca, trackPar2AtDca, histNameX, histNameY ) \
2157- { \
2158- auto mumu4mom = getMuMu4Momentum (trackPar1AtVertex, trackPar2AtVertex); \
2159- double p = mumu4mom.P (); \
2160- double pT = mumu4mom.Pt (); \
2161- double dcax = trackPar1AtDca.getX () - trackPar2AtDca.getX (); \
2162- double dcay = trackPar1AtDca.getY () - trackPar2AtDca.getY (); \
2163- int quadrant1 = GetQuadrant (static_cast <float >(std::atan2 (trackPar1.getY (), trackPar1.getX ()))); \
2164- int quadrant2 = GetQuadrant (static_cast <float >(std::atan2 (trackPar2.getY (), trackPar2.getX ()))); \
2165- registry.get <THnSparse>(HIST (histNameX))->Fill (dcax, p, pT, quadrant1, quadrant2); \
2166- registry.get <THnSparse>(HIST (histNameY))->Fill (dcay, p, pT, quadrant1, quadrant2); \
2159+ { \
2160+ auto mumu4mom = getMuMu4Momentum (trackPar1AtVertex, trackPar2AtVertex); \
2161+ double p = mumu4mom.P (); \
2162+ double pT = mumu4mom.Pt (); \
2163+ double dcax = trackPar1AtDca.getX () - trackPar2AtDca.getX (); \
2164+ double dcay = trackPar1AtDca.getY () - trackPar2AtDca.getY (); \
2165+ int quadrant1 = GetQuadrant (static_cast <float >(std::atan2 (trackPar1.getY (), trackPar1.getX ()))); \
2166+ int quadrant2 = GetQuadrant (static_cast <float >(std::atan2 (trackPar2.getY (), trackPar2.getX ()))); \
2167+ registry.get <THnSparse>(HIST (histNameX))->Fill (dcax, p, pT, quadrant1, quadrant2); \
2168+ registry.get <THnSparse>(HIST (histNameY))->Fill (dcay, p, pT, quadrant1, quadrant2); \
21672169 }
21682170
21692171#define FILL_DIMUON_ANGLE_PLOT (trackPar1, trackPar2, trackPar1AtVertex, trackPar2AtVertex, mchAngle, fwdAngle, histName ) \
2170- { \
2171- auto mumu4mom = getMuMu4Momentum (trackPar1AtVertex, trackPar2AtVertex); \
2172- double p = mumu4mom.P (); \
2173- double pT = mumu4mom.Pt (); \
2174- double dAngle = mchAngle - fwdAngle; \
2175- int quadrant1 = GetQuadrant (static_cast <float >(std::atan2 (trackPar1.getY (), trackPar1.getX ()))); \
2176- int quadrant2 = GetQuadrant (static_cast <float >(std::atan2 (trackPar2.getY (), trackPar2.getX ()))); \
2177- registry.get <THnSparse>(HIST (histName))->Fill (dAngle, fwdAngle, p, pT, quadrant1, quadrant2); \
2172+ { \
2173+ auto mumu4mom = getMuMu4Momentum (trackPar1AtVertex, trackPar2AtVertex); \
2174+ double p = mumu4mom.P (); \
2175+ double pT = mumu4mom.Pt (); \
2176+ double dAngle = mchAngle - fwdAngle; \
2177+ int quadrant1 = GetQuadrant (static_cast <float >(std::atan2 (trackPar1.getY (), trackPar1.getX ()))); \
2178+ int quadrant2 = GetQuadrant (static_cast <float >(std::atan2 (trackPar2.getY (), trackPar2.getX ()))); \
2179+ registry.get <THnSparse>(HIST (histName))->Fill (dAngle, fwdAngle, p, pT, quadrant1, quadrant2); \
21782180 }
21792181
21802182 void FillDimuonPlots (MyEvents const & collisions,
@@ -2210,7 +2212,6 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
22102212 continue ;
22112213 }
22122214
2213-
22142215 // get the pre-stored MCH track parameters
22152216 const auto mchTrackParIt1 = mMchTrackPars .find (mchIndex1);
22162217 if (mchTrackParIt1 == mMchTrackPars .end ()) {
@@ -2247,13 +2248,13 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
22472248 FILL_DIMUON_PLOT (mchTrackParNew1, mchTrackParNew2, mchTrackParNew1AtVertex, mchTrackParNew2AtVertex, " dimuon/realign/invariantMass_MuonKine_MuonCuts" );
22482249
22492250 FILL_DIMUON_DCA_PLOTS (mchTrackPar1, mchTrackPar2,
2250- mchTrackPar1AtVertex, mchTrackPar2AtVertex,
2251- mchTrackPar1AtDca, mchTrackPar2AtDca,
2252- " dimuon/dcax_MuonKine_MuonCuts" , " dimuon/dcay_MuonKine_MuonCuts" );
2251+ mchTrackPar1AtVertex, mchTrackPar2AtVertex,
2252+ mchTrackPar1AtDca, mchTrackPar2AtDca,
2253+ " dimuon/dcax_MuonKine_MuonCuts" , " dimuon/dcay_MuonKine_MuonCuts" );
22532254 FILL_DIMUON_DCA_PLOTS (mchTrackParNew1, mchTrackParNew2,
2254- mchTrackParNew1AtVertex, mchTrackParNew2AtVertex,
2255- mchTrackParNew1AtDca, mchTrackParNew2AtDca,
2256- " dimuon/realign/dcax_MuonKine_MuonCuts" , " dimuon/realign/dcay_MuonKine_MuonCuts" );
2255+ mchTrackParNew1AtVertex, mchTrackParNew2AtVertex,
2256+ mchTrackParNew1AtDca, mchTrackParNew2AtDca,
2257+ " dimuon/realign/dcax_MuonKine_MuonCuts" , " dimuon/realign/dcay_MuonKine_MuonCuts" );
22572258
22582259 double mchAngle = getMuMuAngle (mchTrackPar1AtVertex, mchTrackPar2AtVertex);
22592260 double mchAngleNew = getMuMuAngle (mchTrackParNew1AtVertex, mchTrackParNew2AtVertex);
@@ -2272,8 +2273,8 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
22722273 bool isGoodGlobalMuon2 = IsGoodMuon (muonTrack2, collision, cfgTrackChi2MchUp, 0 .f , cfgPtMchLow, {cfgEtaMftLow, cfgEtaMftUp}, {cfgRabsLow, cfgRabsUp}, fSigmaPdcaUp );
22732274 bool goodGlobalMuonTracks = (isGoodGlobalMuon1 && isGoodGlobalMuon2);
22742275
2275- bool isGoodMatch1 = isGoodGlobalMatching (fwdTrack1, 50 . f );
2276- bool isGoodMatch2 = isGoodGlobalMatching (fwdTrack2, 50 . f );
2276+ bool isGoodMatch1 = isGoodGlobalMatching (fwdTrack1, cfgDimuonMatchChi2Up. value );
2277+ bool isGoodMatch2 = isGoodGlobalMatching (fwdTrack2, cfgDimuonMatchChi2Up. value );
22772278 bool goodGlobalMuonMatches = (isGoodMatch1 && isGoodMatch2);
22782279
22792280 if (!goodGlobalMuonTracks || !goodGlobalMuonMatches) {
@@ -2284,13 +2285,13 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
22842285 FILL_DIMUON_PLOT (mchTrackParNew1, mchTrackParNew2, mchTrackParNew1AtVertex, mchTrackParNew2AtVertex, " dimuon/realign/invariantMass_MuonKine_GlobalMuonCuts_GoodMatches" );
22852286
22862287 FILL_DIMUON_DCA_PLOTS (mchTrackPar1, mchTrackPar2,
2287- mchTrackPar1AtVertex, mchTrackPar2AtVertex,
2288- mchTrackPar1AtDca, mchTrackPar2AtDca,
2289- " dimuon/dcax_MuonKine_GlobalMuonCuts_GoodMatches" , " dimuon/dcay_MuonKine_GlobalMuonCuts_GoodMatches" );
2288+ mchTrackPar1AtVertex, mchTrackPar2AtVertex,
2289+ mchTrackPar1AtDca, mchTrackPar2AtDca,
2290+ " dimuon/dcax_MuonKine_GlobalMuonCuts_GoodMatches" , " dimuon/dcay_MuonKine_GlobalMuonCuts_GoodMatches" );
22902291 FILL_DIMUON_DCA_PLOTS (mchTrackParNew1, mchTrackParNew2,
2291- mchTrackParNew1AtVertex, mchTrackParNew2AtVertex,
2292- mchTrackParNew1AtDca, mchTrackParNew2AtDca,
2293- " dimuon/realign/dcax_MuonKine_GlobalMuonCuts_GoodMatches" , " dimuon/realign/dcay_MuonKine_GlobalMuonCuts_GoodMatches" );
2292+ mchTrackParNew1AtVertex, mchTrackParNew2AtVertex,
2293+ mchTrackParNew1AtDca, mchTrackParNew2AtDca,
2294+ " dimuon/realign/dcax_MuonKine_GlobalMuonCuts_GoodMatches" , " dimuon/realign/dcay_MuonKine_GlobalMuonCuts_GoodMatches" );
22942295
22952296 auto mftIndex1 = fwdTrack1.matchMFTTrackId ();
22962297 auto mftIndex2 = fwdTrack2.matchMFTTrackId ();
@@ -2312,13 +2313,13 @@ struct muonGlobalAlignment { // o2-linter: disable=name/workflow-file,name/struc
23122313 FILL_DIMUON_PLOT (mchTrackParNew1, mchTrackParNew2, fwdTrackParNew1AtVertex, fwdTrackParNew2AtVertex, " dimuon/realign/invariantMass_ScaledMftKine_GlobalMuonCuts_GoodMatches" );
23132314
23142315 FILL_DIMUON_DCA_PLOTS (mchTrackPar1, mchTrackPar2,
2315- fwdTrackPar1AtVertex, fwdTrackPar2AtVertex,
2316- fwdTrackPar1AtDca, fwdTrackPar2AtDca,
2317- " dimuon/dcax_ScaledMftKine_GlobalMuonCuts_GoodMatches" , " dimuon/dcay_ScaledMftKine_GlobalMuonCuts_GoodMatches" );
2316+ fwdTrackPar1AtVertex, fwdTrackPar2AtVertex,
2317+ fwdTrackPar1AtDca, fwdTrackPar2AtDca,
2318+ " dimuon/dcax_ScaledMftKine_GlobalMuonCuts_GoodMatches" , " dimuon/dcay_ScaledMftKine_GlobalMuonCuts_GoodMatches" );
23182319 FILL_DIMUON_DCA_PLOTS (mchTrackParNew1, mchTrackParNew2,
2319- fwdTrackParNew1AtVertex, fwdTrackParNew2AtVertex,
2320- fwdTrackParNew1AtDca, fwdTrackParNew2AtDca,
2321- " dimuon/realign/dcax_ScaledMftKine_GlobalMuonCuts_GoodMatches" , " dimuon/realign/dcay_ScaledMftKine_GlobalMuonCuts_GoodMatches" );
2320+ fwdTrackParNew1AtVertex, fwdTrackParNew2AtVertex,
2321+ fwdTrackParNew1AtDca, fwdTrackParNew2AtDca,
2322+ " dimuon/realign/dcax_ScaledMftKine_GlobalMuonCuts_GoodMatches" , " dimuon/realign/dcay_ScaledMftKine_GlobalMuonCuts_GoodMatches" );
23222323
23232324 double fwdAngle = getMuMuAngle (fwdTrackPar1AtVertex, fwdTrackPar2AtVertex);
23242325 double fwdAngleNew = getMuMuAngle (fwdTrackParNew1AtVertex, fwdTrackParNew2AtVertex);
0 commit comments