3
3
from scipy .ndimage .filters import gaussian_filter
4
4
5
5
6
-
7
- def _make_energy_bins (energy_true , energy_prediction , bins ):
6
+ @ u . quantity_input ( energy_true = u . TeV , energy_prediction = u . TeV )
7
+ def _make_energy_bins (energy_true , energy_prediction , bins , e_ref = 1 * u . TeV ):
8
8
e_min = min (
9
- min (energy_true ),
10
- min (energy_prediction )
9
+ np . min (energy_true ),
10
+ np . min (energy_prediction )
11
11
)
12
12
13
13
e_max = max (
14
- max (energy_true ),
15
- max (energy_prediction )
14
+ np . max (energy_true ),
15
+ np . max (energy_prediction )
16
16
)
17
17
18
- low = np .log10 (e_min . value )
19
- high = np .log10 (e_max . value )
18
+ low = np .log10 (e_min / e_ref )
19
+ high = np .log10 (e_max / e_ref )
20
20
bin_edges = np .logspace (low , high , endpoint = True , num = bins + 1 )
21
21
22
- return bin_edges
23
-
22
+ return bin_edges * e_ref
24
23
25
24
26
25
@u .quantity_input (energy_true = u .TeV , energy_prediction = u .TeV )
27
- def energy_dispersion (energy_true , energy_prediction , bins = 10 , normalize = False , smoothing = 0 ):
26
+ def energy_dispersion (energy_true , energy_prediction , bins = 10 , normalize = False , smoothing = 0 , e_ref = 1 * u . TeV ):
28
27
'''
29
28
Creates energy dispersion matrix i.e. a histogram of e_reco vs e_true.
30
29
@@ -43,6 +42,8 @@ def energy_dispersion(energy_true, energy_prediction, bins=10, normalize=False,
43
42
Amount of smoothing to apply to the generated matrices.
44
43
Equivalent to the sigma parameter in
45
44
https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_filter.html
45
+ e_ref: astropy.unit.Quantity[energy]
46
+ Reference energy
46
47
Returns
47
48
-------
48
49
@@ -55,28 +56,25 @@ def energy_dispersion(energy_true, energy_prediction, bins=10, normalize=False,
55
56
56
57
'''
57
58
if np .isscalar (bins ):
58
- bins = _make_energy_bins (energy_true , energy_prediction , bins )
59
+ bins = _make_energy_bins (energy_true , energy_prediction , bins , e_ref = e_ref )
59
60
60
61
hist , bins_e_true , bins_e_prediction = np .histogram2d (
61
- energy_true . value ,
62
- energy_prediction ,
63
- bins = bins ,
62
+ ( energy_true / e_ref ). to_value ( u . dimensionless_unscaled ) ,
63
+ ( energy_prediction / e_ref ). to_value ( u . dimensionless_unscaled ) ,
64
+ bins = ( bins / e_ref ). to_value ( u . dimensionless_unscaled ) ,
64
65
)
65
66
66
67
if smoothing > 0 :
67
68
hist = gaussian_filter (hist , sigma = smoothing )
68
69
69
70
if normalize :
70
- with np .errstate (invalid = 'ignore' ):
71
- h = hist .T
72
- h = h / h .sum (axis = 0 )
73
- hist = np .nan_to_num (h ).T
71
+ hist = _normalize_hist (hist )
74
72
75
- return hist , bins_e_true * energy_true . unit , bins_e_prediction * energy_true . unit
73
+ return hist , bins_e_true , bins_e_prediction
76
74
77
75
78
76
@u .quantity_input (energy_true = u .TeV , energy_prediction = u .TeV )
79
- def energy_migration (energy_true , energy_prediction , bins_energy = 10 , bins_mu = 10 , normalize = True , smoothing = 0 ):
77
+ def energy_migration (energy_true , energy_prediction , bins_energy = 10 , bins_mu = 10 , normalize = True , smoothing = 0 , e_ref = 1 * u . TeV ):
80
78
'''
81
79
Creates energy migration matrix i.e. a histogram of e_reco/e_true vs e_trueself.
82
80
@@ -97,6 +95,8 @@ def energy_migration(energy_true, energy_prediction, bins_energy=10, bins_mu=10,
97
95
Amount of smoothing to apply to the generated matrices.
98
96
Equivalent to the sigma parameter in
99
97
https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_filter.html
98
+ e_ref: astropy.unit.Quantity[energy]
99
+ Reference energy
100
100
Returns
101
101
-------
102
102
@@ -109,26 +109,32 @@ def energy_migration(energy_true, energy_prediction, bins_energy=10, bins_mu=10,
109
109
110
110
'''
111
111
if np .isscalar (bins_energy ):
112
- bins_energy = _make_energy_bins (energy_true , energy_prediction , bins_energy )
112
+ bins_energy = _make_energy_bins (
113
+ energy_true , energy_prediction , bins_energy , e_ref = e_ref
114
+ )
113
115
114
- migra = (energy_prediction / energy_true ).si . value
116
+ migra = (energy_prediction / energy_true ).to_value ( u . dimensionless_unscaled )
115
117
116
118
if np .isscalar (bins_mu ):
117
- bins_mu = np .linspace (0 , 6 , endpoint = True , num = bins_mu + 1 )
119
+ bins_mu = np .linspace (0 , 6 , bins_mu + 1 )
118
120
119
121
hist , bins_e_true , bins_mu = np .histogram2d (
120
- energy_true . value ,
122
+ ( energy_true / e_ref ). to_value ( u . dimensionless_unscaled ) ,
121
123
migra ,
122
- bins = [bins_energy , bins_mu ],
124
+ bins = [( bins_energy / e_ref ). to_value ( u . dimensionless_unscaled ) , bins_mu ],
123
125
)
124
126
125
127
if smoothing > 0 :
126
- hist = gaussian_filter (hist , sigma = smoothing , )
128
+ hist = gaussian_filter (hist , sigma = smoothing )
127
129
128
130
if normalize :
129
- with np . errstate ( invalid = 'ignore' ):
130
- h = hist . T
131
- h = h / h . sum ( axis = 0 )
132
- hist = np . nan_to_num ( h ). T
131
+ hist = _normalize_hist ( hist )
132
+
133
+ return hist , bins_energy , bins_mu
134
+
133
135
134
- return hist , bins_energy * energy_true .unit , bins_mu
136
+ def _normalize_hist (hist ):
137
+ with np .errstate (invalid = 'ignore' ):
138
+ h = hist .T
139
+ h = h / h .sum (axis = 0 )
140
+ return np .nan_to_num (h ).T
0 commit comments