ATLAS Offline Software
Loading...
Searching...
No Matches
MuonR4::SpacePointCalibrator Class Reference

#include <SpacePointCalibrator.h>

Inheritance diagram for MuonR4::SpacePointCalibrator:
Collaboration diagram for MuonR4::SpacePointCalibrator:

Public Types

enum class  ProjectorType {
  e1DimNoTime = 0 , e1DimRotNoTime = 1 , e2DimNoTime = 2 , e1DimWithTime = 3 ,
  e1DimRotWithTime = 4 , e2DimWithTime = 5
}
 Enum encoding the possible projectors used in ATLAS. More...
using SourceLink_t
 Encode the source links supported by the Calibrator class as a variant of the measurement class type pointer used within Athena.

Public Member Functions

StatusCode initialize () override final
CalibSpacePointPtr calibrate (const EventContext &ctx, const SpacePoint *spacePoint, const Amg::Vector3D &seedPosInChamb, const Amg::Vector3D &seedDirInChamb, const double timeDelay) const override final
CalibSpacePointPtr calibrate (const EventContext &ctx, const CalibratedSpacePoint &spacePoint, const Amg::Vector3D &seedPosInChamb, const Amg::Vector3D &seedDirInChamb, const double timeDelay) const override final
CalibSpacePointVec calibrate (const EventContext &ctx, const std::vector< const SpacePoint * > &spacePoints, const Amg::Vector3D &seedPosInChamb, const Amg::Vector3D &seedDirInChamb, const double timeDelay) const override final
CalibSpacePointVec calibrate (const Acts::CalibrationContext &ctx, const Amg::Vector3D &seedPosInChamb, const Amg::Vector3D &seedDirInChamb, const double timeDelay, const CalibSpacePointVec &spacePoints) const override final
void updateSigns (const Amg::Vector3D &trackPos, const Amg::Vector3D &trackDir, CalibSpacePointVec &hitsToCalib) const override final
double driftVelocity (const Acts::CalibrationContext &ctx, const CalibratedSpacePoint &spacePoint) const override final
double driftAcceleration (const Acts::CalibrationContext &ctx, const CalibratedSpacePoint &spacePoint) const override final
void calibrateSourceLink (const Acts::GeometryContext &geoctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &link, ActsTrk::MutableTrackContainer::TrackStateProxy state) const override final
void stampSignsOnMeasurements (const xAOD::MuonSegment &segment) const override final
double driftRadius (const Acts::CalibrationContext &cctx, const CalibratedSpacePoint &spacePoint, const double timeDelay) const override final
double driftVelocity (const Acts::CalibrationContext &cctx, const CalibratedSpacePoint &spacePoint, const double timeDelay) const override final
double driftAcceleration (const Acts::CalibrationContext &cctx, const CalibratedSpacePoint &spacePoint, const double timeDelay) const override final
template<std::size_t Dim, Acts::TrackStateProxyConcept proxy_t, typename pos_t, typename cov_t>
void setState (const ProjectorType projector, const pos_t &locpos, const cov_t &cov, Acts::SourceLink link, proxy_t &trackState) const
 Copy the local position & covariance into the Acts track state proxy.

Static Public Member Functions

static SourceLinkType getType (const Acts::SourceLink &sl)
 Returns the enumeration corresponding to the object type cached within the Acts::SourceLink.
static SourceLink_t unpackBase (const Acts::SourceLink &sl)
 Unpack the SourceLink_t from the passed Acts source link.
template<Acts::PointerConcept Ptr_t>
static Acts::SourceLink pack (const Ptr_t &measurement)
 Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a SourceLink_t.
template<Acts::PointerConcept Ptr_t>
static void pack (const std::vector< Ptr_t > &measList, std::vector< Acts::SourceLink > &targetSL)
 Converts a vector measurement pointers to Acts::SourceLinks.

Protected Member Functions

template<std::size_t Dim, Acts::TrackStateProxyConcept proxy_t>
void prepareCalibratedState (const ProjectorType projector, Acts::SourceLink link, proxy_t &trackState) const
 Queries the track proxy to allocate memory for the incoming calibration object.

Private Member Functions

void calibrateCombinedPrd (const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const xAOD::CombinedMuonStrip *combinedPrd, ActsTrk::MutableTrackContainer::TrackStateProxy state) const
 Calibrates the track states from a combined muon strip.
std::pair< double, double > calibrateMM (const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const xAOD::MMCluster &cluster, const Amg::Vector3D &globalPos, const Amg::Vector3D &globalDir) const
 Calibrates the position and covariance of a MicroMegas (MM) cluster.
std::pair< double, double > calibratesTGC (const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const xAOD::sTgcStripCluster &cluster, std::optional< double > posAlongTheStrip, const Amg::Vector3D &globalPos, const Amg::Vector3D &globalDir) const
 Calibrates the position and covariance of an sTGC (small-strip Thin Gap Chamber) cluster.

Private Attributes

ActsTrk::GeoContextReadKey_t m_geoCtxKey {this, "AlignmentKey", "ActsAlignment", "cond handle key"}
 access to the ACTS geometry context
ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
ToolHandle< IMdtCalibrationToolm_mdtCalibrationTool {this, "MdtCalibrationTool", ""}
ToolHandle< Muon::INSWCalibToolm_nswCalibTool {this, "NSWCalibTool", ""}
ToolHandle< Muon::IMMClusterBuilderToolm_clusterBuilderToolMM {this, "MMClusterBuilder", ""}
const MuonGMR4::MuonDetectorManagerm_detMgr {nullptr}
Gaudi::Property< double > m_muonPropSpeed {this, "PropagationSpeed", 1./ Gaudi::Units::c_light }
 Assumed propagation velocity of the muon through the detector.
Gaudi::Property< double > m_rpcSignalVelocity
 How fast does an electron signal travel along an rpc strip.
Gaudi::Property< double > m_rpcTimeResolution
Gaudi::Property< bool > m_useRpcTime {this, "useRpcTime", false}
 Load the Rpc time on the track states for the track fit.
Gaudi::Property< bool > m_useTgcTime
 Load the Tgc bunch crossing ID on the track states.
Gaudi::Property< bool > m_usesTgcTime
Gaudi::Property< bool > m_MdtSignFromSegment
Gaudi::Property< double > m_sTgcPrecCoordErrorScale { this, "sTgcPrecCoordErrorScale", 1.0, "Scale factor applied to the sTGC strip measurement uncertainty" }
 Scale factor applied to the sTGC strip measurement uncertainty.
Gaudi::Property< double > m_sTgcNonPrecCoordErrorScale { this, "sTgcNonPrecCoordErrorScale", 1.0, "Scale factor applied to the sTGC non-precise coordinate measurement uncertainty" }
 Scale factor applied to the sTGC non-precise coordinate measurement uncertainty.
Gaudi::Property< double > m_mmStripErrorScale { this, "mmStripErrorScale", 1.0, "Scale factor applied to the MM strip measurement uncertainty" }
 Scale factor applied to the MM strip measurement uncertainty.

Static Private Attributes

static constexpr std::array< Acts::BoundSubspaceIndices, 6 > s_boundSpaceIndices
 Array to map the Projector types to the bound index configurations used by the ATLAS detector measurements.

Detailed Description

Definition at line 30 of file SpacePointCalibrator.h.

Member Typedef Documentation

◆ SourceLink_t

Initial value:
std::variant<std::monostate,
This class is the pure abstract base class for all fittable tracking measurements.
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.

Encode the source links supported by the Calibrator class as a variant of the measurement class type pointer used within Athena.

The std::monostate is used to encode nullptrs or not yet supported types

Definition at line 53 of file MeasurementCalibratorBase.h.

Member Enumeration Documentation

◆ ProjectorType

Enum encoding the possible projectors used in ATLAS.

Their integer representations correspond to the element index in the s_boundSpaceIndices member

Enumerator
e1DimNoTime 
e1DimRotNoTime 

Project out solely the locX (Applies to Itk strips, Rpc, Tgc, sTgc, Mm).

e2DimNoTime 

Project out solely the locY - Complementary projector if the strip plane is rotated (Applies to Itk endcap strips, Rpc, Tgc, sTgc).

e1DimWithTime 

Project out the two spatial coordinates - (Applies to ITk pixel, BI-Rpc, sTgc pad).

e1DimRotWithTime 

Project out the locX & time coordinate - (Applies to Rpc, Tgc, Mm, sTgc).

e2DimWithTime 

Project out the locY & time coordinate - (Applies to Rpc, Tgc, sTgc).

Definition at line 41 of file MeasurementCalibratorBase.h.

41 {
42 e1DimNoTime = 0,
43 e1DimRotNoTime = 1,
45 e2DimNoTime = 2,
46 e1DimWithTime = 3,
47 e1DimRotWithTime = 4,
48 e2DimWithTime = 5,
49 };

Member Function Documentation

◆ calibrate() [1/4]

CalibSpacePointVec MuonR4::SpacePointCalibrator::calibrate ( const Acts::CalibrationContext & ctx,
const Amg::Vector3D & seedPosInChamb,
const Amg::Vector3D & seedDirInChamb,
const double timeDelay,
const CalibSpacePointVec & spacePoints ) const
finaloverride

Definition at line 88 of file SpacePointCalibrator.cxx.

92 {
93 CalibSpacePointVec newCalib{};
94 const EventContext* ctx = cctx.get<const EventContext*>();
95 newCalib.reserve(spacePoints.size());
96 for (const CalibSpacePointPtr& sp : spacePoints){
97 newCalib.emplace_back(calibrate(*ctx, *sp, segPos, segDir, timeDelay));
98 }
99 return newCalib;
100 }
static Double_t sp
CalibSpacePointPtr calibrate(const EventContext &ctx, const SpacePoint *spacePoint, const Amg::Vector3D &seedPosInChamb, const Amg::Vector3D &seedDirInChamb, const double timeDelay) const override final
ISpacePointCalibrator::CalibSpacePointVec CalibSpacePointVec
ISpacePointCalibrator::CalibSpacePointPtr CalibSpacePointPtr

◆ calibrate() [2/4]

CalibSpacePointPtr MuonR4::SpacePointCalibrator::calibrate ( const EventContext & ctx,
const CalibratedSpacePoint & spacePoint,
const Amg::Vector3D & seedPosInChamb,
const Amg::Vector3D & seedDirInChamb,
const double timeDelay ) const
finaloverride

Definition at line 69 of file SpacePointCalibrator.cxx.

73 {
74 CalibSpacePointPtr calibSP{};
75 if (spacePoint.type() != xAOD::UncalibMeasType::Other){
76 calibSP = calibrate(ctx, spacePoint.spacePoint(), segPos, segDir, timeDelay);
77 } else {
78 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint);
79 }
80 if (spacePoint.fitState() == State::Outlier) {
81 calibSP->setFitState(State::Outlier);
82 } else if (spacePoint.fitState() == State::Duplicate) {
83 calibSP->setFitState(State::Duplicate);
84 }
85 return calibSP;
86 }

◆ calibrate() [3/4]

CalibSpacePointPtr MuonR4::SpacePointCalibrator::calibrate ( const EventContext & ctx,
const SpacePoint * spacePoint,
const Amg::Vector3D & seedPosInChamb,
const Amg::Vector3D & seedDirInChamb,
const double timeDelay ) const
finaloverride

In valid drift radius has been created

Set time measurement used by the fast fitter, corrected by the tube T0 and a fast estimate of the time of flight

Set time measurement used by the fast fitter, corrected by the tube T0 and a fast estimate of the time of flight

Transform the space point into the local frame to calculate the propagation time towards the readout

Average the time

Add the difference to the covariance though

Update the covariance of the strip measurements along the strip

Definition at line 102 of file SpacePointCalibrator.cxx.

