acts-project / acts

Experiment-independent toolkit for (charged) particle track reconstruction in (high energy) physics experiments implemented in modern C++
https://acts.readthedocs.io
Mozilla Public License 2.0
103 stars 168 forks source link

Failures during propagation #1385

Closed paulgessinger closed 1 year ago

paulgessinger commented 2 years ago

I've observed two more cases of propagation failures when running over Pythia8 HardQCD + SoftQCD events at mu200.

/cc @andiwand @asalzburger

andiwand commented 2 years ago

I can look into this next week

paulgessinger commented 2 years ago

I should be able to supply an input file if you don't want to run Pythia locally.

andiwand commented 2 years ago

I lately made the effort of compiling it so I would like to try running it as long as my CPU does not throttle :smile:

andiwand commented 2 years ago

FATRAS: 16:54:01 FatrasSimula ERROR event 571 particle id=(82|134|591|0|0)|pdg=0|q=-1|m=0|p=11.5181 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps. This could be a navigation problem where the particle leaves the detector, or potentially a looper that isn't cought by the looper protection.

looking at the log output the particle seems to be invalid

I wonder if this is a bug in the pythia8 conversion or a bug in fatras

@paulgessinger

andiwand commented 2 years ago

16:51:54 TrackFinding ERROR Propapation failed: EigenStepperError:3 Step size adjustment exceeds maximum trials with the initial parameters 33554 :

the "good" news is that all of them seem to have the same origin. the step size goes to zero and we run into the iteration maximum. as far as I know the step size would only get smaller and smaller if we cannot reach the desired accuracy in the runge-kutta integration. I will investigate further why this happens

andiwand commented 2 years ago

after running fatras again I see particles without pdg != 0. actually didn't spot any with 0

11:51:27    FatrasSimula   ERROR     event 2 particle id=(80|0|14|0|0)|pdg=pi-|q=-1|m=0.13957|p=15.0429 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:51:46    FatrasSimula   ERROR     event 22 particle id=(86|0|143|0|0)|pdg=pi+|q=1|m=0.13957|p=27.0124 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:51:49    FatrasSimula   ERROR     event 25 particle id=(151|0|189|0|0)|pdg=pi-|q=-1|m=0.13957|p=107.717 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:51:53    FatrasSimula   ERROR     event 30 particle id=(120|0|53|0|0)|pdg=pi+|q=1|m=0.13957|p=13.1252 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:51:54    FatrasSimula   ERROR     event 31 particle id=(109|0|49|0|0)|pdg=pi+|q=1|m=0.13957|p=17.5328 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:51:56    FatrasSimula   ERROR     event 33 particle id=(140|0|25|0|0)|pdg=pi+|q=1|m=0.13957|p=32.6771 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:51:57    FatrasSimula   ERROR     event 34 particle id=(156|0|273|0|0)|pdg=pi+|q=1|m=0.13957|p=16.2876 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:51:59    FatrasSimula   ERROR     event 35 particle id=(93|0|9|0|0)|pdg=pi+|q=1|m=0.13957|p=15.9507 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:00    FatrasSimula   ERROR     event 36 particle id=(110|0|123|0|0)|pdg=pi-|q=-1|m=0.13957|p=66.8142 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:01    FatrasSimula   ERROR     event 37 particle id=(56|0|509|0|0)|pdg=pi-|q=-1|m=0.13957|p=33.7821 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:01    FatrasSimula   ERROR     event 37 particle id=(85|0|60|0|0)|pdg=pi+|q=1|m=0.13957|p=52.9919 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:16    FatrasSimula   ERROR     event 53 particle id=(2|0|37|0|0)|pdg=pi+|q=1|m=0.13957|p=44.1941 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:20    FatrasSimula   ERROR     event 56 particle id=(114|0|36|0|0)|pdg=p~|q=-1|m=0.93827|p=8.63212 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:23    FatrasSimula   ERROR     event 59 particle id=(7|0|34|0|0)|pdg=pi-|q=-1|m=0.13957|p=31.2168 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:27    FatrasSimula   ERROR     event 63 particle id=(109|0|88|0|0)|pdg=pi-|q=-1|m=0.13957|p=67.0792 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:29    FatrasSimula   ERROR     event 65 particle id=(162|0|78|0|0)|pdg=pi-|q=-1|m=0.13957|p=19.8754 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:30    FatrasSimula   ERROR     event 66 particle id=(139|0|16|0|0)|pdg=pi+|q=1|m=0.13957|p=64.3 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:32    FatrasSimula   ERROR     event 68 particle id=(78|0|4|0|0)|pdg=K+|q=1|m=0.49368|p=41.052 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:40    FatrasSimula   ERROR     event 75 particle id=(168|0|115|0|0)|pdg=pi-|q=-1|m=0.13957|p=4.04962 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:42    FatrasSimula   ERROR     event 77 particle id=(85|0|55|0|0)|pdg=pi+|q=1|m=0.13957|p=32.207 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:45    FatrasSimula   ERROR     event 80 particle id=(30|0|98|0|0)|pdg=pi-|q=-1|m=0.13957|p=59.8709 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:45    FatrasSimula   ERROR     event 80 particle id=(116|134|478|0|0)|pdg=K-|q=-1|m=0.49368|p=21.4687 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:50    FatrasSimula   ERROR     event 85 particle id=(83|0|112|0|0)|pdg=pi-|q=-1|m=0.13957|p=5.79287 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:50    FatrasSimula   ERROR     event 85 particle id=(134|70|244|0|0)|pdg=pi+|q=1|m=0.13957|p=23.0101 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
11:52:59    FatrasSimula   ERROR     event 94 particle id=(137|0|11|0|0)|pdg=pi-|q=-1|m=0.13957|p=17.9685 failed to simulate with error PropagatorError:3: Propagation reached the configured maximum number of steps
andiwand commented 2 years ago

