280 {
281
282
284 if (actsParameter.covariance()) {
285 AmgSymMatrix(5) newcov(actsParameter.covariance()->topLeftCorner<5, 5>());
286
287 for (int i = 0; i < newcov.rows(); i++) {
288 newcov(i, 4) = newcov(i, 4) * 1_MeV;
289 }
290 for (
int i = 0;
i < newcov.cols();
i++) {
291 newcov(4, i) = newcov(4, i) * 1_MeV;
292 }
294 }
295
296 const Acts::Surface &actsSurface = actsParameter.referenceSurface();
298 switch (actsSurface.type()) {
299 case Acts::Surface::SurfaceType::Cone: {
300 const auto &coneSurface = static_cast<const Trk::ConeSurface&>(*trkSurface);
301 return std::make_unique<Trk::AtaCone>(
302 actsParameter.get<Acts::eBoundLoc0>(),
303 actsParameter.get<Acts::eBoundLoc1>(),
304 actsParameter.get<Acts::eBoundPhi>(),
305 actsParameter.get<Acts::eBoundTheta>(),
306 actsParameter.get<Acts::eBoundQOverP>() * 1_MeV, coneSurface, cov);
307 } case Acts::Surface::SurfaceType::Cylinder: {
308 const auto &cylSurface{static_cast<const Trk::CylinderSurface&>(*trkSurface)};
309 return std::make_unique<Trk::AtaCylinder>(
310 actsParameter.get<Acts::eBoundLoc0>(),
311 actsParameter.get<Acts::eBoundLoc1>(),
312 actsParameter.get<Acts::eBoundPhi>(),
313 actsParameter.get<Acts::eBoundTheta>(),
314 actsParameter.get<Acts::eBoundQOverP>() * 1_MeV, cylSurface, cov);
315 } case Acts::Surface::SurfaceType::Disc: {
317 const auto& discSurface{static_cast<const Trk::DiscSurface&>(*trkSurface)};
318 return std::make_unique<Trk::AtaDisc>(
319 actsParameter.get<Acts::eBoundLoc0>(),
320 actsParameter.get<Acts::eBoundLoc1>(),
321 actsParameter.get<Acts::eBoundPhi>(),
322 actsParameter.get<Acts::eBoundTheta>(),
323 actsParameter.get<Acts::eBoundQOverP>() * 1_MeV, discSurface, cov);
325 const Acts::GeometryContext tgContext =
m_ctxProvider.getGeometryContext(ctx);
326 auto& planeSurface{static_cast<const Trk::PlaneSurface&>(*trkSurface)};
327
328 auto helperSurface = Acts::Surface::makeShared<Acts::PlaneSurface>(planeSurface.transform());
329
330 auto covpc = actsParameter.covariance().value();
332 Acts::FreeVector freePars = Acts::transformBoundToFreeParameters(actsSurface, tgContext,
333 actsParameter.parameters());
334
336 Acts::BoundVector targetPars = Acts::transformFreeToBoundParameters(freePars,
337 *helperSurface, tgContext).value();
338
339
340 Acts::FreeMatrix freeTransportJacobian{Acts::FreeMatrix::Identity()};
341
342 Acts::FreeVector freeToPathDerivatives{Acts::FreeVector::Zero()};
343 freeToPathDerivatives.head<3>() = freePars.segment<3>(Acts::eFreeDir0);
344
345 auto boundToFreeJacobian = actsSurface.boundToFreeJacobian(tgContext,
346 freePars.segment<3>(Acts::eFreePos0),
347 freePars.segment<3>(Acts::eFreeDir0));
348
349 Acts::BoundMatrix boundToBoundJac =
350 Acts::detail::boundToBoundTransportJacobian(tgContext, freePars,
351 boundToFreeJacobian, freeTransportJacobian,
352 freeToPathDerivatives, *helperSurface);
353
354 Acts::BoundMatrix targetCov{boundToBoundJac * covpc * boundToBoundJac.transpose()};
355
356 return std::make_unique<Trk::AtaPlane>(
357 targetPars[Acts::eBoundLoc0], targetPars[Acts::eBoundLoc1],
358 targetPars[Acts::eBoundPhi], targetPars[Acts::eBoundTheta],
359 targetPars[Acts::eBoundQOverP] * 1_MeV, planeSurface,
360 targetCov.topLeftCorner<5, 5>());
361 } else {
362 throw std::domain_error("Acts::DiscSurface is not associated with ATLAS disc or plane surface");
363 }
364 break;
365 } case Acts::Surface::SurfaceType::Perigee: {
366 const auto& perSurface = static_cast<const Trk::PerigeeSurface&>(*trkSurface);
367 return std::make_unique<Trk::Perigee>(
368 actsParameter.get<Acts::eBoundLoc0>(),
369 actsParameter.get<Acts::eBoundLoc1>(),
370 actsParameter.get<Acts::eBoundPhi>(),
371 actsParameter.get<Acts::eBoundTheta>(),
372 actsParameter.get<Acts::eBoundQOverP>() * 1_MeV, perSurface, cov);
373 } case Acts::Surface::SurfaceType::Plane: {
374 auto &plaSurface{static_cast<const Trk::PlaneSurface&>(*trkSurface)};
375 return std::make_unique<Trk::AtaPlane>(
376 actsParameter.get<Acts::eBoundLoc0>(),
377 actsParameter.get<Acts::eBoundLoc1>(),
378 actsParameter.get<Acts::eBoundPhi>(),
379 actsParameter.get<Acts::eBoundTheta>(),
380 actsParameter.get<Acts::eBoundQOverP>() * 1_MeV, plaSurface, cov);
381 } case Acts::Surface::SurfaceType::Straw: {
382 auto& lineSurface{static_cast<const Trk::StraightLineSurface&>(*trkSurface)};
383 return std::make_unique<Trk::AtaStraightLine>(
384 actsParameter.get<Acts::eBoundLoc0>(),
385 actsParameter.get<Acts::eBoundLoc1>(),
386 actsParameter.get<Acts::eBoundPhi>(),
387 actsParameter.get<Acts::eBoundTheta>(),
388 actsParameter.get<Acts::eBoundQOverP>() * 1_MeV, lineSurface, cov);
389 } case Acts::Surface::SurfaceType::Curvilinear: {
390 const Acts::GeometryContext tgContext =
m_ctxProvider.getGeometryContext(ctx);
391 return std::make_unique<Trk::CurvilinearParameters>(
392 actsParameter.position(tgContext), actsParameter.get<Acts::eBoundPhi>(),
393 actsParameter.get<Acts::eBoundTheta>(),
394 actsParameter.get<Acts::eBoundQOverP>() * 1_MeV, cov);
395 } case Acts::Surface::SurfaceType::Point:
396 case Acts::Surface::SurfaceType::Other: {
397 break;
398 }
399 }
400 throw std::domain_error("Surface type not found");
401 }
#define AmgSymMatrix(dim)