73{
75
76
77
78 std::vector<const xAOD::Muon*> candidateSAmuons;
80
81
82 bool isStacoRecovery = false;
84 muon->muonType() == xAOD::Muon::MuonType::Combined &&
85 muon->author() == xAOD::Muon::Author::STACO) {
88 if (msTrk && idTrk) {
89 double dEta = std::abs(msTrk->
eta() - idTrk->
eta());
90 double dPhi = std::abs(msTrk->
phi() - idTrk->
phi());
93 ATH_MSG_DEBUG(
"Recovering Staco Combined muon with dEta=" << dEta <<
" dPhi=" << dPhi);
94 isStacoRecovery = true;
95 }
96 }
97 }
98
99 if (
muon->muonType()!= xAOD::Muon::MuonType::MuonStandAlone && !isStacoRecovery && !
m_doValidation) {
100 continue;
101 }
102
104 if (!MuSAMSTP) {
106 continue;
107 }
108
109
112 continue;
113 }
114
115 if (MuSAMSTP->
pt() > 13000000) {
116 ATH_MSG_DEBUG(
"Skipping SA muon with pT " << (MuSAMSTP->
pt() / 1000.) <<
" GeV!");
117 continue;
118 }
119
120
122 muon->parameter(spectrometerFieldIntegral, xAOD::Muon::ParamDef::spectrometerFieldIntegral);
123 if (spectrometerFieldIntegral < 0.1) {
124 ATH_MSG_DEBUG(
"Skipping SA muon with spectrometerFieldIntegral " << spectrometerFieldIntegral <<
" T*m!");
125 continue;
126 }
127
128 candidateSAmuons.push_back(muon);
129 }
130
131
132 if (candidateSAmuons.size() < 2) {
134 return StatusCode::SUCCESS;
135 }
136
137
138 std::vector<std::shared_ptr<xAOD::TrackParticle>> extrapolatedMuSATracks;
139 std::map<const xAOD::TrackParticle*, const xAOD::Muon*> muonToExtrapolatedTrackMap;
140 for (const auto muon : candidateSAmuons) {
142 auto extrapolatedMuSATrack =
extrapolateMuSA(*MuSAMSTP, eventInfo, ctx);
143 if (extrapolatedMuSATrack->definingParameters()[
Trk::d0] > 8000) {
144 ATH_MSG_DEBUG(
"Failed to extrapolate MuSA track, skipping!");
145 continue;
146 }
147
148 extrapolatedMuSATracks.emplace_back(extrapolatedMuSATrack.release());
149 muonToExtrapolatedTrackMap[extrapolatedMuSATracks.back().get()] =
muon;
150 ATH_MSG_VERBOSE(
"Extrapolated MuSA track! Total extrapolated so far: " << extrapolatedMuSATracks.size());
151 }
152
153 if (extrapolatedMuSATracks.size() < 2) {
155 return StatusCode::SUCCESS;
156 }
157
158 std::unique_ptr<Trk::IVKalState> state =
m_vertexFitter->makeState(ctx);
159 std::vector<const xAOD::TrackParticle*> tracksToFit(2);
160 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
161
162 for (
unsigned int i = 0;
i < extrapolatedMuSATracks.size();
i++) {
163 for (
unsigned int j = i+1;
j < extrapolatedMuSATracks.size();
j++) {
164 MuSAVtxFitterTool::WrkVrt MuSACandidate;
165 tracksToFit[0] = extrapolatedMuSATracks[
i].get();
166 tracksToFit[1] = extrapolatedMuSATracks[
j].get();
168 MuSACandidate.pos, MuSACandidate.mom,
169 MuSACandidate.charge, MuSACandidate.cov,
170 MuSACandidate.chi2PerTrk, MuSACandidate.trkAtVrt,
171 MuSACandidate.chi2, *state);
172 if (
res.isSuccess()) {
174 MuSACandidate.newExtrapolatedTracks.push_back(extrapolatedMuSATracks[i]);
175 MuSACandidate.newExtrapolatedTracks.push_back(extrapolatedMuSATracks[j]);
176 MuSACandidate.muonCandidates = {
177 muonToExtrapolatedTrackMap[tracksToFit[0]],
178 muonToExtrapolatedTrackMap[tracksToFit[1]]
179 };
180 MuSACandidate.minOpAng = muonToExtrapolatedTrackMap[tracksToFit[0]]->p4().DeltaR(
181 muonToExtrapolatedTrackMap[tracksToFit[1]]->p4());
182 workVerticesContainer.emplace_back(std::move(MuSACandidate));
183 } else {
185 }
186 }
187 }
188
189
190 return StatusCode::SUCCESS;
191}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
std::pair< std::vector< unsigned int >, bool > res
xAOD::MuonContainer * muonContainer
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
::StatusCode StatusCode
StatusCode definition for legacy code.
@ spectrometerFieldIntegral
Discriminators and further variables.
bool dPhi(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
bool dEta(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
TrackParticle_v1 TrackParticle
Reference the current persistent version: