Документ взят из кэша поисковой машины. Адрес оригинального документа : http://hea-www.harvard.edu/ChaMPlane/quantile/4ciao4.3/modfits.py
Дата изменения: Tue Jun 12 04:22:35 2012
Дата индексирования: Tue Oct 2 08:05:52 2012
Кодировка:

Поисковые слова: п п п п п п п п п п п п п п п п п п п п п

# Jaesub Hong, Nov, 2011
#
# append lines or rows to a fits table
# the data structure of the table is manually handled.
#
# an example usage ---------------------------------------
#
# import modfits as mf
# import struct as st

# fits=mf.modfits("this.fits") # open the fits file
# fits.rewind(50) # start from the last 50th lines
# for i in range(100): # add 100 lines
# fits.append("gz%5d" % i + st.pack('>fffff',0.0,0.1,1.1e2,2.2e3,3.3e4) )
# fits.close(1) # close the file
#
# ---------------------------------------------------------


import re
import os

class modfits:
def __init__(self, filename):
self.filename=filename
self.fsize=os.path.getsize(filename)
self.fits=open(filename,"r+b")
self.pos=0
self.hsize=80
self.bsize=2880

self.naxis1 = 1
self.naxis2 = 1
self.pos1=0
self.pos2=0

self.addbyte=0 # added bytes
self.addline=0 # added lines
self.resi=0 # see if added bytes are a multiple of each line
self.fill=0 # left over to fill the regular buffer size

leftdata = 0
while self.pos < self.fsize:
foundHEnd = False
while foundHEnd == False:
buffer=self.fits.read(self.hsize)
# print buffer
# print buffer[0:6]
if buffer[0:6] == 'NAXIS1':
catch = re.search(r'NAXIS1\s*=\s*([0-9]+)',buffer)
if catch != None:
self.naxis1 = int(catch.group(1))
self.pos1 = self.pos
if buffer[0:6] == 'NAXIS2':
catch = re.search(r'NAXIS2\s*=\s*([0-9]+)',buffer)
if catch != None:
self.naxis2 = int(catch.group(1))
self.pos2 = self.pos
if buffer[0:6] == 'END ':
foundHEnd = True
self.pos +=self.hsize
# break
# break
lefthdr=self.bsize-(self.pos % self.bsize)
datasize=self.naxis1*self.naxis2
leftdata=self.bsize-(datasize % self.bsize)

self.pos = self.pos+lefthdr+datasize+leftdata
self.fits.seek(self.pos)

# print self.naxis1, self.naxis2, self.pos1, self.pos2, self.pos, leftdata, self.fsize

self.pos -= leftdata
self.fits.seek(self.pos1)
buffer=self.fits.read(self.hsize)
# print buffer
self.fits.seek(self.pos2)
buffer=self.fits.read(self.hsize)
# print buffer
self.fits.seek(self.pos)

def rewind(self,lines=1):
# assumes we are at the begining of each line
self.naxis2 -= lines
self.pos -= lines*self.naxis1
self.fits.seek(self.pos)

def append(self,buffer):
blen=len(buffer)
self.addbyte += blen
self.fits.write(buffer)

left = self.addbyte % self.naxis1

if left != 0:
self.resi = 1
left = self.naxis1 - left
else:
self.resi=0


self.addline = self.addbyte / self.naxis1 + self.resi
fsize = (self.addline + self.naxis2) * self.naxis1
self.fill = self.bsize - (fsize % self.bsize)+left

def close(self, verbose=0):

if self.resi == 1:
print "warning: a possibly wrong buffer size. Expect a multiple of ", self.naxis1

if verbose>0 :
print "%d lines are added" % self.addline

if self.fill !=0: self.fits.write(' '* self.fill)
self.fits.seek(self.pos2)
self.fits.write('NAXIS2 = %20d / length of dimension 2' % (self.addline +self.naxis2))
self.fits.close()