100 std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track =
getActsTrack(*track_particle);
102 if ( not optional_track.has_value() ) {
103 ATH_MSG_WARNING(
"Invalid track link for particle " << track_particle->index() <<
". Skipping track..");
107 ATH_MSG_DEBUG(
"Track link found for track particle with index " << track_particle->index());
108 ActsTrk::TrackContainer::ConstTrackProxy track = optional_track.value();
110 std::vector<int>&
regions{measurementRegionHandle(*track_particle)};
111 regions.reserve(track.nMeasurements());
112 std::vector<int>& detectors{measurementDetectorHandle(*track_particle)};
113 detectors.reserve(track.nMeasurements());
114 std::vector<int>& layers{measurementLayerHandle(*track_particle)};
115 layers.reserve(track.nMeasurements());
116 std::vector<int>&
types{measurementTypeHandle(*track_particle)};
117 types.reserve(track.nMeasurements());
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());
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());
152 for (
const auto state : track.trackStatesReversed()) {
154 auto flag = state.typeFlags();
156 bool anyHit = flag.isHole() or flag.hasMeasurement();
158 ATH_MSG_DEBUG(
"--- This is not a hit measurement, skipping...");
168 float chi2_hit_predicted = -999.;
169 float chi2_hit_filtered = -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;
190 }
else if (flag.isOutlier()) {
199 if (state.hasReferenceSurface() and state.referenceSurface().isSensitive()) {
201 if (!detectorElement) {
202 ATH_MSG_WARNING(
"--- TrackState reference surface returned an invalid associated detector element");
206 if (!siliconDetectorElement) {
207 ATH_MSG_WARNING(
"--- TrackState associated detector element is not silicon");
211 const Acts::AnnulusBounds* annulusBounds =
dynamic_cast<const Acts::AnnulusBounds*
>(&(state.referenceSurface().bounds()));
212 isAnnulusBound = annulusBounds ? true :
false;
214 if (siliconDetectorElement) {
216 if (siliconDetectorElement->
isPixel()) {
218 int layer_disk = pixel_id->
layer_disk(detectorIdentifier);
220 if (pixel_id->
barrel_ec(detectorIdentifier) == 0) {
221 if (layer_disk == 0) {
229 }
else if (siliconDetectorElement->
isSCT()) {
232 region = sct_id->
barrel_ec(detectorIdentifier) == 0 ?
234 layer = sct_id->
layer_disk(detectorIdentifier);;
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!");
248 chi2_hit_filtered = state.chi2();
251 if (state.hasUncalibratedSourceLink()) {
256 if (!state.hasSmoothed() || !state.hasProjector())
260 const auto &calibratedParameters = state.effectiveCalibrated();
261 const auto &calibratedCovariance = state.effectiveCalibratedCovariance();
266 bool evaluateUnbiased = flag.isMeasurement();
268 if (evaluateUnbiased) {
269 ATH_MSG_DEBUG(
"--- Good for unbiased parameters evaluation!");
272 if (state.hasUncalibratedSourceLink()) {
277 sizePhi = pixelCluster->channelsInPhi();
278 sizeEta = pixelCluster->channelsInEta();
281 sizePhi = stripCluster->channelsInPhi();
283 ATH_MSG_DEBUG(
"xAOD::UncalibratedMeasurement is neither xAOD::PixelCluster nor xAOD::StripCluster");
288 const auto& [unbiasedParameters, unbiasedCovariance] =
289 evaluateUnbiased ? Acts::calculateUnbiasedParametersCovariance(state) : std::make_pair(state.parameters(), state.covariance());
291 measurementLocX = calibratedParameters[Acts::eBoundLoc0];
292 measurementLocCovX = calibratedCovariance(Acts::eBoundLoc0, Acts::eBoundLoc0);
294 if (!isAnnulusBound) {
296 trackParameterLocX = unbiasedParameters[Acts::eBoundLoc0];
297 residualLocX = (measurementLocX - trackParameterLocX) / 1_um;
298 trackParameterLocCovX = unbiasedCovariance(Acts::eBoundLoc0, Acts::eBoundLoc0);
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);
309 trackParameterLocX = locphi;
310 residualLocX = locR * (measurementLocX - trackParameterLocX) / 1_um;
312 trackParameterLocCovX = locR*locR*covphi + locphi*locphi*covR + 2*locphi*locR*covRphi;
315 measurementLocCovX = locR*locR * measurementLocCovX;
318 pullLocX =
evaluatePull(residualLocX, measurementLocCovX,
319 trackParameterLocCovX, evaluateUnbiased);
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);
336 auto pred = state.predicted();
337 trackParameterLocX = pred[Acts::eBoundLoc0];
338 trackParameterLocY = pred[Acts::eBoundLoc1];
344 detectors.push_back(detector);
345 layers.push_back(layer);
347 predchi2s.push_back(chi2_hit_predicted);
348 filtchi2s.push_back(chi2_hit_filtered);
349 sizesPhi.push_back(sizePhi);
350 sizesEta.push_back(sizeEta);
351 residualsLocX.push_back(residualLocX);
352 pullsLocX.push_back(pullLocX);
353 measurementsLocX.push_back(measurementLocX);
354 trackParametersLocX.push_back(trackParameterLocX);
355 measurementsLocCovX.push_back(measurementLocCovX);
356 trackParametersLocCovX.push_back(trackParameterLocCovX);
357 residualsLocY.push_back(residualLocY);
358 pullsLocY.push_back(pullLocY);
359 measurementsLocY.push_back(measurementLocY);
360 trackParametersLocY.push_back(trackParameterLocY);
361 measurementsLocCovY.push_back(measurementLocCovY);
362 trackParametersLocCovY.push_back(trackParameterLocCovY);
369 return StatusCode::SUCCESS;