Mercurial > repos > astroteam > hess_astro_tool
comparison Image.py @ 1:593c4b45eda5 draft default tip
planemo upload for repository https://github.com/esg-epfl-apc/tools-astro/tree/main/tools commit 2f23ec010eab8d33d2760f061286756e17015af7
author | astroteam |
---|---|
date | Thu, 18 Apr 2024 09:26:15 +0000 |
parents | 02e4bb4fa10c |
children |
comparison
equal
deleted
inserted
replaced
0:02e4bb4fa10c | 1:593c4b45eda5 |
---|---|
12 from astropy import wcs | 12 from astropy import wcs |
13 from astropy.coordinates import SkyCoord | 13 from astropy.coordinates import SkyCoord |
14 from astropy.io import fits | 14 from astropy.io import fits |
15 from astropy.time import Time | 15 from astropy.time import Time |
16 from numpy import cos, pi | 16 from numpy import cos, pi |
17 from oda_api.api import ProgressReporter | |
17 from oda_api.data_products import ImageDataProduct, PictureProduct | 18 from oda_api.data_products import ImageDataProduct, PictureProduct |
18 from oda_api.json import CustomJSONEncoder | 19 from oda_api.json import CustomJSONEncoder |
20 | |
21 pr = ProgressReporter() | |
22 pr.report_progress(stage="Progress", progress=5.0) | |
19 | 23 |
20 if os.path.exists("hess_dl3_dr1.tar.gz") == False: | 24 if os.path.exists("hess_dl3_dr1.tar.gz") == False: |
21 get_ipython().system( # noqa: F821 | 25 get_ipython().system( # noqa: F821 |
22 "wget https://zenodo.org/record/1421099/files/hess_dl3_dr1.tar.gz" | 26 "wget https://zenodo.org/record/1421099/files/hess_dl3_dr1.tar.gz" |
23 ) | 27 ) |
26 src_name = "Crab" # http://odahub.io/ontology#AstrophysicalObject | 30 src_name = "Crab" # http://odahub.io/ontology#AstrophysicalObject |
27 RA = 83.628700 # http://odahub.io/ontology#PointOfInterestRA | 31 RA = 83.628700 # http://odahub.io/ontology#PointOfInterestRA |
28 DEC = 22.014700 # http://odahub.io/ontology#PointOfInterestDEC | 32 DEC = 22.014700 # http://odahub.io/ontology#PointOfInterestDEC |
29 T1 = "2000-10-09T13:16:00.0" # http://odahub.io/ontology#StartTime | 33 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 | 34 T2 = "2022-10-10T13:16:00.0" # http://odahub.io/ontology#EndTime |
31 Radius = 2.5 # http://odahub.io/ontology#AngleDegrees | 35 Radius = 1.0 # http://odahub.io/ontology#AngleDegrees |
32 pixsize = ( | 36 pixsize = ( |
33 0.1 # http://odahub.io/ontology#AngleDegrees ; oda:label "Pixel size" | 37 0.05 # http://odahub.io/ontology#AngleDegrees ; oda:label "Pixel size" |
34 ) | 38 ) |
35 Emin = 100.0 # http://odahub.io/ontology#Energy_GeV | 39 Emin = 1 # http://odahub.io/ontology#Energy_TeV |
36 Emax = 10000.0 # http://odahub.io/ontology#Energy_GeV | 40 Emax = 100.0 # http://odahub.io/ontology#Energy_TeV |
37 | 41 |
38 _galaxy_wd = os.getcwd() | 42 _galaxy_wd = os.getcwd() |
39 | 43 |
40 with open("inputs.json", "r") as fd: | 44 with open("inputs.json", "r") as fd: |
41 inp_dic = json.load(fd) | 45 inp_dic = json.load(fd) |
93 message = "No data found" | 97 message = "No data found" |
94 raise RuntimeError("No data found") | 98 raise RuntimeError("No data found") |
95 message | 99 message |
96 | 100 |
97 cdec = cos(DEC * pi / 180.0) | 101 cdec = cos(DEC * pi / 180.0) |
98 Npix = int(4 * Radius / pixsize) + 1 | 102 Npix = int(2 * Radius / pixsize) + 1 |
99 RA_bins = np.linspace(RA - Radius / cdec, RA + Radius / cdec, Npix + 1) | 103 RA_bins = np.linspace( |
100 DEC_bins = np.linspace(DEC - Radius, DEC + Radius, Npix + 1) | 104 RA - Npix * pixsize / cdec / 2, RA + Npix * pixsize / cdec / 2, Npix + 1 |
105 ) | |
106 DEC_bins = np.linspace( | |
107 DEC - Npix * pixsize / 2, DEC + Npix * pixsize / 2, Npix + 1 | |
108 ) | |
109 | |
101 image = np.zeros((Npix, Npix)) | 110 image = np.zeros((Npix, Npix)) |
102 for f in OBSlist: | 111 for f in OBSlist: |
103 hdul = fits.open("data/" + f) | 112 hdul = fits.open("data/" + f) |
104 ev = hdul["EVENTS"].data | 113 ev = hdul["EVENTS"].data |
105 ev_ra = ev["RA"] | 114 ev_ra = ev["RA"] |
106 ev_dec = ev["DEC"] | 115 ev_dec = ev["DEC"] |
107 ev_en = ev["ENERGY"] | 116 ev_en = ev["ENERGY"] |
108 ev_time = ev["TIME"] | 117 ev_time = ev["TIME"] |
109 h = np.histogram2d(ev_ra, ev_dec, bins=[RA_bins, DEC_bins]) | 118 mask = (ev_en > Emin) & (ev_en < Emax) |
119 h = np.histogram2d(ev_ra[mask], ev_dec[mask], bins=[RA_bins, DEC_bins]) | |
110 image += h[0] | 120 image += h[0] |
111 hdul.close() | 121 hdul.close() |
112 | 122 |
123 image = np.transpose(image) | |
124 | |
113 plt.imshow( | 125 plt.imshow( |
114 np.flip(image, axis=1), | 126 image, |
115 extent=(RA_bins[-1], RA_bins[0], DEC_bins[0], DEC_bins[-1]), | 127 extent=(RA_bins[0], RA_bins[-1], DEC_bins[0], DEC_bins[-1]), |
116 origin="lower", | 128 origin="lower", |
117 ) | 129 ) |
118 plt.colorbar() | 130 plt.colorbar() |
131 | |
132 plt.xlim(*plt.xlim()[::-1]) | |
119 | 133 |
120 plt.xlabel("RA, degrees") | 134 plt.xlabel("RA, degrees") |
121 plt.ylabel("DEC,degrees") | 135 plt.ylabel("DEC,degrees") |
122 plt.savefig("Image.png", format="png") | |
123 | 136 |
124 # Create a new WCS object. The number of axes must be set | 137 # Create a new WCS object. The number of axes must be set |
125 # from the start | 138 # from the start |
126 w = wcs.WCS(naxis=2) | 139 w = wcs.WCS(naxis=2) |
127 | 140 |
128 # Set up an "Airy's zenithal" projection | 141 w.wcs.ctype = ["RA---CAR", "DEC--CAR"] |
129 # Vector properties may be set with Python lists, or Numpy arrays | 142 # we need a Plate carrée (CAR) projection since histogram is binned by ra-dec |
130 w.wcs.crpix = [Npix / 2.0, Npix / 2.0] | 143 # the peculiarity here is that CAR projection produces rectilinear grid only if CRVAL2==0 |
131 w.wcs.cdelt = np.array([pixsize / cdec, pixsize]) | 144 # also, we will follow convention of RA increasing from right to left (CDELT1<0, need to flip an input image) |
132 w.wcs.crval = [RA, DEC] | 145 # otherwise, aladin-lite doesn't show it |
133 w.wcs.ctype = ["RA---AIR", "DEC--AIR"] | 146 w.wcs.crval = [RA, 0] |
134 w.wcs.set_pv([(2, 1, 45.0)]) | 147 w.wcs.crpix = [Npix / 2.0 + 0.5, 0.5 - DEC_bins[0] / pixsize] |
135 | 148 w.wcs.cdelt = np.array([-pixsize / cdec, pixsize]) |
136 # Now, write out the WCS object as a FITS header | 149 |
137 header = w.to_header() | 150 header = w.to_header() |
138 | 151 |
139 # header is an astropy.io.fits.Header object. We can use it to create a new | 152 hdu = fits.PrimaryHDU(np.flip(image, axis=1), header=header) |
140 # PrimaryHDU and write it to a file. | |
141 hdu = fits.PrimaryHDU(image, header=header) | |
142 hdu.writeto("Image.fits", overwrite=True) | 153 hdu.writeto("Image.fits", overwrite=True) |
143 hdu = fits.open("Image.fits") | 154 hdu = fits.open("Image.fits") |
144 im = hdu[0].data | 155 im = hdu[0].data |
145 from astropy.wcs import WCS | 156 wcs1 = wcs.WCS(hdu[0].header) |
146 | 157 ax = plt.subplot(projection=wcs1) |
147 wcs = WCS(hdu[0].header) | |
148 plt.subplot(projection=wcs) | |
149 plt.imshow(im, origin="lower") | 158 plt.imshow(im, origin="lower") |
159 plt.colorbar(label="Counts per pixel") | |
160 plt.scatter( | |
161 [RA], [DEC], marker="x", color="white", transform=ax.get_transform("world") | |
162 ) | |
163 plt.text( | |
164 RA, | |
165 DEC + 0.5 * pixsize, | |
166 src_name, | |
167 color="white", | |
168 transform=ax.get_transform("world"), | |
169 ) | |
170 | |
150 plt.grid(color="white", ls="solid") | 171 plt.grid(color="white", ls="solid") |
151 plt.xlabel("RA") | 172 plt.xlabel("RA") |
152 plt.ylabel("Dec") | 173 plt.ylabel("Dec") |
174 pr.report_progress(stage="Progress", progress=100.0) | |
175 plt.savefig("Image.png", format="png") | |
153 | 176 |
154 bin_image = PictureProduct.from_file("Image.png") | 177 bin_image = PictureProduct.from_file("Image.png") |
155 fits_image = ImageDataProduct.from_fits_file("Image.fits") | 178 fits_image = ImageDataProduct.from_fits_file("Image.fits") |
156 | 179 |
157 picture = bin_image # http://odahub.io/ontology#ODAPictureProduct | 180 png = bin_image # http://odahub.io/ontology#ODAPictureProduct |
158 image = fits_image # http://odahub.io/ontology#Image | 181 fits = fits_image # http://odahub.io/ontology#Image |
159 | 182 |
160 # output gathering | 183 # output gathering |
161 _galaxy_meta_data = {} | 184 _galaxy_meta_data = {} |
162 _oda_outs = [] | 185 _oda_outs = [] |
163 _oda_outs.append(("out_Image_picture", "picture_galaxy.output", picture)) | 186 _oda_outs.append(("out_Image_png", "png_galaxy.output", png)) |
164 _oda_outs.append(("out_Image_image", "image_galaxy.output", image)) | 187 _oda_outs.append(("out_Image_fits", "fits_galaxy.output", fits)) |
165 | 188 |
166 for _outn, _outfn, _outv in _oda_outs: | 189 for _outn, _outfn, _outv in _oda_outs: |
167 _galaxy_outfile_name = os.path.join(_galaxy_wd, _outfn) | 190 _galaxy_outfile_name = os.path.join(_galaxy_wd, _outfn) |
168 if isinstance(_outv, str) and os.path.isfile(_outv): | 191 if isinstance(_outv, str) and os.path.isfile(_outv): |
169 shutil.move(_outv, _galaxy_outfile_name) | 192 shutil.move(_outv, _galaxy_outfile_name) |