the propagation in fatras is flip-flopping between +/- some small value

EigenStepper: updateStepSize corresponds to https://github.com/acts-project/acts/blob/main/Core/include/Acts/Propagator/EigenStepper.hpp#L262 EigenStepper: step corresponds to https://github.com/acts-project/acts/blob/main/Core/include/Acts/Propagator/EigenStepper.ipp#L117

EigenStepper: updateStepSize -0.0289624
EigenStepper: step (748.218, -0.0289624, 76816.8,  +∞)
EigenStepper: updateStepSize 0.0289624
EigenStepper: step (748.218, 0.0289624, 76816.8,  +∞)
EigenStepper: updateStepSize -0.0289624
EigenStepper: step (748.218, -0.0289624, 76816.8,  +∞)
EigenStepper: updateStepSize 0.0289624
EigenStepper: step (748.218, 0.0289624, 76816.8,  +∞)
EigenStepper: updateStepSize -0.0289624
EigenStepper: step (748.218, -0.0289624, 76816.8,  +∞)
andiwand commented 2 years ago

to make this easier to reproduce: this is one of the particles that will fail fatras in the ODD

particle_id,particle_type,process,vx,vy,vz,vt,px,py,pz,m,q
360287970424520704,-211,0,0,0,0,0,0.20463942,0.0932567492,-15.041235,0.139569998,-1
andiwand commented 2 years ago

all the failed particles in 100 events

