00001 import os
00002 import sys
00003 import shutil
00004 from __main__ import default
00005 from tasks import *
00006 from taskinit import *
00007 import unittest
00008
00009 '''
00010 Unit tests for task csvclean. It tests the following parameters:
00011 vis: wrong and correct values
00012 imagename: if output exists
00013 field: wrong field type; non-default value
00014 spw: wrong value; non-default value
00015 niter: wrong type; non-default values
00016 imsize: zero value; non-default value
00017 cell: unsupported value; non-default value
00018 phasecenter: non-default and invalid values
00019 weighting: unsupported value; non-default values
00020 restoringbeam: non-default values
00021
00022 Other tests: check the value of a pixel.
00023 '''
00024 class csvclean_test1(unittest.TestCase):
00025
00026
00027 msfile = 'ngc5921.ms'
00028 fits = 'ngc5921.fits'
00029 res = None
00030 img = 'csvcleantest1'
00031
00032 def setUp(self):
00033 self.res = None
00034 if (os.path.exists(self.fits)):
00035 os.system('rm -rf '+ self.fits)
00036
00037 datapath = os.environ.get('CASAPATH').split()[0] + '/data/regression/ngc5921/'
00038 shutil.copyfile(datapath+self.fits, self.fits)
00039 importuvfits(fitsfile=self.fits, vis=self.msfile)
00040 default(csvclean)
00041
00042 def tearDown(self):
00043 if (os.path.exists(self.msfile)):
00044 shutil.rmtree(self.msfile)
00045
00046 os.system('rm -rf ' + self.img+'*')
00047
00048
00049 def getpixval(self,img,pixel):
00050 ia.open(img)
00051 px = ia.pixelvalue(pixel)
00052 ia.close()
00053 return px['value']['value']
00054
00055 def verify_stats(self,stats):
00056 results = {'success': True, 'msgs': "", 'error_msgs': '' }
00057
00058 ref = {'flux': ([-1.28087772]),
00059 'max': ([ 0.00011397]),
00060 'mean': ([ -1.18477533e-05]),
00061 'min': ([-0.00013796]),
00062 'npts': ([ 250000.]),
00063 'rms': ([ 4.25508006e-05]),
00064 'sigma': ([ 4.08681795e-05]),
00065 'sum': ([-2.96193832]),
00066 'sumsq': ([ 0.00045264])}
00067
00068 for r in ref:
00069 diff = abs(ref[r] - stats[r][0])
00070 if (diff > 10e-5):
00071 results['success']=False
00072 results['error_msgs']=results['error_msgs']\
00073 +"\nError: Statistics failed for %s. "%r
00074
00075 print 'expected %s=%s, got %s=%s'%(r,stats[r], r,ref[r])
00076
00077 return results
00078
00079 def verify_field(self,image,phasecenter):
00080
00081
00082 ia.open(image)
00083 summary = ia.summary()
00084 ia.close()
00085
00086 ra = summary['refval'][0]
00087 dec = summary['refval'][1]
00088 RA = qa.time(qa.quantity(ra,'rad'))
00089 DEC = qa.time(qa.quantity(dec,'rad'))
00090
00091
00092 ms.open(self.msfile)
00093 info = ms.summary(True)
00094 ms.close()
00095 if (type(phasecenter) == int):
00096 fld = 'field_'+str(phasecenter)
00097 ra = info[fld]['direction']['m0']['value']
00098 dec = info[fld]['direction']['m1']['value']
00099 mRA = qa.time(qa.quantity(ra,'rad'))
00100 mDEC = qa.time(qa.quantity(dec,'rad'))
00101
00102
00103
00104 elif (type(phasecenter) == str):
00105 for i in range(3):
00106 fieldid = 'field_'+str(i)
00107 ra = info[fieldid]['direction']['m0']['value']
00108 dec = info[fieldid]['direction']['m1']['value']
00109 mRA = qa.time(qa.quantity(ra,'rad'))
00110 mDEC = qa.time(qa.quantity(dec,'rad'))
00111 if ((RA == mRA) and (DEC == mDEC)):
00112 break
00113
00114 if ((RA != mRA) or (DEC != mDEC)):
00115 print 'ERROR: MS: RA=%s, DEC=%s and IMG: RA=%s, DEC=%s'%(mRA,mDEC,RA,DEC)
00116 return False
00117
00118 return True
00119
00120 def test1(self):
00121 '''Csvclean 1: Default values'''
00122 self.res = csvclean()
00123 self.assertFalse(self.res)
00124
00125 def test2(self):
00126 """Csvclean 2: Wrong input should return False"""
00127 msfile = 'badfilename'
00128 self.res = csvclean(vis=msfile, imagename=self.img)
00129 self.assertFalse(self.res)
00130
00131 def test3(self):
00132 """Csvclean 3: Good input should return True"""
00133 self.res = csvclean(vis=self.msfile,imagename=self.img)
00134 self.assertTrue(self.res)
00135
00136 def test4(self):
00137 """Csvclean 4: Check if output exists"""
00138 self.res = csvclean(vis=self.msfile,imagename=self.img)
00139 self.assertTrue(os.path.exists(self.img+'.image'))
00140
00141 def test5(self):
00142 """Csvclean 5: Wrong field type"""
00143 self.res = csvclean(vis=self.msfile,imagename=self.img,field=0)
00144 self.assertFalse(self.res)
00145
00146 def test6(self):
00147 """Csvclean 6: Non-default field value"""
00148 self.res = csvclean(vis=self.msfile,imagename=self.img,field='2')
00149 self.assertTrue(self.res)
00150 self.assertTrue(os.path.exists(self.img+'.image'))
00151
00152 def test7(self):
00153 """Csvclean 7: Wrong spw value"""
00154 self.res = csvclean(vis=self.msfile,imagename=self.img,spw='10')
00155 self.assertFalse(os.path.exists(self.img+'.image'))
00156
00157 def test8(self):
00158 """Csvclean 8: Non-default spw value"""
00159 self.res = csvclean(vis=self.msfile,imagename=self.img,spw='0')
00160 self.assertTrue(os.path.exists(self.img+'.image'))
00161
00162 def test9(self):
00163 """Csvclean 9: Wrong niter type"""
00164 self.res = csvclean(vis=self.msfile,imagename=self.img,niter='1')
00165 self.assertFalse(self.res)
00166
00167 def test10(self):
00168 """Csvclean 10: Non-default niter values"""
00169 for n in range(10,400,50):
00170 self.res = csvclean(vis=self.msfile,imagename=self.img,niter=n)
00171 self.assertTrue(self.res,'Failed for niter = %s' %n)
00172
00173 def test11(self):
00174 """Csvclean 11: Zero value of imsize"""
00175 self.res = csvclean(vis=self.msfile,imagename=self.img,imsize=0)
00176 self.assertFalse(os.path.exists(self.img+'.image'))
00177
00178 def test12(self):
00179 '''Csvclean 12: Non-default imsize values'''
00180 self.res = csvclean(vis=self.msfile,imagename=self.img,imsize=[80,80])
00181 self.assertTrue(self.res)
00182 self.assertTrue(os.path.exists(self.img+'.image'),'Image %s does not exist' %self.img)
00183
00184 def test13(self):
00185 """Csvclean 13: Non-default cell values"""
00186 self.res = csvclean(vis=self.msfile,imagename=self.img, cell=12.5)
00187 self.assertTrue(self.res,'Task returned %s'%self.res)
00188 self.assertTrue(os.path.exists(self.img+'.image'))
00189
00190 def test14(self):
00191 '''Csvclean 14: Unsupported weighting mode'''
00192 self.res = csvclean(vis=self.msfile,imagename=self.img, weighting='median')
00193 self.assertFalse(self.res)
00194
00195 def test15(self):
00196 '''Csvclean 15: Non-default weighting uniform'''
00197 retValue = {'success': True, 'msgs': "", 'error_msgs': '' }
00198 weights = ['natural','uniform','briggs','radial']
00199 for w in weights:
00200 out = self.img+'.'+w
00201 self.res = csvclean(vis=self.msfile,imagename=out, imsize=500,weighting=w)
00202 if not (os.path.exists(out+'.image')):
00203 retValue['success']=False
00204 retValue['error_msgs']=retValue['error_msgs']\
00205 +"\nError: Failed to create image=%s when weighting=%s."%(out+'.image',w)
00206
00207 self.assertTrue(retValue['success'],retValue['error_msgs'])
00208
00209 def test16(self):
00210 '''Csvclean 16: Test parameter restoringbeam'''
00211 retValue = {'success': True, 'msgs': "", 'error_msgs': '' }
00212 p = ['0.5arcsec','0.25arcsec','0.3']
00213 out = 'myimg'
00214 self.res = csvclean(vis=self.msfile,imagename=out, imsize=500,restoringbeam='0.5arcsec')
00215 if not (os.path.exists(out+'.image')):
00216 retValue['success']=False
00217 retValue['error_msgs']=retValue['error_msgs']\
00218 +"\nError: Failed to create image=%s when restoringbeam=\'0.25arcsec\'."%out+'.image'
00219 os.system('rm -rf myimg.image')
00220
00221 beam = ['0.5arcsec','0.25arcsec']
00222 self.res = csvclean(vis=self.msfile,imagename=out, imsize=500,restoringbeam=beam)
00223 if not (os.path.exists(out+'.image')):
00224 retValue['success']=False
00225 retValue['error_msgs']=retValue['error_msgs']\
00226 +"\nError: Failed to create image=%s when restoringbeam=%s."%(out+'.image',beam)
00227 os.system('rm -rf myimg.image')
00228
00229 beam = ['0.5arcsec','0.25arcsec','0.3deg']
00230 self.res = csvclean(vis=self.msfile,imagename=out, imsize=500,restoringbeam=beam)
00231 if not (os.path.exists(out+'.image')):
00232 retValue['success']=False
00233 retValue['error_msgs']=retValue['error_msgs']\
00234 +"\nError: Failed to create image=%s when restoringbeam=%s."%(out+'.image',beam)
00235 os.system('rm -rf myimg.image')
00236
00237 self.assertTrue(retValue['success'],retValue['error_msgs'])
00238
00239 def test17(self):
00240 '''Csvclean 17: Verify statistics of image'''
00241 self.res = csvclean(vis=self.msfile,imagename=self.img,field='2',imsize=[500,500],
00242 niter=10, restoringbeam=['0.5arcsec'],cell='0.35arcsec',phasecenter=0)
00243 ia.open(self.img+'.image')
00244 stats = ia.statistics()
00245 ia.close()
00246 print stats
00247 retValue = self.verify_stats(stats)
00248 self.assertTrue(retValue['success'],retValue['error_msgs'])
00249
00250 def test18(self):
00251 '''Csvclean 18: Choose a non-default phasecenter'''
00252 phc = 2
00253 im = self.img+'.image'
00254 self.res = csvclean(vis=self.msfile,imagename=self.img,imsize=[100,100],
00255 niter=10,phasecenter=phc)
00256
00257 retValue = self.verify_field(im,phc)
00258 self.assertTrue(retValue,'MS and image coordinates of phasecenter are not the same')
00259
00260 def test19(self):
00261 '''Csvclean 19: Choose a non-existent phasecenter'''
00262 phc = 4
00263 im = self.img+'.image'
00264 self.res = csvclean(vis=self.msfile,imagename=self.img,imsize=[100,100],
00265 niter=10,phasecenter=phc)
00266
00267 self.assertFalse(self.res,'Phasecenter does not exist and should return an error.')
00268
00269 def test20(self):
00270 '''Csvclean 20: Choose a string phasecenter'''
00271 coord = '14h45m16 +09d58m36'
00272 phc = 'J2000 '+coord
00273 im = self.img+'.image'
00274 self.res = csvclean(vis=self.msfile,imagename=self.img,imsize=[100,100],
00275 niter=10,phasecenter=phc)
00276
00277 retValue = self.verify_field(im,coord)
00278 self.assertTrue(retValue,'MS and image coordinates of phasecenter are not the same')
00279
00280 def suite():
00281 return [csvclean_test1]
00282
00283