88{
90 for (const auto& workVertex : workVerticesContainer) {
91
94
95
96 for (
size_t i = 0;
i < workVertex.newExtrapolatedTracks.size();
i++) {
97
98
100 *containerTrack=*workVertex.newExtrapolatedTracks[
i];
101
102
103 ElementLink<xAOD::TrackParticleContainer> link_trk(*MuSAExtrapolatedTracksContainer, MuSAExtrapolatedTracksContainer->
size() - 1);
105
106
107
108 bool muonLinkSuccess = false;
109 bool MSTPLinkSuccess = false;
110
111 ElementLink<xAOD::MuonContainer> link_muon;
112 ElementLink<xAOD::TrackParticleContainer> link_MSTP;
114
117 if (MSTP) {
119 }
120
121
122 if (!MSTPLinkSuccess) {
124 } else {
125 acc_MSTPLink(*containerTrack) = link_MSTP;
126 auto& mstpLinks = acc_MSTPLinks(*MuSAVertex);
127 mstpLinks.push_back(link_MSTP);
128 }
129
130 if (!muonLinkSuccess) {
132 } else {
133 acc_MuonLink(*containerTrack) = link_muon;
134 auto& muonLinks = acc_MuonLinks(*MuSAVertex);
135 muonLinks.push_back(link_muon);
136 }
137 }
138
142 std::vector<float> fCov(workVertex.cov.cbegin(), workVertex.cov.cend());
144
145 vtx_pxAcc(*MuSAVertex) = workVertex.mom.Px();
146 vtx_pyAcc(*MuSAVertex) = workVertex.mom.Py();
147 vtx_pzAcc(*MuSAVertex) = workVertex.mom.Pz();
148
149 vtx_massAcc(*MuSAVertex) = workVertex.mom.M();
150 vtx_chargeAcc(*MuSAVertex) = workVertex.charge;
151
152 minOpAngAcc(*MuSAVertex) = workVertex.minOpAng;
153
154 chi2_coreAcc(*MuSAVertex) = workVertex.chi2Core;
155 ndof_coreAcc(*MuSAVertex) = 1;
156 chi2_assocAcc(*MuSAVertex) = workVertex.chi2;
157 ndof_assocAcc(*MuSAVertex) = workVertex.ndof();
158
159 TLorentzVector sumP4_muon;
160 TLorentzVector sumP4_electron;
161 TLorentzVector sumP4_selected;
162
163 constexpr double muonMass = 105.658;
164
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();
170
171 TLorentzVector p4wrtSV_muon;
172 TLorentzVector p4wrtSV_electron;
173
174 p4wrtSV_muon.SetPtEtaPhiM(pt_wrtSV, eta_wrtSV, phi_wrtSV, muonMass);
176
177 sumP4_muon += p4wrtSV_muon;
178 sumP4_electron += p4wrtSV_electron;
179 sumP4_selected += p4wrtSV_muon;
180
183
184 std::unique_ptr<Trk::Perigee> sv_perigee =
m_trackToVertexTool->perigeeAtVertex(ctx, *containerTrack, workVertex.pos);
185 if (!sv_perigee) {
187 continue;
188 }
189
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);
201
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;
213
214
215
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));
223
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;
230 } else {
231 ATH_MSG_WARNING(
"trkAtVrt not available for track " << i <<
", skipping refit parameters");
232 }
233 }
234
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;
242 }
243 return StatusCode::SUCCESS;
244}
#define ATH_MSG_WARNING(x)
value_type emplace_back(value_type pElem)
Add an element to the end of the collection.
const T * at(size_type n) const
Access an element, as an rvalue.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
bool toContainedElement(BaseConstReference container, ElementType element)
Set link to point to given element (slowest).
index_type index() const
Get the index of the element inside of its container.
ToolHandle< Reco::ITrackToVertex > m_trackToVertexTool
void addTrackAtVertex(const ElementLink< TrackParticleContainer > &tr, float weight=1.0)
Add a new track to the vertex.
const TrackParticleLinks_t & trackParticleLinks() const
Get all the particles associated with the vertex.
void setVertexType(VxType::VertexType vType)
Set the type of the vertex.
void setCovariance(const std::vector< float > &value)
Sets the covariance matrix as a simple vector of values.
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
constexpr double mass_electron
@ SecVtx
Secondary vertex.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
Muon_v1 Muon
Reference the current persistent version: