comparison Spectrum.py @ 0:02e4bb4fa10c draft

planemo upload for repository https://github.com/esg-epfl-apc/tools-astro/tree/main/tools commit 2991f65b25d4e6d1b69458603fce917adff40f94
author astroteam
date Mon, 19 Feb 2024 10:56:44 +0000
parents
children 593c4b45eda5
comparison
equal deleted inserted replaced
-1:000000000000 0:02e4bb4fa10c
1 #!/usr/bin/env python
2 # coding: utf-8
3
4 # flake8: noqa
5
6 import json
7 import os
8 import shutil
9
10 import matplotlib.pyplot as plt
11 import numpy as np
12 from astropy.coordinates import SkyCoord
13 from astropy.io import fits
14 from astropy.time import Time
15 from numpy import log10, sqrt
16 from oda_api.data_products import ODAAstropyTable, PictureProduct
17 from oda_api.json import CustomJSONEncoder
18
19 if os.path.exists("hess_dl3_dr1.tar.gz") == False:
20 get_ipython().system( # noqa: F821
21 "wget https://zenodo.org/record/1421099/files/hess_dl3_dr1.tar.gz"
22 )
23 get_ipython().system("tar -zxvf hess_dl3_dr1.tar.gz") # noqa: F821
24
25 # src_name='Crab' #http://odahub.io/ontology#AstrophysicalObject
26 # RA = 83.628700 # http://odahub.io/ontology#PointOfInterestRA
27 # DEC = 22.014700 # http://odahub.io/ontology#PointOfInterestDEC
28 src_name = "PKS 2155-304"
29 RA = 329.716938 # http://odahub.io/ontology#PointOfInterestRA
30 DEC = -30.225588 # http://odahub.io/ontology#PointOfInterestDEC
31
32 T1 = "2000-10-09T13:16:00.0" # http://odahub.io/ontology#StartTime
33 T2 = "2022-10-10T13:16:00.0" # http://odahub.io/ontology#EndTime
34 Radius = 2.5 # http://odahub.io/ontology#AngleDegrees
35 R_s = 0.2 # http://odahub.io/ontology#AngleDegrees
36
37 Emin = 100.0 # http://odahub.io/ontology#Energy_GeV
38 Emax = 10000.0 # http://odahub.io/ontology#Energy_GeV
39 NEbins = 20 # http://odahub.io/ontology#Integer
40
41 _galaxy_wd = os.getcwd()
42
43 with open("inputs.json", "r") as fd:
44 inp_dic = json.load(fd)
45 if "_data_product" in inp_dic.keys():
46 inp_pdic = inp_dic["_data_product"]
47 else:
48 inp_pdic = inp_dic
49
50 for vn, vv in inp_pdic.items():
51 if vn != "_selector":
52 globals()[vn] = type(globals()[vn])(vv)
53
54 Emin = Emin / 1e3
55 Emax = Emax / 1e3
56 Ebins = np.logspace(log10(Emin), log10(Emax), NEbins + 1)
57 Ebins
58 Emin = Ebins[:-1]
59 Emax = Ebins[1:]
60 Emean = sqrt(Emin * Emax)
61 lgEmean = log10(Emean)
62
63 T1 = Time(T1, format="isot", scale="utc").mjd
64 T2 = Time(T2, format="isot", scale="utc").mjd
65 message = ""
66 RA_pnts = []
67 DEC_pnts = []
68 DL3_files = []
69 OBSIDs = []
70 Tstart = []
71 Tstop = []
72 flist = os.listdir("data")
73 for f in flist:
74 if f[-7:] == "fits.gz":
75 DL3_files.append(f)
76 OBSIDs.append(int(f[20:26]))
77 hdul = fits.open("data/" + f)
78 RA_pnts.append(float(hdul[1].header["RA_PNT"]))
79 DEC_pnts.append(float(hdul[1].header["DEC_PNT"]))
80 Tstart.append(
81 Time(
82 hdul[1].header["DATE-OBS"] + "T" + hdul[1].header["TIME-OBS"],
83 format="isot",
84 scale="utc",
85 ).mjd
86 )
87 Tstop.append(
88 Time(
89 hdul[1].header["DATE-END"] + "T" + hdul[1].header["TIME-END"],
90 format="isot",
91 scale="utc",
92 ).mjd
93 )
94 hdul.close()
95
96 Coords_s = SkyCoord(RA, DEC, unit="degree")
97 COORDS_pnts = SkyCoord(RA_pnts, DEC_pnts, unit="degree")
98 seps = COORDS_pnts.separation(Coords_s).deg
99
100 mask = np.where((seps < Radius) & (Tstart > T1) & (Tstop < T2))[0]
101 OBSlist = []
102 for i in mask:
103 OBSlist.append(DL3_files[i])
104 if len(OBSlist) == 0:
105 message = "No data found"
106 raise RuntimeError("No data found")
107 message
108
109 cts_s = np.zeros(NEbins)
110 cts_b = np.zeros(NEbins)
111 Expos = np.zeros(NEbins)
112 for f in OBSlist:
113 hdul = fits.open("data/" + f)
114 RA_pnt = hdul[1].header["RA_PNT"]
115 DEC_pnt = hdul[1].header["DEC_PNT"]
116 Texp = hdul[1].header["LIVETIME"]
117 dRA = RA - RA_pnt
118 dDEC = DEC - DEC_pnt
119 RA_b = RA_pnt - dRA
120 DEC_b = DEC_pnt - dDEC
121 Coords_b = SkyCoord(RA_b, DEC_b, unit="degree")
122 Coords_pnt = SkyCoord(RA_pnt, DEC_pnt, unit="degree")
123 dist = Coords_pnt.separation(Coords_s).deg
124
125 ev = hdul["EVENTS"].data
126 ev_ra = ev["RA"]
127 ev_dec = ev["DEC"]
128 ev_en = ev["ENERGY"]
129 ev_time = ev["TIME"]
130 ev_coords = SkyCoord(ev_ra, ev_dec, unit="degree")
131 sep_s = ev_coords.separation(Coords_s).deg
132 sep_b = ev_coords.separation(Coords_b).deg
133
134 hdu = hdul["AEFF"].data
135 EEmin = hdu["ENERG_LO"][0]
136 EEmax = hdu["ENERG_HI"][0]
137 lgEE = log10(sqrt(EEmin * EEmax))
138 lgAA = log10(hdu["EFFAREA"][0] + 1e-10)
139 Thmin = hdu["THETA_LO"][0]
140 Thmax = hdu["THETA_HI"][0]
141 ind = np.argmin((Thmin - dist) ** 2)
142 Expos += 10 ** (np.interp(lgEmean, lgEE, lgAA[ind])) * Texp
143 mask = sep_s < R_s
144 cts_s += np.histogram(ev_en[mask], bins=Ebins)[0]
145 mask = sep_b < R_s
146 cts_b += np.histogram(ev_en[mask], bins=Ebins)[0]
147 hdul.close()
148
149 flux = (cts_s - cts_b) / (Emax - Emin) * Emax * Emin / (Expos * 1e4)
150 flux_err = sqrt(cts_s + cts_b) / (Emax - Emin) * Emax * Emin / (Expos * 1e4)
151 plt.errorbar(Emean, flux, yerr=flux_err, xerr=[Emean - Emin, Emax - Emean])
152 plt.xscale("log")
153 plt.yscale("log")
154 plt.xlabel("$E$, TeV")
155 plt.ylabel("$E^2 dN/dE$, erg/(cm$^2$s)")
156 plt.savefig("Spectrum.png", format="png")
157
158 bin_image = PictureProduct.from_file("Spectrum.png")
159 from astropy.table import Table
160
161 data = [Emean, Emin, Emax, flux, flux_err, cts_s, cts_b, Expos * 1e4]
162 names = (
163 "Emean[TeV]",
164 "Emin[TeV]",
165 "Emax[TeV]",
166 "Flux[TeV/cm2s]",
167 "Flux_error[TeV/cm2s]",
168 "Cts_s",
169 "Cts_b",
170 "Exposure[cm2s]",
171 )
172 spec = ODAAstropyTable(Table(data, names=names))
173
174 picture_png = bin_image # http://odahub.io/ontology#ODAPictureProduct
175 spectrum_astropy_table = spec # http://odahub.io/ontology#ODAAstropyTable
176
177 # output gathering
178 _galaxy_meta_data = {}
179 _oda_outs = []
180 _oda_outs.append(
181 ("out_Spectrum_picture_png", "picture_png_galaxy.output", picture_png)
182 )
183 _oda_outs.append(
184 (
185 "out_Spectrum_spectrum_astropy_table",
186 "spectrum_astropy_table_galaxy.output",
187 spectrum_astropy_table,
188 )
189 )
190
191 for _outn, _outfn, _outv in _oda_outs:
192 _galaxy_outfile_name = os.path.join(_galaxy_wd, _outfn)
193 if isinstance(_outv, str) and os.path.isfile(_outv):
194 shutil.move(_outv, _galaxy_outfile_name)
195 _galaxy_meta_data[_outn] = {"ext": "_sniff_"}
196 elif getattr(_outv, "write_fits_file", None):
197 _outv.write_fits_file(_galaxy_outfile_name)
198 _galaxy_meta_data[_outn] = {"ext": "fits"}
199 elif getattr(_outv, "write_file", None):
200 _outv.write_file(_galaxy_outfile_name)
201 _galaxy_meta_data[_outn] = {"ext": "_sniff_"}
202 else:
203 with open(_galaxy_outfile_name, "w") as fd:
204 json.dump(_outv, fd, cls=CustomJSONEncoder)
205 _galaxy_meta_data[_outn] = {"ext": "json"}
206
207 with open(os.path.join(_galaxy_wd, "galaxy.json"), "w") as fd:
208 json.dump(_galaxy_meta_data, fd)
209 print("*** Job finished successfully ***")