def pixelmask2cleanmask(imagename='', maskname='mask0', maskimage='', usemasked=False): """ convert pixel(T/F) mask (in a CASA image) to a mask image (1/0) used for clean imagename - input imagename that contain a mask to be used maskname - mask name in the image (default: mask0) maskimage - output mask image name usemasked - if True use masked region as a valid region """ ia.open(imagename) masks = ia.maskhandler('get') ia.close() inmaskname = '' if type(masks) != list: masks = [masks] for msk in masks: if maskname == msk: inmaskname = msk break if inmaskname == '': raise Exception, "mask %s does not exist. Available masks are: %s" % ( maskname, masks) tb.open(imagename + '/' + maskname) dat0 = tb.getcol('PagedArray') tb.close() #os.system('cp -r %s %s' % (imagename, maskimage)) shutil.copytree(imagename, maskimage) ia.open(maskimage) # to unset mask ia.maskhandler('set', ['']) # make all valid if (usemasked): ia.set(1) else: ia.set(0) ia.close() # tb.open(maskimage, nomodify=False) imd = tb.getcol('map') # maybe shape check here #by default use True part of bool mask masked = 1 if (usemasked): masked = 0 imd[dat0] = masked tb.putcol('map', imd) tb.close()
def pixelmask2cleanmask(imagename='',maskname='mask0',maskimage='',usemasked=False): """ convert pixel(T/F) mask (in a CASA image) to a mask image (1/0) used for clean imagename - input imagename that contain a mask to be used maskname - mask name in the image (default: mask0) maskimage - output mask image name usemasked - if True use masked region as a valid region """ ia.open(imagename) masks=ia.maskhandler('get') ia.close() inmaskname='' if type(masks)!=list: masks=[masks] for msk in masks: if maskname == msk: inmaskname=msk break if inmaskname=='': raise Exception, "mask %s does not exist. Available masks are: %s" % (maskname,masks) tb.open(imagename+'/'+maskname) dat0=tb.getcol('PagedArray') tb.close() #os.system('cp -r %s %s' % (imagename, maskimage)) shutil.copytree(imagename,maskimage) ia.open(maskimage) # to unset mask ia.maskhandler('set',['']) # make all valid if (usemasked): ia.set(1) else: ia.set(0) ia.close() # tb.open(maskimage,nomodify=False) imd=tb.getcol('map') # maybe shape check here #by default use True part of bool mask masked=1 if (usemasked): masked=0 imd[dat0]=masked tb.putcol('map',imd) tb.close()
def blankcube(image, dummyMS, smooth=True, verbose=True, region='centerbox[[10h21m45s,18.05.14.9],[15arcmin,15arcmin]]', ruthless=False, extension='.image', beamround='int', blankThreshold=2.5, moments=[0]): ''' Parameters ---------- image : string Base name of image. If target image has extension other than '.image', change the extension keyword. dummyMS : string MS file required for blanking process in CASA smooth : bool, optional Smooth the image to a circular beam before blanking? Default True verbose : bool, optional region : string, optional region parameter featured in CASA ruthless : bool, optional Delete previous outputs from blankcube extension : string, optional Extension of the target image. Must include the '.', e.g., '.restored' Default '.image' beamround : string,float P blankThreshold : float, optional Initial blanking threshold of all pixels scaled by the standard deviation times the blankingthreshold Default = 2.5 (Walter et al. 2008) moments : list, optional Moments to calculate from cube. Options are 0,1,2. Example: [0,1,2] Default: [0] Returns ------- out : null Examples -------- ''' from casa import immath, imsmooth, immoments from casa import image as ia from casa import imager as im from casa import quanta as qa import os import numpy as np # Delete files associated with previous runs if ruthless: os.system('rm -rf ' + image + '.smooth.blk.image') os.system('rm -rf ' + image + '.smooth.image') os.system('rm -rf ' + image + '.blk.image') os.system('rm -rf ' + image + '.mask') imageDir = './' # Create moment maps mom0, mom1, mom2 = False, False, False if len(moments) > 0: for i, moment in enumerate(moments): if moment == 0: mom0 = True if moment == 1: mom1 = True if moment == 2: mom2 = True if mom1 == True or mom2 == True: beamScale = 1.01 elif mom0 == True: beamScale = 2. # determine beamsize of cube ia.open(imageDir + image + extension) beamsizes = np.zeros(ia.shape()[2]) for i in range(ia.shape()[2]): beamsizes[i] = ia.restoringbeam(channel=i)['major']['value'] beamsizeUnit = ia.restoringbeam(channel=i)['major']['unit'] beamsize = qa.convert(str(beamsizes.max()) + beamsizeUnit, 'arcsec')['value'] if type(beamround) == float: beamsize_smooth = beamround * beamsize else: beamsize_smooth = np.ceil(beamsize) #beamsize_smooth = 1.01 * beamsize ia.close() if verbose: print 'Max beamsize is ' + str(beamsize) + '"' if not os.path.exists(image + '.blk.image'): # create cube for blanking if smooth: # smooth to a larger beam if the user desires if verbose: print 'Convolving to ' + str(beamsize_smooth) + '"' imsmooth(imagename=image + extension, outfile=image + '.blk.image', major=str(beamsize_smooth) + 'arcsec', minor=str(beamsize_smooth) + 'arcsec', region=region, pa='0deg', targetres=True) else: # do no smooth immath(imagename=image + extension, outfile=image + '.blk.image', mode='evalexpr', region=region, expr='IM0') if not os.path.exists(image + '.smooth.image'): # convolve cube to 2X beam for blanking imsmooth(imagename=image + extension, outfile=image + '.smooth.image', major=str(beamsize * beamScale) + 'arcsec', minor=str(beamsize * beamScale) + 'arcsec', pa='0deg', region=region, targetres=True) # determine threshold of cube ia.open(image + '.smooth.image') threshold = ia.statistics()['sigma'][0] * blankThreshold ia.close() # blank the cube at threshold*sigma ia.open(image + '.smooth.image') ia.calcmask(mask=image + '.smooth.image > ' + str(threshold), name='mask1') wait = 'waits for calcmask to close' ia.close() # hand blank the cube im.open(dummyMS) pause = None while pause is None: im.drawmask(image=image + '.smooth.image', mask=image + '.mask') pause = 0 im.close # mask contains values of 0 and 1, change to a mask with only values of 1 ia.open(image + '.mask') ia.calcmask(image + '.mask' + '>0.5') ia.close() # apply mask on smoothed image immath(imagename=image + '.smooth.image', outfile=image + '.smooth.blk.image', mode='evalexpr', mask='mask(' + image + '.mask)', expr='IM0') # apply mask on image ia.open(imageDir + image + '.blk.image') ia.maskhandler('copy', [image + '.smooth.blk.image:mask0', 'newmask']) ia.maskhandler('set', 'newmask') ia.done() cube = '.blk.image' # specify name of cube for moment calculation # create moment 0 map if mom0: if ruthless: os.system('rm -rf ' + image + '.mom0.image') immoments(imagename=image + cube, moments=[0], axis='spectra', chans='', mask='mask(' + image + cube + ')', outfile=image + '.mom0.image') # create moment 1 map if mom1: if ruthless: os.system('rm -rf ' + image + '.mom1.image') immoments(imagename=image + cube, moments=[1], axis='spectra', chans='', mask='mask(' + image + cube + ')', outfile=image + '.mom1.image') # create moment 2 map if mom2: if ruthless: os.system('rm -rf ' + image + '.mom2.image') immoments(imagename=image + cube, moments=[2], axis='spectra', chans='', mask='mask(' + image + cube + ')', outfile=image + '.mom2.image') if verbose and mom0: from casa import imstat flux = imstat(image + '.mom0.image')['flux'][0] ia.open(image + '.mom0.image') beammaj = ia.restoringbeam(channel=0)['major']['value'] beammin = ia.restoringbeam(channel=0)['minor']['value'] beamsizeUnit = ia.restoringbeam(channel=0)['major']['unit'] ia.close() print 'Moment Image: ' + str(image) + '.mom0.image' print 'Beamsize: ' + str(beammaj) + '" X ' + str(beammin) + '"' print 'Flux: ' + str(flux) + ' Jy km/s'
def blankcube(image, dummyMS, smooth=True, verbose=True, region='centerbox[[10h21m45s,18.05.14.9],[15arcmin,15arcmin]]', ruthless=False, extension='.image', beamround='int', blankThreshold=2.5, moments=[0]): ''' Parameters ---------- image : string Base name of image. If target image has extension other than '.image', change the extension keyword. dummyMS : string MS file required for blanking process in CASA smooth : bool, optional Smooth the image to a circular beam before blanking? Default True verbose : bool, optional region : string, optional region parameter featured in CASA ruthless : bool, optional Delete previous outputs from blankcube extension : string, optional Extension of the target image. Must include the '.', e.g., '.restored' Default '.image' beamround : string,float P blankThreshold : float, optional Initial blanking threshold of all pixels scaled by the standard deviation times the blankingthreshold Default = 2.5 (Walter et al. 2008) moments : list, optional Moments to calculate from cube. Options are 0,1,2. Example: [0,1,2] Default: [0] Returns ------- out : null Examples -------- ''' from casa import immath,imsmooth,immoments from casa import image as ia from casa import imager as im from casa import quanta as qa import os import numpy as np # Delete files associated with previous runs if ruthless: os.system('rm -rf ' + image + '.smooth.blk.image') os.system('rm -rf ' + image + '.smooth.image') os.system('rm -rf ' + image + '.blk.image') os.system('rm -rf ' + image + '.mask') imageDir = './' # Create moment maps mom0,mom1,mom2 = False,False,False if len(moments) > 0: for i, moment in enumerate(moments): if moment == 0: mom0 = True if moment == 1: mom1 = True if moment == 2: mom2 = True if mom1 == True or mom2 == True: beamScale = 1.01 elif mom0 == True: beamScale = 2. # determine beamsize of cube ia.open(imageDir + image + extension) beamsizes = np.zeros(ia.shape()[2]) for i in range(ia.shape()[2]): beamsizes[i] = ia.restoringbeam(channel=i)['major']['value'] beamsizeUnit = ia.restoringbeam(channel=i)['major']['unit'] beamsize = qa.convert(str(beamsizes.max()) + beamsizeUnit,'arcsec')['value'] if type(beamround) == float: beamsize_smooth = beamround*beamsize else: beamsize_smooth = np.ceil(beamsize) #beamsize_smooth = 1.01 * beamsize ia.close() if verbose: print 'Max beamsize is ' + str(beamsize) + '"' if not os.path.exists(image + '.blk.image'): # create cube for blanking if smooth: # smooth to a larger beam if the user desires if verbose: print 'Convolving to ' + str(beamsize_smooth) + '"' imsmooth(imagename=image + extension, outfile=image + '.blk.image', major=str(beamsize_smooth) + 'arcsec', minor=str(beamsize_smooth) + 'arcsec', region=region, pa='0deg', targetres=True) else: # do no smooth immath(imagename=image + extension, outfile=image + '.blk.image', mode='evalexpr', region=region, expr='IM0') if not os.path.exists(image + '.smooth.image'): # convolve cube to 2X beam for blanking imsmooth(imagename=image + extension, outfile=image + '.smooth.image', major=str(beamsize*beamScale) + 'arcsec', minor=str(beamsize*beamScale) + 'arcsec', pa='0deg', region=region, targetres=True) # determine threshold of cube ia.open(image + '.smooth.image') threshold = ia.statistics()['sigma'][0] * blankThreshold ia.close() # blank the cube at threshold*sigma ia.open(image + '.smooth.image') ia.calcmask(mask=image + '.smooth.image > ' + str(threshold), name='mask1') wait = 'waits for calcmask to close' ia.close() # hand blank the cube im.open(dummyMS) pause = None while pause is None: im.drawmask(image=image + '.smooth.image', mask=image + '.mask') pause = 0 im.close # mask contains values of 0 and 1, change to a mask with only values of 1 ia.open(image + '.mask') ia.calcmask(image + '.mask' + '>0.5') ia.close() # apply mask on smoothed image immath(imagename=image + '.smooth.image', outfile=image + '.smooth.blk.image', mode='evalexpr', mask='mask(' + image + '.mask)', expr='IM0') # apply mask on image ia.open(imageDir + image + '.blk.image') ia.maskhandler('copy',[image + '.smooth.blk.image:mask0', 'newmask']) ia.maskhandler('set','newmask') ia.done() cube = '.blk.image' # specify name of cube for moment calculation # create moment 0 map if mom0: if ruthless: os.system('rm -rf ' + image + '.mom0.image') immoments(imagename=image + cube, moments=[0], axis='spectra', chans='', mask='mask(' + image + cube + ')', outfile=image + '.mom0.image') # create moment 1 map if mom1: if ruthless: os.system('rm -rf ' + image + '.mom1.image') immoments(imagename=image + cube, moments=[1], axis='spectra', chans='', mask='mask(' + image + cube + ')', outfile=image + '.mom1.image') # create moment 2 map if mom2: if ruthless: os.system('rm -rf ' + image + '.mom2.image') immoments(imagename=image + cube, moments=[2], axis='spectra', chans='', mask='mask(' + image + cube + ')', outfile=image + '.mom2.image') if verbose and mom0: from casa import imstat flux = imstat(image + '.mom0.image')['flux'][0] ia.open(image + '.mom0.image') beammaj = ia.restoringbeam(channel=0)['major']['value'] beammin = ia.restoringbeam(channel=0)['minor']['value'] beamsizeUnit = ia.restoringbeam(channel=0)['major']['unit'] ia.close() print 'Moment Image: ' + str(image) + '.mom0.image' print 'Beamsize: ' + str(beammaj) + '" X ' + str(beammin) + '"' print 'Flux: ' + str(flux) + ' Jy km/s'