particle_id,particle_type,process,vx,vy,vz,vt,px,py,pz,m,q
360287970424520704,-211,0,0,0,0,0,0.20463942,0.0932567492,-15.041235,0.139569998,-1
387309570353004544,211,0,0,0,0,0,-0.0336664878,0.402350187,27.0093441,0.139569998,1
680043546903838720,-211,0,0,0,0,0,-1.22771633,-1.10539758,107.704742,0.139569998,-1
540431956173651968,211,0,0,0,0,0,0.189463511,0.0681857541,-13.1236868,0.139569998,1
490892360205467648,211,0,0,0,0,0,0.0608617477,0.166004553,17.5319443,0.139569998,1
630503948251299840,211,0,0,0,0,0,0.196608573,-0.460996509,32.6732216,0.139569998,1
702561546449977344,211,0,0,0,0,0,-0.0961737335,0.128603414,16.2868423,0.139569998,1
418834765496451072,211,0,0,0,0,0,-0.177656621,0.159051478,15.9489403,0.139569998,1
495395961074352128,-211,0,0,0,0,0,-0.00978880469,0.673449039,66.8108521,0.139569998,-1
252201587672350720,-211,0,0,0,0,0,-0.127471477,-0.488562971,33.7782784,0.139569998,-1
382805969333125120,211,0,0,0,0,0,-0.457007766,-0.276580334,-52.9892273,0.139569998,1
9007199875497984,211,0,0,0,0,0,-0.274833918,-0.350640118,-44.1918106,0.139569998,1
513410358124216320,-2212,0,0,0,0,0,0.128905028,-0.00736087142,8.63115692,0.938269973,-1
31525197962018816,-211,0,0,0,0,0,0.446970522,-0.13388215,-31.2132721,0.139569998,-1
490892360859779072,-211,0,0,0,0,0,-0.0914542228,0.669969797,-67.0758286,0.139569998,-1
729583140942643200,-211,0,0,0,0,0,0.192513958,0.226287067,-19.8732033,0.139569998,-1
626000348472934400,211,0,0,0,0,0,-0.585558176,0.762062788,-64.2928619,0.139569998,1
351280771002007552,321,0,0,0,0,0,-0.625899851,0.0681778342,-41.0471954,0.49368,1
756604739327623168,-211,0,0,0,0,0,-0.0528257377,-0.0299943779,4.04915953,0.139569998,-1
382805969249239040,211,0,0,0,0,0,-0.291572392,-0.142850697,32.2053375,0.139569998,1
135107990465282048,-211,0,0,0,0,0,0.869374216,0.295557469,59.8638687,0.139569998,-1
522564899352608768,-321,0,-0.187151968,-0.0855760351,-50.9075203,0.16982156,-0.325308949,-0.0342989713,-21.4662094,0.49368,-1
373798770950799360,-211,0,0,0,0,0,-0.0598790199,0.0627501607,-5.79222488,0.139569998,-1
603559319975231488,211,0,-0.189030707,6.96873808,-605.281372,2.01945424,-0.0372227877,0.390802145,-23.0067978,0.139569998,1
616993149134307328,-211,0,0,0,0,0,-0.259147942,0.0706318393,-17.9664593,0.139569998,-1
225179981855064064,211,0,0,0,0,0,-0.189642221,0.21128577,-28.8046551,0.139569998,1
andiwand commented 2 years ago

looks like we bounce between two geometries back and forth

update happens here https://github.com/acts-project/acts/blob/main/Core/include/Acts/Propagator/Navigator.hpp#L963

