73{
75
76
77 std::vector<const xAOD::Muon*> candidateSAmuons;
79 bool isSA = (
muon->muonType() == xAOD::Muon::MuonStandAlone);
80 bool isCalo = (
muon->muonType() == xAOD::Muon::CaloTagged);
81 bool isSegment = (
muon->muonType() == xAOD::Muon::SegmentTagged);
82 bool isSiForward = (
muon->muonType() == xAOD::Muon::SiliconAssociatedForwardMuon);
83
85 continue;
86 }
87
89 if (!MuSAMSTP) {
90 if (isCalo || isSegment || isSiForward) {
91 ATH_MSG_VERBOSE(
"Skipping non-SA, non-Combined muon type in validation mode!");
92 } else {
94 }
95 continue;
96 }
97
98
101 continue;
102 }
103
104 if (MuSAMSTP->
pt() > 13000000) {
105 ATH_MSG_DEBUG(
"Skipping SA muon with pT " << (MuSAMSTP->
pt() / 1000.) <<
" GeV!");
106 continue;
107 }
108
109
111 muon->parameter(spectrometerFieldIntegral, xAOD::Muon::spectrometerFieldIntegral);
112 if (spectrometerFieldIntegral < 0.1) {
113 ATH_MSG_DEBUG(
"Skipping SA muon with spectrometerFieldIntegral " <<
muon->spectrometerFieldIntegral <<
" T*m!");
114 continue;
115 }
116
117 candidateSAmuons.push_back(muon);
118 }
119
120
121 if (candidateSAmuons.size() < 2) {
123 return StatusCode::SUCCESS;
124 }
125
126
127 std::vector<std::unique_ptr<xAOD::TrackParticle>> extrapolatedMuSATracks;
128 std::map<const xAOD::TrackParticle*, const xAOD::Muon*> muonToExtrapolatedTrackMap;
129 for (const auto muon : candidateSAmuons) {
131 auto extrapolatedMuSATrack =
extrapolateMuSA(*MuSAMSTP, eventInfo, ctx);
132 if (extrapolatedMuSATrack->definingParameters()[
Trk::d0] > 8000) {
133 ATH_MSG_DEBUG(
"Failed to extrapolate MuSA track, skipping!");
134 continue;
135 }
136 extrapolatedMuSATracks.push_back(std::move(extrapolatedMuSATrack));
137 muonToExtrapolatedTrackMap[extrapolatedMuSATracks.back().get()] =
muon;
138 ATH_MSG_VERBOSE(
"Extrapolated MuSA track! Total extrapolated so far: " << extrapolatedMuSATracks.size());
139 }
140
141 if (extrapolatedMuSATracks.size() < 2) {
143 return StatusCode::SUCCESS;
144 }
145
146 std::unique_ptr<Trk::IVKalState> state =
m_vertexFitter->makeState(ctx);
147
148 for (
unsigned int i = 0;
i < extrapolatedMuSATracks.size();
i++) {
149 for (unsigned int j = i+1; j < extrapolatedMuSATracks.size(); j++) {
150 MuSAVtxFitterTool::WrkVrt MuSACandidate;
151 std::vector<const xAOD::TrackParticle*> tracksToFit = {
152 extrapolatedMuSATracks[
i].get(),
153 extrapolatedMuSATracks[j].get()
154 };
155 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
157 MuSACandidate.pos, MuSACandidate.mom,
158 MuSACandidate.charge, MuSACandidate.cov,
159 MuSACandidate.chi2PerTrk, MuSACandidate.trkAtVrt,
160 MuSACandidate.chi2, *state);
161 if (
res.isSuccess()) {
163
164
165 auto sharedTrack1 = std::make_shared<const xAOD::TrackParticle>(*extrapolatedMuSATracks[i]);
166 auto sharedTrack2 = std::make_shared<const xAOD::TrackParticle>(*extrapolatedMuSATracks[j]);
167 MuSACandidate.newExtrapolatedTracks.push_back(sharedTrack1);
168 MuSACandidate.newExtrapolatedTracks.push_back(sharedTrack2);
169 MuSACandidate.muonCandidates = {
170 muonToExtrapolatedTrackMap[tracksToFit[0]],
171 muonToExtrapolatedTrackMap[tracksToFit[1]]
172 };
173 MuSACandidate.minOpAng = muonToExtrapolatedTrackMap[tracksToFit[0]]->p4().DeltaR(
174 muonToExtrapolatedTrackMap[tracksToFit[1]]->p4());
175 workVerticesContainer.emplace_back(MuSACandidate);
176 } else {
178 }
179 }
180 }
181
182
183 return StatusCode::SUCCESS;
184}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
std::pair< std::vector< unsigned int >, bool > res
xAOD::MuonContainer * muonContainer
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.
TrackParticle_v1 TrackParticle
Reference the current persistent version: