Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
SpacePointCalibrator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 #include "SpacePointCalibrator.h"
5 
14 #include "GaudiKernel/PhysicalConstants.h"
17 namespace {
18  constexpr double c_inv = 1./ Gaudi::Units::c_light;
19 }
20 
21 namespace MuonR4{
25  using namespace SegmentFit;
26 
28  ATH_CHECK(m_geoCtxKey.initialize());
29  ATH_CHECK(m_idHelperSvc.retrieve());
30  ATH_CHECK(m_mdtCalibrationTool.retrieve(EnableTool{m_idHelperSvc->hasMDT()}));
31  ATH_CHECK(detStore()->retrieve(m_detMgr));
32  return StatusCode::SUCCESS;
33  }
34 
36  const CalibratedSpacePoint& spacePoint,
37  const Amg::Vector3D& segPos,
38  const Amg::Vector3D& segDir,
39  const double timeDelay) const {
40  CalibSpacePointPtr calibSP{};
41  if (spacePoint.type() != xAOD::UncalibMeasType::Other){
42  calibSP = calibrate(ctx, spacePoint.spacePoint(), segPos, segDir, timeDelay);
43  } else {
44  calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint);
45  }
46  if (spacePoint.fitState() == State::Outlier) {
47  calibSP->setFitState(State::Outlier);
48  }
49  return calibSP;
50  }
51 
54  const Amg::Vector3D& segPos,
55  const Amg::Vector3D& segDir,
56  const double timeDelay) const {
57  for (CalibSpacePointPtr& sp : spacePoints){
58  sp = calibrate(ctx, *sp, segPos, segDir, timeDelay);
59  }
60  return spacePoints;
61  }
62 
64  const SpacePoint* spacePoint,
65  const Amg::Vector3D& posInChamb,
66  const Amg::Vector3D& dirInChamb,
67  const double timeOffset) const {
68 
69  const ActsGeometryContext* gctx{nullptr};
70  if (!SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
71  return nullptr;
72  }
73  const Amg::Vector3D& spPos{spacePoint->positionInChamber()};
74  const Amg::Transform3D& locToGlob{spacePoint->msSector()->localToGlobalTrans(*gctx)};
75  Amg::Vector3D chDir{spacePoint->directionInChamber()};
76 
77  // Adjust the space point position according to the external seed. But only if the space point
78  // is a 1D strip
79  Amg::Vector3D calibSpPos = spacePoint->dimension() == 2 ? spPos
80  : spPos + Amg::intersect<3>(posInChamb, dirInChamb, spPos, chDir).value_or(0) * chDir;
81 
82  CalibSpacePointPtr calibSP{};
83  switch (spacePoint->type()) {
85  const Amg::Vector3D locClosestApproach = posInChamb
86  + Amg::intersect<3>(spPos, chDir,
87  posInChamb, dirInChamb).value_or(0) * dirInChamb;
88 
89  Amg::Vector3D closestApproach{locToGlob* locClosestApproach};
90  const double timeOfArrival = closestApproach.mag() * c_inv + timeOffset;
91  AmgSymMatrix(2) jac{AmgSymMatrix(2)::Identity()};
92  jac.col(0) = spacePoint->normalInChamber().block<2,1>(0,0).unit();
93  jac.col(1) = spacePoint->directionInChamber().block<2,1>(0,0).unit();
94 
95  if (spacePoint->dimension() == 1) {
96  auto* dc = static_cast<const xAOD::MdtDriftCircle*>(spacePoint->primaryMeasurement());
97  MdtCalibInput calibInput{*dc, *gctx};
98  calibInput.setTrackDirection(locToGlob.linear() * dirInChamb,
99  dirInChamb.phi() || posInChamb[toInt(AxisDefs::phi)] );
100  calibInput.setTimeOfFlight(timeOfArrival);
101  calibInput.setClosestApproach(std::move(closestApproach));
102  ATH_MSG_VERBOSE("Parse hit calibration "<<m_idHelperSvc->toString(dc->identify())<<", "<<calibInput);
103  MdtCalibOutput calibOutput = m_mdtCalibrationTool->calibrate(ctx, calibInput);
104  ATH_MSG_VERBOSE("Returned calibration object "<<calibOutput);
105  State fitState{State::Valid};
106  AmgSymMatrix(2) diagCov{AmgSymMatrix(2)::Identity()};
107  diagCov(toInt(AxisDefs::eta), toInt(AxisDefs::eta)) = std::pow(0.5* dc->readoutElement()->activeTubeLength(dc->measurementHash()),2);
110  ATH_MSG_DEBUG("Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
111  <<std::endl<<calibInput<<std::endl<<calibOutput);
112  fitState = State::FailedCalib;
113  diagCov(toInt(AxisDefs::phi), toInt(AxisDefs::phi)) = std::pow(dc->readoutElement()->innerTubeRadius(), 2);
114  } else {
115  diagCov(toInt(AxisDefs::phi), toInt(AxisDefs::phi)) = std::pow(calibOutput.driftRadiusUncert(), 2);
116  }
117  calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), std::move(chDir), fitState);
118  calibSP->setCovariance<2>(jac.inverse()*diagCov*jac);
119  calibSP->setDriftRadius(calibOutput.driftRadius());
120  } else {
121  auto* dc = static_cast<const xAOD::MdtTwinDriftCircle*>(spacePoint->primaryMeasurement());
122  MdtCalibInput calibInput{*dc, *gctx};
123  calibInput.setClosestApproach(closestApproach);
124  calibInput.setTimeOfFlight(timeOfArrival);
125 
126  MdtCalibInput twinInput{dc->twinIdentify(), dc->twinAdc(), dc->twinTdc(), dc->readoutElement(), *gctx};
127  twinInput.setClosestApproach(closestApproach);
128  twinInput.setTimeOfFlight(timeOfArrival);
129 
130  MdtCalibTwinOutput calibOutput = m_mdtCalibrationTool->calibrateTwinTubes(ctx,
131  std::move(calibInput),
132  std::move(twinInput));
133 
134  AmgSymMatrix(2) diagCov{AmgSymMatrix(2)::Identity()};
135  State fitState{State::Valid};
137  ATH_MSG_DEBUG("Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
138  <<std::endl<<calibOutput);
139  diagCov(toInt(AxisDefs::phi), toInt(AxisDefs::phi)) = std::pow(dc->readoutElement()->innerTubeRadius(), 2);
140  diagCov(toInt(AxisDefs::eta), toInt(AxisDefs::eta)) = std::pow(0.5* dc->readoutElement()->activeTubeLength(dc->measurementHash()), 2);
141  fitState = State::FailedCalib;
142  } else {
143  diagCov(toInt(AxisDefs::phi), toInt(AxisDefs::phi)) = std::pow(calibOutput.uncertPrimaryR(), 2);
144  diagCov(toInt(AxisDefs::eta), toInt(AxisDefs::eta)) = std::pow(calibOutput.sigmaZ(), 2);
145  }
146  calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), std::move(chDir), fitState);
147  calibSP->setCovariance<2>(jac.inverse()*diagCov*jac);
148  calibSP->setDriftRadius(calibOutput.primaryDriftR());
149  }
150  break;
151  }
153  auto* strip = static_cast<const xAOD::RpcMeasurement*>(spacePoint->primaryMeasurement());
154 
156  const Amg::Transform3D toGasGap{strip->readoutElement()->globalToLocalTrans(*gctx, strip->layerHash()) * locToGlob};
157  const Amg::Vector3D lPos = toGasGap * calibSpPos;
158  using EdgeSide = MuonGMR4::RpcReadoutElement::EdgeSide;
159  calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), std::move(chDir));
160  AmgSymMatrix(3) cov{AmgSymMatrix(3)::Identity()};
161  cov.block<2,2>(0, 0) = spacePoint->covariance();
162 
163  cov(2, 2) = m_rpcTimeResolution * m_rpcTimeResolution;
164 
165  const double time1 = strip->time()
166  - strip->readoutElement()->distanceToEdge(strip->layerHash(),
167  lPos.block<2,1>(0,0),
168  EdgeSide::readOut) /m_rpcSignalVelocity;
169 
170  if (spacePoint->dimension() == 2) {
171  auto* strip2 = static_cast<const xAOD::RpcMeasurement*>(spacePoint->secondaryMeasurement());
172 
173  const double time2 = strip2->time() -
174  strip2->readoutElement()->distanceToEdge(strip2->layerHash(),
175  Eigen::Rotation2D{M_PI_2}*lPos.block<2,1>(0,0),
176  EdgeSide::readOut)/m_rpcSignalVelocity;
178  calibSP->setTimeMeasurement(0.5*(time1 + time2));
180  cov(2,2) += std::pow(0.5*(time1 - time2), 2);
181  cov(2,1) = cov(1,2) = - strip->readoutElement()->stripPhiPitch() /m_rpcSignalVelocity / std::sqrt(12.)* std::sqrt(cov(2, 2));
182  cov(2,0) = cov(0,2) = - strip->readoutElement()->stripEtaPitch() /m_rpcSignalVelocity / std::sqrt(12.)* std::sqrt(cov(2, 2));
183 
184  } else {
185  calibSP->setTimeMeasurement(time1);
186  if (strip->measuresPhi()) {
187  cov(2,1) = cov(1,2) = - 0.5 *strip->readoutElement()->stripPhiLength() /m_rpcSignalVelocity * std::sqrt(cov(2, 2));
188  } else {
189  cov(2,0) = cov(0,2) = - 0.5 *strip->readoutElement()->stripEtaLength() /m_rpcSignalVelocity * std::sqrt(cov(2, 2));
190  }
191  }
192  calibSP->setCovariance<3>(std::move(cov));
194  ATH_MSG_VERBOSE("Create rpc space point "<<m_idHelperSvc->toString(strip->identify())<<", dimension "<<spacePoint->dimension()
195  << ", at "<<Amg::toString(calibSP->positionInChamber())<<", uncalib time: "
196  <<strip->time()<<", calib time: "<<calibSP->time()<<" cov " <<toString(calibSP->covariance()));
197  break;
198  }
201  calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), std::move(chDir));
202  calibSP->setCovariance<2>(spacePoint->covariance());
203  break;
204  }
205  default:
206  ATH_MSG_WARNING("Do not know how to calibrate "<<m_idHelperSvc->toString(spacePoint->identify()));
207  }
208  return calibSP;
209  }
210 
212  const std::vector<const SpacePoint*>& spacePoints,
213  const Amg::Vector3D& posInChamb,
214  const Amg::Vector3D& dirInChamb,
215  const double timeOffset) const {
216  CalibSpacePointVec calibSpacePoints{};
217  calibSpacePoints.reserve(spacePoints.size());
218  for(const SpacePoint* spacePoint : spacePoints) {
219  CalibSpacePointPtr hit = calibrate(ctx, spacePoint, posInChamb, dirInChamb, timeOffset);
220  if (hit) calibSpacePoints.push_back(std::move(hit));
221  }
222  return calibSpacePoints;
223  }
224  double SpacePointCalibrator::driftVelocity(const EventContext& ctx,
225  const CalibratedSpacePoint& spacePoint) const {
226  if(spacePoint.type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
227  const MuonCalib::MdtFullCalibData* calibConsts = m_mdtCalibrationTool->getCalibConstants(ctx, spacePoint.spacePoint()->identify());
228  const std::optional<double> driftTime = calibConsts->rtRelation->tr()->driftTime(spacePoint.driftRadius());
229  return calibConsts->rtRelation->rt()->driftVelocity(driftTime.value_or(0.));
230  }
231  return 0.;
232  }
233  double SpacePointCalibrator::driftAcceleration(const EventContext& ctx,
234  const CalibratedSpacePoint& spacePoint) const {
235  if(spacePoint.type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
236  const MuonCalib::MdtFullCalibData* calibConsts = m_mdtCalibrationTool->getCalibConstants(ctx, spacePoint.spacePoint()->identify());
237  const std::optional<double> driftTime = calibConsts->rtRelation->tr()->driftTime(spacePoint.driftRadius());
238  return calibConsts->rtRelation->rt()->driftAcceleration(driftTime.value_or(0.));
239  }
240  return 0.;
241  }
242 }
MuonR4::ISpacePointCalibrator::CalibSpacePointVec
std::vector< CalibSpacePointPtr > CalibSpacePointVec
Definition: ISpacePointCalibrator.h:26
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
MdtCalibInput::setTrackDirection
void setTrackDirection(const Amg::Vector3D &trackDir, bool hasPhi)
Sets the direction of the externally determined track.
Definition: MdtCalibInput.cxx:110
MuonR4::SpacePoint::msSector
const MuonGMR4::SpectrometerSector * msSector() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:116
xAOD::RpcMeasurement_v1
RpcMeasurement_v1: Class storing the geneic.
Definition: RpcMeasurement_v1.h:21
UtilFunctions.h
MuonR4::SpacePoint::type
xAOD::UncalibMeasType type() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:131
MuonR4::SpacePoint::normalInChamber
const Amg::Vector3D & normalInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:125
MdtCalibInput.h
MdtCalibInput
Definition: MdtCalibInput.h:34
MuonCalib::MdtFullCalibData::rtRelation
RtRelationPtr rtRelation
Definition: MdtFullCalibData.h:21
plotBeamSpotVxVal.cov
cov
Definition: plotBeamSpotVxVal.py:201
MdtCalibTwinOutput::sigmaZ
double sigmaZ() const
Definition: MdtCalibTwinOutput.cxx:49
MuonR4::CalibratedSpacePoint::State::Outlier
@ Outlier
MuonR4::SpacePoint::secondaryMeasurement
const xAOD::UncalibratedMeasurement * secondaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:110
MdtTwinDriftCircle.h
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
MuonCalib::MdtFullCalibData
class which holds the full set of calibration constants for a given tube
Definition: MdtFullCalibData.h:15
MuonGMR4::RpcReadoutElement::EdgeSide
EdgeSide
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/RpcReadoutElement.h:107
MdtCalibTwinOutput::uncertPrimaryR
double uncertPrimaryR() const
Definition: MdtCalibTwinOutput.cxx:52
Muon::MdtStatusDriftTime
@ MdtStatusDriftTime
The tube produced a vaild measurement.
Definition: MdtDriftCircleStatus.h:34
xAOD::UncalibMeasType::TgcStripType
@ TgcStripType
MuonR4::CalibSpacePointVec
ISpacePointCalibrator::CalibSpacePointVec CalibSpacePointVec
Definition: SpacePointCalibrator.cxx:22
MuonR4::SpacePoint::primaryMeasurement
const xAOD::UncalibratedMeasurement * primaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:107
MuonR4::SegmentFit::AxisDefs::phi
@ phi
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
TRT::Hit::driftTime
@ driftTime
Definition: HitInfo.h:43
SG::get
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Definition: ReadCondHandle.h:287
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
UtilFunctions.h
MdtCalibOutput.h
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
MuonR4::CalibratedSpacePoint::State::FailedCalib
@ FailedCalib
xAOD::MdtTwinDriftCircle_v1
Definition: MdtTwinDriftCircle_v1.h:12
MuonR4::CalibratedSpacePoint::State
State
State flag to distinguish different space point states.
Definition: CalibratedSpacePoint.h:24
xAOD::Other
@ Other
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonR4::CalibratedSpacePoint::type
xAOD::UncalibMeasType type() const
Returns the space point type.
Definition: CalibratedSpacePoint.cxx:36
MdtCalibInput::setClosestApproach
void setClosestApproach(const Amg::Vector3D &approach)
Sets the closest approach.
Definition: MdtCalibInput.cxx:106
MuonR4::SegmentFit::toString
std::string toString(const Parameters &pars)
Definition: SegmentFitterEventData.cxx:59
MuonR4::SpacePointCalibrator::driftVelocity
double driftVelocity(const EventContext &ctx, const CalibratedSpacePoint &spacePoint) const override final
Definition: SpacePointCalibrator.cxx:224
SpacePointCalibrator.h
F600IntegrationConfig.spacePoints
spacePoints
Definition: F600IntegrationConfig.py:65
MdtCalibOutput::status
MdtDriftCircleStatus status() const
Status of the calibration.
Definition: MdtCalibOutput.cxx:40
MdtCalibOutput
Definition: MdtCalibOutput.h:10
MuonR4::SegmentFit::AxisDefs::eta
@ eta
MuonR4::SpacePointCalibrator::driftAcceleration
double driftAcceleration(const EventContext &ctx, const CalibratedSpacePoint &spacePoint) const override final
Definition: SpacePointCalibrator.cxx:233
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:27
MdtDriftCircle.h
MuonR4::CalibratedSpacePoint::State::Valid
@ Valid
MuonR4::SpacePoint
The muon space point is the combination of two uncalibrated measurements one of them measures the eta...
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:18
MuonR4::ISpacePointCalibrator::CalibSpacePointPtr
std::unique_ptr< CalibratedSpacePoint > CalibSpacePointPtr
Definition: ISpacePointCalibrator.h:25
MuonR4::SpacePoint::directionInChamber
const Amg::Vector3D & directionInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:122
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
MuonR4::CalibratedSpacePoint::fitState
State fitState() const
Returns the state of the calibrated space point.
Definition: CalibratedSpacePoint.cxx:55
MuonR4::SegmentFit::toInt
constexpr int toInt(const ParamDefs p)
Definition: MuonHoughDefs.h:42
RpcMeasurement.h
MdtCalibTwinOutput::primaryStatus
MdtDriftCircleStatus primaryStatus() const
Definition: MdtCalibTwinOutput.cxx:54
python.PhysicalConstants.c_light
float c_light
Definition: PhysicalConstants.py:63
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MdtCalibOutput::driftRadiusUncert
double driftRadiusUncert() const
Returns the uncertainty on the drift radius.
Definition: MdtCalibOutput.cxx:20
MuonR4
This header ties the generic definitions in this package.
Definition: HoughEventData.h:16
MuonR4::SpacePoint::positionInChamber
const Amg::Vector3D & positionInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:119
MuonR4::SpacePointCalibrator::calibrate
CalibSpacePointPtr calibrate(const EventContext &ctx, const SpacePoint *spacePoint, const Amg::Vector3D &seedPosInChamb, const Amg::Vector3D &seedDirInChamb, const double timeDelay) const override final
Definition: SpacePointCalibrator.cxx:63
MdtCalibTwinOutput
Definition: MdtCalibTwinOutput.h:11
MuonR4::CalibSpacePointPtr
ISpacePointCalibrator::CalibSpacePointPtr CalibSpacePointPtr
Definition: SpacePointCalibrator.cxx:23
SegmentFitterEventData.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
MdtReadoutElement.h
MuonGMR4::SpectrometerSector::localToGlobalTrans
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &gctx) const
Returns the local -> global tarnsformation from the sector.
Definition: SpectrometerSector.cxx:51
unit
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
Definition: AmgMatrixBasePlugin.h:21
MuonR4::CalibratedSpacePoint
The calibrated Space point is created during the calibration process.
Definition: CalibratedSpacePoint.h:15
MdtFullCalibData.h
MuonR4::SpacePoint::dimension
unsigned int dimension() const
Is the space point a 1D or combined 2D measurement.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:160
MdtCalibTwinOutput::primaryDriftR
double primaryDriftR() const
Definition: MdtCalibTwinOutput.cxx:50
xAOD::MdtDriftCircle_v1
https://gitlab.cern.ch/atlas/athena/-/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecEvent/Mu...
Definition: MdtDriftCircle_v1.h:21
MuonR4::CalibratedSpacePoint::spacePoint
const SpacePoint * spacePoint() const
The pointer to the space point out of which this space point has been built.
Definition: CalibratedSpacePoint.cxx:18
MuonR4::AmgSymMatrix
const AmgSymMatrix(2) &SpacePoint
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:150
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
xAOD::UncalibMeasType::RpcStripType
@ RpcStripType
xAOD::RpcMeasurement_v1::time
float time() const
Returns the time.
MuonR4::CalibratedSpacePoint::driftRadius
double driftRadius() const
The drift radius of the calibrated space point.
Definition: CalibratedSpacePoint.cxx:27
xAOD::UncalibMeasType::MdtDriftCircleType
@ MdtDriftCircleType
MdtCalibOutput::driftRadius
double driftRadius() const
Returns the drift radius of the calibrated object.
Definition: MdtCalibOutput.cxx:19
MuonR4::SpacePoint::identify
const Identifier & identify() const
: Identifier of the primary measurement
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:140
MuonR4::SpacePointCalibrator::initialize
StatusCode initialize() override final
Definition: SpacePointCalibrator.cxx:27