106 {
107 const ActsTrk::GeometryContext* gctx{nullptr};
108 if (!SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
109 return CalibSpacePointPtr{};
110 }
111 const Amg::Vector3D& spPos{spacePoint->localPosition()};
112 const Amg::Transform3D& locToGlob{spacePoint->msSector()->localToGlobalTransform(*gctx)};
113 const Amg::Vector3D& chDir{spacePoint->sensorDirection()};
114
115 // Adjust the space point position according to the external seed. But only if the space point
116 // is a 1D strip
117 Amg::Vector3D calibSpPos = spacePoint->dimension() == 2 ? spPos
118 : spPos + Amg::intersect<3>(posInChamb, dirInChamb, spPos, chDir).value_or(0) * chDir;
119
120 SpacePoint::Cov_t cov = spacePoint->covariance();
121 CalibSpacePointPtr calibSP{};
122 ATH_MSG_VERBOSE("Calibrate "<<(*spacePoint) <<" -> updated pos "<<Amg::toString(calibSpPos));
123 switch (spacePoint->type()) {
124 using enum xAOD::UncalibMeasType;
125 case MdtDriftCircleType: {
126 const Amg::Vector3D locClosestApproach = posInChamb
127 + Amg::intersect<3>(spPos, chDir,
128 posInChamb, dirInChamb).value_or(0) * dirInChamb;
129
130 Amg::Vector3D closestApproach{locToGlob* locClosestApproach};
131 const double timeOfArrival = closestApproach.mag() * c_inv + ActsTrk::timeToAthena(timeDelay);
132
133 if (spacePoint->dimension() == 1) [[likely]] {
134 auto* dc = static_cast<const xAOD::MdtDriftCircle*>(spacePoint->primaryMeasurement());
135 MdtCalibInput calibInput{*dc, *gctx};
136 calibInput.setTrackDirection(locToGlob.linear() * dirInChamb,
137 std::abs(dirInChamb.phi() - 90._degree) > 1.e-7 );
138 calibInput.setTimeOfFlight(timeOfArrival);
139 calibInput.setClosestApproach(std::move(closestApproach));
140 ATH_MSG_VERBOSE("Parse hit calibration "<<m_idHelperSvc->toString(dc->identify())<<", "<<calibInput);
141 MdtCalibOutput calibOutput = m_mdtCalibrationTool->calibrate(ctx, calibInput);
142 ATH_MSG_VERBOSE("Returned calibration object "<<calibOutput);
143 State fitState{State::Valid};
145 if (calibOutput.status() != Muon::MdtDriftCircleStatus::MdtStatusDriftTime) {
146 ATH_MSG_DEBUG("Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
147 <<std::endl<<calibInput<<std::endl<<calibOutput);
148 fitState = State::FailedCalib;
149 cov[Acts::toUnderlying(AxisDefs::etaCov)] = dc->readoutElement()->innerTubeRadius();
150 } else {
151 cov[Acts::toUnderlying(AxisDefs::etaCov)] = Acts::square(calibOutput.driftRadiusUncert());
152 }
153 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), fitState);
154 calibSP->setCovariance(cov);
155 calibSP->setDriftRadius(calibOutput.driftRadius());
157 double fastToF {(locToGlob * calibSP->localPosition()).norm() * c_inv};
158 calibSP->setTimeMeasurement(ActsTrk::timeToActs(dc->tdc() * IMdtCalibrationTool::tdcBinSize -
159 calibOutput.tubeT0() - fastToF - calibOutput.signalPropagationTime()));
160 ATH_MSG_VERBOSE("Mdt time Meas: " << ActsTrk::timeToAthena(calibSP->time())
161 << ", ToF / fastToF: " << fastToF << " / " << closestApproach.mag() * c_inv
162 << ", tubeT0: " << calibOutput.tubeT0() << ", Signal Prop Time: " << calibOutput.signalPropagationTime());
163 } else {
164 auto* dc = static_cast<const xAOD::MdtTwinDriftCircle*>(spacePoint->primaryMeasurement());
165 MdtCalibInput calibInput{*dc, *gctx};
166 calibInput.setClosestApproach(closestApproach);
167 calibInput.setTimeOfFlight(timeOfArrival);
168
169 MdtCalibInput twinInput{dc->twinIdentify(), dc->twinAdc(), dc->twinTdc(), dc->readoutElement(), *gctx};
170 twinInput.setClosestApproach(closestApproach);
171 twinInput.setTimeOfFlight(timeOfArrival);
172
173 MdtCalibTwinOutput calibOutput = m_mdtCalibrationTool->calibrateTwinTubes(ctx,
174 std::move(calibInput),
175 std::move(twinInput));
176
177 State fitState{State::Valid};
178 if (calibOutput.primaryStatus() != Muon::MdtDriftCircleStatus::MdtStatusDriftTime) {
179 ATH_MSG_DEBUG("Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
180 <<std::endl<<calibOutput);
181 cov[Acts::toUnderlying(AxisDefs::etaCov)] = Acts::square(dc->readoutElement()->innerTubeRadius());
182 cov[Acts::toUnderlying(AxisDefs::phiCov)] = Acts::square(0.5* dc->readoutElement()->activeTubeLength(dc->measurementHash()));
183 fitState = State::FailedCalib;
184 } else {
185 cov[Acts::toUnderlying(AxisDefs::etaCov)] = Acts::square(calibOutput.uncertPrimaryR());
186 cov[Acts::toUnderlying(AxisDefs::phiCov)] = Acts::square(calibOutput.sigmaZ());
187 }
188 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), fitState);
189 calibSP->setCovariance(cov);
190 calibSP->setDriftRadius(calibOutput.primaryDriftR());
192 double fastToF {(locToGlob * calibSP->localPosition()).norm() * c_inv};
193 double tubeT0 {m_mdtCalibrationTool->getCalibConstants(ctx, dc->identify())->tubeCalib->getCalib(dc->identify())->t0};
194 // Remember to add the signal propagation time!!
195 calibSP->setTimeMeasurement(ActsTrk::timeToActs(calibOutput.primaryTdc() * IMdtCalibrationTool::tdcBinSize - tubeT0 - fastToF));
196 }
197 break;
198 }
199 case RpcStripType: {
200 auto* strip = static_cast<const xAOD::RpcMeasurement*>(spacePoint->primaryMeasurement());
201
203 const Amg::Transform3D toGasGap{strip->readoutElement()->globalToLocalTransform(*gctx, strip->layerHash()) * locToGlob};
204 const Amg::Vector3D lPos = toGasGap * calibSpPos;
206 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos));
207
208 // @TODO the constants could be converted to what is needed here (units, inverse) at initialization/construction time
209 // in particular 1/m_rpcSignalVelocity
210 cov[Acts::toUnderlying(AxisDefs::timeCov)] = Acts::square(ActsTrk::timeToActs(m_rpcTimeResolution.value()));
211
212 const double time1 = strip->time()
213 - strip->readoutElement()->distanceToEdge(strip->layerHash(), lPos,
214 EdgeSide::readOut) /m_rpcSignalVelocity;
215
216 if (spacePoint->dimension() == 2) {
217 auto* strip2 = static_cast<const xAOD::RpcMeasurement*>(spacePoint->secondaryMeasurement());
218
219 const double time2 = strip2->time() -
220 strip2->readoutElement()->distanceToEdge(strip2->layerHash(),lPos, EdgeSide::readOut)/m_rpcSignalVelocity;
222 calibSP->setTimeMeasurement(ActsTrk::timeToActs(0.5*(time1 + time2)));
224 cov[Acts::toUnderlying(AxisDefs::timeCov)] += Acts::square(ActsTrk::timeToActs(0.5*(time1 - time2)));
225 } else {
226 calibSP->setTimeMeasurement(ActsTrk::timeToActs(time1));
227 }
228 calibSP->setCovariance(cov);
229 ATH_MSG_VERBOSE("Create rpc space point "<<m_idHelperSvc->toString(strip->identify())<<", dimension "<<spacePoint->dimension()
230 << ", at "<<Amg::toString(calibSP->localPosition())<<", uncalib time: "
231 <<strip->time()<<", calib time: "<<ActsTrk::timeToAthena(calibSP->time())<<" cov " <<calibSP->covariance()
232 <<", time Uncert: "<<ActsTrk::timeToAthena(std::sqrt(calibSP->covariance()[Acts::toUnderlying(AxisDefs::timeCov)])));
233 break;
234 }
235 case TgcStripType: {
236 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos));
238 if (spacePoint->primaryMeasurement()->measuresPhi()) {
239 const auto* strip = static_cast<const xAOD::TgcStrip*>(spacePoint->primaryMeasurement());
240 const Amg::Transform3D toGasGap{strip->readoutElement()->globalToLocalTransform(*gctx, strip->layerHash()) * locToGlob};
241 const Amg::Vector3D lPos = toGasGap * calibSP->localPosition();
242 const auto& sensorPlane = strip->readoutElement()->sensorLayout(strip->layerHash());
243 const auto& radialDesign = strip->readoutElement()->stripLayout(strip->layerHash());
244 cov[Acts::toUnderlying(AxisDefs::phiCov)] = Acts::square(
245 radialDesign.stripPitch(strip->channelNumber(), sensorPlane->to2D(lPos,true))) / 12.;
246 }
247 calibSP->setCovariance(cov);
248 break;
249 }
250 case MMClusterType: {
251 const xAOD::MMCluster* cluster = static_cast<const xAOD::MMCluster*>(spacePoint->primaryMeasurement());
252 Amg::Vector3D globalPos{locToGlob * posInChamb};
253 Amg::Vector3D globalDir{locToGlob.linear() * dirInChamb};
254
255 std::pair<double, double> calibPosCov {calibrateMM(ctx, *gctx, *cluster, globalPos, globalDir)};
256
257 ATH_MSG_DEBUG("Calibrated pos and cov" << calibPosCov.first << " " << calibPosCov.second);
258 cov[Acts::toUnderlying(AxisDefs::etaCov)] = calibPosCov.second;
259 Amg::Transform3D toChamberTrans{ locToGlob.inverse() * cluster->readoutElement()->localToGlobalTransform(*gctx, cluster->layerHash())};
260
261 // since we want to take the second coordiante from the external estimate we need to transform the sp posiiton to the layer frame, replace the precission coordinate and transform back
262 Amg::Vector3D calibSpPosInLayer = toChamberTrans.inverse() * calibSpPos;
263 ATH_MSG_DEBUG("in layer before calibration" << Amg::toString(calibSpPosInLayer));
264 calibSpPosInLayer.x() = calibPosCov.first;
265 ATH_MSG_DEBUG("in layer after calibration" << Amg::toString(calibSpPosInLayer));
266 calibSpPos = toChamberTrans * calibSpPosInLayer;
267
268 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos));
269 calibSP->setCovariance(cov);
270 ATH_MSG_DEBUG("calibrated MM cluster "<<m_idHelperSvc->toString(cluster->identify()) << " loc x old " << cluster->localPosition<1>()[0] << " new loc x " << calibSP->localPosition()[1] << "cov " << calibSP->covariance());
271
272 break;
273 }
274 case sTgcStripType: {
275 const auto* cluster = static_cast<const xAOD::sTgcMeasurement*>(spacePoint->primaryMeasurement());
276
277 // We do not apply any correction for pads or wire only space points
278 if (cluster->channelType() != sTgcIdHelper::sTgcChannelTypes::Strip) {
279 ATH_MSG_DEBUG("Calibrating an sTGC Pad or wire " << m_idHelperSvc->toString(cluster->identify()));
280 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos));
281 calibSP->setCovariance(cov);
282 break;
283 }
284
285 std::optional<double> posAlongTheStrip{std::nullopt};
286
287 // check if the space point is a strip/wire combination and take the position along the strip from the wire measurement
288 if(spacePoint->secondaryMeasurement()) {
289 const auto* secMeas = static_cast<const xAOD::sTgcMeasurement*>(spacePoint->secondaryMeasurement());
290 ATH_MSG_VERBOSE("Using secondary measurement "<< m_idHelperSvc->toString(secMeas->identify())<<" for sTGC strip cluster " << m_idHelperSvc->toString(cluster->identify()));
291 // Extract scalar value - use 2D for pads (2 dimensions), 1D for wires (1 dimension)
292 if (secMeas->numDimensions() == 2) {
293 posAlongTheStrip = static_cast<double>(secMeas->localPosition<2>()[0]);
294 } else {
295 posAlongTheStrip = static_cast<double>(secMeas->localPosition<1>()[0]);
296 }
297 } else {
298 ATH_MSG_VERBOSE("No secondary measurement for sTGC strip cluster " << m_idHelperSvc->toString(cluster->identify()));
299 }
300
301 Amg::Vector3D globalPos{locToGlob * posInChamb};
302 Amg::Vector3D globalDir{locToGlob.linear() * dirInChamb};
303
304 const auto* stripClus = static_cast<const xAOD::sTgcStripCluster*>(cluster);
305 const auto [calibPos, calibCov] = calibratesTGC(ctx, *gctx, *stripClus, posAlongTheStrip, globalPos, globalDir);
306
307 ATH_MSG_DEBUG("Calibrated pos and cov" << calibPos << " " << calibCov);
308 cov[Acts::toUnderlying(AxisDefs::etaCov)] = calibCov;
309 Amg::Transform3D toChamberTrans{ locToGlob.inverse() * cluster->readoutElement()->localToGlobalTransform(*gctx, cluster->layerHash())};
310
311 if (spacePoint->dimension() == 2) {
312 cov[Acts::toUnderlying(AxisDefs::phiCov)] *=
313 Acts::square(m_sTgcNonPrecCoordErrorScale.value());
314 }
315
316 // since we want to take the second coordiante from the external estimate we need to transform the sp posiiton to the layer frame, replace the precission coordinate and transform back
317 Amg::Vector3D calibSpPosInLayer = toChamberTrans.inverse() * calibSpPos;
318 ATH_MSG_DEBUG("in layer before calibration" << Amg::toString(calibSpPosInLayer));
319 calibSpPosInLayer.x() = calibPos;
320 ATH_MSG_DEBUG("in layer after calibration" << Amg::toString(calibSpPosInLayer));
321 calibSpPos = toChamberTrans * calibSpPosInLayer;
322
323 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos));
324 calibSP->setCovariance(cov);
325 ATH_MSG_DEBUG("calibrated sTGC cluster "<<m_idHelperSvc->toString(cluster->identify()) << " loc x old " << cluster->localPosition<1>()[0] << " new loc x " << calibSP->localPosition()[1] << "cov " << calibSP->covariance());
326 break;
327 }
328
329 default:
330 ATH_MSG_WARNING("Do not know how to calibrate "<<m_idHelperSvc->toString(spacePoint->identify()));
331 }
332 return calibSP;
333 }
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
static constexpr double tdcBinSize
Conversion to go from tdc counts -> drift Time.
void setClosestApproach(const Amg::Vector3D &approach)
Sets the closest approach.
void setTimeOfFlight(const double toF)
Sets the time of flight (Usually globPos.mag() * inverseSpeed of light).
void setTrackDirection(const Amg::Vector3D &trackDir, bool hasPhi)
Sets the direction of the externally determined track.
double driftRadiusUncert() const
Returns the uncertainty on the drift radius.
double driftRadius() const
Returns the drift radius of the calibrated object.
MdtDriftCircleStatus status() const
Status of the calibration.
double signalPropagationTime() const
Returns the signal propagation time.
double tubeT0() const
Returns the point in time where the muon typically enters the chamber.
MdtDriftCircleStatus primaryStatus() const
double primaryDriftR() const
double uncertPrimaryR() const
const Amg::Transform3D & localToGlobalTransform(const ActsTrk::GeometryContext &ctx) const override final
Returns the transformation from the local coordinate system of the readout element into the global AT...
std::pair< double, double > calibratesTGC(const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const xAOD::sTgcStripCluster &cluster, std::optional< double > posAlongTheStrip, const Amg::Vector3D &globalPos, const Amg::Vector3D &globalDir) const
Calibrates the position and covariance of an sTGC (small-strip Thin Gap Chamber) cluster.
ToolHandle< IMdtCalibrationTool > m_mdtCalibrationTool
Gaudi::Property< double > m_rpcSignalVelocity
How fast does an electron signal travel along an rpc strip.
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
ActsTrk::GeoContextReadKey_t m_geoCtxKey
access to the ACTS geometry context
Gaudi::Property< double > m_rpcTimeResolution
std::pair< double, double > calibrateMM(const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const xAOD::MMCluster &cluster, const Amg::Vector3D &globalPos, const Amg::Vector3D &globalDir) const
Calibrates the position and covariance of a MicroMegas (MM) cluster.
Gaudi::Property< double > m_sTgcNonPrecCoordErrorScale
Scale factor applied to the sTGC non-precise coordinate measurement uncertainty.
std::array< double, 3 > Cov_t
Abrivation of the covariance type.
const MuonGMR4::MmReadoutElement * readoutElement() const override final
Retrieve the associated MmReadoutElement.
IdentifierHash layerHash() const override final
Returns the hash of the associated layer (Needed for surface retrieval).
const Identifier & identify() const
Returns the Athena identifier of the measurement.
float time() const
Returns the time.
ConstVectorMap< N > localPosition() const
Returns the local position of the measurement.
constexpr double timeToAthena(T actsT)
Converts a time unit from Acts to Athena units.
constexpr auto timeToActs(T athenaT)
Converts a time unit from Athena to Acts units.
std::optional< double > intersect(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
Calculates the point B' along the line B that's closest to a second line A.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
CalibratedSpacePoint::State State
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
MdtDriftCircle_v1 MdtDriftCircle
MdtTwinDriftCircle_v1 MdtTwinDriftCircle
TgcStrip_v1 TgcStrip
Definition TgcStripFwd.h:9
sTgcStripCluster_v1 sTgcStripCluster
UncalibMeasType
Define the type of the uncalibrated measurement.
RpcMeasurement_v1 RpcMeasurement
MMCluster_v1 MMCluster
sTgcMeasurement_v1 sTgcMeasurement
#define likely(x)

◆ calibrate() [4/4]

CalibSpacePointVec MuonR4::SpacePointCalibrator::calibrate ( const EventContext & ctx,
const std::vector< const SpacePoint * > & spacePoints,
const Amg::Vector3D & seedPosInChamb,
const Amg::Vector3D & seedDirInChamb,
const double timeDelay ) const
finaloverride

Definition at line 335 of file SpacePointCalibrator.cxx.

339 {
340 CalibSpacePointVec calibSpacePoints{};
341 calibSpacePoints.reserve(spacePoints.size());
342 for(const SpacePoint* spacePoint : spacePoints) {
343 CalibSpacePointPtr hit = calibrate(ctx, spacePoint, posInChamb, dirInChamb, timeDelay);
344 if (hit) {
345 calibSpacePoints.push_back(std::move(hit));
346 }
347 }
348 return calibSpacePoints;
349 }
bool hit(const Container &ids, int pdgId)

◆ calibrateCombinedPrd()

void MuonR4::SpacePointCalibrator::calibrateCombinedPrd ( const EventContext & ctx,
const ActsTrk::GeometryContext & gctx,
const xAOD::CombinedMuonStrip * combinedPrd,
ActsTrk::MutableTrackContainer::TrackStateProxy state ) const
private

Calibrates the track states from a combined muon strip.

It's a pseudo measurement composed out of two 1D strip measurements residing in the same gas gap (Relevant for Rpc/Tgc/sTgc)

Parameters
ctxThe event context providing the necessary conditions and event-specific information.
gctxPointer to the ActsTrk::GeometryContext, used for geometry-related transformations.
combinedPrdPointer to the measurement carrying the actual prds which are to be combined on the track state
stateThe proxy to the actual track state to fill

Construct bound track parameters to fetch the global track position

Definition at line 414 of file SpacePointCalibrator.cxx.

417 {
418 const auto sl = ActsTrk::detail::xAODUncalibMeasCalibrator::pack(combinedPrd);
419
420 Amg::Vector2D cmbPos = xAOD::toEigen(combinedPrd->localPosition<2>());
421 AmgSymMatrix(2) cmbCov = xAOD::toEigen(combinedPrd->localCovariance<2>());
422 if (combinedPrd->type() == xAOD::UncalibMeasType::RpcStripType) {
423 if (m_useRpcTime) {
424 ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<" Implement me");
425 }
426 setState<2>(ProjectorType::e2DimNoTime, cmbPos, cmbCov, sl, state);
427
428 } else if (combinedPrd->type() == xAOD::UncalibMeasType::TgcStripType) {
429 if (m_useTgcTime) {
430 ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<" Implement me");
431 }
432
433 setState<2>(ProjectorType::e2DimNoTime, cmbPos, cmbCov, sl, state);
434
435 } else if(combinedPrd->type() == xAOD::UncalibMeasType::sTgcStripType) {
436 if (m_usesTgcTime) {
437 ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<" Implement me");
438 }
439 // combined sTGC Space points can be strip/wire, strip/pad or pad/wire combinations.
440 const auto* primMeas = static_cast<const xAOD::sTgcMeasurement*>(combinedPrd->primaryStrip());
441
442 if(primMeas->channelType() == sTgcIdHelper::sTgcChannelTypes::Strip) {
443 const auto* primStripMeas = static_cast<const xAOD::sTgcStripCluster*>(primMeas);
445 const Acts::BoundTrackParameters trackPars{makeBoundPars(state)};
446 std::pair<double, double> calibPosCov{calibratesTGC(ctx, gctx, *primStripMeas, cmbPos[1] ,
447 trackPars.position(gctx.context()),
448 trackPars.direction())};
449 cmbPos[0] = calibPosCov.first;
450 cmbCov(0,0) = calibPosCov.second;
451
452 // Loosen non-precision / second coordinate
453 cmbCov(1,1) *= Acts::square(m_sTgcNonPrecCoordErrorScale.value());
454 }
455 setState<2>(ProjectorType::e2DimNoTime, cmbPos, cmbCov, sl, state);
456
457 } else {
458 THROW_EXCEPTION("Undefined uncalibrated measurement "
459 <<m_idHelperSvc->toString(combinedPrd->identify()));
460 }
461 }
#define AmgSymMatrix(dim)
if(pathvar)
Acts::GeometryContext context() const
static Acts::SourceLink pack(const Ptr_t &measurement)
Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a...
@ e2DimNoTime
Project out solely the locY - Complementary projector if the strip plane is rotated (Applies to Itk e...
void setState(const ProjectorType projector, const pos_t &locpos, const cov_t &cov, Acts::SourceLink link, proxy_t &trackState) const
Copy the local position & covariance into the Acts track state proxy.
Gaudi::Property< bool > m_useRpcTime
Load the Rpc time on the track states for the track fit.
Gaudi::Property< bool > m_useTgcTime
Load the Tgc bunch crossing ID on the track states.
Gaudi::Property< bool > m_usesTgcTime
const xAOD::MuonMeasurement * primaryStrip() const
Returns the primary associated measurement.
virtual xAOD::UncalibMeasType type() const override final
Returns the type of the measurement type as a simple enumeration.
Eigen::Matrix< double, 2, 1 > Vector2D
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ calibrateMM()

std::pair< double, double > MuonR4::SpacePointCalibrator::calibrateMM ( const EventContext & ctx,
const ActsTrk::GeometryContext & gctx,
const xAOD::MMCluster & cluster,
const Amg::Vector3D & globalPos,
const Amg::Vector3D & globalDir ) const
private

Calibrates the position and covariance of a MicroMegas (MM) cluster.

Parameters
ctxThe event context providing the necessary conditions and event-specific information.
gctxPointer to the ActsTrk::GeometryContext, used for geometry-related transformations.
clusterPointer to the xAOD::MMCluster representing the MicroMegas cluster to be calibrated.
globalPosThe global position from an external measurement.
globalDirThe global position from an external measurement.
calibLocPosThe calibrated local position of the cluster (output parameter).
calibLocCovThe calibrated local covariance of the cluster (output parameter).

Definition at line 370 of file SpacePointCalibrator.cxx.

374 {
375 std::vector<NSWCalib::CalibratedStrip> calibClus;
376 StatusCode sc = m_nswCalibTool->calibrateClus(ctx, gctx, cluster, globalPos, calibClus);
377 if(sc.isFailure()) {
378 ATH_MSG_WARNING("Failed to calibrate MM cluster "<<m_idHelperSvc->toString(cluster.identify()));
379 return std::make_pair(0., 0.);
380 }
381
382 Amg::Vector2D locPos{cluster.localPosition<1>()[0] * Amg::Vector2D::UnitX()};
384
385 Amg::MatrixX calibCov{};
386 calibCov.resize(1,1);
387 calibCov(0,0) = cluster.localCovariance<1>()(0, 0);
388 ATH_MSG_DEBUG("old loc pos " << locPos[0] << " old cov" << calibCov(0,0) );
389
390 Muon::IMMClusterBuilderTool::RIO_Author rotAuthor = m_clusterBuilderToolMM->getCalibratedClusterPosition(ctx, calibClus, locDir ,locPos, calibCov);
391 if(rotAuthor == Muon::IMMClusterBuilderTool::RIO_Author::unKnownAuthor){
392 THROW_EXCEPTION("Failed to calibrate MM cluster "<<m_idHelperSvc->toString(cluster.identify()));
393 }
394 ATH_MSG_DEBUG("new loc pos " << locPos[0] << " new cov" << calibCov(0,0) );
395 return std::make_pair(locPos[0], Acts::square(m_mmStripErrorScale.value()) * calibCov(0,0));
396 }
static Double_t sc
Amg::Transform3D globalToLocalTransform(const ActsTrk::GeometryContext &ctx) const
Returns the transformation from the global ATLAS coordinate system into the local coordinate system o...
ToolHandle< Muon::IMMClusterBuilderTool > m_clusterBuilderToolMM
ToolHandle< Muon::INSWCalibTool > m_nswCalibTool
Gaudi::Property< double > m_mmStripErrorScale
Scale factor applied to the MM strip measurement uncertainty.
MMClusterOnTrack::Author RIO_Author
Refinement of the cluster position after the cluster calibration loop is ran with a complete external...
ConstMatrixMap< N > localCovariance() const
Returns the local covariance of the measurement.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
::StatusCode StatusCode
StatusCode definition for legacy code.
Amg::Vector3D toLocal(const Amg::Transform3D &toLocalTrans, const Amg::Vector3D &dir)
Rotates a direction vector into a local frame: x-axis : Parallell to the radial direction of the dete...

◆ calibrateSourceLink()

void MuonR4::SpacePointCalibrator::calibrateSourceLink ( const Acts::GeometryContext & geoctx,
const Acts::CalibrationContext & cctx,
const Acts::SourceLink & link,
ActsTrk::MutableTrackContainer::TrackStateProxy state ) const
finaloverride

Construct bound track parameters to fetch the global track position

Only the combined muonstrip has zero dimensions

Vast majority of the measurements are ordinary drift tubes

Invalid drift radius has been created

Twin tube case

Legacy BM / BO chambers

BI clusters

Definition at line 462 of file SpacePointCalibrator.cxx.

465 {
466
468 const Acts::BoundTrackParameters trackPars{makeBoundPars(trackState)};
469
470
471 const auto* muonMeas = ActsTrk::detail::xAODUncalibMeasCalibrator::unpack(link);
472 const ActsTrk::GeometryContext* gctx = geoctx.get<const ActsTrk::GeometryContext*>();
473 const EventContext* ctx = cctx.get<const EventContext*>();
474 ATH_MSG_VERBOSE("Calibrate measurement "<<m_idHelperSvc->toString(xAOD::identify(muonMeas))
475 <<", smoothened: "<<trackState.hasSmoothed()<<", filtered: "<<trackState.hasFiltered()
476 <<", predicted: "<<trackState.hasPredicted()
477 <<" @\n"<<trackPars);
479 if (muonMeas->numDimensions() == 0u) {
480 calibrateCombinedPrd(*ctx, *gctx, static_cast<const xAOD::CombinedMuonStrip*>(muonMeas),
481 trackState);
482 return;
483
484 }
485 const Amg::Vector3D trackPos{trackPars.position(geoctx)};
486 const Amg::Vector3D trackDir{trackPars.direction()};
487
488 switch (muonMeas->type()){
489 using enum xAOD::UncalibMeasType;
490 case MdtDriftCircleType: {
491 const auto* dc = static_cast<const xAOD::MdtDriftCircle*>(muonMeas);
492 MdtCalibInput calibInput{*dc, *gctx};
493 calibInput.setClosestApproach(trackPos);
494 //calibInput.setTimeOfFlight(trackPars.parameters()[Acts::eBoundTime]);
495 calibInput.setTrackDirection(trackDir, true);
496 const double driftSign = m_MdtSignFromSegment ?
497 static_cast<double>(dec_trackSign(*dc)) :
498 Acts::copySign(1.,trackPars.parameters()[Acts::eBoundLoc0]);
499
501 if (muonMeas->numDimensions() == 1) [[likely]] {
502 MdtCalibOutput calibOutput = m_mdtCalibrationTool->calibrate(*ctx, calibInput);
503 ATH_MSG_VERBOSE("Returned calibration object "<<calibOutput);
504 AmgVector(1) pos{AmgVector(1)::Zero()};
505 AmgSymMatrix(1) cov{AmgSymMatrix(1)::Identity()};
507 if (calibOutput.status() != Muon::MdtDriftCircleStatus::MdtStatusDriftTime) {
508 ATH_MSG_DEBUG("Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
509 <<std::endl<<calibInput<<std::endl<<calibOutput);
510 cov(Acts::eBoundLoc0,Acts::eBoundLoc0) = std::pow(dc->readoutElement()->innerTubeRadius(), 2);
511 } else {
512 pos[Acts::eBoundLoc0] = driftSign*calibOutput.driftRadius();
513 cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = std::pow(calibOutput.driftRadiusUncert(), 2);
514 }
515 setState<1>(ProjectorType::e1DimNoTime, pos, cov, link, trackState);
516 }
518 else {
519 const auto* twinDC = static_cast<const xAOD::MdtTwinDriftCircle*>(muonMeas);
520 MdtCalibInput twinInput{twinDC->twinIdentify(), twinDC->twinAdc(), twinDC->twinTdc(), twinDC->readoutElement(), *gctx};
521 twinInput.setClosestApproach(trackPos);
522 twinInput.setTimeOfFlight(trackPars.parameters()[Acts::eBoundTime]);
523
524 MdtCalibTwinOutput calibOutput = m_mdtCalibrationTool->calibrateTwinTubes(*ctx,
525 std::move(calibInput),
526 std::move(twinInput));
527 Amg::Vector2D locPos{Amg::Vector2D::Zero()};
528 AmgSymMatrix(2) locCov{AmgSymMatrix(2)::Identity()};
529 if (calibOutput.primaryStatus() != Muon::MdtDriftCircleStatus::MdtStatusDriftTime) {
530 ATH_MSG_DEBUG("Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
531 <<std::endl<<calibOutput);
532 locCov(Acts::eBoundLoc0, Acts::eBoundLoc0) = std::pow(dc->readoutElement()->innerTubeRadius(), 2);
533 locCov(Acts::eBoundLoc1, Acts::eBoundLoc1) = std::pow(0.5* dc->readoutElement()->activeTubeLength(dc->measurementHash()), 2);
534 } else {
535 locCov(Acts::eBoundLoc0, Acts::eBoundLoc0) = std::pow(calibOutput.uncertPrimaryR(), 2);
536 locCov(Acts::eBoundLoc1, Acts::eBoundLoc1) = std::pow(calibOutput.sigmaZ(), 2);
537 locPos[Acts::eBoundLoc0] = driftSign*calibOutput.primaryDriftR();
538 locPos[Acts::eBoundLoc1] = calibOutput.locZ();
539 }
540 setState<2>(ProjectorType::e2DimNoTime, locPos, locCov, link, trackState);
541 }
542 break;
543 } case RpcStripType: {
544 const auto* rpcClust = static_cast<const xAOD::RpcMeasurement*>(muonMeas);
546 if (rpcClust->numDimensions() == 1) [[likely]] {
547
548 if (!m_useRpcTime) {
549 const auto proj = rpcClust->measuresPhi() ? ProjectorType::e1DimRotNoTime
551 setState<1>(proj, rpcClust->localPosition<1>(),
552 rpcClust->localCovariance<1>(), link, trackState);
553 } else {
554 AmgVector(2) measPars{AmgVector(2)::Zero()};
555 AmgSymMatrix(2) measCov{AmgSymMatrix(2)::Identity()};
556 measPars[0] = rpcClust->localPosition<1>()[0];
557 measCov(0,0) = rpcClust->localCovariance<1>()(0, 0);
558 ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<"Please fix me using the ActsInterops package");
559 measCov(1,1) = std::pow(m_rpcTimeResolution, 2);
560 const auto proj = rpcClust->measuresPhi() ? ProjectorType::e1DimRotWithTime
562 setState<2>(proj, measPars, measCov, link, trackState);
563 }
564 }
566 else {
567 if (!m_useRpcTime) {
569 rpcClust->localPosition<2>(),
570 rpcClust->localCovariance<2>(), link, trackState);
571 } else {
572 AmgVector(3) measPars{AmgVector(3)::Zero()};
573 AmgSymMatrix(3) measCov{AmgSymMatrix(3)::Identity()};
574 measPars.block<2,1>(0,0) = xAOD::toEigen(rpcClust->localPosition<2>());
575 measCov.block<2,2>(0,0) = xAOD::toEigen(rpcClust->localCovariance<2>());
576 ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<"Please fix me using the ActsInterops package");
577 measCov(2,2) = std::pow(m_rpcTimeResolution, 2);
578 setState<3>(ProjectorType::e2DimWithTime, measPars, measCov, link, trackState);
579 }
580 }
581 break;
582 } case TgcStripType: {
583 const auto* tgcClust = static_cast<const xAOD::TgcStrip*>(muonMeas);
584 if (!m_useTgcTime) {
585 if (!tgcClust->measuresPhi()) {
587 tgcClust->localPosition<1>(),
588 tgcClust->localCovariance<1>(),
589 link, trackState);
590
591 } else {
592 const auto [pos, cov] = xAOD::positionAndCovariance(tgcClust);
593 setState<2>(ProjectorType::e1DimRotNoTime, pos, cov, link, trackState);
594
595 }
596 } else {
597 ATH_MSG_WARNING("Tgc time calibration to be implemented...");
598 }
599 break;
600 }
601 case MMClusterType: {
602 const auto* mmClust = static_cast<const xAOD::MMCluster*>(muonMeas);
603 std::pair<double, double> calibPosCov{calibrateMM(*ctx,* gctx, *mmClust, trackPos, trackDir)};
604 AmgVector(1) pos{AmgVector(1)(calibPosCov.first)};
605 AmgSymMatrix(1) cov{AmgSymMatrix(1)(calibPosCov.second)};
606
607 setState<1>(ProjectorType::e1DimNoTime, pos, cov, link, trackState);
608 break;
609 } case sTgcStripType: {
610 const auto* stgcClust = static_cast<const xAOD::sTgcMeasurement*>(muonMeas);
611
612 if(stgcClust->channelType() == sTgcIdHelper::sTgcChannelTypes::Wire) {
614 muonMeas->localPosition<1>(),
615 muonMeas->localCovariance<1>(), link, trackState);
616 } else if (stgcClust->channelType() == sTgcIdHelper::sTgcChannelTypes::Pad) {
618 stgcClust->localPosition<2>(),
619 stgcClust->localCovariance<2>(), link, trackState);
620 } else { // strips
621 const auto stgCluster = static_cast<const xAOD::sTgcStripCluster*>(muonMeas);
622 std::pair<double, double> calibPosCov{calibratesTGC(*ctx, *gctx, *stgCluster, std::nullopt, trackPos, trackDir)};
623 if(!m_usesTgcTime) {
624 AmgVector(1) pos{calibPosCov.first};
625 AmgSymMatrix(1) cov{calibPosCov.second};
626 setState<1>(ProjectorType::e1DimNoTime, pos, cov, link, trackState);
627 } else {
628 ATH_MSG_WARNING("sTGC time calibration to be implemented...");
629 AmgVector(2) pos{AmgVector(2)::Zero()};
630 AmgSymMatrix(2) cov{AmgSymMatrix(2)::Zero()};
631 pos[0] = calibPosCov.first;
632 pos[1] = stgCluster->time();
633 cov(0,0) = calibPosCov.second;
634 ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<"Please fix me using the ActsInterops package");
635 cov(1,1) = std::pow(25 /*ns*/, 2);
636
637 setState<2>(ProjectorType::e1DimWithTime, pos, cov, link, trackState);
638 }
639 }
640 break;
641 } case Other: {
642 ActsTrk::detail::xAODUncalibMeasCalibrator auxCalibrator{};
643 auxCalibrator.calibrate(geoctx, cctx, link, trackState);
644 break;
645 } default: {
646 THROW_EXCEPTION("The parsed measurement is not a muon measurement. Please check.");
647 }
648 }
649 }
#define AmgVector(rows)
@ e2DimWithTime
Project out the locY & time coordinate - (Applies to Rpc, Tgc, sTgc).
@ e1DimWithTime
Project out the two spatial coordinates - (Applies to ITk pixel, BI-Rpc, sTgc pad).
@ e1DimRotNoTime
Project out solely the locX (Applies to Itk strips, Rpc, Tgc, sTgc, Mm).
@ e1DimRotWithTime
Project out the locX & time coordinate - (Applies to Rpc, Tgc, Mm, sTgc).
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sl, const MutableTrackStateBackend::TrackStateProxy trackState) const
: Interface method for the Acts fitter to calibrate the trajectory track states from the source link ...
static const xAOD::UncalibratedMeasurement * unpack(const Acts::SourceLink &sl)
Helper method to unpack an Acts source link to an uncalibrated measurement.
void calibrateCombinedPrd(const EventContext &ctx, const ActsTrk::GeometryContext &gctx, const xAOD::CombinedMuonStrip *combinedPrd, ActsTrk::MutableTrackContainer::TrackStateProxy state) const
Calibrates the track states from a combined muon strip.
Gaudi::Property< bool > m_MdtSignFromSegment
void Zero(TH1D *hin)
Definition generate.cxx:32
const Identifier & identify(const UncalibratedMeasurement *meas)
Returns the associated identifier from the muon measurement.
std::pair< Amg::Vector2D, AmgSymMatrix(2)> positionAndCovariance(const MuonMeasurement *oneDimMeas)
Returns the 1D position of the uncalibrated measurement expressed in the coordinate system of the mea...
CombinedMuonStrip_v1 CombinedMuonStrip

