eff_outoffocus.py
3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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