trafo_rebin.py 1.72 KB
title = "Rebin"
tip = "Rebins map in or out"
onein = True

from nodmath import map_zoom

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 compute_app(self, **args):
        class FuncParam(DataSet):
            rebinX = FloatItem('RebinX', default=1., min=1.0)
            rebinY = FloatItem('RebinY', default=1., min=1.0)
            pixsiz = BoolItem('PixSiz (arcsec)', default=False)
            order = IntItem('Order', min=1, max=5, default=4)
        name = title.replace(" ", "")
        if args == {}:
           param = FuncParam(_("Rebin"), "Rebin in or out")
        else:
           param = self.parent.ScriptParameter(name, args)

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

    def function(self, m, p):
        try: 
           if not hasattr(p, 'order'): order = 4
           else: order = p.order
        except: 
           order = 4
        if p.pixsiz:
           rebin = (abs(m.header['CDELT2']/p.rebinY*3600.0), abs(m.header['CDELT1']/p.rebinX*3600.0))
        else:
           rebin = (p.rebinX, p.rebinY)
        m.data = map_zoom(m.data, rebin, order=order, prefilter=True)
        m.header['NAXIS2'], m.header['NAXIS1'] = m.data.shape
        m.header['CRPIX1'] = (m.header['CRPIX1'] - 0.5) * rebin[1] + 0.5
        m.header['CRPIX2'] = (m.header['CRPIX2'] - 0.5) * rebin[0] + 0.5
        m.header['CDELT1'] /= rebin[1]
        m.header['CDELT2'] /= rebin[0]
        return m, p