from __future__ import absolute_import import datetime import os import re import shutil # get is_CASA6 and is_python3 from casatasks.private.casa_transition import * if is_CASA6: from casatools import singledishms, calibrater, ms from casatools.platform import bytes2str from casatasks import casalog from .mstools import write_history mysdms = singledishms( ) mycb = calibrater( ) myms = ms( ) else: from taskinit import * from mstools import write_history mysdms, mycb, myms = gentools(['sdms', 'cb', 'ms']) def importnro(infile=None, outputvis=None, overwrite=None, parallel=None): """ """ casalog.origin('importnro') status = True try: outputvis_temp = outputvis + '-backup-' + datetime.datetime.now().strftime('%Y%m%d-%H%M%S') if os.path.exists(outputvis): if overwrite: os.rename(outputvis, outputvis_temp) else: raise RuntimeError('%s exists.'%(outputvis)) if not _is_nostar(infile): raise RuntimeError('%s is not a valid NOSTAR data.'%(infile)) status = mysdms.importnro(infile, outputvis, parallel) if status: # initialize weights using cb tool mycb.open(outputvis, compress=False, addcorr=False, addmodel=False) mycb.initweights(wtmode='nyq') if os.path.exists(outputvis_temp): shutil.rmtree(outputvis_temp) else: if os.path.exists(outputvis): shutil.rmtree(outputvis) if os.path.exists(outputvis_temp): os.rename(outputvis_temp, outputvis) raise RuntimeError('import failed.') # Write parameters to HISTORY table of MS param_names = importnro.__code__.co_varnames[:importnro.__code__.co_argcount] if is_python3: vars = locals() param_vals = [vars[p] for p in param_names] else: param_vals = [eval(p) for p in param_names] write_history(myms, outputvis, 'importnro', param_names, param_vals, casalog) finally: if status: mycb.close() def _is_nostar(filename): """ Check if given data is NOSTAR or not """ ret = False if os.path.getsize(filename) >= 15136: # size of observation header with open(filename, 'rb') as f: if is_CASA6: if bytes2str(f.read(8).replace(b'\x00', b'')) == 'RW': ret = (bytes2str(f.read(15136-8+4)[-4:].replace(b'\x00', b'')) == 'LS') else: if f.read(8).replace('\x00', '') == 'RW': ret = f.read(15136-8+4)[-4:].replace('\x00', '') == 'LS' f.close() return ret