EigenStepper: step (1833.005505, -0.086267, 228591.005006,  +∞)
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -2968.5625)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 713.2684387, 3.1415927, 0.0000000)
EigenStepper: step (1833.005505, 0.086267, 228591.005006,  +∞)
Acts::CylinderSurface
     Center position  (x, y, z) = (0.0000, 0.0000, 0.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::CylinderBounds: (radius, halfLengthZ, halfPhiSector, averagePhi, bevelMinZ, bevelMaxZ) = (29.9242436, 4002.0000000, 3.1415927, 0.0000000, 0.0000000, 0.0000000)
11:27:44    Simulation     ERROR     Propagation reached the step count limit of 1000 (did 1000 steps)
paulgessinger commented 2 years ago

I faintly remember @FabianKlimpel implemented boundary surface checking by using all boundary surfaces and then ordering them in the most likely sequence, in order to be able to try all boundary surfaces one after the other, even if they don't seem compatible in the very beginning.

Maybe this runs into an edge case here?

FabianKlimpel commented 2 years ago

I faintly remember @FabianKlimpel implemented boundary surface checking by using all boundary surfaces and then ordering them in the most likely sequence, in order to be able to try all boundary surfaces one after the other, even if they don't seem compatible in the very beginning.

Maybe this runs into an edge case here?

Yes, I implemented the ordering to cover an edge case when there was just a single boundary surface stored that was unreachable due to the particles curvature. I also utilised the boundary surface of volumes within a volume and treated them the same way. Though, I think that I observed that it could be possible to run in some strange scenarios if such a subvolume is not entirely within the other. After having a brief look at the numbers (sorry, I'm not that familiar with the output anymore), it looks to me as if the cylinder is way longer in z-direction than the position of the disc surface. Is the disc the boundary surface of the cylinder volume?

andiwand commented 2 years ago

thank you for your response @FabianKlimpel !

I was also unsure about the geometry because of the gap. in other cases it looked like it matched. I will try to understand the gap.

the issue I am facing right now is that because of the ordering the navigation will decide to step backwards even tho we are in forward propagation and there is another boundary in the forward direction. because of the back step we end up looping between two points

FabianKlimpel commented 2 years ago

thank you for your response @FabianKlimpel !

I was also unsure about the geometry because of the gap. in other cases it looked like it matched. I will try to understand the gap.

We had the possibilty to visualise the geometry, this may help. Maybe ask @paulgessinger about it. I could guess that the ordering will pick up the cylinder surface behind the disc as it "reachable" in terms of "there is an intersection from a straight line".

the issue I am facing right now is that because of the ordering the navigation will decide to step backwards even tho we are in forward propagation and there is another boundary in the forward direction. because of the back step we end up looping between two points

A step backwards in forward propagation sounds to me like the overstepping protection for low-momentum charged particles from @asalzburger. Is there a curvature? Could you tell at which position you are at the moment the looping starts? Is it on the disc?

andiwand commented 2 years ago

from the log output I see like 10-100 GeV pions which all seem to have the same problem. I thought the curvature should be fairly small for them

the updateStepSize here will override the forward propagation in order step back to the boundary

this is how the loop begins

EigenStepper: step (1833.005505, 0.035662, 228591.126935,  +∞)
from   -18.930319   -23.175027 -2968.440577
direction -0.006533 -0.007677 -0.999949
16:20:56    Simulation     VERBOSE   Step with size = 0.0356616 performed
16:20:56    Simulation     VERBOSE   BeamPipe::Barrel | Entering navigator::status.
16:20:56    Simulation     VERBOSE   Update single surface status for surface: vol=32|bnd=4
16:20:56    Simulation     VERBOSE   Intersection: state is ON SURFACE
16:20:56    Simulation     VERBOSE   BeamPipe::Barrel | Status Surface successfully hit, storing it.
16:20:56    Simulation     VERBOSE   BeamPipe::Barrel | Current surface set to surface vol=32|bnd=4
16:20:56    Simulation     VERBOSE   BeamPipe::Barrel | Status: in boundary handling.
16:20:56    Simulation     VERBOSE   BeamPipe::Barrel | On boundary: update volume information.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Volume updated.
16:20:56    Simulation     VERBOSE   Target: 0 | Target stepSize (path limit) updated to (1833.01,  +∞, 228591,  +∞)
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Entering navigator::target.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | No surfaces present, target at layer first.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | No layers present, resolve volume first.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Searching for compatible layers.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | No compatible layer candidates found.
16:20:56    Simulation     VERBOSE   Last layer done, target volume boundary.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Try to find boundaries, we are at: -18.9306 -23.1753 -2968.48, dir: -0.00653322 -0.00767727   -0.999949
16:20:56    Simulation     VERBOSE   Finding compatibleBoundaries
16:20:56    Simulation     VERBOSE   Volume reports 4 boundary surfaces
16:20:56    Simulation     VERBOSE   Processing boundaries
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=23|bnd=1 :
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -2968.5625)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 713.2684387, 3.1415927, 0.0000000)
16:20:56    Simulation     VERBOSE   Check intersection with surface vol=23|bnd=1
16:20:56    Simulation     VERBOSE    -> pLimit, oLimit, cLimit: 228591, -0.1, 0.0862673
16:20:56    Simulation     VERBOSE   Intersection is WITHIN limit
16:20:56    Simulation     VERBOSE    - Proceed with surface
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=20|bnd=1 :
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -2002.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 206.0000000, 3.1415927, 0.0000000)
16:20:56    Simulation     VERBOSE    - Surface intersecion invalid
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=25|bnd=4 :
Acts::CylinderSurface
     Center position  (x, y, z) = (0.0000, 0.0000, 0.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::CylinderBounds: (radius, halfLengthZ, halfPhiSector, averagePhi, bevelMinZ, bevelMaxZ) = (206.0000000, 2968.5625000, 3.1415927, 0.0000000, 0.0000000, 0.0000000)
16:20:56    Simulation     VERBOSE    - Surface intersecion invalid
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=32|bnd=4 :
Acts::CylinderSurface
     Center position  (x, y, z) = (0.0000, 0.0000, 0.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::CylinderBounds: (radius, halfLengthZ, halfPhiSector, averagePhi, bevelMinZ, bevelMaxZ) = (29.9242436, 4002.0000000, 3.1415927, 0.0000000, 0.0000000, 0.0000000)
16:20:56    Simulation     VERBOSE    - Surface is excluded surface
16:20:56    Simulation     VERBOSE   Volume reports 0 confined dense volumes
16:20:56    Simulation     VERBOSE   1 boundary candidates found at path(s): 0.0862673  
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -2968.5625)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 713.2684387, 3.1415927, 0.0000000)
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Navigation stepSize updated to (1833.01, 0.0862673, 228591,  +∞)
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Target set to next boundary.
EigenStepper: step (1833.005505, 0.086267, 228591.091273,  +∞)
from   -18.930552   -23.175301 -2968.476237
direction -0.006533 -0.007677 -0.999949
16:20:56    Simulation     VERBOSE   Step with size = 0.0862673 performed
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Entering navigator::status.
16:20:56    Simulation     VERBOSE   Update single surface status for surface: vol=23|bnd=1
16:20:56    Simulation     VERBOSE   Intersection: state is ON SURFACE
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Status Surface successfully hit, storing it.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Current surface set to surface vol=23|bnd=1
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Status: in boundary handling.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | On boundary: update volume information.
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Volume updated.
16:20:56    Simulation     VERBOSE   Target: 0 | Target stepSize (path limit) updated to (1833.01,  +∞, 228591,  +∞)
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Entering navigator::target.
16:20:56    Simulation     VERBOSE   LongStrips::fGap | No surfaces present, target at layer first.
16:20:56    Simulation     VERBOSE   LongStrips::fGap | No layers present, resolve volume first.
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Searching for compatible layers.
16:20:56    Simulation     VERBOSE   LongStrips::fGap | No compatible layer candidates found.
16:20:56    Simulation     VERBOSE   Last layer done, target volume boundary.
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Try to find boundaries, we are at: -18.9311  -23.176 -2968.56, dir: -0.00653323 -0.00767726   -0.999949
16:20:56    Simulation     VERBOSE   Finding compatibleBoundaries
16:20:56    Simulation     VERBOSE   Volume reports 4 boundary surfaces
16:20:56    Simulation     VERBOSE   Processing boundaries
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=31|bnd=1 :
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -3036.5625)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 1202.0000000, 3.1415927, 0.0000000)
16:20:56    Simulation     VERBOSE   Check intersection with surface vol=31|bnd=1
16:20:56    Simulation     VERBOSE    -> pLimit, oLimit, cLimit: 228591, -0.1, 68.0035
16:20:56    Simulation     VERBOSE   Intersection is WITHIN limit
16:20:56    Simulation     VERBOSE    - Proceed with surface
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=23|bnd=1 :
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -2968.5625)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 713.2684387, 3.1415927, 0.0000000)
16:20:56    Simulation     VERBOSE    - Surface is excluded surface
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=30|bnd=4 :
Acts::CylinderSurface
     Center position  (x, y, z) = (0.0000, 0.0000, 0.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::CylinderBounds: (radius, halfLengthZ, halfPhiSector, averagePhi, bevelMinZ, bevelMaxZ) = (713.2684387, 3036.5625000, 3.1415927, 0.0000000, 0.0000000, 0.0000000)
16:20:56    Simulation     VERBOSE    - Surface intersecion invalid
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=32|bnd=4 :
Acts::CylinderSurface
     Center position  (x, y, z) = (0.0000, 0.0000, 0.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::CylinderBounds: (radius, halfLengthZ, halfPhiSector, averagePhi, bevelMinZ, bevelMaxZ) = (29.9242436, 4002.0000000, 3.1415927, 0.0000000, 0.0000000, 0.0000000)
16:20:56    Simulation     VERBOSE   Check intersection with surface vol=32|bnd=4
16:20:56    Simulation     VERBOSE    -> pLimit, oLimit, cLimit: 228591, -0.1, -0.0862673
16:20:56    Simulation     VERBOSE   Intersection is WITHIN limit
16:20:56    Simulation     VERBOSE    - Proceed with surface
16:20:56    Simulation     VERBOSE   Volume reports 0 confined dense volumes
16:20:56    Simulation     VERBOSE   2 boundary candidates found at path(s): -0.0862673  68.0035  
Acts::CylinderSurface
     Center position  (x, y, z) = (0.0000, 0.0000, 0.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::CylinderBounds: (radius, halfLengthZ, halfPhiSector, averagePhi, bevelMinZ, bevelMaxZ) = (29.9242436, 4002.0000000, 3.1415927, 0.0000000, 0.0000000, 0.0000000)
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Navigation stepSize updated to (1833.01, -0.0862673, 228591,  +∞)
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Target set to next boundary.
EigenStepper: step (1833.005505, -0.086267, 228591.005006,  +∞)
from   -18.931115   -23.175963 -2968.562500
direction -0.006533 -0.007677 -0.999949
16:20:56    Simulation     VERBOSE   Step with size = -0.0862673 performed
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Entering navigator::status.
16:20:56    Simulation     VERBOSE   Update single surface status for surface: vol=32|bnd=4
16:20:56    Simulation     VERBOSE   Intersection: state is ON SURFACE
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Status Surface successfully hit, storing it.
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Current surface set to surface vol=32|bnd=4
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Status: in boundary handling.
16:20:56    Simulation     VERBOSE   LongStrips::fGap | On boundary: update volume information.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Volume updated.
16:20:56    Simulation     VERBOSE   Target: 0 | Target stepSize (path limit) updated to (1833.01,  +∞, 228591,  +∞)
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Entering navigator::target.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | No surfaces present, target at layer first.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | No layers present, resolve volume first.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Searching for compatible layers.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | No compatible layer candidates found.
16:20:56    Simulation     VERBOSE   Last layer done, target volume boundary.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Try to find boundaries, we are at: -18.9306 -23.1753 -2968.48, dir: -0.00653322 -0.00767727   -0.999949
16:20:56    Simulation     VERBOSE   Finding compatibleBoundaries
16:20:56    Simulation     VERBOSE   Volume reports 4 boundary surfaces
16:20:56    Simulation     VERBOSE   Processing boundaries
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=23|bnd=1 :
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -2968.5625)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 713.2684387, 3.1415927, 0.0000000)
16:20:56    Simulation     VERBOSE   Check intersection with surface vol=23|bnd=1
16:20:56    Simulation     VERBOSE    -> pLimit, oLimit, cLimit: 228591, -0.1, 0.0862673
16:20:56    Simulation     VERBOSE   Intersection is WITHIN limit
16:20:56    Simulation     VERBOSE    - Proceed with surface
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=20|bnd=1 :
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -2002.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 206.0000000, 3.1415927, 0.0000000)
16:20:56    Simulation     VERBOSE    - Surface intersecion invalid
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=25|bnd=4 :
Acts::CylinderSurface
     Center position  (x, y, z) = (0.0000, 0.0000, 0.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::CylinderBounds: (radius, halfLengthZ, halfPhiSector, averagePhi, bevelMinZ, bevelMaxZ) = (206.0000000, 2968.5625000, 3.1415927, 0.0000000, 0.0000000, 0.0000000)
16:20:56    Simulation     VERBOSE    - Surface intersecion invalid
16:20:56    Simulation     VERBOSE   Consider boundary surface vol=32|bnd=4 :
Acts::CylinderSurface
     Center position  (x, y, z) = (0.0000, 0.0000, 0.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::CylinderBounds: (radius, halfLengthZ, halfPhiSector, averagePhi, bevelMinZ, bevelMaxZ) = (29.9242436, 4002.0000000, 3.1415927, 0.0000000, 0.0000000, 0.0000000)
16:20:56    Simulation     VERBOSE    - Surface is excluded surface
16:20:56    Simulation     VERBOSE   Volume reports 0 confined dense volumes
16:20:56    Simulation     VERBOSE   1 boundary candidates found at path(s): 0.0862673  
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -2968.5625)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 713.2684387, 3.1415927, 0.0000000)
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Navigation stepSize updated to (1833.01, 0.0862673, 228591,  +∞)
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Target set to next boundary.
EigenStepper: step (1833.005505, 0.086267, 228591.005006,  +∞)
from   -18.930552   -23.175301 -2968.476237
direction -0.006533 -0.007677 -0.999949
16:20:56    Simulation     VERBOSE   Step with size = 0.0862673 performed
FabianKlimpel commented 2 years ago

