casa  $Rev:20696$
 All Classes Namespaces Files Functions Variables
task_sdcoadd.py
Go to the documentation of this file.
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