73{
75
76
77
78
79
80 std::vector<const xAOD::Muon*> candidateSAmuons;
82
83
84 bool isStacoRecovery = false;
86 muon->muonType() == xAOD::Muon::MuonType::Combined &&
87 muon->author() == xAOD::Muon::Author::STACO) {
88
89
90
91 static const SG::Accessor<char> acc_isLRT("isLRT");
92 if (acc_isLRT.isAvailable(*muon) && acc_isLRT(*muon)) {
94 continue;
95 }
96
97
98
101 if (msTrk && idTrk) {
102 double dEta = std::abs(msTrk->
eta() - idTrk->
eta());
103 double dPhi = std::abs(msTrk->
phi() - idTrk->
phi());
106 ATH_MSG_DEBUG(
"Recovering Staco Combined muon with dEta=" << dEta <<
" dPhi=" << dPhi);
107 isStacoRecovery = true;
108 }
109 }
110 }
111
112 if (
muon->muonType()!= xAOD::Muon::MuonType::MuonStandAlone && !isStacoRecovery && !
m_doValidation) {
113 continue;
114 }
115
117 if (!MuSAMSTP) {
118
120 continue;
121 }
122
123
126 continue;
127 }
128
129 if (MuSAMSTP->
pt() > 13000000) {
130 ATH_MSG_DEBUG(
"Skipping SA muon with pT " << (MuSAMSTP->
pt() / 1000.) <<
" GeV!");
131 continue;
132 }
133
134
136 muon->parameter(spectrometerFieldIntegral, xAOD::Muon::ParamDef::spectrometerFieldIntegral);
137 if (spectrometerFieldIntegral < 0.1) {
138 ATH_MSG_DEBUG(
"Skipping SA muon with spectrometerFieldIntegral " << spectrometerFieldIntegral <<
" T*m!");
139 continue;
140 }
141
142 candidateSAmuons.push_back(muon);
143 }
144
145
146 if (candidateSAmuons.size() < 2) {
148 return StatusCode::SUCCESS;
149 }
150
151
152 std::vector<std::shared_ptr<xAOD::TrackParticle>> extrapolatedMuSATracks;
153 std::map<const xAOD::TrackParticle*, const xAOD::Muon*> muonToExtrapolatedTrackMap;
154 for (const auto muon : candidateSAmuons) {
156 auto extrapolatedMuSATrack =
extrapolateMuSA(*MuSAMSTP, eventInfo, ctx);
157 if (extrapolatedMuSATrack->definingParameters()[
Trk::d0] > 8000) {
158 ATH_MSG_DEBUG(
"Failed to extrapolate MuSA track, skipping!");
159 continue;
160 }
161
162 extrapolatedMuSATracks.emplace_back(extrapolatedMuSATrack.release());
163 muonToExtrapolatedTrackMap[extrapolatedMuSATracks.back().get()] =
muon;
164 ATH_MSG_VERBOSE(
"Extrapolated MuSA track! Total extrapolated so far: " << extrapolatedMuSATracks.size());
165 }
166
167 if (extrapolatedMuSATracks.size() < 2) {
169 return StatusCode::SUCCESS;
170 }
171
172 std::unique_ptr<Trk::IVKalState> state =
m_vertexFitter->makeState(ctx);
173 std::vector<const xAOD::TrackParticle*> tracksToFit(2);
174 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
175
176 for (
unsigned int i = 0;
i < extrapolatedMuSATracks.size();
i++) {
177 for (
unsigned int j = i+1;
j < extrapolatedMuSATracks.size();
j++) {
178 MuSAVtxFitterTool::WrkVrt MuSACandidate;
179 tracksToFit[0] = extrapolatedMuSATracks[
i].get();
180 tracksToFit[1] = extrapolatedMuSATracks[
j].get();
182 MuSACandidate.pos, MuSACandidate.mom,
183 MuSACandidate.charge, MuSACandidate.cov,
184 MuSACandidate.chi2PerTrk, MuSACandidate.trkAtVrt,
185 MuSACandidate.chi2, *state);
186 if (
res.isSuccess()) {
188 MuSACandidate.newExtrapolatedTracks.push_back(extrapolatedMuSATracks[i]);
189 MuSACandidate.newExtrapolatedTracks.push_back(extrapolatedMuSATracks[j]);
190 MuSACandidate.muonCandidates = {
191 muonToExtrapolatedTrackMap[tracksToFit[0]],
192 muonToExtrapolatedTrackMap[tracksToFit[1]]
193 };
194 MuSACandidate.minOpAng = muonToExtrapolatedTrackMap[tracksToFit[0]]->p4().DeltaR(
195 muonToExtrapolatedTrackMap[tracksToFit[1]]->p4());
196 workVerticesContainer.emplace_back(std::move(MuSACandidate));
197 } else {
199 }
200 }
201 }
202
203
204 return StatusCode::SUCCESS;
205}
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(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: