maped_curcent.py 4.65 KB
title = "CurCenter"
tip = "define map size from cursor position"
onein = True

import numpy as np
from kapteyn import wcs
#from kapteyn.interpolation import map_coordinates
from nodmath import map_interpolate

from guiqwt.tools import SelectPointTool
from guidata.qt.QtGui import QMessageBox
from guidata.dataset.datatypes import DataSet
from guidata.dataset.dataitems import (IntItem, StringItem, ChoiceItem, FloatItem, BoolItem)
from guiqwt.config import _

class NOD3_App:

    def __init__(self, parent):
        self.parent = parent
        self.parent.activateWindow()

    def Error(self, msg):
        QMessageBox.critical(self.parent.parent(), title,
                              _(u"Error:")+"\n%s" % str(msg))

    def compute_app(self, **args):
        units = ('Pixel', 'Degree', 'Arcmin', 'Arcsec')
        class FuncParam(DataSet):
            #s = StringItem('s', default="string")
            #i = IntItem('i', default=0, max=100, min=0)
            xtend = FloatItem('X-extension (Unit)')
            ytend = FloatItem('Y-extension (Unit)')
            #b = BoolItem("bool", default=True)
            unit = ChoiceItem(_(u"Unit"), zip(units, units), default=units[0])
        name = title.replace(" ", "")
        if args == {}:
           param = FuncParam(_(title), "Extract a map at cursor center")
        else:
           param = self.parent.ScriptParameter(name, args)

        # if no parameter needed set param to None. activate next line
        #param = None
        self.parent.compute_11(name, lambda m, p: self.function(m, p), param, onein) 

    def read_cursor(self, tool):
        if self.m.header['CTYPE1'][-3:] != "CAR":
           l_off = self.m.header['CRVAL1']
           b_off = self.m.header['CRVAL2']
        else:
           l_off = 0.0
           b_off = 0.0
        self.m.header['NAXIS'] = 2
        self.m.header['CTYPE1'] = self.m.header['CTYPE1'].replace("DES", "CAR")
        self.m.header['CTYPE2'] = self.m.header['CTYPE2'].replace("DES", "CAR")
        proj1 = wcs.Projection(self.m.header)
        header = self.m.header.copy()
        #self.l, self.b = tool.get_coordinates()
        l, b = tool.last_pos
        L = l/self.parent.vu + l_off
        B = b/self.parent.vu + b_off
        self.parent.cursor_activ = False
        self.parent.plot.canvas_pointer = False
        self.selpos.end_callback = None
        del self.selpos
        self.parent.imagewidget.activate_default_tool()
        if self.p.unit == "Pixel":
           xtend = self.p.xtend
           ytend = self.p.ytend
        elif self.p.unit == "Degree":
           xtend = int(self.p.xtend/abs(header['CDELT1'])+0.5)
           ytend = int(self.p.ytend/abs(header['CDELT2'])+0.5)
        elif self.p.unit == "Arcmin":
           xtend = int(self.p.xtend/60.0/abs(header['CDELT1'])+0.5)
           ytend = int(self.p.ytend/60.0/abs(header['CDELT2'])+0.5)
        elif self.p.unit == "Arcsec":
           xtend = int(self.p.xtend/3600.0/abs(header['CDELT1'])+0.5)
           ytend = int(self.p.ytend/3600.0/abs(header['CDELT2'])+0.5)
        if xtend < 2 or ytend < 2:
           self.Error("sorry, map extention too small")
           return [], self.p
        header['NAXIS1'] = xtend
        header['NAXIS2'] = ytend
        header['CRVAL1'] = L
        header['CRVAL2'] = B
        header['CRPIX1'] = (xtend+1)/2.0
        header['CRPIX2'] = (ytend+1)/2.0
        header['CTYPE1'] = header['CTYPE1'][:-3] + "CAR"
        header['CTYPE2'] = header['CTYPE2'][:-3] + "CAR"
        #header['CROTA1'] = 0.0
        #header['CROTA2'] = 0.0
        proj2 = wcs.Projection(header)
        proj2.skysys = proj1.skysys
        proj2.skyout = proj1.skysys
        x, y = wcs.coordmap(proj1, proj2)
        self.m.data = map_interpolate(self.m.data, y, x)
        self.m.header = header.copy()
        self.m.header['CTYPE1'] = self.m.header['CTYPE1'][:-3] + "DES"
        self.m.header['CTYPE2'] = self.m.header['CTYPE2'][:-3] + "DES"
        self.parent.add_object(self.m)
        self.parent.refresh_plot()
        return self.m, self.p

    def function(self, m, p):
        self.m = m
        self.p = p
        self.cursor_activ = True
        row = self.parent.listwidget.currentRow()
        if row < 0: return
        self.selpos = self.parent.get_tool(SelectPointTool)
        self.selpos.TIP = "click on left button"
        self.selpos.mode = "reuse"
        self.selpos.marker = self.parent.plot.cross_marker
        self.selpos.end_callback = self.read_cursor
        self.selpos.activate()
        self.parent.setup_KeyEvent(self.selpos, 'Cursor')
        if hasattr(self.selpos, 'get_active_plot'):
           self.selpos.win = self.selpos.get_active_plot()
           self.selpos.win.set_pointer("canvas")
        return [], p