20 #include "GaudiKernel/SystemOfUnits.h"
21 #include "GaudiKernel/ISvcLocator.h"
24 #include "Acts/Definitions/Algebra.hpp"
25 #include "Acts/Definitions/TrackParametrization.hpp"
26 #include "Acts/EventData/ParticleHypothesis.hpp"
27 #include "Acts/Geometry/GeometryContext.hpp"
28 #include "Acts/Propagator/detail/SteppingLogger.hpp"
29 #include "Acts/Surfaces/CylinderSurface.hpp"
30 #include "Acts/Surfaces/DiscSurface.hpp"
31 #include "Acts/Surfaces/PerigeeSurface.hpp"
32 #include "Acts/Surfaces/Surface.hpp"
33 #include "Acts/Utilities/Helpers.hpp"
34 #include "Acts/Utilities/Logger.hpp"
39 #include "CLHEP/Random/RandomEngine.h"
40 #include "CLHEP/Random/Randomize.h"
48 using xclock = std::chrono::steady_clock;
64 m_referenceSurfaces(0),
65 m_eventsPerExecute(1),
66 m_atlasPropResultWriterSvc(
"ATLASPropResultRootWriterSvc",
name),
67 m_actsPropResultWriterSvc(
"ACTSPropResultRootWriterSvc",
name),
68 m_rndmSvc(
"AthRNGSvc",
name)
93 std::vector< std::vector< const Trk::Surface* > >::const_iterator atlasSurfaceTripleIter = m_atlasReferenceSurfaceTriples.begin();
94 std::vector< std::vector< const Trk::Surface* > >::const_iterator atlasSurfaceTripleIterEnd = m_atlasReferenceSurfaceTriples.end();
95 for ( ; atlasSurfaceTripleIter != atlasSurfaceTripleIterEnd; ++atlasSurfaceTripleIter) {
96 std::vector<const Trk::Surface*>::const_iterator surfIter = (*atlasSurfaceTripleIter).begin();
97 std::vector<const Trk::Surface*>::const_iterator surfIterEnd = (*atlasSurfaceTripleIter).end();
98 for ( ; surfIter != surfIterEnd;
delete (*surfIter), ++surfIter);
111 ATH_CHECK( m_extrapolationTool.retrieve() );
112 ATH_CHECK( m_atlasExtrapolator.retrieve() );
116 if (m_referenceSurfaceRadius.size() == m_referenceSurfaceHalflength.size()) {
118 m_referenceSurfaces = m_referenceSurfaceRadius.size();
120 for (
unsigned int surface = 0; surface < m_referenceSurfaces; surface++) {
122 double radius = m_referenceSurfaceRadius.at(surface);
123 double halfZ = m_referenceSurfaceHalflength.at(surface);
126 std::vector< const Trk::Surface*> trkSurfaceTriplet;
131 m_atlasReferenceSurfaceTriples.push_back(trkSurfaceTriplet);
134 std::vector<std::shared_ptr<const Acts::Surface>> actsSurfaceTriplet;
136 Acts::Transform3 posTransf(Acts::Transform3::Identity()*Acts::Translation3(Acts::Vector3(0.,0., halfZ)));
137 Acts::Transform3 cTransf(Acts::Transform3::Identity()*Acts::Translation3(Acts::Vector3(0.,0., 0.)));
138 Acts::Transform3 negTransf(Acts::Transform3::Identity()*Acts::Translation3(Acts::Vector3(0.,0.,-halfZ)));
140 auto posSurface = Acts::Surface::makeShared<Acts::DiscSurface> (posTransf , 0.,
radius);
141 auto cSurface = Acts::Surface::makeShared<Acts::CylinderSurface>( cTransf ,
radius, halfZ);
142 auto negSurface = Acts::Surface::makeShared<Acts::DiscSurface> (negTransf , 0.,
radius);
144 actsSurfaceTriplet.push_back(posSurface);
145 actsSurfaceTriplet.push_back(cSurface );
146 actsSurfaceTriplet.push_back(negSurface);
148 m_actsReferenceSurfaceTriples.push_back(actsSurfaceTriplet);
150 m_referenceSurfaceNegativeBoundary.push_back(atan2(
radius,-halfZ));
151 m_referenceSurfacePositiveBoundary.push_back(atan2(
radius, halfZ));
154 ATH_MSG_WARNING(
"Not compatible size of ReferenceSurfaceRadius and ReferenceSurfaceHalfZ!! Returning FAILURE!");
155 return StatusCode::FAILURE;
158 ATH_CHECK( m_atlasPropResultWriterSvc.retrieve() );
159 ATH_CHECK( m_actsPropResultWriterSvc.retrieve() );
161 m_randomEngine = m_rndmSvc->getEngine (
this,
"ExtrapolatorComparisonTest");
163 return StatusCode::SUCCESS;
171 return StatusCode::SUCCESS;
178 float milliseconds_to_seconds = 1000.;
181 CLHEP::HepRandomEngine* engine = m_randomEngine->getEngine(ctx);
183 std::vector<perigeeParameters>
parameters = {};
184 for (
int ext = 0;
ext<m_eventsPerExecute;
ext++) {
186 double d0 = CLHEP::RandGauss::shoot(engine) * m_sigmaD0;
187 double z0 = CLHEP::RandGauss::shoot(engine) * m_sigmaZ0;
188 double phi = m_minPhi + (m_maxPhi-m_minPhi)* CLHEP::RandFlat::shoot(engine);
189 double eta = m_minEta + CLHEP::RandFlat::shoot(engine)*(m_maxEta-m_minEta);
190 double pt = m_minPt + CLHEP::RandFlat::shoot(engine)*(m_maxPt-m_minPt);
191 double charge = (CLHEP::RandFlat::shoot(engine) > 0.5 ) ? -1. : 1.;
199 Acts::Vector3
momentum(perigee.m_pt *
std::cos(perigee.m_phi), perigee.m_pt *
std::sin(perigee.m_phi), perigee.m_pt * std::sinh(perigee.m_eta));
206 for (
unsigned int surface = 0; surface < m_atlasReferenceSurfaceTriples.size(); surface++) {
209 double negRef = m_referenceSurfaceNegativeBoundary.at(surface);
210 double posRef = m_referenceSurfacePositiveBoundary.at(surface);
213 int refSurface =
theta < posRef ? 2 : 1;
214 refSurface =
theta > negRef ? 0 : 1;
216 const Trk::Surface* destinationSurface = m_atlasReferenceSurfaceTriples.at(surface).at(refSurface);
218 ATH_MSG_VERBOSE(
"Starting extrapolation " << n_extraps <<
" from : " << *atlPerigee <<
" to : " << *destinationSurface);
222 m_atlasExtrapolator->extrapolate(
230 float ms_fwd = std::chrono::duration_cast<std::chrono::milliseconds>(end_fwd-start_fwd).count();
232 if (destParameters) {
235 ATH_MSG_VERBOSE(
" [ intersection ] parameters: " << destParameters->parameters() );
236 ATH_MSG_VERBOSE(
" [ intersection ] cov matrix: " << destParameters->covariance() );
241 m_atlasExtrapolator->extrapolate(
249 float ms_bkw = std::chrono::duration_cast<std::chrono::milliseconds>(end_bkw-start_bkw).count();
253 ATH_MSG_VERBOSE(
" [extrapolation to perigee] input: " << atlPerigee->parameters() );
254 ATH_MSG_VERBOSE(
" [extrapolation to perigee] output: " << finalperigee->parameters() );
255 ATH_MSG_VERBOSE(
" [extrapolation to perigee] cov matrix: " << finalperigee->covariance() );
257 }
else if (!finalperigee) {
258 ATH_MSG_DEBUG(
" ATLAS Extrapolation to perigee failed for input parameters: " << destParameters->parameters());
261 m_atlasPropResultWriterSvc->write<
Trk::TrackParameters>(atlPerigee, destParameters, ms_fwd, finalperigee, ms_bkw);
263 }
else if (!destParameters) {
267 delete destParameters;
272 auto secs = std::chrono::duration_cast<std::chrono::milliseconds>(
end-
start).count() / milliseconds_to_seconds;
273 double secs_per_ex = secs / n_extraps;
275 ATH_MSG_INFO(
"ATLAS : Time for " << n_extraps <<
" iterations: " << secs <<
"s (" << secs_per_ex <<
"s per extrapolation)");
280 Acts::Vector3
momentum(perigee.m_pt *
std::cos(perigee.m_phi), perigee.m_pt *
std::sin(perigee.m_phi), perigee.m_pt * std::sinh(perigee.m_eta));
284 std::shared_ptr<Acts::PerigeeSurface> actsPerigeeSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3(0, 0, 0));
286 Acts::BoundVector
pars;
289 std::optional<Acts::BoundSquareMatrix>
cov = std::nullopt;
292 ActsGeometryContext gctx = m_extrapolationTool->trackingGeometryTool()->getNominalGeometryContext();
296 for (
unsigned int surface = 0; surface < m_actsReferenceSurfaceTriples.size(); surface++) {
299 double negRef = m_referenceSurfaceNegativeBoundary.at(surface);
300 double posRef = m_referenceSurfacePositiveBoundary.at(surface);
303 int refSurface =
theta < posRef ? 2 : 1;
304 refSurface =
theta > negRef ? 0 : 1;
306 auto destinationSurface = m_actsReferenceSurfaceTriples.at(surface).at(refSurface);
308 ATH_MSG_VERBOSE(
"Starting extrapolation " << n_extraps <<
" from : " <<
pars <<
" to : " << destinationSurface);
311 auto destParameters = m_extrapolationTool->propagate(ctx, *startParameters, *destinationSurface, Acts::Direction::Forward);
313 float ms_fwd = std::chrono::duration_cast<std::chrono::milliseconds>(end_fwd-start_fwd).count();
315 if (destParameters) {
317 ATH_MSG_VERBOSE(
" [ intersection ] with surface at (x,y,z) = " << destParameters->position(anygctx).x() <<
", " << destParameters->position(anygctx).y() <<
", " << destParameters->position(anygctx).z() );
318 ATH_MSG_VERBOSE(
" [ intersection ] parameters: " << destParameters->parameters() );
319 ATH_MSG_VERBOSE(
" [ intersection ] cov matrix: " << *destParameters->covariance() );
323 auto finalperigee = m_extrapolationTool->propagate(ctx, *destParameters, startParameters->referenceSurface(), Acts::Direction::Backward);
325 float ms_bkw = std::chrono::duration_cast<std::chrono::milliseconds>(end_bkw-start_bkw).count();
329 ATH_MSG_VERBOSE(
" [extrapolation to perigee] input: " << startParameters->parameters() );
330 ATH_MSG_VERBOSE(
" [extrapolation to perigee] output: " << finalperigee->parameters() );
331 ATH_MSG_VERBOSE(
" [extrapolation to perigee] cov matrix: " << *finalperigee->covariance() );
333 }
else if (!finalperigee) {
334 ATH_MSG_DEBUG(
" ACTS Extrapolation to perigee failed for input parameters: " << destParameters->parameters());
342 m_actsPropResultWriterSvc->write<
ActsTrackWrapper>(startWrapper, destWrapper, ms_fwd, finalWrapper, ms_bkw);
347 }
else if (!destParameters) {
354 delete startParameters;
358 secs = std::chrono::duration_cast<std::chrono::milliseconds>(
end-
start).count() / milliseconds_to_seconds;
359 secs_per_ex = secs / n_extraps;
361 ATH_MSG_INFO(
"ACTS : Time for " << n_extraps <<
" iterations: " << secs <<
"s (" << secs_per_ex <<
"s per extrapolation)");
363 return StatusCode::SUCCESS;