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