It's hard to imagine the detector geometry just from the numbers. Could you please post a picture of the geometry? Just from the numbers, it looks like the particle stays at the same position all the time. However, it reaches the short and long strips somehow.

What condition leads to Simulation VERBOSE - Surface intersecion invalid? If a surface is unreachable, I moved an iterator to the next surface. So, at least one surface should be reachable at any step.

Storing all boundary surfaces in a vector should not lead to backward stepping. So my first guesses would be an undetected mistake in the geometry or something odd in the overstepping protection. Maybe try to print more variables/parameters that have an impact upon the extrapolation direction. If you want to, then we could have a chat about the issue.

paulgessinger commented 2 years ago

Looking at the log, it seems the propagation does in fact reach the target boundary surface that it was trying to get to:

16:20:56    Simulation     VERBOSE   Consider boundary surface vol=23|bnd=1 :
Acts::DiscSurface
     Center position  (x, y, z) = (0.0000, 0.0000, -2968.5625)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::RadialBounds:  (innerRadius, outerRadius, hPhiSector, averagePhi) = (29.9242436, 713.2684387, 3.1415927, 0.0000000)
16:20:56    Simulation     VERBOSE   Check intersection with surface vol=23|bnd=1
16:20:56    Simulation     VERBOSE    -> pLimit, oLimit, cLimit: 228591, -0.1, 0.0862673
16:20:56    Simulation     VERBOSE   Check intersection with surface vol=23|bnd=1
16:20:56    Simulation     VERBOSE    -> pLimit, oLimit, cLimit: 228591, -0.1, 0.0862673
16:20:56    Simulation     VERBOSE   Step with size = 0.0862673 performed
16:20:56    Simulation     VERBOSE   Update single surface status for surface: vol=23|bnd=1
16:20:56    Simulation     VERBOSE   Intersection: state is ON SURFACE
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Status Surface successfully hit, storing it.
16:20:56    Simulation     VERBOSE   ShortStrips::fGap | Current surface set to surface vol=23|bnd=1

