33from scipy .ndimage .filters import gaussian_filter
44
55
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 ):
88 e_min = min (
9- min (energy_true ),
10- min (energy_prediction )
9+ np . min (energy_true ),
10+ np . min (energy_prediction )
1111 )
1212
1313 e_max = max (
14- max (energy_true ),
15- max (energy_prediction )
14+ np . max (energy_true ),
15+ np . max (energy_prediction )
1616 )
1717
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 )
2020 bin_edges = np .logspace (low , high , endpoint = True , num = bins + 1 )
2121
22- return bin_edges
23-
22+ return bin_edges * e_ref
2423
2524
2625@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 ):
2827 '''
2928 Creates energy dispersion matrix i.e. a histogram of e_reco vs e_true.
3029
@@ -43,6 +42,8 @@ def energy_dispersion(energy_true, energy_prediction, bins=10, normalize=False,
4342 Amount of smoothing to apply to the generated matrices.
4443 Equivalent to the sigma parameter in
4544 https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_filter.html
45+ e_ref: astropy.unit.Quantity[energy]
46+ Reference energy
4647 Returns
4748 -------
4849
@@ -55,28 +56,25 @@ def energy_dispersion(energy_true, energy_prediction, bins=10, normalize=False,
5556
5657 '''
5758 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 )
5960
6061 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 ) ,
6465 )
6566
6667 if smoothing > 0 :
6768 hist = gaussian_filter (hist , sigma = smoothing )
6869
6970 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 )
7472
75- return hist , bins_e_true * energy_true . unit , bins_e_prediction * energy_true . unit
73+ return hist , bins_e_true , bins_e_prediction
7674
7775
7876@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 ):
8078 '''
8179 Creates energy migration matrix i.e. a histogram of e_reco/e_true vs e_trueself.
8280
@@ -97,6 +95,8 @@ def energy_migration(energy_true, energy_prediction, bins_energy=10, bins_mu=10,
9795 Amount of smoothing to apply to the generated matrices.
9896 Equivalent to the sigma parameter in
9997 https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_filter.html
98+ e_ref: astropy.unit.Quantity[energy]
99+ Reference energy
100100 Returns
101101 -------
102102
@@ -109,26 +109,32 @@ def energy_migration(energy_true, energy_prediction, bins_energy=10, bins_mu=10,
109109
110110 '''
111111 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+ )
113115
114- migra = (energy_prediction / energy_true ).si . value
116+ migra = (energy_prediction / energy_true ).to_value ( u . dimensionless_unscaled )
115117
116118 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 )
118120
119121 hist , bins_e_true , bins_mu = np .histogram2d (
120- energy_true . value ,
122+ ( energy_true / e_ref ). to_value ( u . dimensionless_unscaled ) ,
121123 migra ,
122- bins = [bins_energy , bins_mu ],
124+ bins = [( bins_energy / e_ref ). to_value ( u . dimensionless_unscaled ) , bins_mu ],
123125 )
124126
125127 if smoothing > 0 :
126- hist = gaussian_filter (hist , sigma = smoothing , )
128+ hist = gaussian_filter (hist , sigma = smoothing )
127129
128130 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+
133135
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