154 const auto & residualGroup =
getGroup(
"Residuals");
166 fill(
"residualGroup", mu_m);
171 if (not tracks.isValid()) {
173 return StatusCode::RECOVERABLE;
177 ATH_MSG_DEBUG (
"IDAlignMonResidual: Start loop on tracks. Number of tracks " << tracks->size());
181 if ( !trksItr || trksItr->perigeeParameters() ==
nullptr ) {
182 ATH_MSG_DEBUG(
"InDetAlignmentMonitoringRun3: NULL track pointer in collection" );
194 ATH_MSG_DEBUG(
"Not all TSOS contain track parameters - will be missing residuals/pulls");
197 ATH_MSG_DEBUG(
"All TSOS of track " << nTracks <<
"/" << tracks->size() <<
" contain track parameters - Good!");
201 ATH_MSG_DEBUG(
"** IDAlignMonResiduals::fillHistograms() ** track: " << nTracks <<
" has " << trksItr->trackStateOnSurfaces()->size() <<
" TrkSurfaces");
206 const Trk::Perigee* measPer = trksItr->perigeeParameters();
209 trkpt = measPer->
pT()/1000.;
217 if (tsos ==
nullptr) {
223 ATH_MSG_DEBUG(
" --> testing if hit " << nTSOS <<
"/" << trksItr->trackStateOnSurfaces()->size() <<
" is a track measurement");
225 ATH_MSG_DEBUG(
"Skipping TSOS " << nTSOS <<
" because it is an outlier (or the first TSOS on the track)");
230 ATH_MSG_DEBUG(
" --> Defined hit measurementOnTrack() for hit: " << nTSOS <<
"/" << trksItr->trackStateOnSurfaces()->size() <<
" of track " << nTracks);
234 ATH_MSG_DEBUG(
" --> Going to retrieve the Trk::RIO_OnTrack for hit " << nTSOS);
241 ATH_MSG_DEBUG(
" --> Going to retrieve the track parameters of this TSOS: " << nTSOS);
243 if(trackParameter==
nullptr) {
245 ATH_MSG_DEBUG(
" Skipping TSOS " << nTSOS <<
" because it does not have TrackParameters");
249 const AmgSymMatrix(5)* TrackParCovariance = trackParameter->covariance();
251 if(TrackParCovariance==
nullptr) {
254 ATH_MSG_DEBUG(
"Skipping TSOS " << nTSOS <<
" because does not have MeasuredTrackParameters");
259 " --> going to define residuals and everything of TSOS #" << nTSOS <<
"/" <<
260 trksItr->trackStateOnSurfaces()->size());
262 float residualX = 9999.0;
263 float residualY = 9999.0;
264 float pullX = 9999.0;
265 float pullY = 9999.0;
266 float biasedResidualX = 9999.0;
267 float biasedResidualY = 9999.0;
272 int layer_or_wheel = 99;
279 else if (
m_idHelper->is_sct(hitId)) detType = 1;
280 else if (
m_idHelper->is_pixel(hitId)) detType = 0;
284 if ( detType == 99) {
285 ATH_MSG_DEBUG(
" --> Hit " << nTSOS <<
" with detector type " << detType <<
" is not an Inner Detector hit -> skip this hit");
291 ATH_MSG_DEBUG(
"** IDAlignMonResidualsAlg::fillHistograms() ** Hit is from the TRT, finding residuals... ");
295 if (!trackParameter) {
296 ATH_MSG_WARNING(
"No TrackParameters associated with TRT TrkSurface " << nTSOS);
300 float trketa = tsos->trackParameters()->eta();
304 barrel_ec =
m_trtID->barrel_ec(
id);
305 layer_or_wheel =
m_trtID->layer_or_wheel(
id);
306 int phi_module =
m_trtID->phi_module(
id);
309 ATH_MSG_DEBUG(
"Found Trk::TrackParameters for hit " << nTSOS <<
" --> TRT hit (detType= " << detType <<
")" );
315 if (!trackParameterUnbiased) {
316 ATH_MSG_WARNING(
"Cannot define unbiased parameters for hit, skipping it.");
319 ATH_MSG_DEBUG(
" --> TRT UnBiased TrackParameters of hit " << nTSOS <<
" FOUND");
321 float predictR = trackParameterUnbiased->parameters()[
Trk::locR];
324 std::optional<Trk::ResidualPull> residualPull =
326 trackParameterUnbiased.get(),
333 ATH_MSG_DEBUG(
" no covariance of the track parameters given, can not calculate pull!");
338 float residualR = hitR - predictR;
343 if (trtCircle !=
nullptr) {
344 ATH_MSG_DEBUG(
" fillHistograms() ** filling TRT histograms for hit/tsos #" << nTSOS
345 <<
" Barrel/EndCap: " << barrel_ec
346 <<
" layer/wheel: " << layer_or_wheel
347 <<
" phi: " << phi_module
348 <<
" Residual: " << residualR);
365 ATH_MSG_DEBUG(
"applying hit quality cuts to Silicon hit...");
373 else ATH_MSG_DEBUG(
"hit quality cuts NOT APPLIED to Silicon hit.");
385 barrelEC =
m_sctID->barrel_ec(
id);
386 layerDisk =
m_sctID->layer_disk(
id);
387 modEta =
m_sctID->eta_module(
id);
388 modPhi =
m_sctID->phi_module(
id);
395 ATH_MSG_DEBUG(
"Found Trk::TrackParameters " << trackParameter);
397 double unbiasedResXY[4] = {9999.0,9999.0,9999.0,9999.0};
398 double biasedResXY[4] = {9999.0,9999.0,9999.0,9999.0};
403 if (
sc.isFailure()) {
404 ATH_MSG_DEBUG(
"Problem in determining unbiased residuals! Hit is skipped.");
406 fill(residualGroup, detType_m);
412 residualX = (float)unbiasedResXY[0];
413 residualY = (float)unbiasedResXY[1];
414 pullX = (float)unbiasedResXY[2];
415 pullY = (float)unbiasedResXY[3];
419 if (
sc.isFailure()) {
420 ATH_MSG_DEBUG(
"Problem in determining biased residuals! Hit is skipped.");
426 biasedResidualX = (float)biasedResXY[0];
427 biasedResidualY = (float)biasedResXY[1];
431 ATH_MSG_DEBUG(
"No TrackParameters associated with Si TrkSurface "<< nTSOS <<
" - Hit is probably an outlier");
466 ATH_MSG_DEBUG(
" This is a PIXEL hit " << hitId <<
" - filling histograms");
468 si_residualx_m = residualX;
469 fill(residualGroup, si_residualx_m);
472 int ModEtaShift[4] = {12, 38, 60, 82};
473 int ModPhiShift[4] = {0, 24, 56, 104};
476 si_b_residualx_m = residualX;
477 fill(residualGroup, si_b_residualx_m);
479 layerDisk_si_m = layerDisk;
480 si_barrel_resX_m = residualX;
481 si_barrel_resY_m = residualY;
482 si_barrel_pullX_m = pullX;
483 si_barrel_pullY_m = pullY;
484 fill(residualGroup, layerDisk_si_m, si_barrel_resX_m, si_barrel_resY_m, si_barrel_pullX_m, si_barrel_pullY_m);
491 fill(residualGroup, pix_b_residualx_m, pix_b_biased_residualx_m, pix_b_residualy_m, pix_b_biased_residualy_m);
511 auto modPhiShift_barrel_m =
Monitored::Scalar<int>(
"m_modPhiShift_barrel", modPhi + ModPhiShift[layerDisk] );
512 auto modEtaShift_barrel_m =
Monitored::Scalar<int>(
"m_modEtaShift_barrel", modEta + ModEtaShift[layerDisk] );
513 fill(residualGroup, modPhiShift_barrel_m, residualX_barrel_m, residualY_barrel_m);
514 fill(residualGroup, modEtaShift_barrel_m, residualX_barrel_m, residualY_barrel_m);
516 else if(barrelEC==2){
517 int ModPhiShift[3] = {0, 55, 110};
520 layerDisk_si_m = layerDisk;
521 si_eca_resX_m = residualX;
522 si_eca_resY_m = residualY;
523 si_eca_pullX_m = pullX;
524 si_eca_pullY_m = pullY;
525 fill(residualGroup, layerDisk_si_m, si_eca_resX_m, si_eca_resY_m, si_eca_pullX_m, si_eca_pullY_m);
533 fill(residualGroup, pix_eca_residualx_m, pix_eca_residualy_m);
537 fill(residualGroup, pix_eca_pullx_m, pix_eca_pully_m);
545 fill(residualGroup, modPhiShift_eca_m, residualX_eca_m, residualY_eca_m);
547 else if(barrelEC==-2){
548 int ModPhiShift[3] = {0, 55, 110};
551 layerDisk_si_m = layerDisk;
552 si_ecc_resX_m = residualX;
553 si_ecc_resY_m = residualY;
554 si_ecc_pullX_m = pullX;
555 si_ecc_pullY_m = pullY;
556 fill(residualGroup, layerDisk_si_m, si_ecc_resX_m, si_ecc_resY_m, si_ecc_pullX_m, si_ecc_pullY_m);
564 fill(residualGroup, pix_ecc_residualx_m, pix_ecc_residualy_m);
568 fill(residualGroup, pix_ecc_pullx_m, pix_ecc_pully_m);
576 fill(residualGroup, modPhiShift_ecc_m, residualX_ecc_m, residualY_ecc_m);
579 else if (detType==1) {
580 si_residualx_m = residualX;
581 fill(residualGroup, si_residualx_m);
583 ATH_MSG_DEBUG(
" This is a SCT hit " << hitId <<
" - filling histograms");
586 int ModPhiShift[4] = {0, 42, 92, 150};
587 int ModEtaShift[4] = {12, 34, 54, 78};
590 si_b_residualx_m = residualX;
591 fill(residualGroup, si_b_residualx_m);
593 layerDisk_si_m = 4 + 2 * layerDisk + sctSide;
594 si_barrel_resX_m = residualX;
595 si_barrel_pullX_m = pullX;
596 fill(residualGroup, layerDisk_si_m, si_barrel_resX_m, si_barrel_pullX_m);
600 fill(residualGroup, sct_b_residualx_m);
618 auto modPhiShift_sct_barrel_m =
Monitored::Scalar<int>(
"m_modPhiShift_sct_barrel", modPhi + ModPhiShift[layerDisk] );
619 auto modEtaShift_sct_barrel_m =
Monitored::Scalar<int>(
"m_modEtaShift_sct_barrel", modEta + ModEtaShift[layerDisk] );
620 fill(residualGroup, modPhiShift_sct_barrel_m, modEtaShift_sct_barrel_m, residualX_sct_barrel_m);
623 else if(barrelEC==2){
628 layerDisk_si_m = 3 + 2 * layerDisk + sctSide;
629 si_eca_resX_m = residualX;
630 si_eca_pullX_m = pullX;
631 fill(residualGroup, layerDisk_si_m, si_eca_resX_m, si_eca_pullX_m);
637 fill(residualGroup, sct_eca_residualx_m, sct_eca_pullx_m);
646 auto modPhiShift_sct_eca_m =
Monitored::Scalar<int>(
"m_modPhiShift_sct_eca", modPhi + layerDisk * (gap_sct + Nmods) );
647 fill(residualGroup, modPhiShift_sct_eca_m, residualX_sct_eca_m);
650 else if(barrelEC==-2){
655 layerDisk_si_m = 3 + 2 * layerDisk + sctSide;
656 si_ecc_resX_m = residualX;
657 si_ecc_pullX_m = pullX;
658 fill(residualGroup, layerDisk_si_m, si_ecc_resX_m, si_ecc_pullX_m);
664 fill(residualGroup, sct_ecc_residualx_m, sct_ecc_pullx_m);
673 auto modPhiShift_sct_ecc_m =
Monitored::Scalar<int>(
"m_modPhiShift_sct_ecc", modPhi + layerDisk * (gap_sct + Nmods) );
674 fill(residualGroup, modPhiShift_sct_ecc_m, residualX_sct_ecc_m);
684 return StatusCode::SUCCESS;
915 std::unique_ptr <Trk::TrackParameters> TrackParams{};
916 std::unique_ptr <Trk::TrackParameters> UnbiasedTrackParams{};
917 std::unique_ptr <Trk::TrackParameters> PropagatedTrackParams{};
918 std::unique_ptr <Trk::TrackParameters> OtherSideUnbiasedTrackParams{};
921 bool trueUnbiased =
true;
931 if (hitOnTrack !=
nullptr) surfaceID = hitOnTrack->
identify();
943 m_sctID->get_other_side(waferHash, otherSideHash);
949 if (TempHitOnTrack !=
nullptr) {
950 if (
m_sctID->wafer_id(TempHitOnTrack->
identify()) == OtherModuleSideID) {
951 ATH_MSG_VERBOSE(
"True unbiased residual. Removing OtherModuleSide Hit " <<
m_idHelper->show_to_string(OtherModuleSideID,
nullptr,
'/') );
952 OtherModuleSideHit = TempTsos;
957 if (OtherModuleSideHit) {
959 const AmgSymMatrix(5)* OMSHmeasuredTrackParameterCov = OMSHmeasuredTrackParameter ? OMSHmeasuredTrackParameter->covariance() :
nullptr;
962 if (OMSHmeasuredTrackParameterCov) {
968 if (OtherSideUnbiasedTrackParams) {
969 ATH_MSG_VERBOSE(
"Unbiased OtherSideTrackParameters: " << *OtherSideUnbiasedTrackParams);
983 ATH_MSG_VERBOSE(
"TempSurface->associatedLayer()->enclosingTrackingVolume exists");
990 Gaudi::Hive::currentContext(),
991 *OtherSideUnbiasedTrackParams,
998 ATH_MSG_VERBOSE(
"TempSurface->associatedLayer()->enclosingTrackingVolume does not exist");
1004 ATH_MSG_VERBOSE(
"After OtherSide surface call. Surface does not exist");
1008 if (PropagatedTrackParams) {
1009 ATH_MSG_VERBOSE(
"Propagated Track Parameters: " << *PropagatedTrackParams);
1011 ATH_MSG_DEBUG(
"Propagation of unbiased OtherSideParameters failed");
1014 ATH_MSG_DEBUG(
"RemoveFromState did not work for OtherSideParameters");
1017 ATH_MSG_VERBOSE(
"No OtherModuleSideHit Measured Track Parameters found");
1025 if (!PropagatedTrackParams) {
1027 PropagatedTrackParams = std::move(uTrkPtr);
1030 UnbiasedTrackParams =
1032 ->removeFromState(*PropagatedTrackParams,
1036 if (UnbiasedTrackParams) {
1038 ATH_MSG_VERBOSE(
"Unbiased Trackparameters: " << *UnbiasedTrackParams);
1040 TrackParams = std::move(UnbiasedTrackParams);
1043 ATH_MSG_WARNING(
"RemoveFromState did not work, using original TrackParameters");
1046 TrackParams = std::move(uTrkPtr);