285 const G4ThreeVector& mom,
286 int pdg,
double charge,
float t,
288 const EventContext& ctx = Gaudi::Hive::currentContext();
291 double zMuonEntry = 6735.;
292 double rMuonEntry = 4254;
293 double zMuonExit = 21800.;
294 double rMuonExit = 12500.;
295 double zIDExit = 2720.;
296 double rIDExit = 1080.;
298 double zEntry = zMuonEntry;
299 double rEntry = rMuonEntry;
300 double zExit = zMuonExit;
301 double rExit = rMuonExit;
312 Amg::Vector3D npos(scale * pos.x(), scale * pos.y(), scale * pos.z());
316 ATH_MSG_INFO(
"Initial step ... preparing event cache.");
340 std::move(covMatrix));
346 float tX0 = X0 > 10e-5 ? t / X0 : 0.;
348 ATH_MSG_DEBUG(
" position R " << npos.perp() <<
" z " << npos.z() <<
" X0 "
349 << X0 <<
" t " << t <<
" m_tX0Cache "
352 bool useEntry =
true;
356 (std::fabs(npos.z()) > zEntry || npos.perp() > rEntry)) {
372 npos, nmom,
charge, std::move(covMatrix));
395 <<
" reached, step is ignored.");
443 bool crossedExitLayer =
false;
445 if (std::fabs(npos.z()) > zExit || npos.perp() > rExit)
446 crossedExitLayer =
true;
448 ATH_MSG_DEBUG(
"npos Z: " << npos.z() <<
"npos prep: " << npos.perp()
449 <<
"crossedExitLayer: " << crossedExitLayer);
454 <<
"m_treeData->m_g4_steps: " <<
m_treeData->m_g4_steps
455 <<
"m_treeData->m_g4_stepsEntry: " <<
m_treeData->m_g4_stepsEntry);
472 std::unique_ptr<Trk::TrackParameters> trkParameters =
480 if (!trkParameters) {
482 " G4 extrapolate failed without covariance to destination surface ");
485 ATH_MSG_DEBUG(
" Extrapolate m_parameterCacheCov with covMatrix ");
486 extrapolationCache.
reset();
495 if (!trkParameters) {
496 ATH_MSG_DEBUG(
" G4 extrapolate failed with covariance to Muon Entry or ID Exit");
497 ATH_MSG_DEBUG(
" Redo G4 extrapolateM without covariance matrix to Muon Entry or ID Exit ");
498 extrapolationCache.
reset();
510 " G4 extrapolate succesfull with covariance to Muon Entry or ID exit "
511 <<
" X0 " << extrapolationCache.
x0tot() <<
" Eloss deltaE "
512 << extrapolationCache.
eloss()->
deltaE() <<
" Eloss sigma "
516 << extrapolationCache.
eloss()->
meanRad() <<
" sigmaRad "
525 <<
m_treeData->m_g4_steps <<
" exit Layer: " << crossedExitLayer
526 <<
" track parameters: " << trkParameters.get());
528 if (!trkParameters) {
533 <<
"track parameters: " << trkParameters.get());
534 if (crossedExitLayer) {
541 extrapolationCache.
reset();
542 ATH_MSG_DEBUG(
" Extrapolate m_parameterCacheEntryCov with covMatrix "
559 ATH_MSG_DEBUG(
"extrapolation with m_parameterCacheEntryCov succeeded ");
561 ATH_MSG_DEBUG(
" extrapolation failed with m_parameterCacheEntryCov ");
563 ATH_MSG_DEBUG(
" failed due to m_parameterCacheEntryCov is zero");
565 extrapolationCache.
reset();
576 ATH_MSG_DEBUG(
"extrapolation with m_parameterCacheEntry succeeded");
579 extrapolationCache.
reset();
593 bool doBackWard =
false;
595 std::unique_ptr<Trk::TrackParameters> trkParameters_BACK =
603 if (trkParameters_BACK) {
606 m_treeData->m_b_p = trkParameters_BACK->momentum().mag();
607 m_treeData->m_b_eta = trkParameters_BACK->momentum().eta();
608 m_treeData->m_b_theta = trkParameters_BACK->momentum().theta();
609 m_treeData->m_b_phi = trkParameters_BACK->momentum().phi();
610 m_treeData->m_b_x = trkParameters_BACK->position().x();
611 m_treeData->m_b_y = trkParameters_BACK->position().y();
612 m_treeData->m_b_z = trkParameters_BACK->position().z();
615 " Back extrapolation to Muon Entry or ID Exit finds different "
616 "momentum difference MeV "
619 extrapolationCache.
reset();
620 const std::vector<const Trk::TrackStateOnSurface*>* matvec_BACK =
628 if (matvec_BACK && !matvec_BACK->empty()) {
629 std::vector<const Trk::TrackStateOnSurface*>::const_iterator it =
630 matvec_BACK->begin();
631 std::vector<const Trk::TrackStateOnSurface*>::const_iterator
632 it_end = matvec_BACK->end();
633 for (; it != it_end; ++it) {
635 (*it)->materialEffectsOnTrack();
644 if (not matEfs)
continue;
647 double meanIoni = 0.;
648 double sigmaIoni = 0.;
650 double sigmaRad = 0.;
651 double sigmaTheta = 0.;
652 double sigmaPhi = 0.;
665 <<
" eLoss->length() "
670 (matEfs)->scatteringAngles();
679 if ((*it)->trackParameters()) {
681 (*it)->trackParameters()->position().x();
683 (*it)->trackParameters()->position().y();
685 (*it)->trackParameters()->position().z();
712 extrapolationCache.
reset();
713 const std::vector<const Trk::TrackStateOnSurface*>* matvec =
716 &extrapolationCache);
725 "m_treeData->m_g4_stepsEntry (debug): " <<
m_treeData->m_g4_stepsEntry);
727 extrapolationCache.
reset();
731 if (!matvec || matvec->empty()) {
733 " G4 extrapolateM failed with covariance matrix to Muon Entry or ID Exit ");
735 " Redo G4 extrapolateM without covariance matrix to Muon Entry or ID Exit ");
736 extrapolationCache.
reset();
742 " G4 extrapolateM succesfull with covariance matrix to Muon Entry or ID Exit ");
745 << extrapolationCache.
x0tot() <<
" Eloss deltaE "
746 << extrapolationCache.
eloss()->
deltaE() <<
" Eloss sigma "
750 << extrapolationCache.
eloss()->
meanRad() <<
" sigmaRad "
754 extrapolationCache.
reset();
758 if (!matvec || matvec->empty()) {
760 " G4 extrapolateM failed with covariance matrix to Muon or Calo Exit ");
762 " Redo G4 extrapolateM without covariance matrix to Muon or Calo Exit ");
763 extrapolationCache.
reset();
769 " G4 extrapolateM succesfull with covariance matrix to Muon or Calo Exit ");
772 << extrapolationCache.
x0tot() <<
" Eloss deltaE "
773 << extrapolationCache.
eloss()->
deltaE() <<
" Eloss sigma "
777 << extrapolationCache.
eloss()->
meanRad() <<
" sigmaRad "
782 extrapolationCache.
reset();
786 ATH_MSG_DEBUG(
" G4 extrapolateM without covariance matrix to Muon Entry or ID Exit "
787 <<
" X0 " << extrapolationCache.
x0tot() <<
" Eloss deltaE "
788 << extrapolationCache.
eloss()->
deltaE() <<
" Eloss sigma "
792 << extrapolationCache.
eloss()->
meanRad() <<
" sigmaRad "
798 const std::vector<const Trk::TrackStateOnSurface*> matvecNewRepAggrUp =
799 modifyTSOSvector(*matvec, 1.0, 1.0,
true,
true,
true, 0., 0., 10000., 0.,
802 double X0Scale = 1.0;
803 double ElossScale = 1.0;
809 bool system1 =
false;
810 bool system2 =
false;
812 if (!matvec->empty()) {
817 ATH_MSG_DEBUG(
" ID or Calorimeter system " << system1 <<
" Calorimeter or Muon system " << system2);
824 ATH_MSG_DEBUG(
" system2 scales X0 " << X0Scale <<
" ElossScale "
827 const std::vector<const Trk::TrackStateOnSurface*> matvecNew1 =
830 const std::vector<const Trk::TrackStateOnSurface*> matvecNew0 =
834 const std::vector<const Trk::TrackStateOnSurface*> matvecNew5 =
838 const std::vector<const Trk::TrackStateOnSurface*> matvecNew10 =
848 X0Scale, ElossScale);
849 ATH_MSG_DEBUG(
" calorimeter scales X0 " << X0Scale <<
" ElossScale "
851 const std::vector<const Trk::TrackStateOnSurface*> matvecNew1 =
854 const std::vector<const Trk::TrackStateOnSurface*> matvecNew0 =
857 if (std::fabs(Eloss1) > 0)
858 ATH_MSG_DEBUG(
" **** Cross Check calorimeter with Eloss Scale1 "
859 << Eloss1 <<
" Eloss0 " << Eloss0 <<
" ratio "
863 const std::vector<const Trk::TrackStateOnSurface*> matvecNew5 =
867 const std::vector<const Trk::TrackStateOnSurface*> matvecNew10 =
873 <<
"Eloss1 " << Eloss1 <<
" Eloss0 " << Eloss0
874 <<
" Eloss5 " << Eloss5 <<
" Eloss10 " << Eloss10);
881 if (!(matvec->empty()) &&
m_treeData->m_g4_stepsEntry <= 1) {
882 std::vector<const Trk::TrackStateOnSurface*>::const_iterator it =
884 std::vector<const Trk::TrackStateOnSurface*>::const_iterator it_end =
886 for (; it != it_end; ++it) {
897 double meanIoni = 0.;
898 double sigmaIoni = 0.;
900 double sigmaRad = 0.;
901 double sigmaTheta = 0.;
902 double sigmaPhi = 0.;
913 <<
m_treeData->m_g4_stepsEntry <<
" mmat " << mmat
915 <<
" eLoss->deltaE() " << eLoss->
deltaE()
916 <<
" meanIoni " << meanIoni <<
" Total Eloss "
917 << Eloss <<
" eLoss->length() " << eLoss->
length());
922 (matEfs) ? ((matEfs)->scatteringAngles()) : (
nullptr);
928 <<
m_treeData->m_g4_stepsEntry <<
" mmat " << mmat
929 <<
" sigmaTheta " << sigmaTheta <<
" sigmaPhi "
941 if ((*it)->trackParameters()) {
943 (*it)->trackParameters()->position().x();
945 (*it)->trackParameters()->position().y();
947 (*it)->trackParameters()->position().z();
967 <<
m_treeData->m_g4_steps <<
" Radius " << npos.perp() <<
" z "
968 << npos.z() <<
" size matvec "
969 <<
" total X0 " << x0 <<
" total Eloss " << Eloss);
987 trkParameters ? trkParameters->momentum().mag() : 0.;
989 trkParameters ? trkParameters->momentum().eta() : 0.;
991 trkParameters ? trkParameters->momentum().theta() : 0.;
993 trkParameters ? trkParameters->momentum().phi() : 0.;
995 trkParameters ? trkParameters->position().x() : 0.;
997 trkParameters ? trkParameters->position().y() : 0.;
999 trkParameters ? trkParameters->position().z() : 0.;
1001 trkParameters ? trkParameters->parameters()[
Trk::locX] : 0.;
1003 trkParameters ? trkParameters->parameters()[
Trk::locY] : 0.;
1017 double errord0 = 0.;
1018 double errorz0 = 0.;
1019 double errorphi = 0.;
1020 double errortheta = 0.;
1021 double errorqoverp = 0.;
1022 if (trkParameters && trkParameters->covariance()) {
1028 ATH_MSG_DEBUG(
" Covariance found for m_treeData->m_trk_status "
1053 const std::vector<const Trk::TrackStateOnSurface*>& matvec,
double scaleX0,
1054 double scaleEloss,
bool reposition,
bool aggregate,
bool updateEloss,
1055 double caloEnergy,
double caloEnergyError,
double pCaloEntry,
1056 double momentumError,
double& Eloss_tot)
const {
1082 std::vector<const Trk::TrackStateOnSurface*> newTSOSvector;
1083 int maxsize = 2 * matvec.size();
1084 if (aggregate) maxsize = 2;
1085 newTSOSvector.reserve(maxsize);
1094 double sigmaDeltaPhi2_tot = 0.;
1095 double sigmaDeltaTheta2_tot = 0.;
1096 double deltaE_tot = 0.;
1097 double sigmaDeltaE_tot = 0.;
1098 double sigmaPlusDeltaE_tot = 0.;
1099 double sigmaMinusDeltaE_tot = 0.;
1100 double deltaE_ioni_tot = 0.;
1101 double sigmaDeltaE_ioni_tot = 0.;
1102 double deltaE_rad_tot = 0.;
1103 double sigmaDeltaE_rad_tot = 0.;
1110 double deltaEFirst = 0.;
1113 double deltaTheta = 0.;
1122 std::bitset<Trk::MaterialEffectsBase::NumberOfMaterialEffectsTypes>
1128 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
1133 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
1134 typePatternDeposit(0);
1139 for (
const auto* m : matvec) {
1140 if (!m->trackParameters()) {
1144 if (m->materialEffectsOnTrack()) {
1145 double X0 = m->materialEffectsOnTrack()->thicknessInX0();
1148 m->materialEffectsOnTrack());
1174 << m->dumpType() <<
" TSOS surface "
1175 << m->trackParameters()->associatedSurface()
1176 <<
" position x " << m->trackParameters()->position().x()
1177 <<
" y " << m->trackParameters()->position().y() <<
" z "
1178 << m->trackParameters()->position().z() <<
" direction x "
1179 << m->trackParameters()->momentum().unit().x() <<
" y "
1180 << m->trackParameters()->momentum().unit().y() <<
" z "
1181 << m->trackParameters()->momentum().unit().z() <<
" p "
1182 << m->trackParameters()->momentum().mag() <<
" X0 " << X0
1183 <<
" deltaE " << energyLoss->
deltaE()
1185 <<
" depth " <<
depth);
1187 X0_tot += scaleX0 * X0;
1189 sigmaDeltaTheta2_tot +=
1191 sigmaDeltaPhi2_tot +=
1197 deltaE_tot += scaleEloss * energyLoss->
deltaE();
1198 sigmaDeltaE_tot += scaleEloss * energyLoss->
sigmaDeltaE();
1201 deltaE_ioni_tot += scaleEloss * energyLoss->
meanIoni();
1202 sigmaDeltaE_ioni_tot += scaleEloss * energyLoss->
sigmaIoni();
1203 deltaE_rad_tot += scaleEloss * energyLoss->
meanRad();
1204 sigmaDeltaE_rad_tot += scaleEloss * energyLoss->
sigmaRad();
1208 Amg::Vector3D dir = m->trackParameters()->momentum().unit();
1214 dir = dir / dir.mag();
1215 ATH_MSG_DEBUG(
" position at end " << pos.x() <<
" y " << pos.y() <<
" z "
1216 << pos.z() <<
" perp " << pos.perp());
1217 ATH_MSG_DEBUG(
" direction x " << dir.x() <<
" y " << dir.y() <<
" z "
1223 << pos0.x() <<
" y " << pos0.y() <<
" z " << pos0.z()
1224 <<
" perp " << pos0.perp());
1226 << posNew.x() <<
" y " << posNew.y() <<
" z " << posNew.z()
1227 <<
" perp " << posNew.perp() <<
" distance "
1228 << (pos0 - posNew).mag() <<
" depth " <<
depth);
1232 deltaEFirst = energyLoss->
deltaE();
1238 wpos += w * pos0 / 2.;
1239 wpos += w * posNew / 2.;
1242 wdist2 += w * (pos0 - posFirst).
mag2() / 2.;
1243 wdist2 += w * (posNew - posFirst).
mag2() / 2.;
1245 if (!aggregate && !reposition) {
1247 std::sqrt(sigmaDeltaPhi2_tot),
1248 std::sqrt(sigmaDeltaTheta2_tot));
1249 auto energyLossNew = std::make_unique<Trk::EnergyLoss>(
1250 deltaE_tot, sigmaDeltaE_tot, sigmaPlusDeltaE_tot,
1251 sigmaMinusDeltaE_tot, deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1252 deltaE_rad_tot, sigmaDeltaE_rad_tot,
depth);
1253 Eloss_tot += energyLossNew->deltaE();
1255 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1256 X0_tot, scatNew, std::move(energyLossNew), surf, meotPattern);
1257 auto pars = m->trackParameters()->uniqueClone();
1261 nullptr, std::move(pars), std::move(meotLast), typePattern);
1262 newTSOSvector.push_back(newTSOS);
1265 sigmaDeltaTheta2_tot = 0.;
1266 sigmaDeltaPhi2_tot = 0.;
1268 sigmaDeltaE_tot = 0;
1269 sigmaPlusDeltaE_tot = 0.;
1270 sigmaMinusDeltaE_tot = 0.;
1271 deltaE_ioni_tot = 0.;
1272 sigmaDeltaE_ioni_tot = 0.;
1273 deltaE_rad_tot = 0.;
1274 sigmaDeltaE_rad_tot = 0.;
1276 }
else if (!aggregate && reposition) {
1277 if (std::abs(
depth) < 10.) {
1279 std::sqrt(sigmaDeltaPhi2_tot),
1280 std::sqrt(sigmaDeltaTheta2_tot));
1281 auto energyLossNew = std::make_unique<Trk::EnergyLoss>(
1282 deltaE_tot, sigmaDeltaE_tot, sigmaPlusDeltaE_tot,
1283 sigmaMinusDeltaE_tot, deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1284 deltaE_rad_tot, sigmaDeltaE_rad_tot,
depth);
1286 Eloss_tot += energyLossNew->deltaE();
1287 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1288 X0_tot, scatNew, std::move(energyLossNew), surf, meotPattern);
1289 std::unique_ptr<Trk::TrackParameters> pars =
1290 m->trackParameters()->uniqueClone();
1294 std::move(meotLast), typePattern);
1295 newTSOSvector.push_back(newTSOS);
1297 sigmaDeltaTheta2_tot = 0.;
1298 sigmaDeltaPhi2_tot = 0.;
1300 sigmaDeltaE_tot = 0;
1301 sigmaPlusDeltaE_tot = 0.;
1302 sigmaMinusDeltaE_tot = 0.;
1303 deltaE_ioni_tot = 0.;
1304 sigmaDeltaE_ioni_tot = 0.;
1305 deltaE_rad_tot = 0.;
1306 sigmaDeltaE_rad_tot = 0.;
1314 auto energyLoss0 = std::make_unique<Trk::EnergyLoss>(0., 0., 0., 0.);
1316 sqrt(sigmaDeltaPhi2_tot / 2.),
1317 sqrt(sigmaDeltaTheta2_tot / 2.));
1322 sqrt(sigmaDeltaPhi2_tot / 2.),
1323 sqrt(sigmaDeltaTheta2_tot / 2.));
1324 auto energyLossNew = std::make_unique<Trk::EnergyLoss>(
1325 deltaE_tot, sigmaDeltaE_tot, sigmaPlusDeltaE_tot,
1326 sigmaMinusDeltaE_tot, deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1327 deltaE_rad_tot, sigmaDeltaE_rad_tot, 0.);
1328 double norm = dir.perp();
1332 -dir.y() * dir.z() / norm, norm);
1341 Eloss_tot += energyLossNew->deltaE();
1343 auto meotFirst = std::make_unique<Trk::MaterialEffectsOnTrack>(
1344 X0_tot / 2., scatFirst, std::move(energyLoss0), *surfFirst,
1346 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1347 X0_tot / 2., scatNew, std::move(energyLossNew), *surfLast,
1351 double qOverP0 = m->trackParameters()->charge() /
1352 (m->trackParameters()->momentum().
mag() -
1353 std::fabs(energyLoss->
deltaE()));
1357 std::unique_ptr<Trk::TrackParameters> parsFirst =
1359 0., 0., dir.phi(), dir.theta(), qOverP0);
1361 double qOverPNew = m->trackParameters()->charge() /
1362 m->trackParameters()->momentum().mag();
1363 std::unique_ptr<Trk::TrackParameters> parsLast =
1365 0., 0., dir.phi(), dir.theta(), qOverPNew);
1370 std::move(meotFirst), typePattern);
1373 std::move(meotLast), typePattern);
1375 newTSOSvector.push_back(newTSOSFirst);
1376 newTSOSvector.push_back(newTSOS);
1379 sigmaDeltaTheta2_tot = 0.;
1380 sigmaDeltaPhi2_tot = 0.;
1382 sigmaDeltaE_tot = 0;
1383 sigmaPlusDeltaE_tot = 0.;
1384 sigmaMinusDeltaE_tot = 0.;
1385 deltaE_ioni_tot = 0.;
1386 sigmaDeltaE_ioni_tot = 0.;
1387 deltaE_rad_tot = 0.;
1388 sigmaDeltaE_rad_tot = 0.;
1395 if (aggregate && reposition) {
1401 bool threePlanes =
false;
1402 if (X0_tot > 50 && std::fabs(pos.z()) < 6700 && pos.perp() < 4200)
1405 auto energyLoss0 = std::make_unique<Trk::EnergyLoss>(0., 0., 0., 0.);
1408 sqrt(sigmaDeltaTheta2_tot / 2.));
1412 sqrt(sigmaDeltaTheta2_tot / 2.));
1414 deltaE_tot, sigmaDeltaE_tot, sigmaPlusDeltaE_tot,
1415 sigmaMinusDeltaE_tot, deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1416 deltaE_rad_tot, sigmaDeltaE_rad_tot, 0.);
1420 auto energyLossNew =
1423 caloEnergyError, pCaloEntry,
1424 momentumError, elossFlag)
1426 sigmaPlusDeltaE_tot, sigmaMinusDeltaE_tot,
1427 deltaE_ioni_tot, sigmaDeltaE_ioni_tot,
1428 deltaE_rad_tot, sigmaDeltaE_rad_tot, 0.));
1432 dir = dir / dir.mag();
1433 double norm = dir.perp();
1436 Amg::Vector3D coly(-dir.x() * dir.z() / norm, -dir.y() * dir.z() / norm,
1440 double halflength2 =
1441 wdist2 / w_tot - (pos - posFirst).
mag() * (pos - posFirst).
mag();
1442 double halflength = 0.;
1443 if (halflength2 > 0) halflength = sqrt(halflength2);
1448 ATH_MSG_DEBUG(
" WITH aggregation and WITH reposition center planes x "
1449 << pos.x() <<
" y " << pos.y() <<
" z " << pos.z()
1450 <<
" halflength " << halflength <<
" w_tot " << w_tot
1451 <<
" X0_tot " << X0_tot);
1461 std::fabs(deltaEFirst));
1465 std::unique_ptr<Trk::TrackParameters> parsFirst =
1467 0., 0., dir.phi(), dir.theta(), qOverP0);
1468 std::unique_ptr<Trk::TrackParameters> parsLast =
1470 0., 0., dir.phi(), dir.theta(), qOverPNew);
1472 Eloss_tot += energyLossNew.deltaE();
1479 auto meotFirst = std::make_unique<Trk::MaterialEffectsOnTrack>(
1480 X0_tot / 2., scatFirst, std::move(energyLoss0), *surfFirst,
1485 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1486 X0_tot / 2., scatNew,
1487 std::make_unique<Trk::EnergyLoss>(std::move(energyLossNew)),
1488 *surfLast, meotPattern);
1492 std::move(meotFirst), typePattern);
1493 auto whichType = (elossFlag != 0) ? typePatternDeposit : typePattern;
1495 nullptr, std::move(parsLast),
1496 std::move(meotLast), whichType);
1498 newTSOSvector.push_back(newTSOSFirst);
1499 newTSOSvector.push_back(newTSOS);
1507 std::unique_ptr<Trk::TrackParameters> pars =
1509 0., 0., dir.phi(), dir.theta(), qOverPNew);
1512 auto meotFirst = std::make_unique<Trk::MaterialEffectsOnTrack>(
1513 X0_tot / 2., scatFirst,
1514 std::make_unique<Trk::EnergyLoss>(0., 0., 0., 0.), *surfFirst,
1518 auto meot = std::make_unique<Trk::MaterialEffectsOnTrack>(
1520 std::make_unique<Trk::EnergyLoss>(std::move(energyLossNew)), *surf,
1524 auto meotLast = std::make_unique<Trk::MaterialEffectsOnTrack>(
1525 X0_tot / 2., scatNew,
1526 std::make_unique<Trk::EnergyLoss>(0., 0., 0., 0.), *surfLast,
1530 std::move(meotFirst), typePattern);
1532 nullptr, std::move(pars), std::move(meot), typePatternDeposit);
1535 std::move(meotLast), typePattern);
1536 newTSOSvector.push_back(newTSOSFirst);
1537 newTSOSvector.push_back(newTSOS);
1538 newTSOSvector.push_back(newTSOSLast);
1543 return newTSOSvector;