from rgbmaker import RGBMaker as rgbmaker
from rgbmaker.imgplt import pl_RGB, to_pixel, pl_RGBC, overlayc, overlayo, sqrt, save_fig
from rgbmaker.tgss_spidx import find_spidx
from matplotlib import pyplot as plt
from regions import PixCoord, EllipsePixelRegion
from astropy.coordinates import Angle, SkyCoord
from astropy import units as ut
from matplotlib.collections import PatchCollection
import matplotlib.patches as mpatches
import numpy as np
from scipy.ndimage import gaussian_filter
import urllib
from time import perf_counter
import sys
[docs]def query(name="", position="", radius=float(0.12), archives=1,
imagesopt=2, kind='base64', spidx_file=None, px=480, annot=True):
"""
.. jupyter-execute::
from rgbmaker.fetch import query
query(name='Avi', position='3C 33.1', radius=0.12, kind='plot')
*Parameters*
:name:
(Optional) (default=Anonymous) (string)
Your name will be displayed on the image enabling mentors, professors,
fellow students to be able to recognize your work. Credit is important!
:position:
(Required)
The object name or the coordinates of the object in the FK5 (J2000) system.
Ex: "14 09 48.86 -03 02 32.6", M87, NGC1243, without quotes.
:radius:
(Required) (default = 0.12) (float)
The size of the image in degrees, this size will be used for the
`field of view <https://en.wikipedia.org/wiki/Field_of_view/>`_ in the resultant image.
For reference, in the night sky, the moon is about 0.52 degrees across.
:imagesopt:
(default=2)(string)(values=1,2,3)
This dropdown gives you a choice of the composite images you want to create.
**IOU ROR Optical (option = 1)**
*This option returns four images.*
1. There are two `ROR <https://radathomeindia.org/rgbmaker-info#what-is-iou-ror-and-rgb>_`
*(Radio (TGSS ADR1) - Optical (DSS2Red) - Radio (NVSS))* images.
One with TGSS Contours and another with NVSS Contours.
2. The third image is an `IOU <https://radathomeindia.org/rgbmaker-info#what-is-iou-ror-and-rgb>_`
*(Infrared (WISE 22) - Optical (DSS2 Red) - Ultraviolet (Galex Near UV))* with TGSS Contours.
3. The final RGB image is an optical image with *(DSS2IR - DSS2Red - DSS2Blue)* with TGGSS Contours.
**Composite Contours on DSS2R (option = 2)**
*This option returns two images.*
1. The first is a `ROR <https://radathomeindia.org/rgbmaker-info#what-is-iou-ror-and-rgb>_` Image with TGSS contours.
The various symbol seen on the image is the `catalog <https://en.wikipedia.org/wiki/List_of_astronomical_catalogues/>`_
data of the respective survey.
2. The second image is a composite image with DSS2Red background and contours of various
radio surveys like TGSS, NVSS, and VLA First (if available).
:archives:
(default=1)(string)
This dropdown currently offers access to the NVAS image archive. Selecting this option will
return the top 5 results from NVAS (if exists). These can be downloaded as .imfits files (open with DS9)
by using save as an option when right-clicked.
:kind:
(default='base64')
choose from base64, plot, png, jpg to show base64 of resultant image, plot on output, save png/jpg files
:spidx_file:
(Default=None)
enter path to spidx.fits file that contains spectral index data (see example 1).
:px:
(default=480)
change pixel value for the final resulatant image.
:annot:
(default=True)
remove any annotation by setting this to False.
"""
fetch_q = rgbmaker(name=name, position=position,
radius=radius, archives=archives, imagesopt=imagesopt)
name = fetch_q.name
start = perf_counter()
fetch_q.px = px
val = fetch_q.submit_query()
level_contour=4
if fetch_q.server_down:
return fetch_q.throw_output()
else:
if fetch_q.c:
fetch_q.otext.append({'Target center': fetch_q.c.to_string('hmsdms')})
if fetch_q.imagesopt == 1 and fetch_q.c:
# --- using variables for readability -#--#
tgss, dss2r, nvss, w22, gnuv, dss2i, dss2b = val['tgss']['data'], val[
'dss2r']['data'], val['nvss']['data'], val['w22']['data'], val[
'gnuv']['data'], val['dss2ir']['data'], val['dss2b']['data']
# --- creating images ----------#--#
img1, lvlc1 = overlayc(tgss, dss2r, nvss, nvss, level_contour, 0.0015) # NVSS
img2, lvlc2 = overlayc(tgss, dss2r, nvss, tgss, level_contour, 0.015) # TGSS
img3 = overlayo(w22,dss2r,gnuv, kind='IOU')
img4 = overlayo(dss2i,dss2r,dss2b, kind='Optical')
if lvlc2 is not None:
fetch_q.otext.append({'TGSS contour ': (str(np.round(lvlc2, 3)))}) # TGSS
if lvlc1 is not None:
fetch_q.otext.append({'NVSS contour ': (str(np.round(lvlc1, 4)))}) # NVSS
# -------- plotting first plot -------------#--#
plt.ioff()
fig = plt.figure(figsize=(20, 20))
pl_RGBC(1, 2, 1, fetch_q.wcs, val['nvss']['data'], lvlc1, img1, fig, name,annot=annot)
pl_RGBC(1, 2, 2, fetch_q.wcs, val['tgss']['data'], lvlc2, img2, fig, name,annot=annot)
plt.subplots_adjust(wspace=0.01, hspace=0.01)
#-------- Saving first plot ------#--#
string = save_fig(plt, fig, kind)
fetch_q.uri.append(
{'img1': 'data:image/png;base64,' + urllib.parse.quote(string)})
#-------- plotting second plot -----#--#
plt.ioff()
fig1 = plt.figure(figsize=(20, 20))
pl_RGBC(1, 2, 1, fetch_q.wcs, val['tgss']['data'], lvlc2, img3, fig1, name, pkind='iou',annot=annot)
pl_RGBC(1, 2, 2, fetch_q.wcs,
val['tgss']['data'], lvlc2, img4, fig1, name, pkind='iou',annot=annot)
plt.subplots_adjust(wspace=0.01, hspace=0.01)
#-------- Saving second plot ------#--#
string1 = save_fig(plt, fig1, kind)
fetch_q.uri.append(
{'img2': 'data:image/png;base64,' + urllib.parse.quote(string1)})
#-------- Output for success -----#--#
time_taken = perf_counter()-start
fetch_q.info = 'completed in ' + str(np.round(time_taken, 3))+". "
fetch_q.status = "success"
elif fetch_q.imagesopt == 2 and fetch_q.c:
tgss, dss2r, nvss, first = val['tgss']['data'], val[
'dss2r']['data'], val['nvss']['data'], val['first']['data']
# --- plots initialization ------#--#
#img1, lvlc1 = overlayc(tgss, dss2r, nvss, tgss, level_contour, 0.015)
if tgss.max() > 0.015:
lvlct = np.arange(0.015, tgss.max(), ((tgss.max() - 0.015)/level_contour))
fetch_q.otext.append({'TGSS contour ': (str(np.round(lvlct.tolist(), 3)))})
else:
lvlct = None
if first.max() > 0.0005:
lvlcf = np.arange(0.0005, first.max(),
((first.max() - 0.0005)/level_contour))
fetch_q.otext.append({'FIRST contour ': (str(np.round(lvlcf, 4)))})
else:
lvlcf = None
if nvss.max() > 0.0015:
lvlcn = np.arange(0.0015, nvss.max(), ((nvss.max() - 0.0015)/level_contour))
fetch_q.otext.append({'NVSS contour ': (str(np.round(lvlcn.tolist(), 4)))})
else:
lvlcn = None
#--- plotting --------------------#--#
plt.ioff()
fig = plt.figure(figsize=(20, 20))
title = ' TGSS(GMRT)-NVSS(VLA)-DSS2R(DSS)'
dss2r = sqrt(dss2r, scale_min=np.percentile(
np.unique(dss2r), 1.), scale_max=np.percentile(np.unique(dss2r), 100.))
#--- RGBC plot -------------------#--#
ax1 = fig.add_subplot(1,2,1, projection=fetch_q.wcs)
pl_RGB(ax1, dss2r, title, name, annot)
#--- vizier access ---------------#--
# TODO : return table in output
tgss_viz, nvss_viz = fetch_q.vz_query()
if tgss_viz is not None:
tmaj, tmin, tPA, tcen, s_tgss, es_tgss = tgss_viz
if nvss_viz is not None:
nmaj, nmin, nPA, ncen, s_nvss, es_nvss = nvss_viz
try:
try:
patch1 = []
for i in range(len(tcen[0])):
x, y = tcen[0][i], tcen[1][i]
ce = PixCoord(x, y)
a = to_pixel(tmaj[i], fetch_q.r, px)
b = to_pixel(tmin[i], fetch_q.r, px)
theta =Angle(tPA[i], 'deg') + 90*ut.deg
reg = EllipsePixelRegion(center=ce, width=a, height=b, angle=theta)
ellipse = reg.as_artist(facecolor='none', edgecolor='magenta', lw=2)
patch1.append(ellipse)
#kwar = dict(arrowprops=dict(arrowstyle="->", ec=".5",
# relpos=(0.5, 0.5)),
# bbox=dict(boxstyle="round", ec="none", fc="w"))
ax1.annotate(i+1, xy=(x,y),
xytext=(0, 0), textcoords="offset points", color="magenta")
#ha="right", va="top")#, **kwar)
fetch_q.otext.append({f'S_TGSS-{i+1}': f'{s_tgss.tolist()[i]} {str(s_tgss.unit)}'})
fetch_q.otext.append({f'S_TGSS_e-{i+1}': f'{np.round(es_tgss.tolist()[i],3)} {str(es_tgss.unit)}'})
tgss_catalog = PatchCollection(
patch1, edgecolor='magenta', facecolor='None')
ax1.add_collection(tgss_catalog)
finally:
patch2 = []
for i in range(len(ncen[0])):
x, y = ncen[0][i], ncen[1][i]
ce = PixCoord(x, y)
a = to_pixel(nmaj[i], fetch_q.r, px)
b = to_pixel(nmin[i], fetch_q.r, px)
if nPA[i] != 0 and nPA[i] != '--':
theta = Angle(nPA[i], 'deg') + 90*ut.deg
else:
theta = 0*ut.deg + 90*ut.deg
reg = EllipsePixelRegion(
center=ce, width=a, height=b, angle=theta)
ellipse = reg.as_artist(
facecolor='none', edgecolor='cyan', lw=2)
patch2.append(ellipse)
ax1.annotate(i+1, xy=(x, y),
xytext=(0, 0), textcoords="offset points", color="cyan",
ha="right", va="top")#, **kwar)
fetch_q.otext.append({f'S_NVSS-{i+1}': f'{s_nvss.tolist()[i]} {str(s_nvss.unit)}'})
fetch_q.otext.append({f'S_NVSS_e-{i+1}': f'{np.round(es_nvss.tolist()[i],3)} {str(es_nvss.unit)}'})
nvss_catalog = PatchCollection(
patch2, edgecolor='cyan', facecolor='None')
ax1.add_collection(nvss_catalog)
except:
fetch_q.info = "catalog data missing"
finally:
#ax1.legend(framealpha=0.0, labelcolor='white')
if spidx_file is not None:
kwargs = dict(arrowprops=dict(arrowstyle="->", ec=".5",
relpos=(0.5, 0.5)),
bbox=dict(boxstyle="round", ec="none", fc="w"))
xi, yi, spidx = find_spidx(spidx_file, fetch_q.c, fetch_q.r)
for ien in range(len(xi)):
#print(ien)
Xi, Yi = fetch_q.wcs.world_to_pixel(SkyCoord(xi[ien]*ut.deg, yi[ien]*ut.deg))
#print(Xi,Yi, spidx)
ax1.annotate(f'{spidx[ien]}', xy=(Xi, Yi),
xytext=(1, -40), textcoords="offset points",
ha="right", va="top", **kwargs)
#-------- single survey plot ---------#--#
dss2r = sqrt(dss2r, scale_min=np.percentile(
np.unique(dss2r), 1.), scale_max=np.percentile(np.unique(dss2r), 100.))
ax2 = fig.add_subplot(1, 2, 2, projection=fetch_q.wcs)
pl_RGB(ax2, dss2r, title='TGSS(GMRT)-NVSS(VLA)-FIRST(VLA)-DSS2R(DSS)', name=name, annot=annot)
ax2.contour(nvss, lvlcn, colors='cyan')
ax2.contour(tgss, lvlct, colors='magenta')
smooth_first = gaussian_filter(first, sigma=1)
if float(radius)<0.12:
smooth_first = gaussian_filter(first, sigma=2)
ax2.contour(smooth_first, lvlcf, colors='yellow')
leg1 = mpatches.Patch(color='cyan', label='NVSS')
leg2 = mpatches.Patch(color='magenta', label='TGSS')
leg3 = mpatches.Patch(color='yellow', label='FIRST')
leg4 = mpatches.Patch(color='white', label='DSS2R')
ax2.legend(handles=[leg1, leg2, leg3, leg4],
labelcolor='linecolor', framealpha=0.0,)
ax2.autoscale(False)
plt.subplots_adjust(wspace=0.01, hspace=0.01)
#-------- Saving final plot ------#--#
string1 = save_fig(plt, fig, kind)
#-------- Output for success -----#--#
fetch_q.uri.append(
{'img1': 'data:image/png;base64,' + urllib.parse.quote(string1)})
time_taken = perf_counter()-start
fetch_q.info = 'completed in ' + str(np.round(time_taken, 3))+". "
fetch_q.status = "success"
return fetch_q.throw_output()