◆ calibratesTGC()

std::pair< double, double > MuonR4::SpacePointCalibrator::calibratesTGC ( const EventContext & ctx,
const ActsTrk::GeometryContext & gctx,
const xAOD::sTgcStripCluster & cluster,
std::optional< double > posAlongTheStrip,
const Amg::Vector3D & globalPos,
const Amg::Vector3D & globalDir ) const
private

Calibrates the position and covariance of an sTGC (small-strip Thin Gap Chamber) cluster.

Parameters
ctxThe event context providing the necessary conditions for the calibration.
gctxPointer to the ActsTrk::GeometryContext, which provides geometry-related information.
clusterPointer to the sTGC strip cluster to be calibrated.
posAlongTheStripThe position along the strip obtained from the secondary measurement(wire), 0 if no wire measurement is present.
globalPosThe global position from an external measurement.
globalDirThe global direction from an external measurement.
[out]calibLocPosThe calibrated local position of the cluster (output parameter).
[out]calibLocCovThe calibrated local covariance of the cluster (output parameter).

Definition at line 398 of file SpacePointCalibrator.cxx.

403 {
404
405 // if the second coordiante was not provided by the wire, take it from the seed track position
406 if(!posAlongTheStrip) {
407 Amg::Vector3D extPosLocal = cluster.readoutElement()->globalToLocalTransform(gctx, cluster.layerHash()) * globalPos;
408 posAlongTheStrip = extPosLocal[1];
409 }
410
411 // For now just copying over the local position and covariance. Eventually this should apply corrections from B-Lines and as build geometry
412 return std::make_pair( cluster.localPosition<1>()[0], Acts::square(m_sTgcPrecCoordErrorScale.value()) * cluster.localCovariance<1>()(0,0));
413 }
Gaudi::Property< double > m_sTgcPrecCoordErrorScale
Scale factor applied to the sTGC strip measurement uncertainty.
IdentifierHash layerHash() const override final
Returns the hash of the associated gasGap layer.
const MuonGMR4::sTgcReadoutElement * readoutElement() const override final
Retrieve the associated sTgcReadoutElement.

