casa  $Rev:20696$
 All Classes Namespaces Files Functions Variables
test_csvclean.py
Go to the documentation of this file.
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     # Input and output names
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         # Reference statistical values
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         #use ia.summary, get the coordinates from refval and
00081         #compare to the ones given to csvclean
00082         ia.open(image)
00083         summary = ia.summary()
00084         ia.close()
00085         # values of refval are in radians
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         # compare RA and DEC with what comes from listobs
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 #            if ((RA != mRA) or (DEC != mDEC)):
00102 #                print 'ERROR: MS: RA=%s, DEC=%s and IMG: RA=%s, DEC=%s'%(mRA,mDEC,RA,DEC)
00103 #                return False            
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