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::AuxElement::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) {
119 continue;
120 }
121
122
125 continue;
126 }
127
128 if (MuSAMSTP->
pt() > 13000000) {
129 ATH_MSG_DEBUG(
"Skipping SA muon with pT " << (MuSAMSTP->
pt() / 1000.) <<
" GeV!");
130 continue;
131 }
132
133
135 muon->parameter(spectrometerFieldIntegral, xAOD::Muon::ParamDef::spectrometerFieldIntegral);
136 if (spectrometerFieldIntegral < 0.1) {
137 ATH_MSG_DEBUG(
"Skipping SA muon with spectrometerFieldIntegral " << spectrometerFieldIntegral <<
" T*m!");
138 continue;
139 }
140
141 candidateSAmuons.push_back(muon);
142 }
143
144
145 if (candidateSAmuons.size() < 2) {
147 return StatusCode::SUCCESS;
148 }
149
150
151 std::vector<std::shared_ptr<xAOD::TrackParticle>> extrapolatedMuSATracks;
152 std::map<const xAOD::TrackParticle*, const xAOD::Muon*> muonToExtrapolatedTrackMap;
153 for (const auto muon : candidateSAmuons) {
155 auto extrapolatedMuSATrack =
extrapolateMuSA(*MuSAMSTP, eventInfo, ctx);
156 if (extrapolatedMuSATrack->definingParameters()[
Trk::d0] > 8000) {
157 ATH_MSG_DEBUG(
"Failed to extrapolate MuSA track, skipping!");
158 continue;
159 }
160
161 extrapolatedMuSATracks.emplace_back(extrapolatedMuSATrack.release());
162 muonToExtrapolatedTrackMap[extrapolatedMuSATracks.back().get()] =
muon;
163 ATH_MSG_VERBOSE(
"Extrapolated MuSA track! Total extrapolated so far: " << extrapolatedMuSATracks.size());
164 }
165
166 if (extrapolatedMuSATracks.size() < 2) {
168 return StatusCode::SUCCESS;
169 }
170
171 std::unique_ptr<Trk::IVKalState> state =
m_vertexFitter->makeState(ctx);
172 std::vector<const xAOD::TrackParticle*> tracksToFit(2);
173 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
174
175 for (
unsigned int i = 0;
i < extrapolatedMuSATracks.size();
i++) {
176 for (
unsigned int j = i+1;
j < extrapolatedMuSATracks.size();
j++) {
177 MuSAVtxFitterTool::WrkVrt MuSACandidate;
178 tracksToFit[0] = extrapolatedMuSATracks[
i].get();
179 tracksToFit[1] = extrapolatedMuSATracks[
j].get();
181 MuSACandidate.pos, MuSACandidate.mom,
182 MuSACandidate.charge, MuSACandidate.cov,
183 MuSACandidate.chi2PerTrk, MuSACandidate.trkAtVrt,
184 MuSACandidate.chi2, *state);
185 if (
res.isSuccess()) {
187 MuSACandidate.newExtrapolatedTracks.push_back(extrapolatedMuSATracks[i]);
188 MuSACandidate.newExtrapolatedTracks.push_back(extrapolatedMuSATracks[j]);
189 MuSACandidate.muonCandidates = {
190 muonToExtrapolatedTrackMap[tracksToFit[0]],
191 muonToExtrapolatedTrackMap[tracksToFit[1]]
192 };
193 MuSACandidate.minOpAng = muonToExtrapolatedTrackMap[tracksToFit[0]]->p4().DeltaR(
194 muonToExtrapolatedTrackMap[tracksToFit[1]]->p4());
195 workVerticesContainer.emplace_back(std::move(MuSACandidate));
196 } else {
198 }
199 }
200 }
201
202
203 return StatusCode::SUCCESS;
204}
#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: