def write(self, data, ftime, fno): if self.asfits: if self.initialised == 0: #Initialise the header self.finalise = 1 self.initialised = 1 self.hdustart = self.fd.tell() shape = [1] + list(data.shape) FITS.WriteHeader(self.fd, shape, data.dtype.char, firstHeader=(self.hdustart == 0), doByteSwap=self.doByteSwap) self.fdfno = open(self.name + "fno", "w+") self.fdtme = open(self.name + "tme", "w+") FITS.WriteHeader(self.fdfno, [ 1, ], "i", firstHeader=0, doByteSwap=self.doByteSwap) FITS.WriteHeader(self.fdtme, [ 1, ], "d", firstHeader=0, doByteSwap=self.doByteSwap) self.dtype = data.dtype.char self.shape = data.shape self.datasize = data.size * data.itemsize if self.shape != data.shape or self.dtype != data.dtype.char: #Have to start a new fits HDU self.fitsFinalise() #So, finalise existing self.finalise = 1 self.fd.seek(0, 2) #move to end of file. self.hdustart = self.fd.tell() shape = [1] + list(data.shape) FITS.WriteHeader(self.fd, shape, data.dtype.char, firstHeader=0, doByteSwap=self.doByteSwap) self.fdfno = open(self.name + "fno", "w+") self.fdtme = open(self.name + "tme", "w+") FITS.WriteHeader(self.fdfno, [ 1, ], "i", firstHeader=0, doByteSwap=self.doByteSwap) FITS.WriteHeader(self.fdtme, [ 1, ], "d", firstHeader=0, doByteSwap=self.doByteSwap) self.dtype = data.dtype.char self.shape = data.shape #and now write the data. if self.doByteSwap and numpy.little_endian: self.fd.write(data.byteswap().data) self.fdfno.write( numpy.array([fno]).astype(numpy.int32).byteswap().data) self.fdtme.write( numpy.array([ftime]).astype(numpy.float64).byteswap().data) else: self.fd.write(data.data) self.fdfno.write(numpy.array([fno]).astype(numpy.int32).data) self.fdtme.write( numpy.array([ftime]).astype(numpy.float64).data) else: self.info[0] = ( self.info.size - 1 ) * self.info.itemsize + data.size * data.itemsize #number of bytes to follow (excluding these 4) self.info[1] = fno self.info[2:4].view(numpy.float64)[0] = ftime self.info.view("c")[16] = data.dtype.char self.fd.write(self.info.data) self.fd.write(data.data)
def tofits(self, fname, ffrom=None, fto=None, tfrom=None, tto=None): curshape = None curdtype = None fheader = None nentries = 0 tlist = [] flist = [] ffits = open(fname, "w") firstHeader = 1 while 1: hdr = self.fd.read(self.info.size * self.info.itemsize) if hdr == "": break elif len(hdr) < self.info.size * self.info.itemsize: print "Didn't read all of header" break info = numpy.fromstring(hdr, numpy.int32) fno = int(info[1]) ftime = float(info[2:4].view("d")) databytes = info[0] - (self.info.size - 1) * self.info.itemsize fok = tok = 0 if (ffrom == None or fno >= ffrom) and (fto == None or fno <= fto): #print fno fok = 1 if (tfrom == None or ftime >= tfrom) and (tto == None or ftime <= tto): tok = 1 if fok == 1 and tok == 1: frame = self.fd.read(databytes) if len(frame) != databytes: print "Didn't read all of frame" break frame = numpy.fromstring(frame, chr(info[4])) #can it be put into the existing HDU? If not, finalise current, and start a new one. if curshape != databytes or curdtype != chr(info[4]): #end the current HDU FITS.End(ffits) #Update FITS header if fheader != None: FITS.updateLastAxis(None, nentries, fheader) del (fheader) #fheader.close() fheader = None #now write the frame number and time. ffits.close() if firstHeader == 0: FITS.Write(numpy.array(flist).astype("i"), fname, writeMode="a", doByteSwap=self.doByteSwap) FITS.Write(numpy.array(tlist), fname, writeMode="a", doByteSwap=self.doByteSwap) ffits = open(fname, "a+") FITS.WriteHeader(ffits, [ 1, databytes / numpy.zeros( (1, ), chr(info[4])).itemsize ], chr(info[4]), firstHeader=firstHeader, doByteSwap=self.doByteSwap) ffits.flush() firstHeader = 0 fheader = numpy.memmap(fname, dtype="c", mode="r+", offset=ffits.tell() - 2880) flist = [] tlist = [] nentries = 0 curshape = databytes curdtype = chr(info[4]) #now write the data if self.doByteSwap and numpy.little_endian: ffits.write(frame.byteswap().data) else: ffits.write(frame) flist.append(fno) tlist.append(ftime) nentries += 1 else: #skip the data self.fd.seek(databytes - 1, 1) if self.rd.read(1) == "": print "Didn't read all of the frame" break #now finalise the file. FITS.End(ffits) if fheader is not None: FITS.updateLastAxis(None, nentries, fheader) #fheader.close() del (fheader) fheader = None #now write the frame number and time. ffits.close() FITS.Write(numpy.array(flist).astype("i"), fname, writeMode="a", doByteSwap=self.doByteSwap) FITS.Write(numpy.array(tlist), fname, writeMode="a", doByteSwap=self.doByteSwap)