7 #include "GaudiKernel/MsgStream.h"
25 constexpr
double dummy_chi2 = 1.e25;
31 declareInterface<IMuonTrackTagTool>(
this);
43 ATH_MSG_ERROR(
"Could not retrieve a valid tracking geometry");
48 return StatusCode::SUCCESS;
58 ATH_MSG_WARNING(
"Skipping track combination - no perigee parameters for ID track");
62 ATH_MSG_WARNING(
"Skipping track combination - no perigee parameters for MS track");
73 int noutl = 0, ntrt = 0;
74 for (; itStates != endState; ++itStates) {
75 if ((**itStates).measurementOnTrack()) {
87 ATH_MSG_DEBUG(
"ntrt: " << ntrt <<
" ntrtoutl: " << noutl <<
" eta: " <<
eta);
88 if (noutl >= 15 || (ntrt == 0 && std::abs(
eta) > .1 && std::abs(
eta) < 1.9))
return 0;
92 if (idqoverp != 0 && std::abs(1 / idqoverp) < 2500)
return 0;
96 bool checkphiflip =
false, muonisstraight =
false;
98 if (std::abs(muonpar->parameters()[
Trk::qOverP]) < 1.e-9) checkphiflip = muonisstraight =
true;
103 ATH_MSG_DEBUG(
"phi ID: " << phiID <<
" phi MS: " << phiMS <<
" diff: " << phiID - phiMS
105 ATH_MSG_DEBUG(
"theta ID: " << thetaID <<
" theta MS: " << thetaMS <<
" diff: " << thetaID - thetaMS);
106 double phidiff = std::abs(phiID - phiMS);
107 if (std::abs(phidiff - 2 *
M_PI) < phidiff) phidiff = 2 *
M_PI - phidiff;
108 if (checkphiflip && std::abs(phidiff -
M_PI) < phidiff) phidiff = std::abs(
M_PI - phidiff);
109 double thetalimit = .6, philimit = .8;
110 if (muonisstraight) {
114 if (!(std::abs(thetaID - thetaMS) < thetalimit && std::abs(phidiff) < philimit))
return 0;
118 while (!lastmeasidpar &&
index > 0) {
122 if (!lastmeasidpar) {
132 mspar = (**tsosit).trackParameters();
142 std::unique_ptr<const Trk::TrackParameters> idextrapolatedpar = std::unique_ptr<const Trk::TrackParameters>(
145 if (!idextrapolatedpar && lastmeasidpar->parameters()[
Trk::qOverP] != 0 &&
155 idextrapolatedpar = std::unique_ptr<const Trk::TrackParameters>(
160 if (!idextrapolatedpar || !idextrapolatedpar->covariance()) {
161 ATH_MSG_DEBUG(
"ID extrapolated par null or missing error matrix, par: " << idextrapolatedpar.get());
165 std::unique_ptr<const Trk::TrackParameters> created_mspar;
166 if (muonisstraight) {
167 const AmgSymMatrix(5) &idcovmat = *idextrapolatedpar->covariance();
170 if (!mspar->covariance()) {
171 ATH_MSG_DEBUG(
"Muons parameters missing Error matrix: " << mspar);
176 for (
int i = 0;
i < 5;
i++) (newcovmat)(
i, 4) = idcovmat(
i, 4);
179 msparforextrapolator = created_mspar.get();
193 std::unique_ptr<const Trk::TrackParameters> msextrapolatedpar = std::unique_ptr<const Trk::TrackParameters>(
196 if (muonisstraight) {
ATH_MSG_DEBUG(
"Muon track is straight line"); }
198 if ((!msextrapolatedpar && !muonisstraight)) {
199 ATH_MSG_DEBUG(
"extrapolation failed, id:" << idextrapolatedpar.get() <<
" ms: " << msextrapolatedpar.get());
202 double mychi2 = 1e15;
203 if (msextrapolatedpar) mychi2 =
chi2(*idextrapolatedpar, *msextrapolatedpar);
204 if (muonisstraight) {
205 std::unique_ptr<const Trk::TrackParameters> idpar_firsthit = std::unique_ptr<const Trk::TrackParameters>(
207 if (idpar_firsthit) {
208 double chi2_2 =
chi2(*idpar_firsthit, *mspar);
209 if (chi2_2 < mychi2) mychi2 = chi2_2;
216 double loc1ID = idextrapolatedpar.parameters()[
Trk::loc1];
217 double loc2ID = idextrapolatedpar.parameters()[
Trk::loc2];
218 double phiID = idextrapolatedpar.parameters()[
Trk::phi];
219 double thetaID = idextrapolatedpar.parameters()[
Trk::theta];
221 double loc1MS = msextrapolatedpar.parameters()[
Trk::loc1];
222 double loc2MS = msextrapolatedpar.parameters()[
Trk::loc2];
223 double phiMS = msextrapolatedpar.parameters()[
Trk::phi];
224 double thetaMS = msextrapolatedpar.parameters()[
Trk::theta];
226 if (!idextrapolatedpar.covariance() || !msextrapolatedpar.covariance()) {
227 ATH_MSG_DEBUG(
"track parameters don't have error matrix! id: " << idextrapolatedpar.covariance()
228 <<
" ms: " << msextrapolatedpar.covariance());
231 const AmgSymMatrix(5) &idcovmat = *idextrapolatedpar.covariance();
232 const AmgSymMatrix(5) &mscovmat = *msextrapolatedpar.covariance();
234 double loc1diff = std::abs(loc1ID - loc1MS);
235 double loc2diff = std::abs(loc2ID - loc2MS);
241 if (std::abs(loc1diff -
length) < loc1diff) loc1diff =
length - loc1diff;
244 if (std::abs(loc2diff - 2 *
M_PI) < loc2diff) loc2diff = 2 *
M_PI - loc2diff;
246 double phidiff = std::abs(phiID - phiMS);
247 if (std::abs(phidiff - 2 *
M_PI) < phidiff) phidiff = 2 *
M_PI - phidiff;
248 if (std::abs(phidiff -
M_PI) < phidiff) phidiff -=
M_PI;
250 double thetadiff = thetaID - thetaMS;
252 double chi2 = loc1diff * loc1diff / (idcovmat(0, 0) + mscovmat(0, 0)) + loc2diff * loc2diff / (idcovmat(1, 1) + mscovmat(1, 1)) +
253 phidiff * phidiff / (idcovmat(2, 2) + mscovmat(2, 2)) + thetadiff * thetadiff / (idcovmat(3, 3) + mscovmat(3, 3));