282 const G4ThreeVector& mom,
283 int pdg,
double charge,
float t,
285 const EventContext& ctx = Gaudi::Hive::currentContext();
288 double zMuonEntry = 6735.;
289 double rMuonEntry = 4254;
290 double zMuonExit = 21800.;
291 double rMuonExit = 12500.;
292 double zIDExit = 2720.;
293 double rIDExit = 1080.;
295 double zEntry = zMuonEntry;
296 double rEntry = rMuonEntry;
297 double zExit = zMuonExit;
298 double rExit = rMuonExit;
309 Amg::Vector3D npos(scale * pos.x(), scale * pos.y(), scale * pos.z());
313 ATH_MSG_INFO(
"Initial step ... preparing event cache.");
337 std::move(covMatrix));
343 float tX0 = X0 > 10e-5 ? t / X0 : 0.;
345 ATH_MSG_DEBUG(
" position R " << npos.perp() <<
" z " << npos.z() <<
" X0 "
346 << X0 <<
" t " << t <<
" m_tX0Cache "
349 bool useEntry =
true;
353 (std::fabs(npos.z()) > zEntry || npos.perp() > rEntry)) {
369 npos, nmom,
charge, std::move(covMatrix));
392 <<
" reached, step is ignored.");
440 bool crossedExitLayer =
false;
442 if (std::fabs(npos.z()) > zExit || npos.perp() > rExit)
443 crossedExitLayer =
true;
445 ATH_MSG_DEBUG(
"npos Z: " << npos.z() <<
"npos prep: " << npos.perp()
446 <<
"crossedExitLayer: " << crossedExitLayer);
451 <<
"m_treeData->m_g4_steps: " <<
m_treeData->m_g4_steps
452 <<
"m_treeData->m_g4_stepsEntry: " <<
m_treeData->m_g4_stepsEntry);
469 std::unique_ptr<Trk::TrackParameters> trkParameters =
477 if (!trkParameters) {
479 " G4 extrapolate failed without covariance to destination surface ");
482 ATH_MSG_DEBUG(
" Extrapolate m_parameterCacheCov with covMatrix ");
483 extrapolationCache.
reset();
492 if (!trkParameters) {
493 ATH_MSG_DEBUG(
" G4 extrapolate failed with covariance to Muon Entry or ID Exit");
494 ATH_MSG_DEBUG(
" Redo G4 extrapolateM without covariance matrix to Muon Entry or ID Exit ");
495 extrapolationCache.
reset();
507 " G4 extrapolate succesfull with covariance to Muon Entry or ID exit "
508 <<
" X0 " << extrapolationCache.
x0tot() <<
" Eloss deltaE "
509 << extrapolationCache.
eloss()->
deltaE() <<
" Eloss sigma "
513 << extrapolationCache.
eloss()->
meanRad() <<
" sigmaRad "
522 <<
m_treeData->m_g4_steps <<
" exit Layer: " << crossedExitLayer
523 <<
" track parameters: " << trkParameters.get());
525 if (!trkParameters) {
530 <<
"track parameters: " << trkParameters.get());
531 if (crossedExitLayer) {
538 extrapolationCache.
reset();
539 ATH_MSG_DEBUG(
" Extrapolate m_parameterCacheEntryCov with covMatrix "
556 ATH_MSG_DEBUG(
"extrapolation with m_parameterCacheEntryCov succeeded ");
558 ATH_MSG_DEBUG(
" extrapolation failed with m_parameterCacheEntryCov ");
560 ATH_MSG_DEBUG(
" failed due to m_parameterCacheEntryCov is zero");
562 extrapolationCache.
reset();
573 ATH_MSG_DEBUG(
"extrapolation with m_parameterCacheEntry succeeded");
576 extrapolationCache.
reset();
590 constexpr bool doBackWard =
false;
592 std::unique_ptr<Trk::TrackParameters> trkParameters_BACK =
600 if (trkParameters_BACK) {
603 m_treeData->m_b_p = trkParameters_BACK->momentum().mag();
604 m_treeData->m_b_eta = trkParameters_BACK->momentum().eta();
605 m_treeData->m_b_theta = trkParameters_BACK->momentum().theta();
606 m_treeData->m_b_phi = trkParameters_BACK->momentum().phi();
607 m_treeData->m_b_x = trkParameters_BACK->position().x();
608 m_treeData->m_b_y = trkParameters_BACK->position().y();
609 m_treeData->m_b_z = trkParameters_BACK->position().z();
612 " Back extrapolation to Muon Entry or ID Exit finds different "
613 "momentum difference MeV "
616 extrapolationCache.
reset();
617 const std::vector<const Trk::TrackStateOnSurface*>* matvec_BACK =
625 if (matvec_BACK && !matvec_BACK->empty()) {
626 std::vector<const Trk::TrackStateOnSurface*>::const_iterator it =
627 matvec_BACK->begin();
628 std::vector<const Trk::TrackStateOnSurface*>::const_iterator
629 it_end = matvec_BACK->end();
630 for (; it != it_end; ++it) {
632 (*it)->materialEffectsOnTrack();
641 if (not matEfs)
continue;
644 double meanIoni = 0.;
645 double sigmaIoni = 0.;
647 double sigmaRad = 0.;
648 double sigmaTheta = 0.;
649 double sigmaPhi = 0.;
662 <<
" eLoss->length() "
667 (matEfs)->scatteringAngles();
676 if ((*it)->trackParameters()) {
678 (*it)->trackParameters()->position().x();
680 (*it)->trackParameters()->position().y();
682 (*it)->trackParameters()->position().z();
709 extrapolationCache.
reset();
710 const std::vector<const Trk::TrackStateOnSurface*>* matvec =
713 &extrapolationCache);
722 "m_treeData->m_g4_stepsEntry (debug): " <<
m_treeData->m_g4_stepsEntry);
724 extrapolationCache.
reset();
728 if (!matvec || matvec->empty()) {
730 " G4 extrapolateM failed with covariance matrix to Muon Entry or ID Exit ");
732 " Redo G4 extrapolateM without covariance matrix to Muon Entry or ID Exit ");
733 extrapolationCache.
reset();
739 " G4 extrapolateM succesfull with covariance matrix to Muon Entry or ID Exit ");
742 << extrapolationCache.
x0tot() <<
" Eloss deltaE "
743 << extrapolationCache.
eloss()->
deltaE() <<
" Eloss sigma "
747 << extrapolationCache.
eloss()->
meanRad() <<
" sigmaRad "
751 extrapolationCache.
reset();
755 if (!matvec || matvec->empty()) {
757 " G4 extrapolateM failed with covariance matrix to Muon or Calo Exit ");
759 " Redo G4 extrapolateM without covariance matrix to Muon or Calo Exit ");
760 extrapolationCache.
reset();
766 " G4 extrapolateM succesfull with covariance matrix to Muon or Calo Exit ");
769 << extrapolationCache.
x0tot() <<
" Eloss deltaE "
770 << extrapolationCache.
eloss()->
deltaE() <<
" Eloss sigma "
774 << extrapolationCache.
eloss()->
meanRad() <<
" sigmaRad "
779 extrapolationCache.
reset();
783 ATH_MSG_DEBUG(
" G4 extrapolateM without covariance matrix to Muon Entry or ID Exit "
784 <<
" X0 " << extrapolationCache.
x0tot() <<
" Eloss deltaE "
785 << extrapolationCache.
eloss()->
deltaE() <<
" Eloss sigma "
789 << extrapolationCache.
eloss()->
meanRad() <<
" sigmaRad "
800 const std::vector<const Trk::TrackStateOnSurface*> matvecNewRepAggrUp =
801 modifyTSOSvector(*matvec, 1.0, 1.0,
true,
true,
true, 0., 0., 10000., 0.,
804 double X0Scale = 1.0;
805 double ElossScale = 1.0;
811 bool system1 =
false;
812 bool system2 =
false;
814 if (!matvec->empty()) {
819 ATH_MSG_DEBUG(
" ID or Calorimeter system " << system1 <<
" Calorimeter or Muon system " << system2);
826 ATH_MSG_DEBUG(
" system2 scales X0 " << X0Scale <<
" ElossScale "
829 const std::vector<const Trk::TrackStateOnSurface*> matvecNew1 =
832 const std::vector<const Trk::TrackStateOnSurface*> matvecNew0 =
836 const std::vector<const Trk::TrackStateOnSurface*> matvecNew5 =
840 const std::vector<const Trk::TrackStateOnSurface*> matvecNew10 =
850 X0Scale, ElossScale);
851 ATH_MSG_DEBUG(
" calorimeter scales X0 " << X0Scale <<
" ElossScale "
853 const std::vector<const Trk::TrackStateOnSurface*> matvecNew1 =
856 const std::vector<const Trk::TrackStateOnSurface*> matvecNew0 =
859 if (std::fabs(Eloss1) > 0)
860 ATH_MSG_DEBUG(
" **** Cross Check calorimeter with Eloss Scale1 "
861 << Eloss1 <<
" Eloss0 " << Eloss0 <<
" ratio "
865 const std::vector<const Trk::TrackStateOnSurface*> matvecNew5 =
869 const std::vector<const Trk::TrackStateOnSurface*> matvecNew10 =
875 <<
"Eloss1 " << Eloss1 <<
" Eloss0 " << Eloss0
876 <<
" Eloss5 " << Eloss5 <<
" Eloss10 " << Eloss10);
883 if (!(matvec->empty()) &&
m_treeData->m_g4_stepsEntry <= 1) {
884 std::vector<const Trk::TrackStateOnSurface*>::const_iterator it =
886 std::vector<const Trk::TrackStateOnSurface*>::const_iterator it_end =
888 for (; it != it_end; ++it) {
899 double meanIoni = 0.;
900 double sigmaIoni = 0.;
902 double sigmaRad = 0.;
903 double sigmaTheta = 0.;
904 double sigmaPhi = 0.;
915 <<
m_treeData->m_g4_stepsEntry <<
" mmat " << mmat
917 <<
" eLoss->deltaE() " << eLoss->
deltaE()
918 <<
" meanIoni " << meanIoni <<
" Total Eloss "
919 << Eloss <<
" eLoss->length() " << eLoss->
length());
924 (matEfs) ? ((matEfs)->scatteringAngles()) : (
nullptr);
930 <<
m_treeData->m_g4_stepsEntry <<
" mmat " << mmat
931 <<
" sigmaTheta " << sigmaTheta <<
" sigmaPhi "
943 if ((*it)->trackParameters()) {
945 (*it)->trackParameters()->position().x();
947 (*it)->trackParameters()->position().y();
949 (*it)->trackParameters()->position().z();
969 <<
m_treeData->m_g4_steps <<
" Radius " << npos.perp() <<
" z "
970 << npos.z() <<
" size matvec "
971 <<
" total X0 " << x0 <<
" total Eloss " << Eloss);
989 trkParameters ? trkParameters->momentum().mag() : 0.;
991 trkParameters ? trkParameters->momentum().eta() : 0.;
993 trkParameters ? trkParameters->momentum().theta() : 0.;
995 trkParameters ? trkParameters->momentum().phi() : 0.;
997 trkParameters ? trkParameters->position().x() : 0.;
999 trkParameters ? trkParameters->position().y() : 0.;
1001 trkParameters ? trkParameters->position().z() : 0.;
1003 trkParameters ? trkParameters->parameters()[
Trk::locX] : 0.;
1005 trkParameters ? trkParameters->parameters()[
Trk::locY] : 0.;
1019 double errord0 = 0.;
1020 double errorz0 = 0.;
1021 double errorphi = 0.;
1022 double errortheta = 0.;
1023 double errorqoverp = 0.;
1024 if (trkParameters && trkParameters->covariance()) {
1030 ATH_MSG_DEBUG(
" Covariance found for m_treeData->m_trk_status "
1055 const std::vector<const Trk::TrackStateOnSurface*>& matvec,
double scaleX0,
1056 double scaleEloss,
bool reposition,
bool aggregate,
bool updateEloss,
1057 double caloEnergy,
double caloEnergyError,
double pCaloEntry,
1058 double momentumError,
double& Eloss_tot)
const {
1084 std::vector<const Trk::TrackStateOnSurface*> newTSOSvector;
1085 int maxsize = 2 * matvec.size();
1086 if (aggregate) maxsize = 2;
1087 newTSOSvector.reserve(maxsize);
1096 double sigmaDeltaPhi2_tot = 0.;
1097 double sigmaDeltaTheta2_tot = 0.;
1098 double deltaE_tot = 0.;
1099 double sigmaDeltaE_tot = 0.;
1100 double sigmaPlusDeltaE_tot = 0.;
1101 double sigmaMinusDeltaE_tot = 0.;
1102 double deltaE_ioni_tot = 0.;
1103 double sigmaDeltaE_ioni_tot = 0.;
1104 double deltaE_rad_tot = 0.;
1105 double sigmaDeltaE_rad_tot = 0.;
1112 double deltaEFirst = 0.;
1115 double deltaTheta = 0.;
1124 std::bitset<Trk::MaterialEffectsBase::NumberOfMaterialEffectsTypes>
1130 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
1135 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
1136 typePatternDeposit(0);
1141 for (
const auto* m : matvec) {
1142 if (!m->trackParameters()) {
1146 if (m->materialEffectsOnTrack()) {
1147 double X0 = m->materialEffectsOnTrack()->thicknessInX0();
1150 m->materialEffectsOnTrack());
1176 << m->dumpType() <<
" TSOS surface "
1177 << m->trackParameters()->associatedSurface()
1178 <<
" position x " << m->trackParameters()->position().x()
1179 <<
" y " << m->trackParameters()->position().y() <<
" z "
1180 << m->trackParameters()->position().z() <<
" direction x "
1181 << m->trackParameters()->momentum().unit().x() <<
" y "
1182 << m->trackParameters()->momentum().unit().y() <<
" z "
1183 << m->trackParameters()->momentum().unit().z() <<
" p "
1184 << m->trackParameters()->momentum().mag() <<
" X0 " << X0
1185 <<
" deltaE " << energyLoss->
deltaE()
1187 <<
" depth " <<
depth);
1189 X0_tot += scaleX0 * X0;
1191 sigmaDeltaTheta2_tot +=
1193 sigmaDeltaPhi2_tot +=
1199 deltaE_tot += scaleEloss * energyLoss->
deltaE();
1200 sigmaDeltaE_tot += scaleEloss * energyLoss->
sigmaDeltaE();
1203 deltaE_ioni_tot += scaleEloss * energyLoss->
meanIoni();
1204 sigmaDeltaE_ioni_tot += scaleEloss * energyLoss->
sigmaIoni();
1205 deltaE_rad_tot += scaleEloss * energyLoss->
meanRad();
1206 sigmaDeltaE_rad_tot += scaleEloss * energyLoss->
sigmaRad();
1210 Amg::Vector3D dir = m->trackParameters()->momentum().unit();
1216 dir = dir / dir.mag();
1217 ATH_MSG_DEBUG(
" position at end " << pos.x() <<
" y " << pos.y() <<
" z "
1218 << pos.z() <<
" perp " << pos.perp());
1219 ATH_MSG_DEBUG(
" direction x " << dir.x() <<
" y " << dir.y() <<
" z "
1225 << pos0.x() <<
" y " << pos0.y() <<
" z " << pos0.z()
1226 <<
" perp " << pos0.perp());
1228 << posNew.x() <<
" y " << posNew.y() <<
" z " << posNew.z()
1229 <<
" perp " << posNew.perp() <<
" distance "
1230 << (pos0 - posNew).mag() <<
" depth " <<
depth);
1234 deltaEFirst = energyLoss->
deltaE();
1240 wpos += w * pos0 / 2.;
1241 wpos += w * posNew / 2.;
1244 wdist2 += w * (pos0 - posFirst).
mag2() / 2.;
1245 wdist2 += w * (posNew - posFirst).
mag2() / 2.;
1247 if (!aggregate && !reposition) {
1249 std::sqrt(sigmaDeltaPhi2_tot),
1250 std::sqrt(sigmaDeltaTheta2_tot));
1251 auto energyLossNew = std::make_unique<Trk::EnergyLoss>(
1252 deltaE_tot, sigmaDeltaE_tot, sigmaPlusDeltaE_tot,
1253 sigmaMinusDeltaE_tot, deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1254 deltaE_rad_tot, sigmaDeltaE_rad_tot,
depth);
1255 Eloss_tot += energyLossNew->deltaE();
1257 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1258 X0_tot, scatNew, std::move(energyLossNew), surf, meotPattern);
1259 auto pars = m->trackParameters()->uniqueClone();
1263 nullptr, std::move(pars), std::move(meotLast), typePattern);
1264 newTSOSvector.push_back(newTSOS);
1267 sigmaDeltaTheta2_tot = 0.;
1268 sigmaDeltaPhi2_tot = 0.;
1270 sigmaDeltaE_tot = 0;
1271 sigmaPlusDeltaE_tot = 0.;
1272 sigmaMinusDeltaE_tot = 0.;
1273 deltaE_ioni_tot = 0.;
1274 sigmaDeltaE_ioni_tot = 0.;
1275 deltaE_rad_tot = 0.;
1276 sigmaDeltaE_rad_tot = 0.;
1278 }
else if (!aggregate && reposition) {
1279 if (std::abs(
depth) < 10.) {
1281 std::sqrt(sigmaDeltaPhi2_tot),
1282 std::sqrt(sigmaDeltaTheta2_tot));
1283 auto energyLossNew = std::make_unique<Trk::EnergyLoss>(
1284 deltaE_tot, sigmaDeltaE_tot, sigmaPlusDeltaE_tot,
1285 sigmaMinusDeltaE_tot, deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1286 deltaE_rad_tot, sigmaDeltaE_rad_tot,
depth);
1288 Eloss_tot += energyLossNew->deltaE();
1289 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1290 X0_tot, scatNew, std::move(energyLossNew), surf, meotPattern);
1291 std::unique_ptr<Trk::TrackParameters> pars =
1292 m->trackParameters()->uniqueClone();
1296 std::move(meotLast), typePattern);
1297 newTSOSvector.push_back(newTSOS);
1299 sigmaDeltaTheta2_tot = 0.;
1300 sigmaDeltaPhi2_tot = 0.;
1302 sigmaDeltaE_tot = 0;
1303 sigmaPlusDeltaE_tot = 0.;
1304 sigmaMinusDeltaE_tot = 0.;
1305 deltaE_ioni_tot = 0.;
1306 sigmaDeltaE_ioni_tot = 0.;
1307 deltaE_rad_tot = 0.;
1308 sigmaDeltaE_rad_tot = 0.;
1316 auto energyLoss0 = std::make_unique<Trk::EnergyLoss>(0., 0., 0., 0.);
1318 sqrt(sigmaDeltaPhi2_tot / 2.),
1319 sqrt(sigmaDeltaTheta2_tot / 2.));
1324 sqrt(sigmaDeltaPhi2_tot / 2.),
1325 sqrt(sigmaDeltaTheta2_tot / 2.));
1326 auto energyLossNew = std::make_unique<Trk::EnergyLoss>(
1327 deltaE_tot, sigmaDeltaE_tot, sigmaPlusDeltaE_tot,
1328 sigmaMinusDeltaE_tot, deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1329 deltaE_rad_tot, sigmaDeltaE_rad_tot, 0.);
1330 double norm = dir.perp();
1334 -dir.y() * dir.z() / norm, norm);
1343 Eloss_tot += energyLossNew->deltaE();
1345 auto meotFirst = std::make_unique<Trk::MaterialEffectsOnTrack>(
1346 X0_tot / 2., scatFirst, std::move(energyLoss0), *surfFirst,
1348 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1349 X0_tot / 2., scatNew, std::move(energyLossNew), *surfLast,
1353 double qOverP0 = m->trackParameters()->charge() /
1354 (m->trackParameters()->momentum().
mag() -
1355 std::fabs(energyLoss->
deltaE()));
1359 std::unique_ptr<Trk::TrackParameters> parsFirst =
1361 0., 0., dir.phi(), dir.theta(), qOverP0);
1363 double qOverPNew = m->trackParameters()->charge() /
1364 m->trackParameters()->momentum().mag();
1365 std::unique_ptr<Trk::TrackParameters> parsLast =
1367 0., 0., dir.phi(), dir.theta(), qOverPNew);
1372 std::move(meotFirst), typePattern);
1375 std::move(meotLast), typePattern);
1377 newTSOSvector.push_back(newTSOSFirst);
1378 newTSOSvector.push_back(newTSOS);
1381 sigmaDeltaTheta2_tot = 0.;
1382 sigmaDeltaPhi2_tot = 0.;
1384 sigmaDeltaE_tot = 0;
1385 sigmaPlusDeltaE_tot = 0.;
1386 sigmaMinusDeltaE_tot = 0.;
1387 deltaE_ioni_tot = 0.;
1388 sigmaDeltaE_ioni_tot = 0.;
1389 deltaE_rad_tot = 0.;
1390 sigmaDeltaE_rad_tot = 0.;
1397 if (aggregate && reposition) {
1403 bool threePlanes =
false;
1404 if (X0_tot > 50 && std::fabs(pos.z()) < 6700 && pos.perp() < 4200)
1407 auto energyLoss0 = std::make_unique<Trk::EnergyLoss>(0., 0., 0., 0.);
1410 sqrt(sigmaDeltaTheta2_tot / 2.));
1414 sqrt(sigmaDeltaTheta2_tot / 2.));
1416 deltaE_tot, sigmaDeltaE_tot, sigmaPlusDeltaE_tot,
1417 sigmaMinusDeltaE_tot, deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1418 deltaE_rad_tot, sigmaDeltaE_rad_tot, 0.);
1422 auto energyLossNew =
1425 caloEnergyError, pCaloEntry,
1426 momentumError, elossFlag)
1428 sigmaPlusDeltaE_tot, sigmaMinusDeltaE_tot,
1429 deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1430 deltaE_rad_tot, sigmaDeltaE_rad_tot, 0.));
1434 dir = dir / dir.mag();
1435 double norm = dir.perp();
1438 Amg::Vector3D coly(-dir.x() * dir.z() / norm, -dir.y() * dir.z() / norm,
1442 double halflength2 =
1443 wdist2 / w_tot - (pos - posFirst).
mag() * (pos - posFirst).
mag();
1444 double halflength = 0.;
1445 if (halflength2 > 0) halflength = sqrt(halflength2);
1450 ATH_MSG_DEBUG(
" WITH aggregation and WITH reposition center planes x "
1451 << pos.x() <<
" y " << pos.y() <<
" z " << pos.z()
1452 <<
" halflength " << halflength <<
" w_tot " << w_tot
1453 <<
" X0_tot " << X0_tot);
1463 std::fabs(deltaEFirst));
1467 std::unique_ptr<Trk::TrackParameters> parsFirst =
1469 0., 0., dir.phi(), dir.theta(), qOverP0);
1470 std::unique_ptr<Trk::TrackParameters> parsLast =
1472 0., 0., dir.phi(), dir.theta(), qOverPNew);
1474 Eloss_tot += energyLossNew.deltaE();
1481 auto meotFirst = std::make_unique<Trk::MaterialEffectsOnTrack>(
1482 X0_tot / 2., scatFirst, std::move(energyLoss0), *surfFirst,
1487 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1488 X0_tot / 2., scatNew,
1489 std::make_unique<Trk::EnergyLoss>(std::move(energyLossNew)),
1490 *surfLast, meotPattern);
1494 std::move(meotFirst), typePattern);
1495 auto whichType = (elossFlag != 0) ? typePatternDeposit : typePattern;
1497 nullptr, std::move(parsLast),
1498 std::move(meotLast), whichType);
1500 newTSOSvector.push_back(newTSOSFirst);
1501 newTSOSvector.push_back(newTSOS);
1509 std::unique_ptr<Trk::TrackParameters> pars =
1511 0., 0., dir.phi(), dir.theta(), qOverPNew);
1514 auto meotFirst = std::make_unique<Trk::MaterialEffectsOnTrack>(
1515 X0_tot / 2., scatFirst,
1516 std::make_unique<Trk::EnergyLoss>(0., 0., 0., 0.), *surfFirst,
1520 auto meot = std::make_unique<Trk::MaterialEffectsOnTrack>(
1522 std::make_unique<Trk::EnergyLoss>(std::move(energyLossNew)), *surf,
1526 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1527 X0_tot / 2., scatNew,
1528 std::make_unique<Trk::EnergyLoss>(0., 0., 0., 0.), *surfLast,
1532 std::move(meotFirst), typePattern);
1534 nullptr, std::move(pars), std::move(meot), typePatternDeposit);
1537 std::move(meotLast), typePattern);
1538 newTSOSvector.push_back(newTSOSFirst);
1539 newTSOSvector.push_back(newTSOS);
1540 newTSOSvector.push_back(newTSOSLast);
1545 return newTSOSvector;