Commit 3b71cf337afc47c4a8a9df5a539471d8a976332f
1 parent
9b6e9d0c
Use csspec in the mak_spectrum.py example script (#1504).
Showing
2 changed files
with
91 additions
and
23 deletions
cscripts/csspec.py
| @@ -43,7 +43,8 @@ class csspec(ctools.cscript): | @@ -43,7 +43,8 @@ class csspec(ctools.cscript): | ||
| 43 | self.version = "1.0.0" | 43 | self.version = "1.0.0" |
| 44 | 44 | ||
| 45 | # Initialise some members | 45 | # Initialise some members |
| 46 | - self.obs = None | 46 | + self.obs = None |
| 47 | + self.fits = None | ||
| 47 | 48 | ||
| 48 | # Initialise some members | 49 | # Initialise some members |
| 49 | if len(argv) > 0 and isinstance(argv[0],gammalib.GObservations): | 50 | if len(argv) > 0 and isinstance(argv[0],gammalib.GObservations): |
| @@ -107,8 +108,8 @@ class csspec(ctools.cscript): | @@ -107,8 +108,8 @@ class csspec(ctools.cscript): | ||
| 107 | pars.append(gammalib.GApplicationPar("psfcube","f","a","NONE","","","PSF cube file (only needed for stacked analysis)")) | 108 | pars.append(gammalib.GApplicationPar("psfcube","f","a","NONE","","","PSF cube file (only needed for stacked analysis)")) |
| 108 | pars.append(gammalib.GApplicationPar("bkgcube","s","a","NONE","","","Background cube file (only needed for stacked analysis)")) | 109 | pars.append(gammalib.GApplicationPar("bkgcube","s","a","NONE","","","Background cube file (only needed for stacked analysis)")) |
| 109 | pars.append(gammalib.GApplicationPar("caldb","s","a","prod2","","","Calibration database")) | 110 | pars.append(gammalib.GApplicationPar("caldb","s","a","prod2","","","Calibration database")) |
| 110 | - pars.append(gammalib.GApplicationPar("edisp","b","h","no","","","Apply energy dispersion?")) | ||
| 111 | pars.append(gammalib.GApplicationPar("irf","s","a","South_50h","","","Instrument response function")) | 111 | pars.append(gammalib.GApplicationPar("irf","s","a","South_50h","","","Instrument response function")) |
| 112 | + pars.append(gammalib.GApplicationPar("edisp","b","h","no","","","Apply energy dispersion?")) | ||
| 112 | pars.append(gammalib.GApplicationPar("emin","r","h","0.1","","","Lower energy limit for spectral points(TeV)")) | 113 | pars.append(gammalib.GApplicationPar("emin","r","h","0.1","","","Lower energy limit for spectral points(TeV)")) |
| 113 | pars.append(gammalib.GApplicationPar("emax","r","h","100.0","","","Upper energy limit for spectral points(TeV)")) | 114 | pars.append(gammalib.GApplicationPar("emax","r","h","100.0","","","Upper energy limit for spectral points(TeV)")) |
| 114 | pars.append(gammalib.GApplicationPar("enumbins","i","a","20","","","Number of spectral points")) | 115 | pars.append(gammalib.GApplicationPar("enumbins","i","a","20","","","Number of spectral points")) |
| @@ -198,6 +199,13 @@ class csspec(ctools.cscript): | @@ -198,6 +199,13 @@ class csspec(ctools.cscript): | ||
| 198 | # Return | 199 | # Return |
| 199 | return | 200 | return |
| 200 | 201 | ||
| 202 | + def spectrum(self): | ||
| 203 | + """ | ||
| 204 | + Return spectrum as FITS object. | ||
| 205 | + """ | ||
| 206 | + # Return | ||
| 207 | + return self.fits | ||
| 208 | + | ||
| 201 | def execute(self): | 209 | def execute(self): |
| 202 | """ | 210 | """ |
| 203 | Execute the script. | 211 | Execute the script. |
examples/make_spectrum.py
| @@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
| 2 | # ========================================================================== | 2 | # ========================================================================== |
| 3 | # This script shows how to make a spectrum using obsutils. | 3 | # This script shows how to make a spectrum using obsutils. |
| 4 | # | 4 | # |
| 5 | -# Copyright (C) 2014 Juergen Knoedlseder | 5 | +# Copyright (C) 2014-2015 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,9 +18,9 @@ | @@ -18,9 +18,9 @@ | ||
| 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 gammalib | 21 | +#import gammalib |
| 22 | import ctools | 22 | import ctools |
| 23 | -from cscripts import obsutils | 23 | +import cscripts |
| 24 | try: | 24 | try: |
| 25 | import matplotlib.pyplot as plt | 25 | import matplotlib.pyplot as plt |
| 26 | has_matplotlib = True | 26 | has_matplotlib = True |
| @@ -46,6 +46,7 @@ def make_spectrum(): | @@ -46,6 +46,7 @@ def make_spectrum(): | ||
| 46 | tstop = 1800.0 | 46 | tstop = 1800.0 |
| 47 | emin = 0.1 | 47 | emin = 0.1 |
| 48 | emax = 100.0 | 48 | emax = 100.0 |
| 49 | + enumbins = 10 | ||
| 49 | 50 | ||
| 50 | # Simulate events | 51 | # Simulate events |
| 51 | sim = ctools.ctobssim() | 52 | sim = ctools.ctobssim() |
| @@ -62,14 +63,28 @@ def make_spectrum(): | @@ -62,14 +63,28 @@ def make_spectrum(): | ||
| 62 | sim.run() | 63 | sim.run() |
| 63 | 64 | ||
| 64 | # Generate an energy binning | 65 | # Generate an energy binning |
| 65 | - e_min = gammalib.GEnergy(emin, "TeV") | ||
| 66 | - e_max = gammalib.GEnergy(emax, "TeV") | ||
| 67 | - ebounds = gammalib.GEbounds(10, e_min, e_max) | 66 | + #e_min = gammalib.GEnergy(emin, "TeV") |
| 67 | + #e_max = gammalib.GEnergy(emax, "TeV") | ||
| 68 | + #ebounds = gammalib.GEbounds(10, e_min, e_max) | ||
| 68 | 69 | ||
| 69 | - # Generate spectral points | ||
| 70 | - spectrum = obsutils.spectrum(sim.obs(), "Crab", ebounds) | 70 | + # Setup csspec run |
| 71 | + spec = cscripts.csspec(sim.obs()) | ||
| 72 | + spec["srcname"] = "Crab" | ||
| 73 | + spec["outfile"] = "spectrum.fits" | ||
| 74 | + spec["expcube"] = "NONE" | ||
| 75 | + spec["psfcube"] = "NONE" | ||
| 76 | + spec["bkgcube"] = "NONE" | ||
| 77 | + spec["edisp"] = False | ||
| 78 | + spec["emin"] = emin | ||
| 79 | + spec["emax"] = emax | ||
| 80 | + spec["enumbins"] = enumbins | ||
| 81 | + spec["binned"] = False | ||
| 82 | + spec.run() | ||
| 71 | 83 | ||
| 72 | - # Return spectrum | 84 | + # Get copy of spectrum |
| 85 | + spectrum = spec.spectrum().copy() | ||
| 86 | + | ||
| 87 | + # Return | ||
| 73 | return spectrum | 88 | return spectrum |
| 74 | 89 | ||
| 75 | 90 | ||
| @@ -80,21 +95,66 @@ def plot_spectrum(spectrum): | @@ -80,21 +95,66 @@ def plot_spectrum(spectrum): | ||
| 80 | """ | 95 | """ |
| 81 | Plot spectrum. | 96 | Plot spectrum. |
| 82 | """ | 97 | """ |
| 98 | + # Read spectrum file | ||
| 99 | + table = spectrum.table(1) | ||
| 100 | + c_energy = table["Energy"] | ||
| 101 | + c_ed = table["ed_Energy"] | ||
| 102 | + c_eu = table["eu_Energy"] | ||
| 103 | + c_flux = table["Flux"] | ||
| 104 | + c_eflux = table["e_Flux"] | ||
| 105 | + c_ts = table["TS"] | ||
| 106 | + c_upper = table["UpperLimit"] | ||
| 107 | + | ||
| 108 | + # Initialise arrays to be filled | ||
| 109 | + energies = [] | ||
| 110 | + flux = [] | ||
| 111 | + ed_engs = [] | ||
| 112 | + eu_engs = [] | ||
| 113 | + e_flux = [] | ||
| 114 | + ul_energies = [] | ||
| 115 | + ul_ed_engs = [] | ||
| 116 | + ul_eu_engs = [] | ||
| 117 | + ul_flux = [] | ||
| 118 | + | ||
| 119 | + # Loop over rows of the file | ||
| 120 | + nrows = table.nrows() | ||
| 121 | + for row in range(nrows): | ||
| 122 | + | ||
| 123 | + # Get TS | ||
| 124 | + ts = c_ts.real(row) | ||
| 125 | + flx = c_flux.real(row) | ||
| 126 | + e_flx = c_eflux.real(row) | ||
| 127 | + | ||
| 128 | + # Switch | ||
| 129 | + if ts > 9.0 and e_flx < flx: | ||
| 130 | + | ||
| 131 | + # Add information | ||
| 132 | + energies.append(c_energy.real(row)) | ||
| 133 | + flux.append(c_flux.real(row)) | ||
| 134 | + ed_engs.append(c_ed.real(row)) | ||
| 135 | + eu_engs.append(c_eu.real(row)) | ||
| 136 | + e_flux.append(c_eflux.real(row)) | ||
| 137 | + | ||
| 138 | + # | ||
| 139 | + else: | ||
| 140 | + | ||
| 141 | + # Add information | ||
| 142 | + ul_energies.append(c_energy.real(row)) | ||
| 143 | + ul_flux.append(c_upper.real(row)) | ||
| 144 | + ul_ed_engs.append(c_ed.real(row)) | ||
| 145 | + ul_eu_engs.append(c_eu.real(row)) | ||
| 146 | + | ||
| 83 | # Create figure | 147 | # Create figure |
| 84 | - plt.figure(1) | 148 | + plt.figure() |
| 85 | plt.title("Crab spectrum") | 149 | plt.title("Crab spectrum") |
| 86 | 150 | ||
| 87 | - # Plot spectrum | ||
| 88 | - plt.loglog(spectrum['energy']['value'], | ||
| 89 | - spectrum['flux']['value'], 'ro', label='Crab') | ||
| 90 | - plt.errorbar(spectrum['energy']['value'], | ||
| 91 | - spectrum['flux']['value'], | ||
| 92 | - spectrum['flux']['ed_value'], ecolor='r') | ||
| 93 | - | ||
| 94 | - # Put labels | ||
| 95 | - plt.xlabel("Energy ("+spectrum['energy']['unit']+")") | ||
| 96 | - plt.ylabel("Flux ("+spectrum['flux']['unit']+")") | ||
| 97 | - plt.legend(loc="lower left") | 151 | + # Plot the spectrum |
| 152 | + plt.loglog() | ||
| 153 | + plt.grid() | ||
| 154 | + plt.errorbar(energies, flux, yerr=e_flux, xerr=[ed_engs, eu_engs], fmt='ro') | ||
| 155 | + plt.errorbar(ul_energies, ul_flux, xerr=[ul_ed_engs, ul_eu_engs], yerr=1.0e-11, uplims=True, fmt='ro') | ||
| 156 | + plt.xlabel("Energy (TeV)") | ||
| 157 | + plt.ylabel(r"dN/dE (erg cm$^{-2}$ s$^{-1}$)") | ||
| 98 | 158 | ||
| 99 | # Show spectrum | 159 | # Show spectrum |
| 100 | plt.show() | 160 | plt.show() |