Skip to content

Commit 9808766

Browse files
authored
Merge pull request #283 from RasmusOrsoe/HE_converter_adaptation
New i3 extractors for high energy, small bug fixes
2 parents ecf83e4 + 73ffa49 commit 9808766

6 files changed

Lines changed: 144 additions & 7 deletions

File tree

src/graphnet/data/extractors/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@
22
from .i3featureextractor import *
33
from .i3truthextractor import *
44
from .i3retroextractor import *
5+
from .i3splinempeextractor import I3SplineMPEICExtractor
6+
from .i3tumextractor import I3TUMExtractor
7+
from .i3hybridrecoextractor import I3GalacticPlaneHybridRecoExtractor
58
from .i3genericextractor import I3GenericExtractor

src/graphnet/data/extractors/i3featureextractor.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ def __init__(self, pulsemap):
1717
class I3FeatureExtractorIceCube86(I3FeatureExtractor):
1818
def __call__(self, frame) -> dict:
1919
"""Extract features to be used as inputs to GNN models."""
20-
2120
output = {
2221
"charge": [],
2322
"dom_time": [],
@@ -27,6 +26,10 @@ def __call__(self, frame) -> dict:
2726
"width": [],
2827
"pmt_area": [],
2928
"rde": [],
29+
"is_bright_dom": [],
30+
"is_bad_dom": [],
31+
"is_saturated_dom": [],
32+
"is_errata_dom": [],
3033
}
3134

3235
# Get OM data
@@ -36,6 +39,23 @@ def __call__(self, frame) -> dict:
3639
self._calibration,
3740
)
3841

42+
# Added these :
43+
bright_doms = None
44+
bad_doms = None
45+
saturation_windows = None
46+
calibration_errata = None
47+
if "BrightDOMs" in frame:
48+
bright_doms = frame.Get("BrightDOMs")
49+
50+
if "BadDomsList" in frame:
51+
bad_doms = frame.Get("BadDomsList")
52+
53+
if "SaturationWindows" in frame:
54+
saturation_windows = frame.Get("SaturationWindows")
55+
56+
if "CalibrationErrata" in frame:
57+
calibration_errata = frame.Get("CalibrationErrata")
58+
3959
for om_key in om_keys:
4060
# Common values for each OM
4161
x = self._gcd_dict[om_key].position.x
@@ -44,6 +64,27 @@ def __call__(self, frame) -> dict:
4464
area = self._gcd_dict[om_key].area
4565
rde = self._get_relative_dom_efficiency(frame, om_key)
4666

67+
# DOM flags
68+
if bright_doms:
69+
is_bright_dom = 1 if om_key in bright_doms else 0
70+
else:
71+
is_bright_dom = -1
72+
73+
if bad_doms:
74+
is_bad_dom = 1 if om_key in bad_doms else 0
75+
else:
76+
is_bad_dom = -1
77+
78+
if saturation_windows:
79+
is_saturated_dom = 1 if om_key in saturation_windows else 0
80+
else:
81+
is_saturated_dom = -1
82+
83+
if calibration_errata:
84+
is_errata_dom = 1 if om_key in calibration_errata else 0
85+
else:
86+
is_errata_dom = -1
87+
4788
# Loop over pulses for each OM
4889
pulses = data[om_key]
4990
for pulse in pulses:
@@ -55,7 +96,11 @@ def __call__(self, frame) -> dict:
5596
output["dom_x"].append(x)
5697
output["dom_y"].append(y)
5798
output["dom_z"].append(z)
58-
99+
# DOM flags
100+
output["is_bright_dom"].append(is_bright_dom)
101+
output["is_bad_dom"].append(is_bad_dom)
102+
output["is_saturated_dom"].append(is_saturated_dom)
103+
output["is_errata_dom"].append(is_errata_dom)
59104
return output
60105

