111 std::vector<RecordPars> parameters;
113 parameters.emplace_back(
Amg::Vector3D{vertex->x(), vertex->y(), vertex->z()},
116 else {parameters.emplace_back();}
120 ATH_CHECK(trackRecordCollection.isPresent());
122 const std::string r_name = trackRecordCollection.key();
123 float&
x = (*myDecors.
xDecor[idx])(truthParticle);
124 float&
y = (*myDecors.
yDecor[idx])(truthParticle);
125 float&
z = (*myDecors.
zDecor[idx])(truthParticle);
126 float& px = (*myDecors.
pxDecor[idx])(truthParticle);
127 float& py = (*myDecors.
pyDecor[idx])(truthParticle);
128 float& pz = (*myDecors.
pzDecor[idx])(truthParticle);
130 char& found_truth = (*myDecors.
matchedDecor[idx])(truthParticle);
132 x =
y =
z = px = py = pz = dummy_val;
136 float& ex = (*myDecors.
exDecor[idx])(truthParticle);
137 float& ey = (*myDecors.
eyDecor[idx])(truthParticle);
138 float& ez = (*myDecors.
ezDecor[idx])(truthParticle);
139 float& epx = (*myDecors.
epxDecor[idx])(truthParticle);
140 float& epy = (*myDecors.
epyDecor[idx])(truthParticle);
141 float& epz = (*myDecors.
epzDecor[idx])(truthParticle);
143 ex = ey = ez = epx = epy = epz = dummy_val;
146 for (
const TrackRecord& trackRecord : *trackRecordCollection) {
148 CLHEP::Hep3Vector pos = trackRecord.GetPosition();
149 CLHEP::Hep3Vector mom = trackRecord.GetMomentum();
150 ATH_MSG_VERBOSE(
"Found associated " << r_name <<
" pt " << mom.perp() <<
" position: r " << pos.perp() <<
" z " << pos.z());
151 x = pos.x();
y = pos.y();
z = pos.z();
152 px = mom.x(); py = mom.y(); pz = mom.z();
153 parameters.emplace_back(pos, mom);
159 if (!found_truth) {parameters.emplace_back();}
161 RecordPars& r_pars = parameters.back();
162 r_pars.record_name = r_name;
166 if (!found_truth)
continue;
168 if (r_name ==
"CaloEntryLayer")
169 volume = trackingGeometry->
trackingVolume(
"InDet::Containers::InnerDetector");
170 else if (r_name ==
"MuonEntryLayer")
172 else if (r_name ==
"MuonExitLayer")
173 volume = trackingGeometry->
trackingVolume(
"Muon::Containers::MuonSystem");
177 r_pars.volume = volume;
182 cov(0, 0) = cov(1, 1) = 1e-3;
183 cov(2, 2) = cov(3, 3) = 1e-6;
184 cov(4, 4) = 1e-3 / truthParticle.
p4().P();
185 for (
unsigned int i = 0; i < parameters.size() - 1; ++i) {
186 const RecordPars& start_pars = parameters[i];
187 const RecordPars& end_pars = parameters[i+1];
189 if ( (!start_pars.record_name.empty() && !start_pars.volume) || !end_pars.volume)
continue;
193 const std::string& r_name = end_pars.record_name;
195 float& ex = (*myDecors.
exDecor[end_pars.idx])(truthParticle);
196 float& ey = (*myDecors.
eyDecor[end_pars.idx])(truthParticle);
197 float& ez = (*myDecors.
ezDecor[end_pars.idx])(truthParticle);
198 float& epx = (*myDecors.
epxDecor[end_pars.idx])(truthParticle);
199 float& epy = (*myDecors.
epyDecor[end_pars.idx])(truthParticle);
200 float& epz = (*myDecors.
epzDecor[end_pars.idx])(truthParticle);
202 std::vector<float>& covMat = (*myDecors.
ecovDecor[end_pars.idx])(truthParticle);
204 std::unique_ptr<Trk::TrackParameters> exPars{
210 (*myDecors.
eisDecor[end_pars.idx])(truthParticle) =
true;
211 ex = exPars->position().x();
212 ey = exPars->position().y();
213 ez = exPars->position().z();
214 epx = exPars->momentum().x();
215 epy = exPars->momentum().y();
216 epz = exPars->momentum().z();
221 <<
" truth: r " << end_pars.pos.perp() <<
" z "
222 << end_pars.pos.z() <<
" p "
223 << end_pars.mom.mag() << std::endl
224 <<
" extrp: r " << exPars->position().perp() <<
" z "
225 << exPars->position().z() <<
" p "
226 << exPars->momentum().mag() <<
" res p "
227 << (end_pars.mom.mag() -
228 exPars->momentum().mag())
229 <<
" error " << errorp <<
" cov "
232 << (end_pars.mom.mag() -
233 exPars->momentum().mag()) /
236 return StatusCode::SUCCESS;
float px() const
The x component of the particle's momentum.
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
float py() const
The y component of the particle's momentum.
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
float pz() const
The z component of the particle's momentum.