◆ driftAcceleration() [1/2]

double MuonR4::SpacePointCalibrator::driftAcceleration ( const Acts::CalibrationContext & cctx,
const CalibratedSpacePoint & spacePoint,
const double timeDelay ) const
finaloverride

Definition at line 682 of file SpacePointCalibrator.cxx.

684 {
685 if(spacePoint.type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
686 const MuonCalib::MdtFullCalibData* calibConsts =
687 m_mdtCalibrationTool->getCalibConstants(*cctx.get<const EventContext*>(), spacePoint.spacePoint()->identify());
688 return ActsTrk::accelerationToActs(calibConsts->rtRelation->rt()->driftAcceleration(ActsTrk::timeToAthena(spacePoint.time() - timeDelay)));
689 }
690 return 0.;
691 }
constexpr double accelerationToActs(const double athenaA)
Converts an acceleration from Athena to Acts units.

◆ driftAcceleration() [2/2]

double MuonR4::SpacePointCalibrator::driftAcceleration ( const Acts::CalibrationContext & ctx,
const CalibratedSpacePoint & spacePoint ) const
finaloverride

Definition at line 360 of file SpacePointCalibrator.cxx.

361 {
362 if(spacePoint.type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
363 const MuonCalib::MdtFullCalibData* calibConsts = m_mdtCalibrationTool->getCalibConstants(*ctx.get<const EventContext*>(), spacePoint.spacePoint()->identify());
364 const std::optional<double> driftTime = calibConsts->rtRelation->tr()->driftTime(spacePoint.driftRadius());
365 return ActsTrk::accelerationToActs(calibConsts->rtRelation->rt()->driftAcceleration(driftTime.value_or(0.)));
366 }
367 return 0.;
368 }
@ driftTime
Definition HitInfo.h:43