61106
def _get_relative_dom_efficiency(self, frame, om_key):
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from graphnet.data.extractors.i3extractor import I3Extractor
2+
3+
4+
class I3GalacticPlaneHybridRecoExtractor(I3Extractor):
5+
def __init__(self, name="dnn_hybrid"):
6+
super().__init__(name)
7+
8+
def __call__(self, frame) -> dict:
9+
"""Extracts TUMs DNN Recos and associated variables"""
10+
output = {}
11+
if "DNNCascadeAnalysis_version_001_p00" in frame:
12+
reco_object = frame["DNNCascadeAnalysis_version_001_p00"]
13+
keys = [
14+
"angErr",
15+
"angErr_uncorrected",
16+
"dec",
17+
"dpsi",
18+
"energy",
19+
"event",
20+
"ra",
21+
"run",
22+
"subevent",
23+
"time",
24+
"trueDec",
25+
"trueE",
26+
"trueRa",
27+
"true_azi",
28+
"true_zen",
29+
]
30+
for key in keys:
31+
output.update({key: reco_object[key]})
32+
output.update(
33+
{
34+
"zenith_hybrid": reco_object["zen"],
35+
"azimuth_hybrid": reco_object["azi"],
36+
"energy_hybrid_log": reco_object["logE"],
37+
}
38+
)
39+
40+
return output
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from graphnet.data.extractors.i3extractor import I3Extractor
2+
3+
4+
class I3SplineMPEICExtractor(I3Extractor):
5+
def __init__(self, name="spline_mpe_ic"):
6+
super().__init__(name)
7+
8+
def __call__(self, frame) -> dict:
9+
"""Extracts SplineMPE pointing predictions."""
10+
output = {}
11+
if "SplineMPEIC" in frame:
12+
output.update(
13+
{
14+
"zenith_spline_mpe_ic": frame["SplineMPEIC"].dir.zenith,
15+
"azimuth_spline_mpe_ic": frame["SplineMPEIC"].dir.azimuth,
16+
}
17+
)
18+
19+
return output

src/graphnet/data/extractors/i3truthextractor.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,10 @@ def __call__(self, frame, padding_value=-1) -> dict:
9999
# Only InIceSplit P frames contain ML appropriate I3RecoPulseSeriesMap etc.
100100
# At low levels i3files contain several other P frame splits (e.g NullSplit),
101101
# we remove those here.
102-
if frame["I3EventHeader"].sub_event_stream != "InIceSplit":
102+
if frame["I3EventHeader"].sub_event_stream not in [
103+
"InIceSplit",
104+
"Final",
105+
]:
103106
return output
104107

105108
if "FilterMask" in frame:
@@ -146,10 +149,15 @@ def __call__(self, frame, padding_value=-1) -> dict:
146149
) = self._get_primary_particle_interaction_type_and_elasticity(
147150
frame, sim_type
148151
)
149-
(
150-
energy_track,
151-
inelasticity,
152-
) = self._get_primary_track_energy_and_inelasticity(frame)
152+
try:
153+
(
154+
energy_track,
155+
inelasticity,
156+
) = self._get_primary_track_energy_and_inelasticity(frame)
157+
except RuntimeError: # track energy fails on northeren tracks with ""Hadrons" has no mass implemented. Cannot get total energy."
158+
energy_track = (padding_value,)
159+
inelasticity = (padding_value,)
160+
153161
output.update(
154162
{
155163
"energy": MCInIcePrimary.energy,
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from graphnet.data.extractors.i3extractor import I3Extractor
2+
3+
4+
class I3TUMExtractor(I3Extractor):
5+
def __init__(self, name="tum_dnn"):
6+
super().__init__(name)
7+
8+
def __call__(self, frame) -> dict:
9+
"""Extracts TUM DNN Recos and associated variables"""
10+
output = {}
11+
if "TUM_dnn_energy_hive" in frame:
12+
output.update(
13+
{
14+
"tum_dnn_energy_hive": 10
15+
** frame["TUM_dnn_energy_hive"]["mu_E_on_entry"],
16+
"tum_dnn_energy_dst": 10
17+
** frame["TUM_dnn_energy_dst"]["mu_E_on_entry"],
18+
"tum_bdt_sigma": frame["TUM_bdt_sigma"].value,
19+
}
20+
)
21+
22+
return output

0 commit comments

Comments
 (0)