737 RecursionCounter
counter(cache.m_recursionCount);
739 ATH_MSG_WARNING(
"Too many recursive calls of extrapolateToNextMaterialLayer: "
744 ++cache.m_methodSequence;
745 ATH_MSG_DEBUG(
"M-[" << cache.m_methodSequence <<
"] extrapolateToNextMaterialLayer(...) ");
747 ATH_MSG_WARNING(
"Too many method sequence calls of extrapolateToNextMaterialLayer: "
748 << cache.m_methodSequence);
766 std::vector<unsigned int> solutions;
770 bool resolveActive = destSurf ==
nullptr;
774 if (cache.m_lastMaterialLayer && !cache.m_lastMaterialLayer->isOnLayer(parm->position())) {
775 cache.m_lastMaterialLayer =
nullptr;
779 if (!cache.m_highestVolume) {
780 cache.m_highestVolume = cache.m_trackingGeometry->highestTrackingVolume();
787 staticVol = cache.m_trackingGeometry->lowestStaticTrackingVolume(gp);
790 nextStatVol != staticVol) {
791 staticVol = nextStatVol;
799 cache.m_navigSurfs.clear();
801 cache.m_navigSurfs.emplace_back(destSurf,
false);
808 cache.m_identifiedParameters.reset();
815 if (staticVol && (staticVol != cache.m_currentStatic || resolveActive !=
m_resolveActive)) {
817 cache.m_currentStatic = staticVol;
818 cache.retrieveBoundaries();
820 cache.m_detachedVols.clear();
821 cache.m_detachedBoundaries.clear();
822 cache.m_denseVols.clear();
823 cache.m_denseBoundaries.clear();
824 cache.m_layers.clear();
825 cache.m_navigLays.clear();
829 if (!detVols.empty()) {
831 for (; iTer != detVols.end(); ++iTer) {
833 const Trk::Layer* layR = (*iTer)->layerRepresentation();
835 const auto detBounds = (*iTer)->trackingVolume()->boundarySurfaces();
838 cache.m_detachedVols.emplace_back(*iTer, detBounds.size());
839 for (
unsigned int ibb = 0; ibb < detBounds.size(); ibb++) {
840 const Trk::Surface& surf = (detBounds[ibb])->surfaceRepresentation();
841 cache.m_detachedBoundaries.emplace_back(&surf,
true);
845 cache.addOneNavigationLayer((*iTer)->trackingVolume(), layR);
848 const auto&
multi = (*iTer)->multilayerRepresentation();
849 for (
const auto *
i :
multi) {
850 cache.addOneNavigationLayer((*iTer)->trackingVolume(),
i);
856 (*iTer)->name().compare((*iTer)->name().size() - 4, 4,
"PERM") ==
863 if ((*iTer)->trackingVolume()->zOverAtimesRho() != 0. &&
864 ((*iTer)->trackingVolume()->confinedDenseVolumes().empty()) &&
865 ((*iTer)->trackingVolume()->confinedArbitraryLayers().empty())) {
866 cache.m_denseVols.emplace_back((*iTer)->trackingVolume(), detBounds.size());
868 for (
unsigned int ibb = 0; ibb < detBounds.size(); ibb++) {
869 const Trk::Surface& surf = (detBounds[ibb])->surfaceRepresentation();
870 cache.m_denseBoundaries.emplace_back(&surf,
true);
874 (*iTer)->trackingVolume()->confinedArbitraryLayers();
875 if (!(*iTer)->trackingVolume()->confinedDenseVolumes().empty() ||
876 (confLays.size() > detBounds.size())) {
877 cache.m_detachedVols.emplace_back(*iTer, detBounds.size());
878 for (
unsigned int ibb = 0; ibb < detBounds.size(); ibb++) {
880 (detBounds[ibb])->surfaceRepresentation();
881 cache.m_detachedBoundaries.emplace_back(&surf,
true);
883 }
else if (!confLays.empty()) {
884 for (
const Trk::Layer*
const lIt : confLays) {
885 cache.addOneNavigationLayer((*iTer)->trackingVolume(), (lIt));
891 cache.m_denseResolved = std::pair<unsigned int, unsigned int>(cache.m_denseVols.size(),
892 cache.m_denseBoundaries.size());
893 cache.m_layerResolved = cache.m_layers.size();
896 cache.m_navigSurfs.insert(
897 cache.m_navigSurfs.end(), cache.m_staticBoundaries.begin(), cache.m_staticBoundaries.end());
913 std::unique_ptr<Trk::TrackParameters> pNextPar = prop.propagate(ctx,*currPar,cache.m_navigSurfs,
918 ++cache.m_nPropagations;
923 cache.m_parametersAtBoundary.resetBoundaryInformation();
928 if (propagVol->
zOverAtimesRho() != 0. && !cache.m_matstates && cache.m_extrapolationCache) {
929 if (not cache.elossPointerOverwritten()) {
931 ATH_MSG_DEBUG(cache.to_string(
" extrapolateToNextMaterialLayer"));
933 const double dInX0 = std::abs(
path) / propagVol->
x0();
935 cache.m_extrapolationCache->updateX0(dInX0);
937 const double currentqoverp = nextPar->parameters()[
Trk::qOverP];
939 materialProperties, std::abs(1. / currentqoverp), 1.,
dir,
particle);
941 << nextPar->momentum().mag() - currPar->momentum().mag() <<
","
943 cache.m_extrapolationCache->updateEloss(
944 eloss.meanIoni(), eloss.sigmaIoni(), eloss.meanRad(), eloss.sigmaRad());
953 const double dInX0 = std::abs(
path) / propagVol->
x0();
955 const double scatsigma = std::sqrt(
m_msupdater->sigmaSquare(
956 materialProperties, 1. / std::abs(nextPar->parameters()[
qOverP]), 1.,
particle));
960 const double currentqoverp = nextPar->parameters()[
Trk::qOverP];
962 materialProperties, std::abs(1. / currentqoverp), 1.,
dir,
particle);
965 << nextPar->momentum().mag() - currPar->momentum().mag() <<
","
969 nextPar->position(), nextPar->momentum(), nextPar->charge()));
971 if (cache.m_extrapolationCache) {
973 ATH_MSG_DEBUG(cache.to_string(
" mat states extrapolateToNextMaterialLayer"));
975 cache.m_extrapolationCache->updateX0(dInX0);
976 cache.m_extrapolationCache->updateEloss(
977 eloss.meanIoni(), eloss.sigmaIoni(), eloss.meanRad(), eloss.sigmaRad());
982 auto mefot = std::make_unique<Trk::MaterialEffectsOnTrack>(
983 dInX0, newsa, std::make_unique<Trk::EnergyLoss>(std::move(eloss)),
984 cvlTP->associatedSurface());
985 cache.m_matstates->push_back(
new TrackStateOnSurface(
986 nullptr, std::move(cvlTP), std::move(mefot)));
988 <<
"', t/X0 = " << dInX0);
992 const unsigned int isurf = destSurf ? 1 : 0;
993 if (destSurf && solutions[0] == 0) {
996 if (destSurf && solutions.size() > 1 && solutions[1] == 0) {
999 if (solutions[0] <= isurf + cache.m_staticBoundaries.size()) {
1002 cache.m_currentStatic->
boundarySurfaces()[solutions[0] - isurf]->attachedVolume(
1003 currPar->position(), currPar->momentum(),
dir);
1004 cache.m_parametersAtBoundary.boundaryInformation(nextVol, currPar, currPar);
1006 ATH_MSG_DEBUG(
" [!] World boundary at position R,z: " << currPar->position().perp() <<
","
1007 << currPar->position().z());
1020 cache.m_currentDense = cache.m_dense ? cache.m_currentStatic : cache.m_highestVolume;
1021 cache.m_navigBoundaries.clear();
1022 if (cache.m_denseVols.size() > cache.m_denseResolved.first) {
1023 cache.m_denseVols.resize(cache.m_denseResolved.first);
1025 while (cache.m_denseBoundaries.size() > cache.m_denseResolved.second) {
1026 cache.m_denseBoundaries.pop_back();
1028 if (cache.m_layers.size() > cache.m_layerResolved) {
1029 cache.m_navigLays.resize(cache.m_layerResolved);
1031 while (cache.m_layers.size() > cache.m_layerResolved) {
1032 cache.m_layers.pop_back();
1042 cache.m_navigVolsInt.clear();
1044 gp = currPar->position();
1045 std::vector<const Trk::DetachedTrackingVolume*> detVols =
1046 cache.m_trackingGeometry->lowestDetachedTrackingVolumes(gp);
1048 for (; dIter != detVols.end(); ++dIter) {
1049 const Trk::Layer* layR = (*dIter)->layerRepresentation();
1051 if (
active && !resolveActive) {
1055 (*dIter)->name().compare((*dIter)->name().size() - 4, 4,
"PERM") != 0) {
1069 if (!
active && confinedDense.empty() && confinedLays.empty()) {
1073 if (!
active && confinedDense.empty() && confinedLays.size() <= bounds.size()) {
1076 if (!confinedDense.empty() || !confinedLays.empty()) {
1077 cache.m_navigVolsInt.emplace_back(dVol, bounds.size());
1078 for (
unsigned int ib = 0;
ib < bounds.size();
ib++) {
1079 const Trk::Surface& surf = (bounds[
ib])->surfaceRepresentation();
1080 cache.m_navigBoundaries.emplace_back(&surf,
true);
1083 if (!confinedDense.empty()) {
1084 auto vIter = confinedDense.begin();
1085 for (; vIter != confinedDense.end(); ++vIter) {
1086 const auto bounds = (*vIter)->boundarySurfaces();
1087 cache.m_denseVols.emplace_back(*vIter, bounds.size());
1088 for (
unsigned int ib = 0;
ib < bounds.size();
ib++) {
1089 const Trk::Surface& surf = (bounds[
ib])->surfaceRepresentation();
1090 cache.m_denseBoundaries.emplace_back(&surf,
true);
1095 if (!confinedLays.empty()) {
1096 for (
const auto *confinedLay : confinedLays) {
1097 cache.addOneNavigationLayer(dVol, confinedLay);
1104 for (
const auto *subvol : subvols) {
1124 cache.m_navigVolsInt.emplace_back(detVol, bounds.size());
1125 for (
unsigned int ib = 0;
ib < bounds.size();
ib++) {
1126 const Trk::Surface& surf = (bounds[
ib])->surfaceRepresentation();
1127 cache.m_navigBoundaries.emplace_back(&surf,
true);
1130 cache.m_denseVols.emplace_back(detVol, bounds.size());
1131 for (
unsigned int ib = 0;
ib < bounds.size();
ib++) {
1132 const Trk::Surface& surf = (bounds[
ib])->surfaceRepresentation();
1133 cache.m_denseBoundaries.emplace_back(&surf,
true);
1141 cache.addOneNavigationLayer(detVol, lay);
1145 detVol->
nextLayer(currPar->position(),
dir * currPar->momentum().unit(),
true);
1146 if (nextLayer && nextLayer != lay) {
1147 cache.addOneNavigationLayer(detVol, nextLayer);
1152 cache.addOneNavigationLayer(detVol,
layer);
1158 cache.copyToNavigationSurfaces();
1161 cache.m_currentDense = cache.m_highestVolume;
1162 if (cache.m_dense && cache.m_denseVols.empty()) {
1163 cache.m_currentDense = cache.m_currentStatic;
1165 for (
unsigned int i = 0;
i < cache.m_denseVols.size();
i++) {
1170 cache.m_currentDense = dVol;
1182 std::vector<unsigned int> solutions;
1185 currPar->position() + 2 *
m_tolerance *
dir * currPar->momentum().normalized();
1186 if (!(cache.m_currentDense->inside(
tp, 0.))) {
1187 cache.m_currentDense = cache.m_highestVolume;
1188 if (cache.m_dense && cache.m_denseVols.empty()) {
1189 cache.m_currentDense = cache.m_currentStatic;
1191 for (
unsigned int i = 0;
i < cache.m_denseVols.size();
i++) {
1194 cache.m_currentDense = dVol;
1202 <<
" (current momentum: " << currPar->momentum().mag() <<
")");
1203 ATH_MSG_DEBUG(
" [+] " << cache.m_navigSurfs.size() <<
" target surfaces in '"
1204 << cache.m_currentDense->volumeName() <<
"'.");
1207 solutions,
path,
false,
false, cache.m_currentDense));
1209 ++cache.m_nPropagations;
1214 if (nextPar && !(cache.m_currentDense->inside(nextPar->position(),
m_tolerance) ||
1217 ATH_MSG_DEBUG(
" [!] ERROR: missing volume boundary for volume"
1218 << cache.m_currentDense->volumeName());
1219 if (cache.m_currentDense->zOverAtimesRho() != 0.) {
1220 ATH_MSG_DEBUG(
" [!] ERROR: trying to recover: repeat the propagation step in"
1221 << cache.m_highestVolume->volumeName());
1222 cache.m_currentDense = cache.m_highestVolume;
1227 ATH_MSG_DEBUG(
" [+] Number of intersection solutions: " << solutions.size());
1228 if (cache.m_currentDense->zOverAtimesRho() != 0. && !cache.m_matstates &&
1229 cache.m_extrapolationCache) {
1230 if (not cache.elossPointerOverwritten()) {
1232 ATH_MSG_DEBUG(cache.to_string(
" extrapolateToNextMaterialLayer dense "));
1234 const double dInX0 = std::abs(
path) / cache.m_currentDense->x0();
1235 cache.m_extrapolationCache->updateX0(dInX0);
1237 const double currentqoverp = nextPar->parameters()[
Trk::qOverP];
1239 materialProperties, std::abs(1. / currentqoverp), 1.,
dir,
particle);
1240 cache.m_extrapolationCache->updateEloss(
1250 if (cache.m_currentDense->zOverAtimesRho() != 0. && cache.m_matstates) {
1251 const double dInX0 = std::abs(
path) / cache.m_currentDense->x0();
1256 const double scatsigma = std::sqrt(
m_msupdater->sigmaSquare(
1257 materialProperties, 1. / std::abs(nextPar->parameters()[
qOverP]), 1.,
particle));
1261 const double currentqoverp = nextPar->parameters()[
Trk::qOverP];
1263 materialProperties, std::abs(1. / currentqoverp), 1.,
dir,
particle);
1266 << nextPar->momentum().mag() - currPar->momentum().mag() <<
","
1271 nextPar->position(), nextPar->momentum(), nextPar->charge()));
1273 if (cache.m_extrapolationCache) {
1275 ATH_MSG_DEBUG(cache.to_string(
" extrapolateToNextMaterialLayer dense"));
1277 cache.m_extrapolationCache->updateX0(dInX0);
1278 cache.m_extrapolationCache->updateEloss(eloss.meanIoni(),
1286 auto mefot = std::make_unique<Trk::MaterialEffectsOnTrack>(
1287 dInX0, newsa, std::make_unique<Trk::EnergyLoss>(std::move(eloss)), cvlTP->associatedSurface());
1289 cache.m_matstates->push_back(
new TrackStateOnSurface(
1290 nullptr, std::move(cvlTP), std::move(mefot)));
1292 ATH_MSG_DEBUG(
" [M] Collecting material from dense volume '"
1293 << cache.m_currentDense->volumeName() <<
"', t/X0 = " << dInX0);
1296 if (destSurf && solutions[0] == 0) {
1299 if (destSurf && solutions.size() > 1 && solutions[1] == 0) {
1306 nextPar->position(), nextPar->momentum().normalized());
1308 dist = distSol.
first();
1318 if (dist *
dir < 0.) {
1320 cache.m_parametersAtBoundary.resetBoundaryInformation();
1323 ATH_MSG_DEBUG(
" [+] New 3D-distance to destinatiion - d3 = " << dist *
dir);
1326 int const iDest = destSurf ? 1 : 0;
1327 unsigned int iSol = 0;
1328 while (iSol < solutions.size()) {
1329 if (solutions[iSol] < iDest + cache.m_staticBoundaries.size()) {
1331 const Trk::Layer*
mb = cache.m_navigSurfs[solutions[iSol]].first->materialLayer();
1333 if (
mb->layerMaterialProperties() &&
1334 mb->layerMaterialProperties()->fullMaterial(nextPar->position())) {
1336 const IMaterialEffectsUpdator* currentUpdator =
1338 IMaterialEffectsUpdator::ICache& currentUpdatorCache =
1339 cache.subMaterialEffectsUpdatorCache();
1341 if (currentUpdator) {
1342 nextPar = cache.m_ownedPtrs.push(
1343 currentUpdator->update(currentUpdatorCache, nextPar,
1347 cache.m_parametersAtBoundary.resetBoundaryInformation();
1353 const double lx0 = lmat->
x0();
1354 const double layThick =
mb->thickness();
1357 const double costr =
1358 std::abs(nextPar->momentum().normalized().dot(
mb->surfaceRepresentation().normal()));
1360 if (
mb->surfaceRepresentation().isOnSurface(
1361 mb->surfaceRepresentation().center(),
false, 0., 0.)) {
1362 thick = fmin(
mb->surfaceRepresentation().bounds().r(),
1363 layThick / std::abs(nextPar->momentum().normalized().dot(
1364 mb->surfaceRepresentation().normal())));
1366 thick = fmin(2 *
mb->thickness(), layThick / (1 - costr));
1369 if (!cache.m_matstates && cache.m_extrapolationCache) {
1370 if (not cache.elossPointerOverwritten()) {
1371 const double dInX0 = thick / lx0;
1373 ATH_MSG_DEBUG(cache.to_string(
" extrapolateToNextMaterialLayer thin "));
1375 cache.m_extrapolationCache->updateX0(dInX0);
1376 const double currentqoverp = nextPar->parameters()[
Trk::qOverP];
1378 *lmat, std::abs(1. / currentqoverp), 1. / costr,
dir,
particle);
1379 cache.m_extrapolationCache->updateEloss(
1380 eloss.meanIoni(), eloss.sigmaIoni(), eloss.meanRad(), eloss.sigmaRad());
1390 if (cache.m_matstates) {
1391 const double dInX0 = thick / lx0;
1392 const double scatsigma = std::sqrt(
m_msupdater->sigmaSquare(
1393 *lmat, 1. / std::abs(nextPar->parameters()[
qOverP]), 1.,
particle));
1397 const double currentqoverp = nextPar->parameters()[
Trk::qOverP];
1399 *lmat, std::abs(1. / currentqoverp), 1. / costr,
dir,
particle);
1403 nextPar->position(), nextPar->momentum(), nextPar->charge()));
1404 if (cache.m_extrapolationCache) {
1405 if (not cache.elossPointerOverwritten()) {
1407 ATH_MSG_DEBUG(cache.to_string(
" extrapolateToNextMaterialLayer thin "));
1409 cache.m_extrapolationCache->updateX0(dInX0);
1410 cache.m_extrapolationCache->updateEloss(
1411 eloss.meanIoni(), eloss.sigmaIoni(), eloss.meanRad(), eloss.sigmaRad());
1420 std::make_unique<Trk::MaterialEffectsOnTrack>(
1422 std::make_unique<Trk::EnergyLoss>(std::move(eloss)),
1423 cvlTP->associatedSurface());
1424 cache.m_matstates->push_back(
new TrackStateOnSurface(
1425 nullptr, std::move(cvlTP), std::move(mefot)));
1431 const unsigned int index = solutions[iSol] - iDest;
1433 nextVol = (cache.m_currentStatic->boundarySurfaces())[
index]->attachedVolume(
1434 nextPar->position(), nextPar->momentum(),
dir);
1437 !(nextVol->
inside(nextPar->position() + 0.01 *
dir * nextPar->momentum().normalized(),
1439 ATH_MSG_DEBUG(
" [!] WARNING: wrongly assigned static volume ?"
1440 << cache.m_currentStatic->volumeName() <<
"->" << nextVol->
volumeName());
1441 nextVol = cache.m_trackingGeometry->lowestStaticTrackingVolume(
1442 nextPar->position() + 0.01 * nextPar->momentum().normalized());
1448 if (nextVol != cache.m_currentStatic) {
1449 cache.m_parametersAtBoundary.boundaryInformation(nextVol, nextPar, nextPar);
1451 << cache.m_currentStatic->volumeName() <<
"'.");
1454 assocVol != cache.m_currentStatic) {
1463 if (nextVol && nextPar) {
1470 }
else if (solutions[iSol] <
1471 iDest + cache.m_staticBoundaries.size() + cache.m_layers.size()) {
1473 const unsigned int index = solutions[iSol] - iDest - cache.m_staticBoundaries.size();
1478 if (nextLayer == cache.m_lastMaterialLayer &&
1481 " [!] This layer is identical to the one with last material update, return layer "
1482 "without repeating the update");
1484 if (!destSurf && (nextLayer->
layerType() > 0)) {
1488 const double layThick = nextLayer->
thickness();
1489 if (
collect && layThick > 0.) {
1492 const IMaterialEffectsUpdator* currentUpdator =
1494 IMaterialEffectsUpdator::ICache& currentUpdatorCache =
1495 cache.subMaterialEffectsUpdatorCache();
1497 if (currentUpdator) {
1498 nextPar = cache.m_ownedPtrs.push(
1499 currentUpdator->update(currentUpdatorCache, nextPar,
1503 cache.m_parametersAtBoundary.resetBoundaryInformation();
1511 const double costr = std::abs(
1517 layThick / std::abs(nextPar->momentum().normalized().dot(
1520 thick = fmin(2 * nextLayer->
thickness(), layThick / (1 - costr));
1523 if (!cache.m_matstates && cache.m_extrapolationCache) {
1524 if (not cache.elossPointerOverwritten()) {
1525 const double dInX0 = thick / lx0;
1527 ATH_MSG_DEBUG(cache.to_string(
" extrapolateToNextMaterialLayer thin "));
1529 cache.m_extrapolationCache->updateX0(dInX0);
1532 const double currentqoverp = nextPar->parameters()[
Trk::qOverP];
1534 materialProperties, std::abs(1. / currentqoverp), 1. / costr,
dir,
particle);
1535 cache.m_extrapolationCache->updateEloss(
1536 eloss.meanIoni(), eloss.sigmaIoni(), eloss.meanRad(), eloss.sigmaRad());
1545 if (cache.m_matstates) {
1546 const double dInX0 = thick / lx0;
1549 const double scatsigma = std::sqrt(
m_msupdater->sigmaSquare(
1550 materialProperties, 1. / std::abs(nextPar->parameters()[
qOverP]), 1.,
particle));
1551 const double par_theta = std::abs(nextPar->parameters()[
Trk::theta]) > FLT_EPSILON
1556 const double currentqoverp = nextPar->parameters()[
Trk::qOverP];
1558 materialProperties, std::abs(1. / currentqoverp), 1. / costr,
dir,
particle);
1561 auto cvlTP = std::make_unique<Trk::CurvilinearParameters>(
1562 nextPar->position(), nextPar->momentum(), nextPar->charge());
1563 if (cache.m_extrapolationCache) {
1564 if (not cache.elossPointerOverwritten()) {
1566 ATH_MSG_DEBUG(cache.to_string(
" extrapolateToNextMaterialLayer thin "));
1568 cache.m_extrapolationCache->updateX0(dInX0);
1569 cache.m_extrapolationCache->updateEloss(
1570 eloss.meanIoni(), eloss.sigmaIoni(), eloss.meanRad(), eloss.sigmaRad());
1578 auto mefot = std::make_unique<Trk::MaterialEffectsOnTrack>(
1579 dInX0, newsa, std::make_unique<Trk::EnergyLoss>(std::move(eloss)), cvlTP->associatedSurface());
1580 cache.m_matstates->push_back(
new TrackStateOnSurface(
1581 nullptr, std::move(cvlTP), std::move(mefot)));
1584 if (cache.m_cacheLastMatLayer) {
1585 cache.m_lastMaterialLayer = nextLayer;
1587 if (!destSurf && nextLayer->
layerType() > 0) {
1591 if (resolveActive) {
1593 if (cache.m_navigLays[
index].first &&
1594 cache.m_navigLays[
index].first->confinedLayers()) {
1596 nextPar->position(),
dir * nextPar->momentum().normalized(),
true);
1598 cache.m_navigLays[
index].second = newLayer;
1605 }
else if (solutions[iSol] < iDest + cache.m_staticBoundaries.size() +
1606 cache.m_layers.size() + cache.m_denseBoundaries.size()) {
1608 unsigned int index =
1609 solutions[iSol] - iDest - cache.m_staticBoundaries.size() - cache.m_layers.size();
1610 std::vector<std::pair<const Trk::TrackingVolume*, unsigned int>>
::iterator dIter =
1611 cache.m_denseVols.begin();
1612 while (dIter != cache.m_denseVols.end() &&
index >= (*dIter).second) {
1613 index -= (*dIter).second;
1616 if (dIter != cache.m_denseVols.end()) {
1617 currVol = (*dIter).first;
1619 ((*dIter).first->boundarySurfaces())[
index]->attachedVolume(*nextPar,
dir);
1622 nextPar->position() + 2 *
m_tolerance *
dir * nextPar->momentum().normalized();
1624 cache.m_currentDense = currVol;
1626 cache.m_currentDense = cache.m_highestVolume;
1627 if (cache.m_dense && cache.m_denseVols.empty()) {
1628 cache.m_currentDense = cache.m_currentStatic;
1630 for (
unsigned int i = 0;
i < cache.m_denseVols.size();
i++) {
1633 cache.m_currentDense = dVol;
1635 << cache.m_currentDense->volumeName() <<
"'.");
1641 cache.m_currentDense = nextVol;
1642 ATH_MSG_DEBUG(
" [+] Next dense volume: '" << cache.m_currentDense->volumeName()
1646 }
else if (solutions[iSol] < iDest + cache.m_staticBoundaries.size() +
1647 cache.m_layers.size() + cache.m_denseBoundaries.size() +
1648 cache.m_navigBoundaries.size()) {
1650 unsigned int index = solutions[iSol] - iDest - cache.m_staticBoundaries.size() -
1651 cache.m_layers.size() - cache.m_denseBoundaries.size();
1652 std::vector<std::pair<const Trk::TrackingVolume*, unsigned int>>
::iterator nIter =
1653 cache.m_navigVolsInt.begin();
1654 while (nIter != cache.m_navigVolsInt.end() &&
index >= (*nIter).second) {
1655 index -= (*nIter).second;
1658 if (nIter != cache.m_navigVolsInt.end()) {
1659 currVol = (*nIter).first;
1661 ((*nIter).first->boundarySurfaces())[
index]->attachedVolume(*nextPar,
dir);
1664 nextPar->position() + 2 *
m_tolerance *
dir * nextPar->momentum().normalized();
1665 if (nextVol && nextVol->
inside(
tp, 0.)) {
1666 ATH_MSG_DEBUG(
" [+] Navigation volume boundary, entering volume '"
1668 }
else if (currVol->
inside(
tp, 0.)) {
1670 ATH_MSG_DEBUG(
" [+] Navigation volume boundary, entering volume '"
1674 ATH_MSG_DEBUG(
" [+] Navigation volume boundary, leaving volume '"
1681 ctx, cache, prop, nextPar, destSurf, cache.m_currentStatic,
1685 }
else if (solutions[iSol] < iDest + cache.m_staticBoundaries.size() +
1686 cache.m_layers.size() + cache.m_denseBoundaries.size() +
1687 cache.m_navigBoundaries.size() +
1688 cache.m_detachedBoundaries.size()) {
1690 unsigned int index = solutions[iSol] - iDest - cache.m_staticBoundaries.size() -
1691 cache.m_layers.size() - cache.m_denseBoundaries.size() -
1692 cache.m_navigBoundaries.size();
1693 std::vector<std::pair<const Trk::DetachedTrackingVolume*, unsigned int>>
::iterator dIter =
1694 cache.m_detachedVols.begin();
1695 while (dIter != cache.m_detachedVols.end() &&
index >= (*dIter).second) {
1696 index -= (*dIter).second;
1699 if (dIter != cache.m_detachedVols.end()) {
1700 currVol = (*dIter).first->trackingVolume();
1703 ((*dIter).first->trackingVolume()->boundarySurfaces())[
index]->attachedVolume(
1706 nextPar->position() + 2 *
m_tolerance *
dir * nextPar->momentum().normalized();
1707 if (nextVol && nextVol->
inside(
tp, 0.)) {
1708 ATH_MSG_DEBUG(
" [+] Detached volume boundary, entering volume '"
1710 }
else if (currVol->
inside(
tp, 0.)) {
1712 ATH_MSG_DEBUG(
" [+] Detached volume boundary, entering volume '"
1716 ATH_MSG_DEBUG(
" [+] Detached volume boundary, leaving volume '"
1723 ctx, cache, prop, nextPar, destSurf, cache.m_currentStatic,
1732 cache.m_parametersAtBoundary.boundaryInformation(cache.m_currentStatic, nextPar, nextPar);