◆ driftRadius()

double MuonR4::SpacePointCalibrator::driftRadius ( const Acts::CalibrationContext & cctx,
const CalibratedSpacePoint & spacePoint,
const double timeDelay ) const
finaloverride

Definition at line 661 of file SpacePointCalibrator.cxx.

663 {
664 if(spacePoint.type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
665 const MuonCalib::MdtFullCalibData* calibConsts =
666 m_mdtCalibrationTool->getCalibConstants(*cctx.get<const EventContext*>(), spacePoint.spacePoint()->identify());
667 return calibConsts->rtRelation->rt()->radius(ActsTrk::timeToAthena(spacePoint.time() - timeDelay));
668 }
669 return 0.;
670 }

◆ driftVelocity() [1/2]

double MuonR4::SpacePointCalibrator::driftVelocity ( const Acts::CalibrationContext & cctx,
const CalibratedSpacePoint & spacePoint,
const double timeDelay ) const
finaloverride

Definition at line 672 of file SpacePointCalibrator.cxx.

674 {
675 if(spacePoint.type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
676 const MuonCalib::MdtFullCalibData* calibConsts =
677 m_mdtCalibrationTool->getCalibConstants(*cctx.get<const EventContext*>(), spacePoint.spacePoint()->identify());
678 return ActsTrk::velocityToActs(calibConsts->rtRelation->rt()->driftVelocity(ActsTrk::timeToAthena(spacePoint.time() - timeDelay)));
679 }
680 return 0.;
681 }
constexpr double velocityToActs(const double athenaV)
Converts a velocity from Athena to Acts units.

◆ driftVelocity() [2/2]

double MuonR4::SpacePointCalibrator::driftVelocity ( const Acts::CalibrationContext & ctx,
const CalibratedSpacePoint & spacePoint ) const
finaloverride

Definition at line 350 of file SpacePointCalibrator.cxx.

351 {
352 if(spacePoint.type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
353
354 const MuonCalib::MdtFullCalibData* calibConsts = m_mdtCalibrationTool->getCalibConstants(*ctx.get<const EventContext*>(), spacePoint.spacePoint()->identify());
355 const std::optional<double> driftTime = calibConsts->rtRelation->tr()->driftTime(spacePoint.driftRadius());
356 return ActsTrk::velocityToActs(calibConsts->rtRelation->rt()->driftVelocity(driftTime.value_or(0.)));
357 }
358 return 0.;
359 }

◆ getType()

SourceLinkType ActsTrk::detail::MeasurementCalibratorBase::getType ( const Acts::SourceLink & sl)
staticinherited

Returns the enumeration corresponding to the object type cached within the Acts::SourceLink.

The SourceLink must have been created by a MeasurementCalibrator to ensure that the underlying variant is cached. If the variant is a monostate, nTypes is returned

Parameters
slReference to the source link to unpack.

◆ initialize()

StatusCode MuonR4::SpacePointCalibrator::initialize ( )
finaloverride

Definition at line 51 of file SpacePointCalibrator.cxx.

51 {
52 ATH_CHECK(m_geoCtxKey.initialize());
53 ATH_CHECK(m_idHelperSvc.retrieve());
54 ATH_CHECK(m_mdtCalibrationTool.retrieve(EnableTool{m_idHelperSvc->hasMDT()}));
55 ATH_CHECK(m_nswCalibTool.retrieve(EnableTool{m_idHelperSvc->hasMM() || m_idHelperSvc->hasSTGC()}));
56 ATH_CHECK(detStore()->retrieve(m_detMgr));
57 return StatusCode::SUCCESS;
58 }
#define ATH_CHECK
Evaluate an expression and check for errors.
const MuonGMR4::MuonDetectorManager * m_detMgr

◆ pack() [1/2]

template<Acts::PointerConcept Ptr_t>
Acts::SourceLink ActsTrk::detail::MeasurementCalibratorBase::pack ( const Ptr_t & measurement)
staticinherited

Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a SourceLink_t.

Nullptrs are converted to a std::monostate.

Parameters
measurementPointer to the measurement to transform into a SourceLInk

◆ pack() [2/2]

template<Acts::PointerConcept Ptr_t>
void ActsTrk::detail::MeasurementCalibratorBase::pack ( const std::vector< Ptr_t > & measList,
std::vector< Acts::SourceLink > & targetSL )
staticinherited

Converts a vector measurement pointers to Acts::SourceLinks.

Parameters
measListThe list of measurement pointers for conversion
targetSLThe allocated SourceLink vectors to which the Acts::SourceLink objects are appended.

◆ prepareCalibratedState()

template<std::size_t Dim, Acts::TrackStateProxyConcept proxy_t>
void ActsTrk::detail::MeasurementCalibratorBase::prepareCalibratedState ( const ProjectorType projector,
Acts::SourceLink link,
proxy_t & trackState ) const
protectedinherited

Queries the track proxy to allocate memory for the incoming calibration object.

Defines the projector indices and allocates the source link to the state

Parameters
projectorProjector configuration of the measurement
linkSource link to associate with the state
trackStateRefrence to the track state proxy to write.

◆ setState()

template<std::size_t Dim, Acts::TrackStateProxyConcept proxy_t, typename pos_t, typename cov_t>
void ActsTrk::detail::MeasurementCalibratorBase::setState ( const ProjectorType projector,
const pos_t & locpos,
const cov_t & cov,
Acts::SourceLink link,
proxy_t & trackState ) const
inherited

Copy the local position & covariance into the Acts track state proxy.

Template Parameters
DimDimension of the measurement
trajectory_tData type of the track state proxy backend
pos_tData type of the [Dim x 1] position vector
cov_tData type of the [Dim x Dim] covariance matrix
Parameters
projectorProjector configuration of the measurement
locposCalibrated local postion
covCalibrated local covariance
linkSource link to associate with the state
trackStateRefrence to the track state proxy to write.

◆ stampSignsOnMeasurements()

void MuonR4::SpacePointCalibrator::stampSignsOnMeasurements ( const xAOD::MuonSegment & segment) const
finaloverride

Definition at line 650 of file SpacePointCalibrator.cxx.

650 {
651 const auto [segPos, segLine] = makeLine(localSegmentPars(segment));
652 const Segment* detSeg = MuonR4::detailedSegment(segment);
653 for (const auto& meas : detSeg->measurements()) {
655 dec_trackSign(*meas->spacePoint()->primaryMeasurement()) =
656 SeedingAux::strawSign(segPos, segLine, *meas);
657 }
658 }
659 }
Parameters localSegmentPars(const xAOD::MuonSegment &seg)
Returns the localSegPars decoration from a xAODMuon::Segment.
std::pair< Amg::Vector3D, Amg::Vector3D > makeLine(const Parameters &pars)
Returns the parsed parameters into an Eigen line parametrization.
const Segment * detailedSegment(const xAOD::MuonSegment &seg)
Helper function to navigate from the xAOD::MuonSegment to the MuonR4::Segment.

◆ unpackBase()

SourceLink_t ActsTrk::detail::MeasurementCalibratorBase::unpackBase ( const Acts::SourceLink & sl)
staticinherited

Unpack the SourceLink_t from the passed Acts source link.

Parameters
slReference to the source link to unpack.

