casa
$Rev:20696$
|
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)