11 #include "VrtSecInclusive/Constants.h"
71 return StatusCode::SUCCESS;
80 const EventContext& ctx)
const
83 for (
const auto& workVertex : workVerticesContainer) {
89 for (
size_t i = 0;
i < workVertex.newExtrapolatedTracks.size();
i++) {
94 *containerTrack=*newTrack;
102 bool muonLinkSuccess =
false;
103 bool MSTPLinkSuccess =
false;
116 if (!MSTPLinkSuccess) {
119 acc_MSTPLink(*containerTrack) = link_MSTP;
120 auto& mstpLinks = acc_MSTPLinks(*MuSAVertex);
121 mstpLinks.push_back(link_MSTP);
124 if (!muonLinkSuccess) {
127 acc_MuonLink(*containerTrack) = link_muon;
128 auto& muonLinks = acc_MuonLinks(*MuSAVertex);
129 muonLinks.push_back(link_muon);
136 std::vector<float> fCov(workVertex.cov.cbegin(), workVertex.cov.cend());
139 vtx_pxAcc(*MuSAVertex) = workVertex.mom.Px();
140 vtx_pyAcc(*MuSAVertex) = workVertex.mom.Py();
141 vtx_pzAcc(*MuSAVertex) = workVertex.mom.Pz();
143 vtx_massAcc(*MuSAVertex) = workVertex.mom.M();
144 vtx_chargeAcc(*MuSAVertex) = workVertex.charge;
146 minOpAngAcc(*MuSAVertex) = workVertex.minOpAng;
148 chi2_coreAcc(*MuSAVertex) = workVertex.chi2Core;
149 ndof_coreAcc(*MuSAVertex) = 1;
150 chi2_assocAcc(*MuSAVertex) = workVertex.chi2;
151 ndof_assocAcc(*MuSAVertex) = workVertex.ndof();
153 TLorentzVector sumP4_muon;
154 TLorentzVector sumP4_electron;
155 TLorentzVector sumP4_selected;
157 constexpr
double muonMass = 105.658;
159 for (
size_t i = 0;
i < workVertex.newExtrapolatedTracks.size();
i++) {
161 double pt_wrtSV =
track->pt();
162 double eta_wrtSV =
track->eta();
163 double phi_wrtSV =
track->phi();
165 TLorentzVector p4wrtSV_muon;
166 TLorentzVector p4wrtSV_electron;
168 p4wrtSV_muon.SetPtEtaPhiM(pt_wrtSV, eta_wrtSV, phi_wrtSV, muonMass);
171 sumP4_muon += p4wrtSV_muon;
172 sumP4_electron += p4wrtSV_electron;
173 sumP4_selected += p4wrtSV_muon;
177 std::unique_ptr<Trk::Perigee> sv_perigee =
m_trackToVertexTool->perigeeAtVertex(ctx, *containerTrack, workVertex.pos);
183 double qOverP_wrtSV = sv_perigee->parameters()[
Trk::qOverP];
184 double theta_wrtSV = sv_perigee->parameters()[
Trk::theta];
185 double p_wrtSV = 1.0 / std::abs(qOverP_wrtSV);
186 pt_wrtSV = p_wrtSV *
sin(theta_wrtSV);
187 eta_wrtSV = -
log(
tan(theta_wrtSV / 2.0));
188 phi_wrtSV = sv_perigee->parameters()[
Trk::phi];
189 double d0_wrtSV = sv_perigee->parameters()[
Trk::d0];
190 double z0_wrtSV = sv_perigee->parameters()[
Trk::z0];
191 double sqrd0Err_wrtSV = (*sv_perigee->covariance())(
Trk::d0,
Trk::d0);
192 double sqrz0Err_wrtSV = (*sv_perigee->covariance())(
Trk::z0,
Trk::z0);
195 qOverP_wrtSVAcc(*containerTrack) = qOverP_wrtSV;
196 theta_wrtSVAcc(*containerTrack) = theta_wrtSV;
197 p_wrtSVAcc(*containerTrack) = p_wrtSV;
198 pt_wrtSVAcc(*containerTrack) = pt_wrtSV;
199 eta_wrtSVAcc(*containerTrack) = eta_wrtSV;
200 phi_wrtSVAcc(*containerTrack) = phi_wrtSV;
201 d0_wrtSVAcc(*containerTrack) = d0_wrtSV;
202 z0_wrtSVAcc(*containerTrack) = z0_wrtSV;
203 sqrd0Err_wrtSVAcc(*containerTrack) = sqrd0Err_wrtSV;
204 sqrz0Err_wrtSVAcc(*containerTrack) = sqrz0Err_wrtSV;
205 sqrQoPErr_wrtSVAcc(*containerTrack) = sqrQoPErr_wrtSV;
208 massAcc(*MuSAVertex) = sumP4_muon.M();
209 mass_eAcc(*MuSAVertex) = sumP4_electron.M();
210 mass_selectedTracksAcc(*MuSAVertex) = sumP4_selected.M();
211 num_trksAcc(*MuSAVertex) = workVertex.nTracksTotal();
212 num_selectedTracksAcc(*MuSAVertex) = workVertex.selectedTrackIndices.size();
213 num_associatedTracksAcc(*MuSAVertex) = workVertex.associatedTrackIndices.size();
214 dCloseVrtAcc(*MuSAVertex) = workVertex.closestWrkVrtValue;
216 return StatusCode::SUCCESS;
231 ATH_CHECK(MuSAVtxContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
234 ATH_CHECK(MuSAExtrapolatedTracksContainer.
record(std::make_unique<xAOD::TrackParticleContainer>(), std::make_unique<xAOD::TrackParticleAuxContainer>()));
236 std::vector<MuSAVtxFitterTool::WrkVrt> workVerticesContainer;
242 if (workVerticesContainer.empty()) {
244 return StatusCode::SUCCESS;
251 if (workVerticesContainer.empty()) {
252 ATH_MSG_DEBUG(
"No MuSA vertices found after post-fit selection!");
253 return StatusCode::SUCCESS;
260 if (workVerticesContainer.empty()) {
261 ATH_MSG_DEBUG(
"No MuSA vertices found after best overlap selection!");
262 return StatusCode::SUCCESS;
264 ATH_MSG_DEBUG(
"Found " << workVerticesContainer.size() <<
" MuSA vertices");
270 return StatusCode::SUCCESS;