87 const EventContext& ctx)
const
90 for (
const auto& workVertex : workVerticesContainer) {
96 for (
size_t i = 0; i < workVertex.newExtrapolatedTracks.size(); i++) {
100 *containerTrack=*workVertex.newExtrapolatedTracks[i];
108 bool muonLinkSuccess =
false;
109 bool MSTPLinkSuccess =
false;
116 const xAOD::TrackParticle* MSTP = muon->trackParticle(xAOD::Muon::MuonSpectrometerTrackParticle);
122 if (!MSTPLinkSuccess) {
125 acc_MSTPLink(*containerTrack) = link_MSTP;
126 auto& mstpLinks = acc_MSTPLinks(*MuSAVertex);
127 mstpLinks.push_back(link_MSTP);
130 if (!muonLinkSuccess) {
133 acc_MuonLink(*containerTrack) = link_muon;
134 auto& muonLinks = acc_MuonLinks(*MuSAVertex);
135 muonLinks.push_back(link_muon);
142 std::vector<float> fCov(workVertex.cov.cbegin(), workVertex.cov.cend());
145 vtx_pxAcc(*MuSAVertex) = workVertex.mom.Px();
146 vtx_pyAcc(*MuSAVertex) = workVertex.mom.Py();
147 vtx_pzAcc(*MuSAVertex) = workVertex.mom.Pz();
149 vtx_massAcc(*MuSAVertex) = workVertex.mom.M();
150 vtx_chargeAcc(*MuSAVertex) = workVertex.charge;
152 minOpAngAcc(*MuSAVertex) = workVertex.minOpAng;
154 chi2_coreAcc(*MuSAVertex) = workVertex.chi2Core;
155 ndof_coreAcc(*MuSAVertex) = 1;
156 chi2_assocAcc(*MuSAVertex) = workVertex.chi2;
157 ndof_assocAcc(*MuSAVertex) = workVertex.ndof();
159 TLorentzVector sumP4_muon;
160 TLorentzVector sumP4_electron;
161 TLorentzVector sumP4_selected;
163 constexpr double muonMass = 105.658;
165 for (
size_t i = 0; i < workVertex.newExtrapolatedTracks.size(); i++) {
167 double pt_wrtSV = track->pt();
168 double eta_wrtSV = track->eta();
169 double phi_wrtSV = track->phi();
171 TLorentzVector p4wrtSV_muon;
172 TLorentzVector p4wrtSV_electron;
174 p4wrtSV_muon.SetPtEtaPhiM(pt_wrtSV, eta_wrtSV, phi_wrtSV, muonMass);
177 sumP4_muon += p4wrtSV_muon;
178 sumP4_electron += p4wrtSV_electron;
179 sumP4_selected += p4wrtSV_muon;
184 std::unique_ptr<Trk::Perigee> sv_perigee =
m_trackToVertexTool->perigeeAtVertex(ctx, *containerTrack, workVertex.pos);
190 double qOverP_wrtSV = sv_perigee->parameters()[
Trk::qOverP];
191 double theta_wrtSV = sv_perigee->parameters()[
Trk::theta];
192 double p_wrtSV = 1.0 / std::abs(qOverP_wrtSV);
193 pt_wrtSV = p_wrtSV * sin(theta_wrtSV);
194 eta_wrtSV = -log(tan(theta_wrtSV / 2.0));
195 phi_wrtSV = sv_perigee->parameters()[
Trk::phi];
196 double d0_wrtSV = sv_perigee->parameters()[
Trk::d0];
197 double z0_wrtSV = sv_perigee->parameters()[
Trk::z0];
198 double sqrd0Err_wrtSV = (*sv_perigee->covariance())(
Trk::d0,
Trk::d0);
199 double sqrz0Err_wrtSV = (*sv_perigee->covariance())(
Trk::z0,
Trk::z0);
202 qOverP_wrtSVAcc(*containerTrack) = qOverP_wrtSV;
203 theta_wrtSVAcc(*containerTrack) = theta_wrtSV;
204 p_wrtSVAcc(*containerTrack) = p_wrtSV;
205 pt_wrtSVAcc(*containerTrack) = pt_wrtSV;
206 eta_wrtSVAcc(*containerTrack) = eta_wrtSV;
207 phi_wrtSVAcc(*containerTrack) = phi_wrtSV;
208 d0_wrtSVAcc(*containerTrack) = d0_wrtSV;
209 z0_wrtSVAcc(*containerTrack) = z0_wrtSV;
210 sqrd0Err_wrtSVAcc(*containerTrack) = sqrd0Err_wrtSV;
211 sqrz0Err_wrtSVAcc(*containerTrack) = sqrz0Err_wrtSV;
212 sqrQoPErr_wrtSVAcc(*containerTrack) = sqrQoPErr_wrtSV;
216 if (i < workVertex.trkAtVrt.size() && workVertex.trkAtVrt[i].size() >= 3) {
217 double phi_refit = workVertex.trkAtVrt[i][0];
218 double theta_refit = workVertex.trkAtVrt[i][1];
219 double qOverP_refit = workVertex.trkAtVrt[i][2];
220 double p_refit = 1.0 / std::abs(qOverP_refit);
221 double pt_refit = p_refit * std::sin(theta_refit);
222 double eta_refit = -std::log(std::tan(theta_refit / 2.0));
224 phi_refitAcc(*containerTrack) = phi_refit;
225 theta_refitAcc(*containerTrack) = theta_refit;
226 qOverP_refitAcc(*containerTrack) = qOverP_refit;
227 p_refitAcc(*containerTrack) = p_refit;
228 pt_refitAcc(*containerTrack) = pt_refit;
229 eta_refitAcc(*containerTrack) = eta_refit;
231 ATH_MSG_WARNING(
"trkAtVrt not available for track " << i <<
", skipping refit parameters");
235 massAcc(*MuSAVertex) = sumP4_muon.M();
236 mass_eAcc(*MuSAVertex) = sumP4_electron.M();
237 mass_selectedTracksAcc(*MuSAVertex) = sumP4_selected.M();
238 num_trksAcc(*MuSAVertex) = workVertex.nTracksTotal();
239 num_selectedTracksAcc(*MuSAVertex) = workVertex.selectedTrackIndices.size();
240 num_associatedTracksAcc(*MuSAVertex) = workVertex.associatedTrackIndices.size();
241 dCloseVrtAcc(*MuSAVertex) = workVertex.closestWrkVrtValue;
243 return StatusCode::SUCCESS;