then we indeed switch from short strips to long strips forward gap:

16:20:56    Simulation     VERBOSE   LongStrips::fGap | Volume updated.

There are no layers here, so it tries to go to LongStrips::fGap's boundary surfaces. And then for, whatever reason it believes it can hit the outer cylinder envelop boundary surface:

16:20:56    Simulation     VERBOSE   Consider boundary surface vol=32|bnd=4 :
Acts::CylinderSurface
     Center position  (x, y, z) = (0.0000, 0.0000, 0.0000)
     Rotation:             colX = (1.000000, 0.000000, 0.000000)
                           colY = (0.000000, 1.000000, 0.000000)
                           colZ = (0.000000, 0.000000, 1.000000)
     Bounds  : Acts::CylinderBounds: (radius, halfLengthZ, halfPhiSector, averagePhi, bevelMinZ, bevelMaxZ) = (29.9242436, 4002.0000000, 3.1415927, 0.0000000, 0.0000000, 0.0000000)
16:20:56    Simulation     VERBOSE   Check intersection with surface vol=32|bnd=4
16:20:56    Simulation     VERBOSE    -> pLimit, oLimit, cLimit: 228591, -0.1, -0.0862673
16:20:56    Simulation     VERBOSE   Intersection is WITHIN limit
16:20:56    Simulation     VERBOSE    - Proceed with surface
16:20:56    Simulation     VERBOSE   2 boundary candidates found at path(s): -0.0862673  68.0035
16:20:56    Simulation     VERBOSE   Step with size = -0.0862673 performed
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Status Surface successfully hit, storing it.
16:20:56    Simulation     VERBOSE   LongStrips::fGap | Current surface set to surface vol=32|bnd=4

