16 #include "GaudiKernel/PhysicalConstants.h"
34 using namespace SegmentFit;
39 ATH_CHECK(m_mdtCalibrationTool.retrieve(EnableTool{m_idHelperSvc->hasMDT()}));
40 ATH_CHECK(m_nswCalibTool.retrieve(EnableTool{m_idHelperSvc->hasMM() || m_idHelperSvc->hasSTGC()}));
42 return StatusCode::SUCCESS;
49 const double timeDelay)
const {
52 calibSP = calibrate(ctx, spacePoint.
spacePoint(), segPos, segDir, timeDelay);
54 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint);
66 const double timeDelay)
const {
68 sp = calibrate(ctx, *sp, segPos, segDir, timeDelay);
77 const double timeOffset)
const {
80 if (!
SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
90 : spPos + Amg::intersect<3>(posInChamb, dirInChamb, spPos, chDir).value_or(0) * chDir;
93 switch (spacePoint->
type()) {
96 + Amg::intersect<3>(spPos, chDir,
97 posInChamb, dirInChamb).value_or(0) * dirInChamb;
100 const double timeOfArrival = closestApproach.mag() * c_inv + timeOffset;
110 calibInput.setTimeOfFlight(timeOfArrival);
111 calibInput.setClosestApproach(std::move(closestApproach));
112 ATH_MSG_VERBOSE(
"Parse hit calibration "<<m_idHelperSvc->toString(dc->identify())<<
", "<<calibInput);
113 MdtCalibOutput calibOutput = m_mdtCalibrationTool->calibrate(ctx, calibInput);
120 ATH_MSG_DEBUG(
"Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
121 <<std::endl<<calibInput<<std::endl<<calibOutput);
127 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), std::move(chDir), fitState);
128 calibSP->setCovariance<2>(jac.inverse()*diagCov*jac);
129 calibSP->setDriftRadius(calibOutput.
driftRadius());
134 calibInput.setTimeOfFlight(timeOfArrival);
136 MdtCalibInput twinInput{dc->twinIdentify(), dc->twinAdc(), dc->twinTdc(), dc->readoutElement(), *gctx};
138 twinInput.setTimeOfFlight(timeOfArrival);
141 std::move(calibInput),
142 std::move(twinInput));
147 ATH_MSG_DEBUG(
"Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
148 <<std::endl<<calibOutput);
156 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), std::move(chDir), fitState);
157 calibSP->setCovariance<2>(jac.inverse()*diagCov*jac);
166 const Amg::Transform3D toGasGap{strip->readoutElement()->globalToLocalTrans(*gctx, strip->layerHash()) * locToGlob};
169 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), std::move(chDir));
171 cov.block<2,2>(0, 0) = spacePoint->covariance();
173 cov(2, 2) = m_rpcTimeResolution * m_rpcTimeResolution;
175 const double time1 = strip->time()
176 - strip->readoutElement()->distanceToEdge(strip->layerHash(),
177 lPos.block<2,1>(0,0),
178 EdgeSide::readOut) /m_rpcSignalVelocity;
183 const double time2 = strip2->
time() -
184 strip2->readoutElement()->distanceToEdge(strip2->layerHash(),
185 Eigen::Rotation2D{M_PI_2}*lPos.block<2,1>(0,0),
186 EdgeSide::readOut)/m_rpcSignalVelocity;
188 calibSP->setTimeMeasurement(0.5*(time1 + time2));
191 cov(2,1) =
cov(1,2) = - strip->readoutElement()->stripPhiPitch() /m_rpcSignalVelocity / std::sqrt(12.)* std::sqrt(
cov(2, 2));
192 cov(2,0) =
cov(0,2) = - strip->readoutElement()->stripEtaPitch() /m_rpcSignalVelocity / std::sqrt(12.)* std::sqrt(
cov(2, 2));
195 calibSP->setTimeMeasurement(time1);
196 if (strip->measuresPhi()) {
197 cov(2,1) =
cov(1,2) = - 0.5 *strip->readoutElement()->stripPhiLength() /m_rpcSignalVelocity * std::sqrt(
cov(2, 2));
199 cov(2,0) =
cov(0,2) = - 0.5 *strip->readoutElement()->stripEtaLength() /m_rpcSignalVelocity * std::sqrt(
cov(2, 2));
202 calibSP->setCovariance<3>(std::move(
cov));
204 ATH_MSG_VERBOSE(
"Create rpc space point "<<m_idHelperSvc->toString(strip->identify())<<
", dimension "<<spacePoint->
dimension()
205 <<
", at "<<
Amg::toString(calibSP->positionInChamber())<<
", uncalib time: "
206 <<strip->time()<<
", calib time: "<<calibSP->time()<<
" cov " <<
toString(calibSP->covariance()));
211 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), std::move(chDir));
212 calibSP->setCovariance<2>(spacePoint->covariance());
218 std::vector<NSWCalib::CalibratedStrip> calibClus;
219 StatusCode sc = m_nswCalibTool->calibrateClus(ctx, *gctx, cluster, locToGlob * posInChamb, calibClus);
228 Amg::Vector3D globalTrackDir{locToGlob.linear() * dirInChamb};
232 if(rotAuthor == Muon::IMMClusterBuilderTool::RIO_Author::unKnownAuthor){
239 Amg::Vector3D calibSpPosInLayer = toChamberTrans.inverse() * calibSpPos;
240 calibSpPosInLayer.x() = locPos.x();
242 calibSpPos = toChamberTrans * calibSpPosInLayer;
244 calibSP = std::make_unique<CalibratedSpacePoint>(spacePoint, std::move(calibSpPos), std::move(chDir));
245 calibSP->setCovariance<2>(spacePoint->covariance());
246 ATH_MSG_DEBUG(
"calibrated MM cluster "<<m_idHelperSvc->toString(cluster->
identify()) <<
" loc x old " << cluster->
localPosition<1>()[0] <<
" new loc x " << locPos.x());
260 const double timeOffset)
const {
264 CalibSpacePointPtr hit = calibrate(ctx, spacePoint, posInChamb, dirInChamb, timeOffset);
265 if (hit) calibSpacePoints.push_back(std::move(hit));
267 return calibSpacePoints;
289 const Acts::CalibrationContext& cctx,
290 const Acts::SourceLink& link,
291 ActsTrk::MutableTrackContainer::TrackStateProxy trackState)
const {
294 const Acts::BoundTrackParameters trackPars{trackState.referenceSurface().getSharedPtr(),
295 trackState.parameters(), trackState.covariance(),
301 const EventContext* ctx = cctx.get<
const EventContext*>();
304 <<
" @ surface "<<trackState.referenceSurface().geometryId());
305 switch (muonMeas->type()){
307 case MdtDriftCircleType: {
310 calibInput.setClosestApproach(trackPos);
312 calibInput.setTrackDirection(trackDir,
true);
313 const double driftSign =
sign(trackPars.parameters()[Acts::eBoundLoc0]);
316 if (
ATH_LIKELY(muonMeas->numDimensions() == 1)) {
317 MdtCalibOutput calibOutput = m_mdtCalibrationTool->calibrate(*ctx, calibInput);
323 ATH_MSG_DEBUG(
"Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
324 <<std::endl<<calibInput<<std::endl<<calibOutput);
325 cov(Acts::eBoundLoc0,Acts::eBoundLoc0) =
std::pow(dc->readoutElement()->innerTubeRadius(), 2);
330 setState<1, ActsTrk::MutableTrackStateBackend>(ProjectorType::e1DimNoTime,
pos,
cov, link, trackState);
335 MdtCalibInput twinInput{twinDC->twinIdentify(), twinDC->twinAdc(), twinDC->twinTdc(), twinDC->readoutElement(), *gctx};
336 twinInput.setClosestApproach(trackPos);
337 twinInput.setTimeOfFlight(trackPars.parameters()[Acts::eBoundTime]);
340 std::move(calibInput),
341 std::move(twinInput));
345 ATH_MSG_DEBUG(
"Failed to create a valid hit from "<<m_idHelperSvc->toString(dc->identify())
346 <<std::endl<<calibOutput);
347 locCov(Acts::eBoundLoc0, Acts::eBoundLoc0) =
std::pow(dc->readoutElement()->innerTubeRadius(), 2);
348 locCov(Acts::eBoundLoc1, Acts::eBoundLoc1) =
std::pow(0.5* dc->readoutElement()->activeTubeLength(dc->measurementHash()), 2);
351 locCov(Acts::eBoundLoc1, Acts::eBoundLoc1) =
std::pow(calibOutput.
sigmaZ(), 2);
353 locPos[Acts::eBoundLoc1] = calibOutput.
locZ();
355 setState<2, ActsTrk::MutableTrackStateBackend>(ProjectorType::e2DimNoTime, locPos, locCov, link, trackState);
358 }
case RpcStripType: {
361 if (
ATH_LIKELY(rpcClust->numDimensions() == 1)) {
363 setState<1, ActsTrk::MutableTrackStateBackend>(ProjectorType::e1DimNoTime,
364 rpcClust->localPosition<1>(),
365 rpcClust->localCovariance<1>(), link, trackState);
369 measPars[0] = rpcClust->localPosition<1>()[0];
370 measCov(0,0) = rpcClust->localCovariance<1>()(0, 0);
371 measCov(1,1) =
std::pow(m_rpcTimeResolution, 2);
372 setState<2, ActsTrk::MutableTrackStateBackend>(ProjectorType::e1DimWithTime,
373 measPars, measCov, link, trackState);
379 setState<2, ActsTrk::MutableTrackStateBackend>(ProjectorType::e1DimNoTime,
380 rpcClust->localPosition<2>(),
381 rpcClust->localCovariance<2>(), link, trackState);
385 measPars.block<2,1>(0,0) = xAOD::toEigen(rpcClust->localPosition<2>());
386 measCov.block<2,2>(0,0) = xAOD::toEigen(rpcClust->localCovariance<2>());
387 measCov(2,2) =
std::pow(m_rpcTimeResolution, 2);
388 setState<3, ActsTrk::MutableTrackStateBackend>(ProjectorType::e2DimWithTime,
389 measPars, measCov, link, trackState);
393 }
case TgcStripType: {
395 setState<1, ActsTrk::MutableTrackStateBackend>(ProjectorType::e1DimRotNoTime,
396 muonMeas->localPosition<1>(),
397 muonMeas->localCovariance<1>(), link, trackState);
403 case MMClusterType: {
406 }
case sTgcStripType: {
410 THROW_EXCEPTION(
"The parsed measurement is not a muon measurement. Please check.");