Commit b1e044a447312eaf6cf3f3ad5b9dfb97c85c27a2
1 parent
1cbb5663
show_spectrum.py now adapts to energy scale of data and shows filename in title
Showing
1 changed file
with
39 additions
and
17 deletions
examples/show_spectrum.py
| @@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
| 2 | # ========================================================================== | 2 | # ========================================================================== |
| 3 | # Display spectrum generated by csspec | 3 | # Display spectrum generated by csspec |
| 4 | # | 4 | # |
| 5 | -# Copyright (C) 2015-2020 Juergen Knoedlseder | 5 | +# Copyright (C) 2015-2021 Juergen Knoedlseder |
| 6 | # | 6 | # |
| 7 | # This program is free software: you can redistribute it and/or modify | 7 | # This program is free software: you can redistribute it and/or modify |
| 8 | # it under the terms of the GNU General Public License as published by | 8 | # it under the terms of the GNU General Public License as published by |
| @@ -18,6 +18,7 @@ | @@ -18,6 +18,7 @@ | ||
| 18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 19 | # | 19 | # |
| 20 | # ========================================================================== | 20 | # ========================================================================== |
| 21 | +import os | ||
| 21 | import sys | 22 | import sys |
| 22 | try: | 23 | try: |
| 23 | import matplotlib.pyplot as plt | 24 | import matplotlib.pyplot as plt |
| @@ -70,7 +71,7 @@ def get_spectrum_fits(fits): | @@ -70,7 +71,7 @@ def get_spectrum_fits(fits): | ||
| 70 | ---------- | 71 | ---------- |
| 71 | fits : `~gammalib.GFits` | 72 | fits : `~gammalib.GFits` |
| 72 | Spectral GFits object | 73 | Spectral GFits object |
| 73 | - | 74 | + |
| 74 | Returns | 75 | Returns |
| 75 | ------- | 76 | ------- |
| 76 | spec : dict | 77 | spec : dict |
| @@ -168,7 +169,7 @@ def get_spectrum_fits(fits): | @@ -168,7 +169,7 @@ def get_spectrum_fits(fits): | ||
| 168 | # ========================= # | 169 | # ========================= # |
| 169 | # Plot delta log-likelihood # | 170 | # Plot delta log-likelihood # |
| 170 | # ========================= # | 171 | # ========================= # |
| 171 | -def plot_dloglike(spec): | 172 | +def plot_dloglike(ax, spec): |
| 172 | """ | 173 | """ |
| 173 | Plot delta log-likelihood | 174 | Plot delta log-likelihood |
| 174 | 175 | ||
| @@ -187,7 +188,7 @@ def plot_dloglike(spec): | @@ -187,7 +188,7 @@ def plot_dloglike(spec): | ||
| 187 | 188 | ||
| 188 | # Compute the logarithmic center of each bin | 189 | # Compute the logarithmic center of each bin |
| 189 | fluxpnts = 10 ** ((y_bounds[1:]+y_bounds[:-1]) / 2.0) | 190 | fluxpnts = 10 ** ((y_bounds[1:]+y_bounds[:-1]) / 2.0) |
| 190 | - | 191 | + |
| 191 | # Scale the boundaries on the grid | 192 | # Scale the boundaries on the grid |
| 192 | y_bounds = 10 ** y_bounds | 193 | y_bounds = 10 ** y_bounds |
| 193 | 194 | ||
| @@ -201,12 +202,12 @@ def plot_dloglike(spec): | @@ -201,12 +202,12 @@ def plot_dloglike(spec): | ||
| 201 | dll_hist = [[row[i] for row in dll_hist] for i in range(steps)] | 202 | dll_hist = [[row[i] for row in dll_hist] for i in range(steps)] |
| 202 | 203 | ||
| 203 | # Plot the likelihood profiles | 204 | # Plot the likelihood profiles |
| 204 | - plt.pcolormesh(np.array(spec['engs_scan']), y_bounds, | ||
| 205 | - np.array(dll_hist), vmin=-10.0, vmax=0.0, | ||
| 206 | - cmap='Reds', alpha=0.9) | ||
| 207 | - cbar = plt.colorbar() | 205 | + c = ax.pcolormesh(np.array(spec['engs_scan']), y_bounds, |
| 206 | + np.array(dll_hist), vmin=-10.0, vmax=0.0, | ||
| 207 | + cmap='Reds', alpha=0.9) | ||
| 208 | + cbar = plt.colorbar(c) | ||
| 208 | cbar.set_label(r'$\Delta$ log-likelihood') | 209 | cbar.set_label(r'$\Delta$ log-likelihood') |
| 209 | - plt.grid() | 210 | + ax.grid() |
| 210 | 211 | ||
| 211 | # Return | 212 | # Return |
| 212 | return | 213 | return |
| @@ -229,27 +230,48 @@ def plot_spectrum(filename, plotfile): | @@ -229,27 +230,48 @@ def plot_spectrum(filename, plotfile): | ||
| 229 | # Get spectrum parameters | 230 | # Get spectrum parameters |
| 230 | spec = get_spectrum_file(filename) | 231 | spec = get_spectrum_file(filename) |
| 231 | 232 | ||
| 233 | + # Set energy scale of spectrum | ||
| 234 | + if max(spec['energies']) < 1.0e-3: | ||
| 235 | + xlabel = 'Energy (MeV)' | ||
| 236 | + conv = 1.0e6 | ||
| 237 | + elif max(spec['energies']) < 1.0: | ||
| 238 | + xlabel = 'Energy (GeV)' | ||
| 239 | + conv = 1.0e3 | ||
| 240 | + else: | ||
| 241 | + xlabel = 'Energy (TeV)' | ||
| 242 | + conv = 1.0 | ||
| 243 | + if conv != 1.0: | ||
| 244 | + spec['energies'] = [e * 1.0e6 for e in spec['energies']] | ||
| 245 | + spec['ed_engs'] = [e * 1.0e6 for e in spec['ed_engs']] | ||
| 246 | + spec['eu_engs'] = [e * 1.0e6 for e in spec['eu_engs']] | ||
| 247 | + spec['ul_energies'] = [e * 1.0e6 for e in spec['ul_energies']] | ||
| 248 | + spec['ul_ed_engs'] = [e * 1.0e6 for e in spec['ul_ed_engs']] | ||
| 249 | + spec['ul_eu_engs'] = [e * 1.0e6 for e in spec['ul_eu_engs']] | ||
| 250 | + | ||
| 232 | # Create the plot | 251 | # Create the plot |
| 233 | - plt.figure() | ||
| 234 | - plt.loglog() | ||
| 235 | - plt.grid() | ||
| 236 | - plt.xlabel('Energy (TeV)') | ||
| 237 | - plt.ylabel(r'E$^2$ $\times$ dN/dE (erg cm$^{-2}$ s$^{-1}$)') | 252 | + fig = plt.figure() |
| 253 | + fig.subplots_adjust(left=0.17, right=0.98, top=0.92, bottom=0.10) | ||
| 254 | + ax = fig.add_subplot(111) | ||
| 255 | + ax.loglog() | ||
| 256 | + ax.grid() | ||
| 257 | + ax.set_xlabel(xlabel) | ||
| 258 | + ax.set_ylabel(r'E$^2$ $\times$ dN/dE (erg cm$^{-2}$ s$^{-1}$)') | ||
| 259 | + ax.set_title(os.path.basename(filename)) | ||
| 238 | 260 | ||
| 239 | # Plot the spectrum | 261 | # Plot the spectrum |
| 240 | - plt.errorbar(spec['energies'], spec['flux'], | 262 | + ax.errorbar(spec['energies'], spec['flux'], |
| 241 | yerr=spec['e_flux'], xerr=[spec['ed_engs'], spec['eu_engs']], | 263 | yerr=spec['e_flux'], xerr=[spec['ed_engs'], spec['eu_engs']], |
| 242 | fmt='ro') | 264 | fmt='ro') |
| 243 | 265 | ||
| 244 | # Plot upper limits | 266 | # Plot upper limits |
| 245 | if len(spec['ul_energies']) > 0: | 267 | if len(spec['ul_energies']) > 0: |
| 246 | - plt.errorbar(spec['ul_energies'], spec['ul_flux'], yerr=spec['yerr'], | 268 | + ax.errorbar(spec['ul_energies'], spec['ul_flux'], yerr=spec['yerr'], |
| 247 | xerr=[spec['ul_ed_engs'], spec['ul_eu_engs']], | 269 | xerr=[spec['ul_ed_engs'], spec['ul_eu_engs']], |
| 248 | uplims=True, fmt='ro') | 270 | uplims=True, fmt='ro') |
| 249 | 271 | ||
| 250 | # Plot log-likelihood profiles | 272 | # Plot log-likelihood profiles |
| 251 | if len(spec['dll_scan']) > 0: | 273 | if len(spec['dll_scan']) > 0: |
| 252 | - plot_dloglike(spec) | 274 | + plot_dloglike(ax, spec) |
| 253 | 275 | ||
| 254 | # Show figure | 276 | # Show figure |
| 255 | if len(plotfile) > 0: | 277 | if len(plotfile) > 0: |