12 #include "Acts/Definitions/Units.hpp"
13 #include "Acts/Surfaces/LineBounds.hpp"
14 #include "Acts/Surfaces/PlaneSurface.hpp"
21 #include "GaudiKernel/PhysicalConstants.h"
24 #include "Acts/Visualization/ObjVisualization3D.hpp"
25 #include "Acts/Visualization/GeometryView3D.hpp"
29 using namespace Acts::UnitLiterals;
31 using namespace Acts::detail::LineHelper;
38 ATH_CHECK(m_extrapolationTool.retrieve());
40 return StatusCode::SUCCESS;
47 const auto tgContext = gctx->context();
57 auto lambda = sp.isStraw() ? Amg::intersect<3>(
trf * sp.localPosition(),
58 trf.linear() * sp.sensorDirection(),
59 start.position(tgContext),
61 : Amg::intersect<3>(
start.position(tgContext),
63 n.dot(
target.center(tgContext)));
68 <<
"\n, "<<m_idHelperSvc->toString(detEl->identify())
69 <<
" geoId: "<<
target.geometryId()<<
", "<<( lambda.value_or(0.) > 0 ?
"forward" :
"backward"));
71 return m_extrapolationTool->propagate(ctx,
start,
target, lambda.value_or(0.) > 0
72 ? Acts::Direction::Forward()
73 : Acts::Direction::Backward(), 100._m);
88 Acts::ObjVisualization3D visualHelper{};
92 Acts::ViewConfig{.color = {220, 0, 0}});
98 std::stringstream sstr{};
101 <<segment->chiSquared() / segment->numberDoF()<<
", nDoF: "<<segment->numberDoF()<<
", "
102 <<segment->nPrecisionHits()<<
", "<<segment->nPhiLayers()<<std::endl;
104 sstr<<
" **** "<<(*meas)<<
", chi2: "<<SeedingAux::chi2Term(locPos,
locDir, *meas)
105 <<
", sign: "<<(meas->isStraw() ?
106 (SeedingAux::strawSign(locPos,
locDir, *meas) == 1 ?
"R" :
"L") :
"-")
109 : Acts::GeometryIdentifier{})
116 if (!meas->spacePoint() ||
120 const auto sp = meas->spacePoint();
123 const auto& bounds = targetSurf.bounds();
125 const auto trf = targetSurf.transform(tgContext).inverse() *
126 sector->
surface().transform(tgContext);
128 lPos = (
trf * SeedingAux::extrapolateToPlane(locPos,
locDir, *meas)).block<2,1>(0,0);
129 if (!bounds.inside(lPos, Acts::BoundaryTolerance::AbsoluteEuclidean(-2._mm))){
131 <<
" is outside the trapezoid "<<bounds
132 <<
" "<<m_idHelperSvc->toString(sp->identify()));
136 const auto cIsect = lineIntersect<3>(meas->localPosition(),
137 meas->sensorDirection(),
139 const auto cIsectPos = cIsect.position();
140 const auto cPos =
trf * cIsectPos;
141 lPos[0] = cPos.perp() * SeedingAux::strawSign(locPos,
locDir, *meas);
143 const auto& lBounds =
static_cast<const Acts::LineBounds&
>(bounds);
144 if (std::abs(cPos.z()) > lBounds.get(Acts::LineBounds::eHalfLengthZ) - 2._cm ||
145 cPos.perp() >lBounds.get(Acts::LineBounds::eR) - 0.2_mm) {
147 <<m_idHelperSvc->toString(sp->identify())
156 <<
", expected: "<<
Amg::toString(lPos)<<
", "<<targetSurf.bounds());
157 retCode = StatusCode::FAILURE;
163 Acts::ViewConfig{.color = {0, 0, 220}}, 6._cm);
167 ATH_MSG_DEBUG(
"Position on "<<m_idHelperSvc->toString(sp->identify())
170 const Amg::Vector2D dPos = (*extpPars).localPosition() - lPos;
171 if (dPos.mag() > 0.1_mm) {
172 ATH_MSG_FATAL(
"Too large deviation on "<<m_idHelperSvc->toString(sp->identify())
174 retCode = StatusCode::FAILURE;
177 const double dist = lPos[0];
178 const double extDist = (*extpPars).parameters()[Acts::eBoundLoc0];
179 const double extLocZ = (*extpPars).parameters()[Acts::eBoundLoc1];
180 const double cov = meas->covariance()[Acts::toUnderlying(AxisDefs::etaCov)];
181 ATH_MSG_DEBUG(
"Distance on surface "<<m_idHelperSvc->toString(sp->identify())
182 <<
" straight: "<<dist<<
", extrapolated: "<<extDist
183 <<
"--> "<<(extDist - dist ) / std::sqrt(
cov)
184 <<
", along the tube: "<<lPos[1]<<
", extrapolated: "<<extLocZ);
185 if (std::abs(dist - extDist) / std::sqrt(
cov) > 0.05 ||
186 std::abs(lPos[1] - extLocZ) > 0.1_mm) {
187 ATH_MSG_FATAL(
"Too large deviation on "<<m_idHelperSvc->toString(sp->identify())
188 <<
", "<<
Amg::toString(lPos)<<
" vs. ("<<extDist<<
", "<<extLocZ<<
")"
189 <<
", deviate R: "<<(std::abs(dist -extDist) / std::sqrt(
cov))
190 <<
", deviate Z: "<<std::abs(lPos[1] - extLocZ));
191 retCode = StatusCode::FAILURE;
196 visualHelper.write(
std::format(
"ExtTpTest_{:}_{:}_{:}.obj",
197 ctx.eventID().event_number(), segment->index(),