comparison Image.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 import wcs
13 from astropy.coordinates import SkyCoord
14 from astropy.io import fits
15 from astropy.time import Time
16 from numpy import cos, pi
17 from oda_api.data_products import ImageDataProduct, PictureProduct
18 from oda_api.json import CustomJSONEncoder
19
20 if os.path.exists("hess_dl3_dr1.tar.gz") == False:
21 get_ipython().system( # noqa: F821
22 "wget https://zenodo.org/record/1421099/files/hess_dl3_dr1.tar.gz"
23 )
24 get_ipython().system("tar -zxvf hess_dl3_dr1.tar.gz") # noqa: F821
25
26 src_name = "Crab" # http://odahub.io/ontology#AstrophysicalObject
27 RA = 83.628700 # http://odahub.io/ontology#PointOfInterestRA
28 DEC = 22.014700 # http://odahub.io/ontology#PointOfInterestDEC
29 T1 = "2000-10-09T13:16:00.0" # http://odahub.io/ontology#StartTime
30 T2 = "2022-10-10T13:16:00.0" # http://odahub.io/ontology#EndTime
31 Radius = 2.5 # http://odahub.io/ontology#AngleDegrees
32 pixsize = (
33 0.1 # http://odahub.io/ontology#AngleDegrees ; oda:label "Pixel size"
34 )
35 Emin = 100.0 # http://odahub.io/ontology#Energy_GeV
36 Emax = 10000.0 # http://odahub.io/ontology#Energy_GeV
37
38 _galaxy_wd = os.getcwd()
39
40 with open("inputs.json", "r") as fd:
41 inp_dic = json.load(fd)
42 if "_data_product" in inp_dic.keys():
43 inp_pdic = inp_dic["_data_product"]
44 else:
45 inp_pdic = inp_dic
46
47 for vn, vv in inp_pdic.items():
48 if vn != "_selector":
49 globals()[vn] = type(globals()[vn])(vv)
50
51 T1 = Time(T1, format="isot", scale="utc").mjd
52 T2 = Time(T2, format="isot", scale="utc").mjd
53 message = ""
54 RA_pnts = []
55 DEC_pnts = []
56 DL3_files = []
57 OBSIDs = []
58 Tstart = []
59 Tstop = []
60 flist = os.listdir("data")
61 for f in flist:
62 if f[-7:] == "fits.gz":
63 DL3_files.append(f)
64 OBSIDs.append(int(f[20:26]))
65 hdul = fits.open("data/" + f)
66 RA_pnts.append(float(hdul[1].header["RA_PNT"]))
67 DEC_pnts.append(float(hdul[1].header["DEC_PNT"]))
68 Tstart.append(
69 Time(
70 hdul[1].header["DATE-OBS"] + "T" + hdul[1].header["TIME-OBS"],
71 format="isot",
72 scale="utc",
73 ).mjd
74 )
75 Tstop.append(
76 Time(
77 hdul[1].header["DATE-END"] + "T" + hdul[1].header["TIME-END"],
78 format="isot",
79 scale="utc",
80 ).mjd
81 )
82 hdul.close()
83
84 Coords_s = SkyCoord(RA, DEC, unit="degree")
85 COORDS_pnts = SkyCoord(RA_pnts, DEC_pnts, unit="degree")
86 seps = COORDS_pnts.separation(Coords_s).deg
87
88 mask = np.where((seps < Radius) & (Tstart > T1) & (Tstop < T2))[0]
89 OBSlist = []
90 for i in mask:
91 OBSlist.append(DL3_files[i])
92 if len(OBSlist) == 0:
93 message = "No data found"
94 raise RuntimeError("No data found")
95 message
96
97 cdec = cos(DEC * pi / 180.0)
98 Npix = int(4 * Radius / pixsize) + 1
99 RA_bins = np.linspace(RA - Radius / cdec, RA + Radius / cdec, Npix + 1)
100 DEC_bins = np.linspace(DEC - Radius, DEC + Radius, Npix + 1)
101 image = np.zeros((Npix, Npix))
102 for f in OBSlist:
103 hdul = fits.open("data/" + f)
104 ev = hdul["EVENTS"].data
105 ev_ra = ev["RA"]
106 ev_dec = ev["DEC"]
107 ev_en = ev["ENERGY"]
108 ev_time = ev["TIME"]
109 h = np.histogram2d(ev_ra, ev_dec, bins=[RA_bins, DEC_bins])
110 image += h[0]
111 hdul.close()
112
113 plt.imshow(
114 np.flip(image, axis=1),
115 extent=(RA_bins[-1], RA_bins[0], DEC_bins[0], DEC_bins[-1]),
116 origin="lower",
117 )
118 plt.colorbar()
119
120 plt.xlabel("RA, degrees")
121 plt.ylabel("DEC,degrees")
122 plt.savefig("Image.png", format="png")
123
124 # Create a new WCS object. The number of axes must be set
125 # from the start
126 w = wcs.WCS(naxis=2)
127
128 # Set up an "Airy's zenithal" projection
129 # Vector properties may be set with Python lists, or Numpy arrays
130 w.wcs.crpix = [Npix / 2.0, Npix / 2.0]
131 w.wcs.cdelt = np.array([pixsize / cdec, pixsize])
132 w.wcs.crval = [RA, DEC]
133 w.wcs.ctype = ["RA---AIR", "DEC--AIR"]
134 w.wcs.set_pv([(2, 1, 45.0)])
135
136 # Now, write out the WCS object as a FITS header
137 header = w.to_header()
138
139 # header is an astropy.io.fits.Header object. We can use it to create a new
140 # PrimaryHDU and write it to a file.
141 hdu = fits.PrimaryHDU(image, header=header)
142 hdu.writeto("Image.fits", overwrite=True)
143 hdu = fits.open("Image.fits")
144 im = hdu[0].data
145 from astropy.wcs import WCS
146
147 wcs = WCS(hdu[0].header)
148 plt.subplot(projection=wcs)
149 plt.imshow(im, origin="lower")
150 plt.grid(color="white", ls="solid")
151 plt.xlabel("RA")
152 plt.ylabel("Dec")
153
154 bin_image = PictureProduct.from_file("Image.png")
155 fits_image = ImageDataProduct.from_fits_file("Image.fits")
156
157 picture = bin_image # http://odahub.io/ontology#ODAPictureProduct
158 image = fits_image # http://odahub.io/ontology#Image
159
160 # output gathering
161 _galaxy_meta_data = {}
162 _oda_outs = []
163 _oda_outs.append(("out_Image_picture", "picture_galaxy.output", picture))
164 _oda_outs.append(("out_Image_image", "image_galaxy.output", image))
165
166 for _outn, _outfn, _outv in _oda_outs:
167 _galaxy_outfile_name = os.path.join(_galaxy_wd, _outfn)
168 if isinstance(_outv, str) and os.path.isfile(_outv):
169 shutil.move(_outv, _galaxy_outfile_name)
170 _galaxy_meta_data[_outn] = {"ext": "_sniff_"}
171 elif getattr(_outv, "write_fits_file", None):
172 _outv.write_fits_file(_galaxy_outfile_name)
173 _galaxy_meta_data[_outn] = {"ext": "fits"}
174 elif getattr(_outv, "write_file", None):
175 _outv.write_file(_galaxy_outfile_name)
176 _galaxy_meta_data[_outn] = {"ext": "_sniff_"}
177 else:
178 with open(_galaxy_outfile_name, "w") as fd:
179 json.dump(_outv, fd, cls=CustomJSONEncoder)
180 _galaxy_meta_data[_outn] = {"ext": "json"}
181
182 with open(os.path.join(_galaxy_wd, "galaxy.json"), "w") as fd:
183 json.dump(_galaxy_meta_data, fd)
184 print("*** Job finished successfully ***")