86 std::vector< const Trk::Surface*> trkSurfaceTriplet;
93 ATH_MSG_INFO(
"Creating Trk::Surface at: R " << radius <<
" Z " << halfZ);
97 std::vector<std::shared_ptr<const Acts::Surface> > actsSurfaceTriplet;
99 Acts::Transform3 posTransf(Acts::Transform3::Identity() * Acts::Translation3(Acts::Vector3(0., 0., halfZ)));
100 Acts::Transform3 cTransf(Acts::Transform3::Identity() * Acts::Translation3(Acts::Vector3(0., 0., 0.)));
101 Acts::Transform3 negTransf(Acts::Transform3::Identity() * Acts::Translation3(Acts::Vector3(0., 0., -halfZ)));
103 auto posSurface = Acts::Surface::makeShared<Acts::DiscSurface> (posTransf, 0., radius);
104 auto cSurface = Acts::Surface::makeShared<Acts::CylinderSurface>(cTransf, radius, halfZ);
105 auto negSurface = Acts::Surface::makeShared<Acts::DiscSurface> (negTransf, 0., radius);
107 actsSurfaceTriplet.push_back(posSurface);
108 actsSurfaceTriplet.push_back(cSurface);
109 actsSurfaceTriplet.push_back(negSurface);
110 ATH_MSG_INFO(
"Creating Acts::Surface at: R " << radius <<
" Z " << halfZ);
117 ATH_MSG_WARNING(
"Not compatible size of ReferenceSurfaceRadius and ReferenceSurfaceHalfZ!! Returning FAILURE!");
118 return StatusCode::FAILURE;
126 return StatusCode::SUCCESS;
139 float milliseconds_to_seconds = 1000.;
144 std::vector<perigeeParameters> parameters = {};
147 double d0 = CLHEP::RandGauss::shoot(engine) *
m_sigmaD0;
148 double z0 = CLHEP::RandGauss::shoot(engine) *
m_sigmaZ0;
152 double charge = (CLHEP::RandFlat::shoot(engine) > 0.5) ? -1. : 1.;
157 auto start = xclock::now();
158 for (
auto& perigee : parameters) {
159 Acts::Vector3 momentum(perigee.m_pt * std::cos(perigee.m_phi), perigee.m_pt * std::sin(
160 perigee.m_phi), perigee.m_pt * std::sinh(perigee.m_eta));
161 double theta = Acts::VectorHelpers::theta(momentum);
162 double qOverP = perigee.m_charge / momentum.norm();
165 auto atlPerigee = std::make_unique<Trk::Perigee>(perigee.m_d0, perigee.m_z0, perigee.m_phi,
theta,
qOverP,
175 int refSurface =
theta < posRef ? 2 : 1;
176 refSurface =
theta > negRef ? 0 : 1;
181 "Starting extrapolation " << n_extraps <<
" from : " << *atlPerigee <<
" to : " << *destinationSurface);
183 auto start_fwd = xclock::now();
184 auto destParameters =
192 auto end_fwd = xclock::now();
193 float ms_fwd = std::chrono::duration_cast<std::chrono::milliseconds>(end_fwd - start_fwd).count();
195 if (destParameters) {
198 " [ intersection ] with surface at (x,y,z) = " << destParameters->position().x() <<
", " << destParameters->position().y() <<
", " <<
199 destParameters->position().z());
200 ATH_MSG_VERBOSE(
" [ intersection ] parameters: " << destParameters->parameters());
201 ATH_MSG_VERBOSE(
" [ intersection ] cov matrix: " << destParameters->covariance());
204 auto start_bkw = xclock::now();
209 atlPerigee->associatedSurface(),
213 auto end_bkw = xclock::now();
214 float ms_bkw = std::chrono::duration_cast<std::chrono::milliseconds>(end_bkw - start_bkw).count();
218 ATH_MSG_VERBOSE(
" [extrapolation to perigee] input: " << atlPerigee->parameters());
219 ATH_MSG_VERBOSE(
" [extrapolation to perigee] output: " << finalperigee->parameters());
220 ATH_MSG_VERBOSE(
" [extrapolation to perigee] cov matrix: " << finalperigee->covariance());
221 }
else if (!finalperigee) {
222 ATH_MSG_DEBUG(
" ATLAS Extrapolation to perigee failed for input parameters: " <<
223 destParameters->parameters());
227 destParameters.get(), ms_fwd, finalperigee.get(),
229 }
else if (!destParameters) {
235 auto end = xclock::now();
236 auto secs = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() / milliseconds_to_seconds;
240 double secs_per_ex = secs / n_extraps;
242 "ATLAS : Time for " << n_extraps <<
" iterations: " << secs <<
"s (" << secs_per_ex <<
"s per extrapolation)");
245 start = xclock::now();
246 for (
auto& perigee : parameters) {
247 Acts::Vector3 momentum(perigee.m_pt * std::cos(perigee.m_phi), perigee.m_pt * std::sin(
248 perigee.m_phi), perigee.m_pt * std::sinh(perigee.m_eta));
249 double theta = Acts::VectorHelpers::theta(momentum);
250 double qOverP = perigee.m_charge / momentum.norm();
252 std::shared_ptr<Acts::PerigeeSurface> actsPerigeeSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3(
256 Acts::BoundVector pars;
258 pars << perigee.m_d0, perigee.m_z0, perigee.m_phi,
theta,
qOverP, t;
259 std::optional<Acts::BoundMatrix> cov = std::nullopt;
264 const auto* startParameters =
265 new const Acts::BoundTrackParameters(std::move(actsPerigeeSurface), pars, std::move(
266 cov), Acts::ParticleHypothesis::pion());
275 int refSurface =
theta < posRef ? 2 : 1;
276 refSurface =
theta > negRef ? 0 : 1;
280 ATH_MSG_VERBOSE(
"Starting extrapolation " << n_extraps <<
" from : " << pars <<
" to : " << destinationSurface);
282 auto start_fwd = xclock::now();
283 auto destParameters =
m_extrapolationTool->propagate(ctx, *startParameters, *destinationSurface,
284 Acts::Direction::Forward());
285 auto end_fwd = xclock::now();
286 float ms_fwd = std::chrono::duration_cast<std::chrono::milliseconds>(end_fwd - start_fwd).count();
288 if (destParameters.ok()) {
290 ATH_MSG_VERBOSE(
" [ intersection ] with surface at (x,y,z) = " << destParameters->position(
291 anygctx).x() <<
", " << destParameters->position(anygctx).y() <<
", " <<
292 destParameters->position(anygctx).z());
293 ATH_MSG_VERBOSE(
" [ intersection ] parameters: " << destParameters->parameters());
294 ATH_MSG_VERBOSE(
" [ intersection ] cov matrix: " << *destParameters->covariance());
297 auto start_bkw = xclock::now();
299 startParameters->referenceSurface(),
300 Acts::Direction::Backward());
301 auto end_bkw = xclock::now();
302 float ms_bkw = std::chrono::duration_cast<std::chrono::milliseconds>(end_bkw - start_bkw).count();
304 if (finalperigee.ok()) {
306 ATH_MSG_VERBOSE(
" [extrapolation to perigee] input: " << startParameters->parameters());
307 ATH_MSG_VERBOSE(
" [extrapolation to perigee] output: " << finalperigee->parameters());
308 ATH_MSG_VERBOSE(
" [extrapolation to perigee] cov matrix: " << *finalperigee->covariance());
309 }
else if (!finalperigee.ok()) {
310 ATH_MSG_DEBUG(
" ACTS Extrapolation to perigee failed for input parameters: " << destParameters->parameters());
314 auto startWrapper = std::make_unique<ActsTrackWrapper>(startParameters, anygctx);
315 auto destWrapper = std::make_unique<ActsTrackWrapper>(&destParameters.value(), anygctx);
316 auto finalWrapper = std::make_unique<ActsTrackWrapper>(&finalperigee.value(), anygctx);
319 destWrapper.get(), ms_fwd, finalWrapper.get(), ms_bkw);
320 }
else if (!destParameters.ok()) {
322 auto startWrapper = std::make_unique<ActsTrackWrapper>(startParameters, anygctx);
326 delete startParameters;
330 secs = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() / milliseconds_to_seconds;
334 double secs_per_ex = secs / n_extraps;
336 "ATLAS : Time for " << n_extraps <<
" iterations: " << secs <<
"s (" << secs_per_ex <<
"s per extrapolation)");
338 return StatusCode::SUCCESS;