@@ -168,13 +168,26 @@ def total_track_energy(
168168
169169 MMCTrackList = frame [self .mmctracklist ]
170170 if self .daughters :
171- MMCTrackList = [
172- track
173- for track in MMCTrackList
174- if frame [self .mctree ].get_primary (track .GetI3Particle ())
175- in primaries
176- ]
177- MMCTrackList = simclasses .I3MMCTrackList (MMCTrackList )
171+ MMCTrackList_filtered = []
172+ for track in MMCTrackList :
173+ try :
174+ if (
175+ frame [self .mctree ].get_primary (track .GetI3Particle ())
176+ in primaries
177+ ):
178+ MMCTrackList_filtered .append (track )
179+ except RuntimeError as e :
180+ if "particle not found" in str (e ):
181+ # log warning with event header
182+ self .warning (
183+ f"Could not find primary for track { track .GetI3Particle ()} "
184+ f" in event { frame ['I3EventHeader' ]} : { e } "
185+ )
186+ # continue to next track
187+ else :
188+ raise e
189+
190+ MMCTrackList = simclasses .I3MMCTrackList (MMCTrackList_filtered )
178191
179192 track_list = np .array (
180193 MuonGun .Track .harvest (frame [self .mctree ], MMCTrackList )
@@ -202,8 +215,24 @@ def total_track_energy(
202215 continue
203216
204217 # Get the corresponding energies
205- e0 = track .get_energy (intersections .first )
206- e1 = track .get_energy (intersections .second )
218+ try :
219+ e0 = track .get_energy (intersections .first )
220+ e1 = track .get_energy (intersections .second )
221+
222+ except RuntimeError as e :
223+ if (
224+ "sum of losses is smaller than "
225+ "energy at last checkpoint" in str (e )
226+ ):
227+ hdr = frame ["I3EventHeader" ]
228+ e .add_note (f"Error in MuonGun track in event { hdr } " )
229+ self .warning (
230+ f"Skipping bad track { hdr } : { e } "
231+ f"\n Total energy of offending particle: { particle .energy } "
232+ )
233+ continue
234+ else :
235+ raise
207236
208237 # Accumulate
209238 e_deposited += e0 - e1
@@ -260,6 +289,9 @@ def total_cascade_energy(
260289 cascade_bool .append (p .is_cascade )
261290 energies .append (p .energy )
262291
292+ if len (energies ) == 0 :
293+ return 0.0
294+
263295 length = np .array (length_list ).astype (float )
264296 length [np .isnan (length )] = 0
265297 pos = np .asarray (pos_list )
0 commit comments