Esempio n. 1
0
    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)
Esempio n. 2
0
 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)