eff_outoffocus.py 3.87 KB
title = "Out Of Focus"
tip = "Out of focus method"
onein = False

import numpy as np
import pyfits
import os

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):
        class FuncParam(DataSet):
            output = StringItem('Outfile', default="focus.fits")
            #i = IntItem('i', default=0, max=100, min=0)
            #a = FloatItem('a', default=1.)
            #b = BoolItem("bool", default=True)
            #choice = ChoiceItem("Unit", ("Degree", "Arcmin", "Arcsec"), default=2)
        name = title.replace(" ", "")
        if args == {}:
           param = FuncParam(_(title), "description")
        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 function(self, ms, p):
        foc = []
        for m in ms:
            if 'FOCUS' in m.header:
               foc.append(m.header['FOCUS'])
            else:
               self.Error('sorry, keyword FOCUS not found in header')
               return [], p
        foc.sort()
        for m in ms:
            if m.header['FOCUS'] == foc[0]: m3 =m
            elif m.header['FOCUS'] == foc[1]: m1 =m
            elif m.header['FOCUS'] == foc[2]: m2 =m
        mf = [m1,m2,m3]
        chopthr = 3600*abs(2*m1.header['PATLONG'])
        hdu = pyfits.PrimaryHDU()
        hdu.header['FREQ'] = (m.header['CRVAL3'], 'Frequency in Hz')
        hdu.header['CHOPTHR'] = (chopthr, 'Horn distance in arcsec')
        #hdu.header['TELESC'] = (m.header['TELESCOP'], 'Telescope name')
        hdu.header['TELESC'] = ('GBT', 'Telescope name')
        hdu.header['OBSTYPE'] = ('AZCHOP', 'Object type')
        hdu.header['MEANEL'] = (m.header['MEANEL'], 'Mean elevation')
        hdu.header['EXTNAME'] = ('Primary', 'Extension name')
        hdulist = pyfits.HDUList([hdu])
        outfile = str("%s" % p.output)
        if os.path.exists(outfile): os.remove(outfile) 
        hdulist.writeto(outfile)
        l = -1
        name = ('Focus', 'Focus+', 'Focus-')
        rad = np.pi/180.0
        for m in mf:
            l += 1
            data = m.data.ravel()
            rms = data*0 + np.std(m.data)
            rows, cols = m.data.shape
            dx = []
            dy = []
            tm = []
            t = 0.0
            for row in range(rows):
                y = (row-m.header['CRPIX2'])*m.header['CDELT2']
                for col in range(cols):
                    x = (col-m.header['CRPIX1'])*m.header['CDELT1']
                    dx.append(x*rad)
                    dy.append(y*rad)  
                    t += 0.1/86400.0
                    tm.append(t)
            col1 = pyfits.Column(name='DX', format='E', array=dx, unit='radians')
            col2 = pyfits.Column(name='DY', format='E', array=dy, unit='radians')
            col3 = pyfits.Column(name='fnu', format='E', array=data, unit='Jy')
            col4 = pyfits.Column(name='UFNU', format='E', array=rms, unit='Jy')
            col5 = pyfits.Column(name='TIME', format='E', array=tm, unit='d')
            columns = pyfits.ColDefs([col1, col2, col3, col4, col5])
            hdu = pyfits.new_table(columns)
            hdu.header['EXTNAME'] = (name[l], 'Extension name')
            hdu.header['DZ'] = ((m.header['FOCUS']-foc[1])/1000.0, 'z-Focus offset')
            #hdulist.append(hdu)
            pyfits.append(outfile, hdu.data, hdu.header)
        return [], p