154 auto residualGroup =
getGroup(
"Residuals");
157 bool hasBeenCalledThisEvent=
false;
163 if (!hasBeenCalledThisEvent){
166 hasBeenCalledThisEvent=
true;
172 fill(
"residualGroup", mu_m);
177 if (not tracks.isValid()) {
179 return StatusCode::RECOVERABLE;
183 ATH_MSG_DEBUG (
"IDAlignMonResidual: Start loop on tracks. Number of tracks " << tracks->size());
187 if ( !trksItr || trksItr->perigeeParameters() ==
nullptr ) {
188 ATH_MSG_DEBUG(
"InDetAlignmentMonitoringRun3: NULL track pointer in collection" );
200 ATH_MSG_DEBUG(
"Not all TSOS contain track parameters - will be missing residuals/pulls");
203 ATH_MSG_DEBUG(
"All TSOS of track " << nTracks <<
"/" << tracks->size() <<
" contain track parameters - Good!");
207 ATH_MSG_DEBUG(
"** IDAlignMonResiduals::fillHistograms() ** track: " << nTracks <<
" has " << trksItr->trackStateOnSurfaces()->size() <<
" TrkSurfaces");
212 const Trk::Perigee* measPer = trksItr->perigeeParameters();
215 trkpt = measPer->
pT()/1000.;
223 if (tsos ==
nullptr) {
229 ATH_MSG_DEBUG(
" --> testing if hit " << nTSOS <<
"/" << trksItr->trackStateOnSurfaces()->size() <<
" is a track measurement");
231 ATH_MSG_DEBUG(
"Skipping TSOS " << nTSOS <<
" because it is an outlier (or the first TSOS on the track)");
236 ATH_MSG_DEBUG(
" --> Defined hit measurementOnTrack() for hit: " << nTSOS <<
"/" << trksItr->trackStateOnSurfaces()->size() <<
" of track " << nTracks);
240 ATH_MSG_DEBUG(
" --> Going to retrieve the Trk::RIO_OnTrack for hit " << nTSOS);
247 ATH_MSG_DEBUG(
" --> Going to retrieve the track parameters of this TSOS: " << nTSOS);
249 if(trackParameter==
nullptr) {
251 ATH_MSG_DEBUG(
" Skipping TSOS " << nTSOS <<
" because it does not have TrackParameters");
255 const AmgSymMatrix(5)* TrackParCovariance = trackParameter ? trackParameter->covariance() :
nullptr;
257 if(TrackParCovariance==
nullptr) {
260 ATH_MSG_DEBUG(
"Skipping TSOS " << nTSOS <<
" because does not have MeasuredTrackParameters");
265 " --> going to define residuals and everything of TSOS #" << nTSOS <<
"/" <<
266 trksItr->trackStateOnSurfaces()->size());
268 float residualX = 9999.0;
269 float residualY = 9999.0;
270 float pullX = 9999.0;
271 float pullY = 9999.0;
272 float biasedResidualX = 9999.0;
273 float biasedResidualY = 9999.0;
278 int layer_or_wheel = 99;
285 else if (
m_idHelper->is_sct(hitId)) detType = 1;
286 else if (
m_idHelper->is_pixel(hitId)) detType = 0;
290 if ( detType == 99) {
291 ATH_MSG_DEBUG(
" --> Hit " << nTSOS <<
" with detector type " << detType <<
" is not an Inner Detector hit -> skip this hit");
297 ATH_MSG_DEBUG(
"** IDAlignMonResidualsAlg::fillHistograms() ** Hit is from the TRT, finding residuals... ");
301 if (!trackParameter) {
302 ATH_MSG_WARNING(
"No TrackParameters associated with TRT TrkSurface " << nTSOS);
306 float trketa = tsos->trackParameters()->eta();
310 barrel_ec =
m_trtID->barrel_ec(
id);
311 layer_or_wheel =
m_trtID->layer_or_wheel(
id);
312 int phi_module =
m_trtID->phi_module(
id);
315 ATH_MSG_DEBUG(
"Found Trk::TrackParameters for hit " << nTSOS <<
" --> TRT hit (detType= " << detType <<
")" );
321 if (!trackParameterUnbiased) {
322 ATH_MSG_WARNING(
"Cannot define unbiased parameters for hit, skipping it.");
325 ATH_MSG_DEBUG(
" --> TRT UnBiased TrackParameters of hit " << nTSOS <<
" FOUND");
327 float predictR = trackParameterUnbiased->parameters()[
Trk::locR];
330 std::optional<Trk::ResidualPull> residualPull =
332 trackParameterUnbiased.get(),
339 ATH_MSG_DEBUG(
" no covariance of the track parameters given, can not calculate pull!");
344 float residualR = hitR - predictR;
349 if (trtCircle !=
nullptr) {
350 ATH_MSG_DEBUG(
" fillHistograms() ** filling TRT histograms for hit/tsos #" << nTSOS
351 <<
" Barrel/EndCap: " << barrel_ec
352 <<
" layer/wheel: " << layer_or_wheel
353 <<
" phi: " << phi_module
354 <<
" Residual: " << residualR);
371 ATH_MSG_DEBUG(
"applying hit quality cuts to Silicon hit...");
379 else ATH_MSG_DEBUG(
"hit quality cuts NOT APPLIED to Silicon hit.");
391 barrelEC =
m_sctID->barrel_ec(
id);
392 layerDisk =
m_sctID->layer_disk(
id);
393 modEta =
m_sctID->eta_module(
id);
394 modPhi =
m_sctID->phi_module(
id);
401 ATH_MSG_DEBUG(
"Found Trk::TrackParameters " << trackParameter);
403 double unbiasedResXY[4] = {9999.0,9999.0,9999.0,9999.0};
404 double biasedResXY[4] = {9999.0,9999.0,9999.0,9999.0};
409 if (
sc.isFailure()) {
410 ATH_MSG_DEBUG(
"Problem in determining unbiased residuals! Hit is skipped.");
412 fill(residualGroup, detType_m);
418 residualX = (float)unbiasedResXY[0];
419 residualY = (float)unbiasedResXY[1];
420 pullX = (float)unbiasedResXY[2];
421 pullY = (float)unbiasedResXY[3];
425 if (
sc.isFailure()) {
426 ATH_MSG_DEBUG(
"Problem in determining biased residuals! Hit is skipped.");
432 biasedResidualX = (float)biasedResXY[0];
433 biasedResidualY = (float)biasedResXY[1];
437 ATH_MSG_DEBUG(
"No TrackParameters associated with Si TrkSurface "<< nTSOS <<
" - Hit is probably an outlier");
472 ATH_MSG_DEBUG(
" This is a PIXEL hit " << hitId <<
" - filling histograms");
474 si_residualx_m = residualX;
475 fill(residualGroup, si_residualx_m);
478 int ModEtaShift[4] = {12, 38, 60, 82};
479 int ModPhiShift[4] = {0, 24, 56, 104};
482 si_b_residualx_m = residualX;
483 fill(residualGroup, si_b_residualx_m);
485 layerDisk_si_m = layerDisk;
486 si_barrel_resX_m = residualX;
487 si_barrel_resY_m = residualY;
488 si_barrel_pullX_m = pullX;
489 si_barrel_pullY_m = pullY;
490 fill(residualGroup, layerDisk_si_m, si_barrel_resX_m, si_barrel_resY_m, si_barrel_pullX_m, si_barrel_pullY_m);
497 fill(residualGroup, pix_b_residualx_m, pix_b_biased_residualx_m, pix_b_residualy_m, pix_b_biased_residualy_m);
517 auto modPhiShift_barrel_m =
Monitored::Scalar<int>(
"m_modPhiShift_barrel", modPhi + ModPhiShift[layerDisk] );
518 auto modEtaShift_barrel_m =
Monitored::Scalar<int>(
"m_modEtaShift_barrel", modEta + ModEtaShift[layerDisk] );
519 fill(residualGroup, modPhiShift_barrel_m, residualX_barrel_m, residualY_barrel_m);
520 fill(residualGroup, modEtaShift_barrel_m, residualX_barrel_m, residualY_barrel_m);
522 else if(barrelEC==2){
523 int ModPhiShift[3] = {0, 55, 110};
526 layerDisk_si_m = layerDisk;
527 si_eca_resX_m = residualX;
528 si_eca_resY_m = residualY;
529 si_eca_pullX_m = pullX;
530 si_eca_pullY_m = pullY;
531 fill(residualGroup, layerDisk_si_m, si_eca_resX_m, si_eca_resY_m, si_eca_pullX_m, si_eca_pullY_m);
539 fill(residualGroup, pix_eca_residualx_m, pix_eca_residualy_m);
543 fill(residualGroup, pix_eca_pullx_m, pix_eca_pully_m);
551 fill(residualGroup, modPhiShift_eca_m, residualX_eca_m, residualY_eca_m);
553 else if(barrelEC==-2){
554 int ModPhiShift[3] = {0, 55, 110};
557 layerDisk_si_m = layerDisk;
558 si_ecc_resX_m = residualX;
559 si_ecc_resY_m = residualY;
560 si_ecc_pullX_m = pullX;
561 si_ecc_pullY_m = pullY;
562 fill(residualGroup, layerDisk_si_m, si_ecc_resX_m, si_ecc_resY_m, si_ecc_pullX_m, si_ecc_pullY_m);
570 fill(residualGroup, pix_ecc_residualx_m, pix_ecc_residualy_m);
574 fill(residualGroup, pix_ecc_pullx_m, pix_ecc_pully_m);
582 fill(residualGroup, modPhiShift_ecc_m, residualX_ecc_m, residualY_ecc_m);
585 else if (detType==1) {
586 si_residualx_m = residualX;
587 fill(residualGroup, si_residualx_m);
589 ATH_MSG_DEBUG(
" This is a SCT hit " << hitId <<
" - filling histograms");
592 int ModPhiShift[4] = {0, 42, 92, 150};
593 int ModEtaShift[4] = {12, 34, 54, 78};
596 si_b_residualx_m = residualX;
597 fill(residualGroup, si_b_residualx_m);
599 layerDisk_si_m = 4 + 2 * layerDisk + sctSide;
600 si_barrel_resX_m = residualX;
601 si_barrel_pullX_m = pullX;
602 fill(residualGroup, layerDisk_si_m, si_barrel_resX_m, si_barrel_pullX_m);
606 fill(residualGroup, sct_b_residualx_m);
624 auto modPhiShift_sct_barrel_m =
Monitored::Scalar<int>(
"m_modPhiShift_sct_barrel", modPhi + ModPhiShift[layerDisk] );
625 auto modEtaShift_sct_barrel_m =
Monitored::Scalar<int>(
"m_modEtaShift_sct_barrel", modEta + ModEtaShift[layerDisk] );
626 fill(residualGroup, modPhiShift_sct_barrel_m, modEtaShift_sct_barrel_m, residualX_sct_barrel_m);
629 else if(barrelEC==2){
634 layerDisk_si_m = 3 + 2 * layerDisk + sctSide;
635 si_eca_resX_m = residualX;
636 si_eca_pullX_m = pullX;
637 fill(residualGroup, layerDisk_si_m, si_eca_resX_m, si_eca_pullX_m);
643 fill(residualGroup, sct_eca_residualx_m, sct_eca_pullx_m);
652 auto modPhiShift_sct_eca_m =
Monitored::Scalar<int>(
"m_modPhiShift_sct_eca", modPhi + layerDisk * (gap_sct + Nmods) );
653 fill(residualGroup, modPhiShift_sct_eca_m, residualX_sct_eca_m);
656 else if(barrelEC==-2){
661 layerDisk_si_m = 3 + 2 * layerDisk + sctSide;
662 si_ecc_resX_m = residualX;
663 si_ecc_pullX_m = pullX;
664 fill(residualGroup, layerDisk_si_m, si_ecc_resX_m, si_ecc_pullX_m);
670 fill(residualGroup, sct_ecc_residualx_m, sct_ecc_pullx_m);
679 auto modPhiShift_sct_ecc_m =
Monitored::Scalar<int>(
"m_modPhiShift_sct_ecc", modPhi + layerDisk * (gap_sct + Nmods) );
680 fill(residualGroup, modPhiShift_sct_ecc_m, residualX_sct_ecc_m);
690 return StatusCode::SUCCESS;
921 std::unique_ptr <Trk::TrackParameters> TrackParams{};
922 std::unique_ptr <Trk::TrackParameters> UnbiasedTrackParams{};
923 std::unique_ptr <Trk::TrackParameters> PropagatedTrackParams{};
924 std::unique_ptr <Trk::TrackParameters> OtherSideUnbiasedTrackParams{};
927 bool trueUnbiased =
true;
937 if (hitOnTrack !=
nullptr) surfaceID = hitOnTrack->
identify();
949 m_sctID->get_other_side(waferHash, otherSideHash);
955 if (TempHitOnTrack !=
nullptr) {
956 if (
m_sctID->wafer_id(TempHitOnTrack->
identify()) == OtherModuleSideID) {
957 ATH_MSG_VERBOSE(
"True unbiased residual. Removing OtherModuleSide Hit " <<
m_idHelper->show_to_string(OtherModuleSideID,
nullptr,
'/') );
958 OtherModuleSideHit = TempTsos;
963 if (OtherModuleSideHit) {
965 const AmgSymMatrix(5)* OMSHmeasuredTrackParameterCov = OMSHmeasuredTrackParameter ? OMSHmeasuredTrackParameter->covariance() :
nullptr;
968 if (OMSHmeasuredTrackParameterCov) {
974 if (OtherSideUnbiasedTrackParams) {
975 ATH_MSG_VERBOSE(
"Unbiased OtherSideTrackParameters: " << *OtherSideUnbiasedTrackParams);
989 ATH_MSG_VERBOSE(
"TempSurface->associatedLayer()->enclosingTrackingVolume exists");
996 Gaudi::Hive::currentContext(),
997 *OtherSideUnbiasedTrackParams,
1004 ATH_MSG_VERBOSE(
"TempSurface->associatedLayer()->enclosingTrackingVolume does not exist");
1010 ATH_MSG_VERBOSE(
"After OtherSide surface call. Surface does not exist");
1014 if (PropagatedTrackParams) {
1015 ATH_MSG_VERBOSE(
"Propagated Track Parameters: " << *PropagatedTrackParams);
1017 ATH_MSG_DEBUG(
"Propagation of unbiased OtherSideParameters failed");
1020 ATH_MSG_DEBUG(
"RemoveFromState did not work for OtherSideParameters");
1023 ATH_MSG_VERBOSE(
"No OtherModuleSideHit Measured Track Parameters found");
1031 if (!PropagatedTrackParams) {
1033 PropagatedTrackParams = std::move(uTrkPtr);
1036 UnbiasedTrackParams =
1038 ->removeFromState(*PropagatedTrackParams,
1042 if (UnbiasedTrackParams) {
1044 ATH_MSG_VERBOSE(
"Unbiased Trackparameters: " << *UnbiasedTrackParams);
1046 TrackParams = std::move(UnbiasedTrackParams);
1049 ATH_MSG_WARNING(
"RemoveFromState did not work, using original TrackParameters");
1052 TrackParams = std::move(uTrkPtr);