and switched back into ShortStrips::fGap. So there's two things we need to understand:

  1. What is the geometric configuration leading to the navigation finding an intersection with the outer disk of ShortStrips::fGap at +0.086 and then finding an intersection with the outer cylinder surface of LongStrips::fGap at -0.086? It seems suspicious that it's the same absolute path length.
  2. If the geometric configuration is correct, should it not in any case try the boundary surface at 68.0035 first?
andiwand commented 2 years ago

the fatras errors seem to be gone after #1433 - 100 pythia events with 200 pileup without error

I will look into the other propagation failure next

andiwand commented 2 years ago

The track finding propagation error is due to high energy losses in thick material slabs. E.g. there are pions with ~1 GeV which get completely stopped in ~3 m material. Because the propagation does not stop some quantities blow up because of division by zero.

How does the CKF actually assume the particle identity?

In order to fix this we should stop the propagation when the particle is stopped, I guess? Should this be part of the Propagator?

@paulgessinger @andiwand

paulgessinger commented 2 years ago

@asalzburger suggests to check if this happens during truth tracking as well, or only combinatorial finding of real seeds.

andiwand commented 2 years ago

with truth seeding and filtering the problem seems to disappear but at the same time while lowering ptMin the problem re-appears.

addSeeding(
    s,
    trackingGeometry,
    field,
    geoSelectionConfigFile=oddSeedingSel,
    truthSeedRanges=TruthSeedRanges(pt=(500.0 * u.MeV, None), nHits=(9, None)),
    seedingAlgorithm=SeedingAlgorithm.TruthEstimated,
    outputDirRoot=outputDir,
)

