casa
$Rev:20696$
|
00001 import os 00002 from taskinit import * 00003 00004 import asap as sd 00005 from asap.scantable import is_scantable 00006 import pylab as pl 00007 import sdutil 00008 00009 def sdcoadd(infiles, antenna, fluxunit, telescopeparm, specunit, frame, doppler, scanaverage, timeaverage, tweight, polaverage, pweight, outfile, outform, overwrite): 00010 00011 casalog.origin('sdcoadd') 00012 00013 ### 00014 ### Now the actual task code 00015 ### 00016 00017 try: 00018 worker = sdcoadd_worker(**locals()) 00019 worker.initialize() 00020 worker.execute() 00021 worker.finalize() 00022 00023 except Exception, instance: 00024 sdutil.process_exception(instance) 00025 raise Exception, instance 00026 00027 class sdcoadd_worker(sdutil.sdtask_template): 00028 def __init__(self, **kwargs): 00029 super(sdcoadd_worker,self).__init__(**kwargs) 00030 self.suffix = '_coadd' 00031 00032 def __del__(self): 00033 # restore all the scantables when the instance is deleted 00034 self.cleanup() 00035 00036 def initialize(self): 00037 self.nfile = len(self.infiles) 00038 if self.nfile < 2: 00039 raise Exception, 'Need at least two data file names' 00040 super(sdcoadd_worker,self).initialize() 00041 00042 def initialize_scan(self): 00043 self.scanlist = [None] * self.nfile 00044 self.restorer = [None] * self.nfile 00045 00046 for i in xrange(self.nfile): 00047 sorg = sd.scantable(self.infiles[i],average=self.scanaverage,antenna=self.antenna) 00048 00049 # prepare restorer object 00050 restorer = sdutil.scantable_restore_factory(sorg, 00051 self.infiles[i], 00052 self.fluxunit, 00053 self.specunit, 00054 self.frame, 00055 self.doppler) 00056 # convert flux 00057 stmp = sdutil.set_fluxunit(sorg, self.fluxunit, self.telescopeparm, False) 00058 if stmp: 00059 # Restore header in original table before deleting 00060 if restorer is not None: 00061 restorer.restore() 00062 self.scanlist[i] = stmp 00063 else: 00064 self.scanlist[i] = sorg 00065 self.restorer[i] = restorer 00066 00067 # this is bit tricky 00068 # set fluxunit here instead of self.set_to_scan 00069 # and remove fluxunit attribute to disable additional 00070 # call of set_fluxunit in self.set_to_scan 00071 self.fluxunit_saved = self.fluxunit 00072 del self.fluxunit 00073 00074 def execute(self): 00075 self.set_to_scan() 00076 00077 self.merge() 00078 00079 # Average in time if desired 00080 self.scan = sdutil.doaverage(self.scan, self.scanaverage, self.timeaverage, 00081 self.tweight, self.polaverage, self.pweight) 00082 00083 def set_to_scan(self): 00084 for scan in self.scanlist: 00085 self.scan = scan 00086 super(sdcoadd_worker,self).set_to_scan() 00087 del self.scan 00088 00089 def merge(self): 00090 self.scan = sd.merge(self.scanlist) 00091 casalog.post( "Coadded %s" % self.infiles ) 00092 00093 # total row 00094 totalrow = 0 00095 for scan in self.scanlist: 00096 totalrow += scan.nrow() 00097 if totalrow > self.scan.nrow(): 00098 casalog.post( "Actual number of rows is less than the number of rows expected in merged data.", priority = 'WARN' ) 00099 casalog.post( "Possibly, there are conformance error among the input data.", priority = 'WARN' ) 00100 00101 def save(self): 00102 sdutil.save(self.scan, self.project, self.outform, self.overwrite) 00103 00104 def cleanup(self): 00105 for r in self.restorer: 00106 if r: 00107 r.restore() 00108