81{
83 for (const auto& workVertex : workVerticesContainer) {
84
87
88
89 for (
size_t i = 0;
i < workVertex.newExtrapolatedTracks.size();
i++) {
90
92
94 *containerTrack=*newTrack;
95
96
97 ElementLink<xAOD::TrackParticleContainer> link_trk(*MuSAExtrapolatedTracksContainer, MuSAExtrapolatedTracksContainer->
size() - 1);
99
100
101
102 bool muonLinkSuccess = false;
103 bool MSTPLinkSuccess = false;
104
105 ElementLink<xAOD::MuonContainer> link_muon;
106 ElementLink<xAOD::TrackParticleContainer> link_MSTP;
108
111 if (MSTP) {
113 }
114
115
116 if (!MSTPLinkSuccess) {
118 } else {
119 acc_MSTPLink(*containerTrack) = link_MSTP;
120 auto& mstpLinks = acc_MSTPLinks(*MuSAVertex);
121 mstpLinks.push_back(link_MSTP);
122 }
123
124 if (!muonLinkSuccess) {
126 } else {
127 acc_MuonLink(*containerTrack) = link_muon;
128 auto& muonLinks = acc_MuonLinks(*MuSAVertex);
129 muonLinks.push_back(link_muon);
130 }
131 }
132
136 std::vector<float> fCov(workVertex.cov.cbegin(), workVertex.cov.cend());
138
139 vtx_pxAcc(*MuSAVertex) = workVertex.mom.Px();
140 vtx_pyAcc(*MuSAVertex) = workVertex.mom.Py();
141 vtx_pzAcc(*MuSAVertex) = workVertex.mom.Pz();
142
143 vtx_massAcc(*MuSAVertex) = workVertex.mom.M();
144 vtx_chargeAcc(*MuSAVertex) = workVertex.charge;
145
146 minOpAngAcc(*MuSAVertex) = workVertex.minOpAng;
147
148 chi2_coreAcc(*MuSAVertex) = workVertex.chi2Core;
149 ndof_coreAcc(*MuSAVertex) = 1;
150 chi2_assocAcc(*MuSAVertex) = workVertex.chi2;
151 ndof_assocAcc(*MuSAVertex) = workVertex.ndof();
152
153 TLorentzVector sumP4_muon;
154 TLorentzVector sumP4_electron;
155 TLorentzVector sumP4_selected;
156
157 constexpr double muonMass = 105.658;
158
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();
164
165 TLorentzVector p4wrtSV_muon;
166 TLorentzVector p4wrtSV_electron;
167
168 p4wrtSV_muon.SetPtEtaPhiM(pt_wrtSV, eta_wrtSV, phi_wrtSV, muonMass);
170
171 sumP4_muon += p4wrtSV_muon;
172 sumP4_electron += p4wrtSV_electron;
173 sumP4_selected += p4wrtSV_muon;
174
177
178 std::unique_ptr<Trk::Perigee> sv_perigee =
m_trackToVertexTool->perigeeAtVertex(ctx, *containerTrack, workVertex.pos);
179 if (!sv_perigee) {
181 continue;
182 }
183
184 double qOverP_wrtSV = sv_perigee->parameters()[
Trk::qOverP];
185 double theta_wrtSV = sv_perigee->parameters()[
Trk::theta];
186 double p_wrtSV = 1.0 / std::abs(qOverP_wrtSV);
187 pt_wrtSV = p_wrtSV *
sin(theta_wrtSV);
188 eta_wrtSV = -
log(
tan(theta_wrtSV / 2.0));
189 phi_wrtSV = sv_perigee->parameters()[
Trk::phi];
190 double d0_wrtSV = sv_perigee->parameters()[
Trk::d0];
191 double z0_wrtSV = sv_perigee->parameters()[
Trk::z0];
192 double sqrd0Err_wrtSV = (*sv_perigee->covariance())(
Trk::d0,
Trk::d0);
193 double sqrz0Err_wrtSV = (*sv_perigee->covariance())(
Trk::z0,
Trk::z0);
195
196 qOverP_wrtSVAcc(*containerTrack) = qOverP_wrtSV;
197 theta_wrtSVAcc(*containerTrack) = theta_wrtSV;
198 p_wrtSVAcc(*containerTrack) = p_wrtSV;
199 pt_wrtSVAcc(*containerTrack) = pt_wrtSV;
200 eta_wrtSVAcc(*containerTrack) = eta_wrtSV;
201 phi_wrtSVAcc(*containerTrack) = phi_wrtSV;
202 d0_wrtSVAcc(*containerTrack) = d0_wrtSV;
203 z0_wrtSVAcc(*containerTrack) = z0_wrtSV;
204 sqrd0Err_wrtSVAcc(*containerTrack) = sqrd0Err_wrtSV;
205 sqrz0Err_wrtSVAcc(*containerTrack) = sqrz0Err_wrtSV;
206 sqrQoPErr_wrtSVAcc(*containerTrack) = sqrQoPErr_wrtSV;
207 }
208
209 massAcc(*MuSAVertex) = sumP4_muon.M();
210 mass_eAcc(*MuSAVertex) = sumP4_electron.M();
211 mass_selectedTracksAcc(*MuSAVertex) = sumP4_selected.M();
212 num_trksAcc(*MuSAVertex) = workVertex.nTracksTotal();
213 num_selectedTracksAcc(*MuSAVertex) = workVertex.selectedTrackIndices.size();
214 num_associatedTracksAcc(*MuSAVertex) = workVertex.associatedTrackIndices.size();
215 dCloseVrtAcc(*MuSAVertex) = workVertex.closestWrkVrtValue;
216 }
217 return StatusCode::SUCCESS;
218}
#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: