forked from spacetelescope/ramp_simulator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathread_fits.py
executable file
·146 lines (120 loc) · 4.83 KB
/
read_fits.py
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#! /usr/bin/env python
'''
Module for reading in a given fits file using either RampModel
or astropy, packaging information into a common format,
and returning
metadata needed within the simulator (these need to be in
a common format regardless of read-in method). Other meta
data can stay in whatever format produced when it is read
in, under the assmption that it will be written using the
same format
read pattern - exposure.readpatt READPATT
nints - exposure.nints NINTS
ngroups - exposure.ngroups NGROUPS
nframes - exposure.nframes NFRAMES
nskip - exposure.nskip NSKIP
groupgap - exposure.groupgap GROUPGAP
exptype = exposure.type EXP_TYPE
detector - instrument.detector DETECTOR
instrument - instrument.name INSTRUME
'''
class Read_fits():
def __init__(self):
self.translate = {}
self.translate['READPATT'] = 'exposure.readpatt'
self.translate['NINTS'] = 'exposure.nints'
self.translate['NGROUPS'] = 'expsoure.ngroups'
self.translate['NFRAMES'] = 'exposure.nframes'
self.translate['NSKIP'] = 'exposure.nskip'
self.translate['GROUPGAP'] = 'exposure.groupgap'
self.translate['EXP_TYPE'] = 'exposure.type'
self.translate['DETECTOR'] = 'instrument.detector'
self.translate['INSTRUME'] = 'instrument.name'
self.translate['FASTAXIS'] = 'subarray.fastaxis'
self.translate['SLOWAXIS'] = 'subarray.slowaxis'
def rampmodel_to_obj(self):
# convert a RampModel instance to a read_fits object
self.data = self.model.data
self.zeroframe = self.model.zeroframe
self.sbAndRefpix = None
self.header = {}
for key in self.translate:
try:
self.header[key] = self.model.meta[self.translate[key]]
except:
self.header[key] = None
def read_astropy(self):
from astropy.io import fits
import numpy as np
h = fits.open(self.file)
self.data = None
self.zeroframe = None
self.sbAndRefpix = None
for i in xrange(len(h)):
name = h[i].name
if name == 'SCI':
self.data = h[i].data
if name == 'ZEROFRAME':
self.zeroframe = h[i].data
if name == 'SBANDREFPIX':
self.sbAndRefpix = h[i].data
#to match what happens with the RampModel version,
#populate any of the remaining None extensions with
#arrays of zeros
#if self.zeroframe is None:
# self.zeroframe = np.zeros((ngroup,ny,nx),dtype=np.float)
self.header = {}
for key in self.translate:
try:
self.header[key] = h[0].header[key]
except:
self.header[key] = None
def read_datamodel(self):
from jwst.datamodels import RampModel
import numpy as np
h = RampModel(self.file)
#remove non-pipeline related keywords (e.g. CV3 temps/voltages)
h.__delattr__('extra_fits')
self.data = h.data
#Currently a bug in level1bmodel when zeroframe is
#not present and a cube of zeros is returned
#If the datamodel returns a default zeroframe of all
#zeros, then set it to None here
#self.zeroframe = h.zeroframe
if np.all(h.zeroframe == 0):
self.zeroframe = None
self.sbAndRefpix = None
self.header = {}
for key in self.translate:
try:
self.header[key] = h.meta[self.translate[key]]
except:
self.header[key] = None
def insert_into_datamodel(self,subfile):
#read in a dummy/substitute file as a datamodel,
#and insert the data and self.header metadata
#into it
from jwst.datamodels import RampModel #Level1bModel
import numpy as np
h = RampModel(subfile)
h.data = self.data
try:
h.zeroframe = self.zeroframe
except:
pass
h.err = np.zeros_like(self.data)
h.groupdq = np.zeros_like(self.data)
nint,ng,ny,nx = self.data.shape
h.pixeldq = np.zeros((ny,nx))
h.meta.exposure.readpatt = self.header['READPATT']
h.meta.exposure.nints = self.header['NINTS']
h.meta.exposure.ngroups = self.header['NGROUPS']
h.meta.exposure.nframes = self.header['NFRAMES']
h.meta.exposure.nskip = self.header['NSKIP']
h.meta.exposure.groupgap = self.header['GROUPGAP']
h.meta.exposure.type = self.header['EXP_TYPE']
h.meta.instrument.detector = self.header['DETECTOR']
h.meta.instrument.name = self.header['INSTRUME']
h.meta.subarray.fastaxis = self.header['FASTAXIS']
h.meta.subarray.slowaxis = self.header['SLOWAXIS']
return h