I think it makes sense to have a more general solution for p=0 in the propagator as this might creep up in the future

andiwand commented 2 years ago

with #1454 the stopped particle propagation failures seem to disappear but some of them will now result in

17:05:32    TrackFinding   ERROR     CombinatorialKalmanFilter failed: CombinatorialKalmanFilterError:5 No track is found with the initial parameters 12760 : 
-4.34102
 32.8367
-2.08792
 2.17054
 -2.1418
0.301926

which makes sense but I am not sure how to continue from here. any suggestions @paulgessinger @asalzburger ?

there seems to be one more propagation failure which is not caused by stopped particles

17:05:35    TrackFinding   ERROR     Propapation failed: PropagatorError:3 Propagation reached the configured maximum number of steps with the initial parameters 24986 : 
-7.65096
-31.2718
-1.38305
 2.18772
-1.99442
-14.7634
stale[bot] commented 2 years ago

This issue/PR has been automatically marked as stale because it has not had recent activity. The stale label will be removed if any interaction occurs.

andiwand commented 2 years ago

https://github.com/acts-project/acts/pull/1454 fixes the problem but will lead to

14:40:46    TrackFinding   ERROR     CombinatorialKalmanFilter failed: CombinatorialKalmanFilterError:5 No track is found with the initial parameters 44539 : 

for stopped particles.

andiwand commented 1 year ago

closing as this should be fixed with https://github.com/acts-project/acts/pull/1454