casa  $Rev:20696$
 All Classes Namespaces Files Functions Variables
test_importasdm_sd.py
Go to the documentation of this file.
00001 #
00002 # Unit test of importasdm task with signledish=True
00003 #
00004 # Here, the script tests whether,
00005 #   1) ASDM can be imported without any exception,
00006 #   2) all necessary tables exist,
00007 #   3) (part of) table contents are valid.
00008 #
00009 # Same tests will be done for useversion='v2' and 'v3'.
00010 #
00011 import os
00012 import sys
00013 import shutil
00014 import string
00015 import numpy
00016 from __main__ import default
00017 from tasks import *
00018 from taskinit import *
00019 import unittest
00020 
00021 # ASDM dataset name
00022 myasdm_dataset_name = 'uid___X5f_X18951_X1'
00023 
00024 # Scantable name
00025 asapname = myasdm_dataset_name + '.asap'
00026 
00027 class asdmsd_import( unittest.TestCase ):
00028     def setUp( self ):
00029         self.res = None
00030         self.subtables = [ 'FIT',
00031                            'FOCUS',
00032                            'FREQUENCIES',
00033                            'HISTORY',
00034                            'MOLECULES',
00035                            'TCAL',
00036                            'WEATHER' ]
00037         self.nrows = { 'MAIN': 3576,
00038                        'FIT': 0,
00039                        'FOCUS': 1,
00040                        'FREQUENCIES': 2,
00041                        'HISTORY': 0,
00042                        'MOLECULES': 1,
00043                        'TCAL': 1,
00044                        'WEATHER': 1 }
00045         if(os.path.exists(myasdm_dataset_name)):
00046             shutil.rmtree(myasdm_dataset_name)
00047 
00048         datapath=os.environ.get('CASAPATH').split()[0]+'/data/regression/asdm-import/input/'
00049         shutil.copytree(datapath + myasdm_dataset_name, myasdm_dataset_name)
00050         default(importasdm)
00051         
00052     def tearDown(self):
00053         shutil.rmtree(myasdm_dataset_name)
00054         shutil.rmtree(asapname,ignore_errors=True)
00055 
00056 ##     def test0( self ):
00057 ##         """asdmsd_import_v2: Test direct import to single-dish format (oldasdm2ASAP)"""
00058 ##         # 1) test import
00059 ##         self.doImport( version='v2' )
00060 
00061 ##         # 2) table existence check
00062 ##         self.tableExistenceCheck()
00063 
00064 ##         # 3) table contents check
00065 ##         self.tableContentsCheck()
00066         
00067     def test1( self ):
00068         """asdmsd_import_v3: Test direct import to single-dish format (asdm2ASAP)"""
00069         # 1) test import
00070         self.doImport( version='v3' )
00071 
00072         # 2) table existence check
00073         self.tableExistenceCheck()
00074 
00075         # 3) table contents check
00076         self.tableContentsCheck()
00077 
00078     def doImport( self, version ):
00079         self.res = importasdm(asdm=myasdm_dataset_name,
00080                               vis=asapname,
00081                               singledish=True,
00082                               antenna=0,
00083                               useversion=version)
00084         self.assertEqual( self.res, None )
00085 
00086 
00087     def tableExistenceCheck( self ):
00088         result={}
00089         item = { 'success': True, 'message':'' }
00090         msgTemplate = string.Template( '%s/$table does not exist.'%(asapname) )
00091         
00092         # MAIN
00093         result['MAIN'] = item
00094         if not os.path.exists( asapname ):
00095             result['MAIN']['success'] = False
00096             result['MAIN']['message'] = msgTemplate.safe_substitute( table='MAIN' )
00097 
00098         # subtables
00099         for t in self.subtables:
00100             result[t] = item
00101             pathToSubtable = asapname + '/' + t
00102             if not os.path.exists( pathToSubtable ):
00103                 result[t]['success'] = False
00104                 result[t]['message'] = msgTemplate.safe_substitute( table = t )
00105 
00106         self.__checkResult( result )
00107 
00108     def tableContentsCheck( self ):
00109         result={}
00110         item = { 'success': True, 'message':'' }
00111         msgTemplate = string.Template( '%s/$table: nrow must be $valid (was $thevalue)' )
00112 
00113         # MAIN
00114         result['MAIN'] = item
00115         tb.open( asapname )
00116         nrow = tb.nrows()
00117         tb.close()
00118         if nrow != self.nrows['MAIN']:
00119             result['MAIN']['success'] = False
00120             result['MAIN']['message'] = msgTemplate.safe_substitute( table='MAIN', valid=self.nrows['MAIN'], thevalue=nrow )
00121 
00122         # subtables
00123         for t in self.subtables:
00124             result[t] = item
00125             pathToSubtable = asapname + '/' + t
00126             tb.open( pathToSubtable )
00127             nrow = tb.nrows()
00128             tb.close()
00129             if nrow != self.nrows[t]:
00130                 result[t]['success'] = False
00131                 result[t]['message'] = msgTemplate.safe_substitute( table=t, valid=self.nrows[t], thevalue=nrow )
00132 
00133         self.__checkResult( result )
00134 
00135         # MAIN header
00136         items = { 'nIF': 2,
00137                   'nPol': 1,
00138                   'nBeam': 1,
00139                   'nChan': 256,
00140                   'AntennaName': 'OSF//DV01@TF1' }
00141         self.__checkHeader( items )
00142 
00143         # MAIN column
00144         items = { 0: 0.50806641578674316,
00145                   1788: 10.553685188293457 }
00146         self.__checkColumn( 'SPECTRA', items )
00147 
00148         # FREQUENCIES column
00149         items = { 0: 8.6276162900858246e10,
00150                   1: 8.6287882216325546e10 }
00151         self.__checkColumn( 'REFVAL', items, 'FREQUENCIES' )
00152         
00153     def __checkResult( self, result ):
00154         for key in result.keys():
00155             r = result[key]
00156             self.assertTrue( r['success'], msg=r['message'] )        
00157 
00158     def __checkHeader( self, items ):
00159         msgTemplate = string.Template( 'HEADER: $key must be $valid (was &value).' )
00160         vals = {}
00161         tb.open( asapname )
00162         for key in items.keys():
00163             vals[key] = tb.getkeyword( key )
00164         tb.close()
00165 
00166         for key in items.keys():
00167             #print '%s: %s'%(key,vals[key])
00168             self.assertEqual( vals[key], items[key],
00169                               msg=msgTemplate.safe_substitute(key=key,valid=items[key],value=vals[key]) )
00170 
00171     def __checkColumn( self, column, items, table='MAIN' ):
00172         msgTemplate = string.Template( '$table/$column: row $row differ (difference is $diff)' )
00173         vals = {}
00174         if table is 'MAIN':
00175             tb.open( asapname )
00176         else:
00177             tb.open( asapname + '/' + table )
00178         for key in items.keys():
00179             v = tb.getcell( column, key )
00180             if isinstance( v, numpy.ndarray ):
00181                 vals[key] = v[0]
00182             else:
00183                 vals[key] = v
00184         tb.close()
00185 
00186         for key in items.keys():
00187             #print '%s: %s'%(key,vals[key])
00188             diff = (vals[key] - items[key]) / vals[key]
00189             #print 'diff = %12.10f'%(diff)
00190             self.assertTrue( diff < 1.0e-8,
00191                              msg=msgTemplate.safe_substitute(table=table,column=column,row=key,diff=diff) )
00192 
00193 
00194 def suite():
00195     return [asdmsd_import]