◆ updateSigns()

void MuonR4::SpacePointCalibrator::updateSigns ( const Amg::Vector3D & trackPos,
const Amg::Vector3D & trackDir,
CalibSpacePointVec & hitsToCalib ) const
finaloverride

Definition at line 60 of file SpacePointCalibrator.cxx.

62 {
63 std::vector<int> signs = SeedingAux::strawSigns(trackPos, trackDir,
64 hitsToCalib);
65 for (const auto [spIdx, sp]: Acts::enumerate(hitsToCalib)) {
66 sp->setDriftRadius(sp->driftRadius() * signs[spIdx]);
67 }
68 }

Member Data Documentation

◆ m_clusterBuilderToolMM

ToolHandle<Muon::IMMClusterBuilderTool> MuonR4::SpacePointCalibrator::m_clusterBuilderToolMM {this, "MMClusterBuilder", ""}
private

Definition at line 144 of file SpacePointCalibrator.h.

144{this, "MMClusterBuilder", ""};

◆ m_detMgr

const MuonGMR4::MuonDetectorManager* MuonR4::SpacePointCalibrator::m_detMgr {nullptr}
private

Definition at line 146 of file SpacePointCalibrator.h.

146{nullptr};

◆ m_geoCtxKey

ActsTrk::GeoContextReadKey_t MuonR4::SpacePointCalibrator::m_geoCtxKey {this, "AlignmentKey", "ActsAlignment", "cond handle key"}
private

access to the ACTS geometry context

Definition at line 136 of file SpacePointCalibrator.h.

136{this, "AlignmentKey", "ActsAlignment", "cond handle key"};

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> MuonR4::SpacePointCalibrator::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
private

Definition at line 138 of file SpacePointCalibrator.h.

138{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_mdtCalibrationTool

ToolHandle<IMdtCalibrationTool> MuonR4::SpacePointCalibrator::m_mdtCalibrationTool {this, "MdtCalibrationTool", ""}
private

Definition at line 140 of file SpacePointCalibrator.h.

140{this, "MdtCalibrationTool", ""};

◆ m_MdtSignFromSegment

Gaudi::Property<bool> MuonR4::SpacePointCalibrator::m_MdtSignFromSegment
private
Initial value:
{this, "useSegmentSigns", true,
"Mdt drift signs are copied from the segment line instead from the track state"}

Definition at line 167 of file SpacePointCalibrator.h.

167 {this, "useSegmentSigns", true,
168 "Mdt drift signs are copied from the segment line instead from the track state"};

◆ m_mmStripErrorScale

Gaudi::Property<double> MuonR4::SpacePointCalibrator::m_mmStripErrorScale { this, "mmStripErrorScale", 1.0, "Scale factor applied to the MM strip measurement uncertainty" }
private

Scale factor applied to the MM strip measurement uncertainty.

Definition at line 177 of file SpacePointCalibrator.h.

177{ this, "mmStripErrorScale", 1.0, "Scale factor applied to the MM strip measurement uncertainty" };

◆ m_muonPropSpeed

Gaudi::Property<double> MuonR4::SpacePointCalibrator::m_muonPropSpeed {this, "PropagationSpeed", 1./ Gaudi::Units::c_light }
private

Assumed propagation velocity of the muon through the detector.

Needs to be replaced by the proper time estimate once the calibrator is exposed to the Acts propagator

Definition at line 151 of file SpacePointCalibrator.h.

151{this, "PropagationSpeed", 1./ Gaudi::Units::c_light };

◆ m_nswCalibTool

ToolHandle<Muon::INSWCalibTool> MuonR4::SpacePointCalibrator::m_nswCalibTool {this, "NSWCalibTool", ""}
private

Definition at line 142 of file SpacePointCalibrator.h.

142{this, "NSWCalibTool", ""};

◆ m_rpcSignalVelocity

Gaudi::Property<double> MuonR4::SpacePointCalibrator::m_rpcSignalVelocity
private
Initial value:
{this, "rpcSignalVelocity", 0.5 * Gaudi::Units::c_light,
"Propagation speed of the signal inside the rpc strip"}

How fast does an electron signal travel along an rpc strip.

Definition at line 154 of file SpacePointCalibrator.h.

154 {this, "rpcSignalVelocity", 0.5 * Gaudi::Units::c_light,
155 "Propagation speed of the signal inside the rpc strip"};

◆ m_rpcTimeResolution

Gaudi::Property<double> MuonR4::SpacePointCalibrator::m_rpcTimeResolution
private
Initial value:
{this, "rpcTimeResolution", 0.6 * Gaudi::Units::nanosecond,
"Estimated time resolution of the strip readout"}

Definition at line 157 of file SpacePointCalibrator.h.

157 {this, "rpcTimeResolution", 0.6 * Gaudi::Units::nanosecond,
158 "Estimated time resolution of the strip readout"};

◆ m_sTgcNonPrecCoordErrorScale

Gaudi::Property<double> MuonR4::SpacePointCalibrator::m_sTgcNonPrecCoordErrorScale { this, "sTgcNonPrecCoordErrorScale", 1.0, "Scale factor applied to the sTGC non-precise coordinate measurement uncertainty" }
private

Scale factor applied to the sTGC non-precise coordinate measurement uncertainty.

Definition at line 174 of file SpacePointCalibrator.h.

174{ this, "sTgcNonPrecCoordErrorScale", 1.0, "Scale factor applied to the sTGC non-precise coordinate measurement uncertainty" };

◆ m_sTgcPrecCoordErrorScale

Gaudi::Property<double> MuonR4::SpacePointCalibrator::m_sTgcPrecCoordErrorScale { this, "sTgcPrecCoordErrorScale", 1.0, "Scale factor applied to the sTGC strip measurement uncertainty" }
private

Scale factor applied to the sTGC strip measurement uncertainty.

Definition at line 171 of file SpacePointCalibrator.h.

171{ this, "sTgcPrecCoordErrorScale", 1.0, "Scale factor applied to the sTGC strip measurement uncertainty" };

◆ m_useRpcTime

Gaudi::Property<bool> MuonR4::SpacePointCalibrator::m_useRpcTime {this, "useRpcTime", false}
private

Load the Rpc time on the track states for the track fit.

Definition at line 161 of file SpacePointCalibrator.h.

161{this, "useRpcTime", false};

◆ m_usesTgcTime

Gaudi::Property<bool> MuonR4::SpacePointCalibrator::m_usesTgcTime
private
Initial value:
{this, "usesTgcTime", false,
"Load the sTgc time on the track states for the fit"}

Definition at line 165 of file SpacePointCalibrator.h.

165 {this, "usesTgcTime", false,
166 "Load the sTgc time on the track states for the fit"};

◆ m_useTgcTime

Gaudi::Property<bool> MuonR4::SpacePointCalibrator::m_useTgcTime
private
Initial value:
{this, "useTgcTime", false,
"Load the Tgc BC-ID on the track states for the fit"}

Load the Tgc bunch crossing ID on the track states.

Definition at line 163 of file SpacePointCalibrator.h.

163 {this, "useTgcTime", false,
164 "Load the Tgc BC-ID on the track states for the fit"};

◆ s_boundSpaceIndices

std::array<Acts::BoundSubspaceIndices, 6> ActsTrk::detail::MeasurementCalibratorBase::s_boundSpaceIndices
staticconstexprprivateinherited
Initial value:
{
Acts::BoundSubspaceIndices{Acts::eBoundLoc0},
Acts::BoundSubspaceIndices{Acts::eBoundLoc1},
Acts::BoundSubspaceIndices{Acts::eBoundLoc0, Acts::eBoundLoc1},
Acts::BoundSubspaceIndices{Acts::eBoundLoc0, Acts::eBoundTime},
Acts::BoundSubspaceIndices{Acts::eBoundLoc1, Acts::eBoundTime},
Acts::BoundSubspaceIndices{Acts::eBoundLoc0, Acts::eBoundLoc1, Acts::eBoundTime}
}

Array to map the Projector types to the bound index configurations used by the ATLAS detector measurements.

Definition at line 115 of file MeasurementCalibratorBase.h.

115 {
116 Acts::BoundSubspaceIndices{Acts::eBoundLoc0}, // One dimenion without time
117 Acts::BoundSubspaceIndices{Acts::eBoundLoc1}, // Complementary one dimension without time
118 Acts::BoundSubspaceIndices{Acts::eBoundLoc0, Acts::eBoundLoc1},
119 Acts::BoundSubspaceIndices{Acts::eBoundLoc0, Acts::eBoundTime}, // One dimension with time
120 Acts::BoundSubspaceIndices{Acts::eBoundLoc1, Acts::eBoundTime}, // Complementary one dimension with time
121 Acts::BoundSubspaceIndices{Acts::eBoundLoc0, Acts::eBoundLoc1, Acts::eBoundTime}
122 };

The documentation for this class was generated from the following files: