65 {
67
69
70 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<int>> measurementRegionHandle(
m_measurementRegionKey, ctx);
71 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<int>> measurementDetectorHandle(
m_measurementDetectorKey, ctx);
72 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<int>> measurementLayerHandle(
m_measurementLayerKey, ctx);
73 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<int>> measurementTypeHandle(
m_measurementTypeKey, ctx);
74 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> chi2HitPredictedHandle(
m_chi2HitPredictedKey, ctx);
75 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> chi2HitFilteredHandle(
m_chi2HitFilteredKey, ctx);
76
77 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<int>> measurementPhiWidthHandle(
m_measurementPhiWidthKey, ctx);
78 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<int>> measurementEtaWidthHandle(
m_measurementEtaWidthKey, ctx);
79
80 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> residualLocXhandle(
m_residualLocXkey, ctx);
81 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> pullLocXhandle(
m_pullLocXkey, ctx);
82 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> measurementLocXhandle(
m_measurementLocXkey, ctx);
83 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> trackParameterLocXhandle(
m_trackParameterLocXkey, ctx);
84 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> measurementLocCovXhandle(
m_measurementLocCovXkey, ctx);
85 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> trackParameterLocCovXhandle(
m_trackParameterLocCovXkey, ctx);
86
87 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> residualLocYhandle(
m_residualLocYkey, ctx);
88 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> pullLocYhandle(
m_pullLocYkey, ctx);
89 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> measurementLocYhandle(
m_measurementLocYkey, ctx);
90 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> trackParameterLocYhandle(
m_trackParameterLocYkey, ctx);
91 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> measurementLocCovYhandle(
m_measurementLocCovYkey, ctx);
92 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> trackParameterLocCovYhandle(
m_trackParameterLocCovYkey, ctx);
93
97
99
100 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track =
getActsTrack(*track_particle);
101
102 if ( not optional_track.has_value() ) {
103 ATH_MSG_WARNING(
"Invalid track link for particle " << track_particle->index() <<
". Skipping track..");
104 continue;
105 }
106
107 ATH_MSG_DEBUG(
"Track link found for track particle with index " << track_particle->index());
108 ActsTrk::TrackContainer::ConstTrackProxy
track = optional_track.value();
109
110 std::vector<int>&
regions{measurementRegionHandle(*track_particle)};
112 std::vector<int>&
detectors{measurementDetectorHandle(*track_particle)};
114 std::vector<int>&
layers{measurementLayerHandle(*track_particle)};
116 std::vector<int>&
types{measurementTypeHandle(*track_particle)};
118 std::vector<float>& predchi2s{chi2HitPredictedHandle(*track_particle)};
119 predchi2s.reserve(
track.nMeasurements());
120 std::vector<float>& filtchi2s{chi2HitFilteredHandle(*track_particle)};
121 filtchi2s.reserve(
track.nMeasurements());
122
123 std::vector<int>& sizesPhi{measurementPhiWidthHandle(*track_particle)};
124 sizesPhi.reserve(
track.nMeasurements());
125 std::vector<int>& sizesEta{measurementEtaWidthHandle(*track_particle)};
126 sizesEta.reserve(
track.nMeasurements());
127 std::vector<float>& residualsLocX{residualLocXhandle(*track_particle)};
128 residualsLocX.reserve(
track.nMeasurements());
129 std::vector<float>& pullsLocX{pullLocXhandle(*track_particle)};
130 pullsLocX.reserve(
track.nMeasurements());
131 std::vector<float>& measurementsLocX{measurementLocXhandle(*track_particle)};
132 measurementsLocX.reserve(
track.nMeasurements());
133 std::vector<float>& trackParametersLocX{trackParameterLocXhandle(*track_particle)};
134 trackParametersLocX.reserve(
track.nMeasurements());
135 std::vector<float>& measurementsLocCovX{measurementLocCovXhandle(*track_particle)};
136 measurementsLocCovX.reserve(
track.nMeasurements());
137 std::vector<float>& trackParametersLocCovX{trackParameterLocCovXhandle(*track_particle)};
138 trackParametersLocCovX.reserve(
track.nMeasurements());
139 std::vector<float>& residualsLocY{residualLocYhandle(*track_particle)};
140 residualsLocY.reserve(
track.nMeasurements());
141 std::vector<float>& pullsLocY{pullLocYhandle(*track_particle)};
142 pullsLocY.reserve(
track.nMeasurements());
143 std::vector<float>& measurementsLocY{measurementLocYhandle(*track_particle)};
144 measurementsLocY.reserve(
track.nMeasurements());
145 std::vector<float>& trackParametersLocY{trackParameterLocYhandle(*track_particle)};
146 trackParametersLocY.reserve(
track.nMeasurements());
147 std::vector<float>& measurementsLocCovY{measurementLocCovYhandle(*track_particle)};
148 measurementsLocCovY.reserve(
track.nMeasurements());
149 std::vector<float>& trackParametersLocCovY{trackParameterLocCovYhandle(*track_particle)};
150 trackParametersLocCovY.reserve(
track.nMeasurements());
151
152 for (
const auto state :
track.trackStatesReversed()) {
153
154 auto flag = state.typeFlags();
155
156 bool anyHit =
flag.isHole() or
flag.hasMeasurement() or state.hasUncalibratedSourceLink();
157 if (not anyHit) {
158 ATH_MSG_DEBUG(
"--- This is not a hit measurement, skipping...");
159 continue;
160 }
161
162
163
165 int region = -999;
168 float chi2_hit_predicted = -999.;
169 float chi2_hit_filtered = -999.;
170 int sizePhi = -999;
171 int sizeEta = -999;
172 float residualLocX = -999.;
173 float pullLocX = -999.;
174 float measurementLocX = -999.;
175 float trackParameterLocX = -999.;
176 float measurementLocCovX = -999.;
177 float trackParameterLocCovX = -999;
178 float residualLocY = -999.;
179 float pullLocY = -999.;
180 float measurementLocY = -999.;
181 float trackParameterLocY = -999.;
182 float measurementLocCovY = -999.;
183 float trackParameterLocCovY = -999.;
184 bool isAnnulusBound = false;
185
186
190 }
else if (
flag.isOutlier()) {
193 }
else if (
flag.hasMeasurement()) {
196 }
197
198
199 if (state.hasReferenceSurface() and state.referenceSurface().isSensitive()) {
200 const ActsDetectorElement * detectorElement = dynamic_cast<const ActsDetectorElement *>(state.referenceSurface().surfacePlacement());
201 if (!detectorElement) {
202 ATH_MSG_WARNING(
"--- TrackState reference surface returned an invalid associated detector element");
203 continue;
204 }
205 const InDetDD::SiDetectorElement * siliconDetectorElement =
dynamic_cast<const InDetDD::SiDetectorElement *
>(detectorElement->
upstreamDetectorElement());
206 if (!siliconDetectorElement) {
207 ATH_MSG_WARNING(
"--- TrackState associated detector element is not silicon");
208 continue;
209 }
210
211 const Acts::AnnulusBounds* annulusBounds = dynamic_cast<const Acts::AnnulusBounds*>(&(state.referenceSurface().bounds()));
212 isAnnulusBound = annulusBounds ? true : false;
213
214 if (siliconDetectorElement) {
215 Identifier detectorIdentifier = siliconDetectorElement->
identify();
216 if (siliconDetectorElement->
isPixel()) {
217 const PixelID* pixel_id =
static_cast<const PixelID *
>(siliconDetectorElement->
getIdHelper());
218 int layer_disk = pixel_id->
layer_disk(detectorIdentifier);
220 if (pixel_id->
barrel_ec(detectorIdentifier) == 0) {
221 if (layer_disk == 0) {
225 } else {
228 }
229 }
else if (siliconDetectorElement->
isSCT()) {
230 const SCT_ID* sct_id =
static_cast<const SCT_ID *
>(siliconDetectorElement->
getIdHelper());
232 region = sct_id->
barrel_ec(detectorIdentifier) == 0 ?
235 }
else ATH_MSG_WARNING(
"--- Unknown detector type - It is not pixel nor strip detecor element!");
237 }
else ATH_MSG_WARNING(
"--- Missing reference surface or associated detector element!");
238
239
240
241
242
244
245
246
248 chi2_hit_filtered = state.chi2();
249 }
250
251 if (state.hasUncalibratedSourceLink()) {
253 }
254
255
256 if (!state.hasSmoothed() || !state.hasProjector())
257 continue;
258
259
260 const auto &calibratedParameters = state.effectiveCalibrated();
261 const auto &calibratedCovariance = state.effectiveCalibratedCovariance();
262
263
264
265
266 bool evaluateUnbiased =
flag.isMeasurement();
267
268 if (evaluateUnbiased) {
269 ATH_MSG_DEBUG(
"--- Good for unbiased parameters evaluation!");
271
272 if (state.hasUncalibratedSourceLink()) {
282 } else {
283 ATH_MSG_DEBUG(
"xAOD::UncalibratedMeasurement is neither xAOD::PixelCluster nor xAOD::StripCluster");
284 }
285 }
286 }
287
288 const auto& [unbiasedParameters, unbiasedCovariance] =
289 evaluateUnbiased ? Acts::calculateUnbiasedParametersCovariance(state) : std::make_pair(state.
parameters(), state.covariance());
290
291 measurementLocX = calibratedParameters[Acts::eBoundLoc0];
292 measurementLocCovX = calibratedCovariance(Acts::eBoundLoc0, Acts::eBoundLoc0);
293
294 if (!isAnnulusBound) {
295
296 trackParameterLocX = unbiasedParameters[Acts::eBoundLoc0];
297 residualLocX = (measurementLocX - trackParameterLocX) / 1_um;
298 trackParameterLocCovX = unbiasedCovariance(Acts::eBoundLoc0, Acts::eBoundLoc0);
299 }
300 else {
301
302
303 float locR = unbiasedParameters[Acts::eBoundLoc0];
304 float covR = unbiasedCovariance(Acts::eBoundLoc0,Acts::eBoundLoc0);
305 float locphi = unbiasedParameters[Acts::eBoundLoc1];
306 float covphi = unbiasedCovariance(Acts::eBoundLoc1,Acts::eBoundLoc1);
307 float covRphi = unbiasedCovariance(Acts::eBoundLoc0,Acts::eBoundLoc1);
308
309 trackParameterLocX = locphi;
310 residualLocX =
locR * (measurementLocX - trackParameterLocX) / 1_um;
311
312 trackParameterLocCovX =
locR*
locR*covphi + locphi*locphi*covR + 2*locphi*
locR*covRphi;
313
314
315 measurementLocCovX =
locR*
locR * measurementLocCovX;
316 }
317
318 pullLocX =
evaluatePull(residualLocX, measurementLocCovX,
319 trackParameterLocCovX, evaluateUnbiased);
320
321 if (state.calibratedSize() == 2) {
322 measurementLocY = calibratedParameters[Acts::eBoundLoc1];
323 trackParameterLocY = unbiasedParameters[Acts::eBoundLoc1];
324 residualLocY = (measurementLocY - trackParameterLocY) / 1_um;
325 measurementLocCovY = calibratedCovariance(Acts::eBoundLoc1, Acts::eBoundLoc1);
326 trackParameterLocCovY = unbiasedCovariance(Acts::eBoundLoc1, Acts::eBoundLoc1);
327 pullLocY =
evaluatePull(residualLocY, measurementLocCovY,
328 trackParameterLocCovY, evaluateUnbiased);
329 }
330
331 }
332
334
335
336 auto pred = state.predicted();
337 trackParameterLocX = pred[Acts::eBoundLoc0];
338 trackParameterLocY = pred[Acts::eBoundLoc1];
339 }
340
341 else {
344 }
345
346
347
351 types.push_back(type);
352 predchi2s.push_back(chi2_hit_predicted);
353 filtchi2s.push_back(chi2_hit_filtered);
354 sizesPhi.push_back(sizePhi);
355 sizesEta.push_back(sizeEta);
356 residualsLocX.push_back(residualLocX);
357 pullsLocX.push_back(pullLocX);
358 measurementsLocX.push_back(measurementLocX);
359 trackParametersLocX.push_back(trackParameterLocX);
360 measurementsLocCovX.push_back(measurementLocCovX);
361 trackParametersLocCovX.push_back(trackParameterLocCovX);
362 residualsLocY.push_back(residualLocY);
363 pullsLocY.push_back(pullLocY);
364 measurementsLocY.push_back(measurementLocY);
365 trackParametersLocY.push_back(trackParameterLocY);
366 measurementsLocCovY.push_back(measurementLocCovY);
367 trackParametersLocCovY.push_back(trackParameterLocCovY);
368
369
370 }
371
372 }
373
374 return StatusCode::SUCCESS;
375 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
static const std::vector< std::string > types
static const std::vector< std::string > regions
const GeoVDetectorElement * upstreamDetectorElement() const
Returns the underllying GeoModel detectorelement that this one is based on.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_chi2HitPredictedKey
float evaluatePull(const float residual, const float measurementCovariance, const float trackParameterCovariance, const bool evaluateUnbiased) const
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementRegionKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_residualLocYkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_trackParameterLocYkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementLayerKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementDetectorKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementLocYkey
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
float getChi2Contribution(const typename ActsTrk::TrackStateBackend::ConstTrackStateProxy &state) const
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementEtaWidthKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_pullLocYkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementLocXkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementTypeKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_residualLocXkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_pullLocXkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementLocCovXkey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticlesKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_trackParameterLocXkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_trackParameterLocCovYkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementLocCovYkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_trackParameterLocCovXkey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_chi2HitFilteredKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_measurementPhiWidthKey
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
virtual Identifier identify() const override final
identifier of this detector element (inline)
const AtlasDetectorID * getIdHelper() const
Returns the id helper (inline).
int layer_disk(const Identifier &id) const
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0).
int layer_disk(const Identifier &id) const
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0).
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
virtual xAOD::UncalibMeasType type() const =0
Returns the type of the measurement type as a simple enumeration.
std::optional< ActsTrk::TrackContainer::ConstTrackProxy > getActsTrack(const xAOD::TrackParticle &trkPart)
Return the proxy to the Acts track from which the track particle was made frome.
layers(flags, cells_name, *args, **kw)
Here we define wrapper functions to set up all of the standard corrections.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
StripCluster_v1 StripCluster
Define the version of the strip cluster class.
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
PixelCluster_v1 PixelCluster
Define the version of the pixel cluster class.
UncalibMeasType
Define the type of the uncalibrated measurement.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".