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