casa  $Rev:20696$
 All Classes Namespaces Files Functions Variables
task_gaincal.py
Go to the documentation of this file.
00001 import os
00002 import numpy as np
00003 from taskinit import *
00004 
00005 def gaincal(vis=None,caltable=None,
00006             field=None,spw=None,intent=None,
00007             selectdata=None,timerange=None,uvrange=None,antenna=None,scan=None,
00008             observation=None, msselect=None,
00009             solint=None,combine=None,preavg=None,refant=None,minblperant=None,
00010             minsnr=None,solnorm=None,
00011             gaintype=None,smodel=None,calmode=None,append=None,
00012             splinetime=None,npointaver=None,phasewrap=None,
00013             gaintable=None,gainfield=None,interp=None,spwmap=None,
00014             gaincurve=None,opacity=None,parang=None):
00015 
00016         #Python script
00017         casalog.origin('gaincal')
00018 
00019         try: 
00020                 mycb = cbtool()
00021                 if ((type(vis)==str) & (os.path.exists(vis))):
00022                         mycb.open(filename=vis,compress=False,addcorr=False,addmodel=False)
00023                 else:
00024                         raise Exception, 'Visibility data set not found - please verify the name'
00025 
00026                 # Do data selection according to selectdata
00027                 if (selectdata):
00028                         # pass all data selection parameters in as specified
00029                         mycb.selectvis(time=timerange,spw=spw, scan=scan, field=field,
00030                                      intent=intent, observation=str(observation),
00031                                      baseline=antenna,uvrange=uvrange,chanmode='none',
00032                                      msselect=msselect);
00033                 else:
00034                         # selectdata=F, so time,scan,baseline,uvrange,msselect=''
00035                         # using spw and field specifications only
00036                         mycb.selectvis(time='',spw=spw,scan='',field=field,intent=intent,
00037                                      observation='', baseline='', uvrange='',
00038                                      chanmode='none', msselect='')
00039 
00040                 # set the model, if specified
00041                 if (len(smodel)>0):
00042                         mycb.setptmodel(smodel);
00043 
00044 
00045 
00046                 # Arrange apply of existing other calibrations 
00047                 # First do the existing cal tables...
00048                 ngaintab = 0;
00049                 if (gaintable!=['']):
00050                         ngaintab=len(gaintable)
00051                 ngainfld = len(gainfield)
00052                 nspwmap = len(spwmap)
00053                 ninterp = len(interp)
00054 
00055                 # handle list of list issues with spwmap
00056                 if (nspwmap>0):
00057                         if (type(spwmap[0])!=list):
00058                                 # first element not a list, only one spwmap specified
00059                                 # make it a list of list
00060                                 spwmap=[spwmap];
00061                                 nspwmap=1;
00062 
00063                 for igt in range(ngaintab):
00064                         if (gaintable[igt]!=''):
00065 
00066                                 # field selection is null unless specified
00067                                 thisgainfield=''
00068                                 if (igt<ngainfld):
00069                                         thisgainfield=gainfield[igt]
00070                                         
00071                                 # spwmap is null unless specifed
00072                                 thisspwmap=[-1]
00073                                 if (igt<nspwmap):
00074                                         thisspwmap=spwmap[igt];
00075 
00076                                 # interp is 'linear' unless specified
00077                                 thisinterp='linear'
00078                                 if (igt<ninterp):
00079                                         if (interp[igt]==''):
00080                                                 interp[igt]=thisinterp
00081                                         thisinterp=interp[igt];
00082 
00083                                 mycb.setapply(t=0.0,table=gaintable[igt],field=thisgainfield,
00084                                             calwt=True,spwmap=thisspwmap,interp=thisinterp)
00085                 
00086                 # ...and now the specialized terms
00087                 # (BTW, interp irrelevant for these, since they are evaluated)
00088 
00089                 # opacity (if non-trivially specified and any >0.0)
00090                 opacarr=np.array(opacity)   # as numpy array for uniformity
00091                 if (np.sum(opacarr)>0.0):
00092                         # opacity transmitted as a list in all cases
00093                         mycb.setapply(type='TOPAC',t=-1,opacity=opacarr.tolist(),calwt=True)
00094 
00095                 if gaincurve: mycb.setapply(type='GAINCURVE',t=-1,calwt=True)
00096 
00097                 # Apply parallactic angle, if requested
00098                 if parang: mycb.setapply(type='P')
00099 
00100                 # Set up for solving:  
00101                 phaseonly=False
00102                 if (gaintype=='G'):
00103                         mycb.setsolve(type='G',t=solint,combine=combine,preavg=preavg,refant=refant,
00104                                     minblperant=minblperant,
00105                                     solnorm=solnorm,minsnr=minsnr,table=caltable,
00106                                     apmode=calmode,phaseonly=phaseonly,append=append)
00107                 elif (gaintype=='T'):
00108                         mycb.setsolve(type='T',t=solint,combine=combine,preavg=preavg,refant=refant,
00109                                     minblperant=minblperant,
00110                                     solnorm=solnorm,minsnr=minsnr,table=caltable,
00111                                     apmode=calmode,phaseonly=phaseonly,append=append)
00112                 elif (gaintype=='K' or gaintype=='KCROSS' or gaintype=='XY+QU' or gaintype=='XYf+QU'):
00113                         mycb.setsolve(type=gaintype,t=solint,combine=combine,preavg=preavg,refant=refant,
00114                                     minblperant=minblperant,
00115                                     solnorm=solnorm,minsnr=minsnr,table=caltable,
00116                                     apmode=calmode,phaseonly=phaseonly,append=append)
00117                 elif (gaintype=='GSPLINE'):
00118                         mycb.setsolvegainspline(table=caltable,append=append,mode=calmode,
00119                                               refant=refant,splinetime=splinetime,preavg=preavg,
00120                                               npointaver=npointaver,phasewrap=phasewrap)
00121                 mycb.solve()
00122 
00123                 reportsolvestats(mycb.activityrec());
00124 
00125                 mycb.close()
00126 
00127         except Exception, instance:
00128                 print '*** Error ***',instance
00129                 mycb.close()
00130                 raise Exception, instance
00131 
00132 def reportsolvestats(rec):
00133         if (rec.keys().count('origin')==1 and
00134             rec['origin']=='Calibrater::genericGatherAndSolve'):
00135                 casalog.post("Calibration solve statistics per spw:  (expected/attempted/succeeded):")
00136                 nexp=rec['nExpected']
00137                 natt=rec['nAttempt']
00138                 nsuc=rec['nSucceed']
00139                 for ispw in range(len(nexp)):
00140                         solstatstr="  Spw "+str(ispw)+": "
00141                         solstatstr+=str(nexp[ispw])+"/"
00142                         solstatstr+=str(natt[ispw])+"/"
00143                         solstatstr+=str(nsuc[ispw])
00144                         casalog.post(solstatstr)