81{
83 for (const auto& workVertex : workVerticesContainer) {
84
87
88
89 for (
size_t i = 0;
i < workVertex.newExtrapolatedTracks.size();
i++) {
90
91
93 *containerTrack=*workVertex.newExtrapolatedTracks[
i];
94
95
96 ElementLink<xAOD::TrackParticleContainer> link_trk(*MuSAExtrapolatedTracksContainer, MuSAExtrapolatedTracksContainer->
size() - 1);
98
99
100
101 bool muonLinkSuccess = false;
102 bool MSTPLinkSuccess = false;
103
104 ElementLink<xAOD::MuonContainer> link_muon;
105 ElementLink<xAOD::TrackParticleContainer> link_MSTP;
107
110 if (MSTP) {
112 }
113
114
115 if (!MSTPLinkSuccess) {
117 } else {
118 acc_MSTPLink(*containerTrack) = link_MSTP;
119 auto& mstpLinks = acc_MSTPLinks(*MuSAVertex);
120 mstpLinks.push_back(link_MSTP);
121 }
122
123 if (!muonLinkSuccess) {
125 } else {
126 acc_MuonLink(*containerTrack) = link_muon;
127 auto& muonLinks = acc_MuonLinks(*MuSAVertex);
128 muonLinks.push_back(link_muon);
129 }
130 }
131
135 std::vector<float> fCov(workVertex.cov.cbegin(), workVertex.cov.cend());
137
138 vtx_pxAcc(*MuSAVertex) = workVertex.mom.Px();
139 vtx_pyAcc(*MuSAVertex) = workVertex.mom.Py();
140 vtx_pzAcc(*MuSAVertex) = workVertex.mom.Pz();
141
142 vtx_massAcc(*MuSAVertex) = workVertex.mom.M();
143 vtx_chargeAcc(*MuSAVertex) = workVertex.charge;
144
145 minOpAngAcc(*MuSAVertex) = workVertex.minOpAng;
146
147 chi2_coreAcc(*MuSAVertex) = workVertex.chi2Core;
148 ndof_coreAcc(*MuSAVertex) = 1;
149 chi2_assocAcc(*MuSAVertex) = workVertex.chi2;
150 ndof_assocAcc(*MuSAVertex) = workVertex.ndof();
151
152 TLorentzVector sumP4_muon;
153 TLorentzVector sumP4_electron;
154 TLorentzVector sumP4_selected;
155
156 constexpr double muonMass = 105.658;
157
158 for (
size_t i = 0;
i < workVertex.newExtrapolatedTracks.size();
i++) {
160 double pt_wrtSV =
track->pt();
161 double eta_wrtSV =
track->eta();
162 double phi_wrtSV =
track->phi();
163
164 TLorentzVector p4wrtSV_muon;
165 TLorentzVector p4wrtSV_electron;
166
167 p4wrtSV_muon.SetPtEtaPhiM(pt_wrtSV, eta_wrtSV, phi_wrtSV, muonMass);
169
170 sumP4_muon += p4wrtSV_muon;
171 sumP4_electron += p4wrtSV_electron;
172 sumP4_selected += p4wrtSV_muon;
173
176
177 std::unique_ptr<Trk::Perigee> sv_perigee =
m_trackToVertexTool->perigeeAtVertex(ctx, *containerTrack, workVertex.pos);
178 if (!sv_perigee) {
180 continue;
181 }
182
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);
194
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;
206 }
207
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;
215 }
216 return StatusCode::SUCCESS;
217}
#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.
index_type index() const
Get the index of the element inside of its container.
bool toContainedElement(BaseConstReference data, ElementType element, IProxyDict *sg=0)
Set from element pointer and a reference to the container (storable)
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: