Masking images for analysis: Difference between revisions

From CASA Guides
Jump to navigationJump to search
No edit summary
mNo edit summary
 
(14 intermediate revisions by 2 users not shown)
Line 2: Line 2:


Here we describe how to create masked images. This implies to mark pixels as blanked values (different to zeros) at places that shall not be considered further. A typical application is to blank all noise values and sidelobes with the goal to obtain a data cube that has only reliable flux pixels in it.  
Here we describe how to create masked images. This implies to mark pixels as blanked values (different to zeros) at places that shall not be considered further. A typical application is to blank all noise values and sidelobes with the goal to obtain a data cube that has only reliable flux pixels in it.  
Versioning note (August 2021): In CASA 6, under the standard NRAO installation, ia is imported as iatool


'''1) Mask all values below a threshold'''
'''1) Mask all values below a threshold'''
Line 13: Line 15:
</pre>
</pre>


this will create a mask with the profane name ''mymask1'' within the image cube ''image.im''. Supported is the full LEL syntax. All values above the 0.0126 threshold is kept, the value below are blanked. This mask can be manipulated with other [http://casa.nrao.edu/docs/CasaRef/CasaRef.html tools]
this will create a mask with the profane name ''mymask1'' within the image cube ''image.im''. Supported is the full [http://casa.nrao.edu/aips2_docs/notes/223/index.shtml LEL syntax]. All values above the 0.0126 threshold are kept, the values below that threshold are blanked. This mask can be manipulated with other [http://casa.nrao.edu/docs/CasaRef/CasaRef.html tools]




Line 21: Line 23:


    
    
* first you need to create the regions for an entire cube (unfortunately the current viewer only does so on a single plane). We use the toolbox for this: ''im.drawmask''
First, create a region file for an entire cube containing plane-by-plane regions that encompass the emission features of interest (unfortunately the current viewer only does so on a single plane). We use the ''im.drawmask'' tool to do so.
 
As this is an imager tool, we have to give an input visibility
As this is an imager tool, we have to give an input visibility
when opening, even though we will only be working on the image.
when opening, even though we will only be working on the image.
Line 31: Line 32:
</pre>
</pre>


This should launch viewer in a familiar looking way - you have the same interface
This command should launch the ''viewer'' in a familiar looking way - you have the same interface
as for interactive cleaning.  Use regions to select the galaxy in each channel it
as for interactive cleaning.  Use regions to select your object in each channel and it
shows up in as you would for interactive clean.  You want to use a separate region for
shows up in as you would for interactive clean.  You want to use a separate region for
each plane as we are trying to very precisely determine where there is source or not.
each plane as we are trying to very precisely determine where there is source or not.
Line 38: Line 39:
against the background - you don't want to accidentally include noise because
against the background - you don't want to accidentally include noise because
you couldn't see it.
you couldn't see it.
When you're done press the blue continue arrow as a way to quit
When you're done press the blue continue arrow as a way to quit.
Then close the imager tools
Then close the imager tools


Line 46: Line 47:




You can check that this worked by looking at it in viewer, looking at the ''image.im'' or within the ''image.im'' file/directory, by looking at the ''blank3.mask'' directly. In the mask, there are 1's for the
You can check that this worked by looking at it in the ''viewer'', looking at the ''image.im'' or within the ''image.im'' file/directory, by looking at the ''blank3.mask'' directly. In the mask, there are 1's for the
regions we marked as having signals and 0's elsewhere.
regions we marked as having signals and 0's elsewhere.






Masks are full of boolean values - ''True'''s and ''False'''s
Masks are full of boolean values - ''True'' 's and ''False'' 's
In order to proceed, we need to make a mask of the mask
In order to proceed, we need to make a mask of the mask
This is done with ''calcmask'' again:
This is done with ''calcmask'' again:
(see 6.5.2 of CASA guide & toolbox tricks)
(see [http://casa.nrao.edu/docs/UserMan/UserMansu280.html#x331-3270006.5.2 6.5.2 of CASA guide] & toolbox tricks)
Open the mask image and create a mask where all values below 0.5 are masked (to distinguish between 0s and 1s):
Open the mask image and create a mask where all values below 0.5 are masked (to distinguish between 0s and 1s):


Line 85: Line 86:
and applies the mask ''blank3.mask'', writing out to ''imagemasked.im''
and applies the mask ''blank3.mask'', writing out to ''imagemasked.im''


Load this into viewer to check that things worked the way you expected,  
Load this into ''viewer'' to check that things worked the way you expected,  
We should just see the selected signal.  
We should just see the selected signal.  


'''4) copy a mask from one image to another image'''
'''4) copy a mask from one image to another image'''


If you look at the master image created above, you'll notice that we have
If you look at the master image created above, you'll notice that we have

Latest revision as of 10:54, 25 August 2021

How to mask an image for further analysis (e.g. for moment analyses)

Here we describe how to create masked images. This implies to mark pixels as blanked values (different to zeros) at places that shall not be considered further. A typical application is to blank all noise values and sidelobes with the goal to obtain a data cube that has only reliable flux pixels in it.

Versioning note (August 2021): In CASA 6, under the standard NRAO installation, ia is imported as iatool

1) Mask all values below a threshold

Say, you want to blank (mask) all pixels in your image image.im below a value of 126mJy/beam (if your image has the units of mJy/beam). You can do this with ia.calcmask:

ia.open('image.im')
ia.calcmask(mask='image.im > 0.0126', name='mymask1')
ia.done()

this will create a mask with the profane name mymask1 within the image cube image.im. Supported is the full LEL syntax. All values above the 0.0126 threshold are kept, the values below that threshold are blanked. This mask can be manipulated with other tools


2) Create regions and mask the values

A threshold is not always sufficient and one would like to mask values that are supposedly not real or not under consideration (e.g. sidelobes).


First, create a region file for an entire cube containing plane-by-plane regions that encompass the emission features of interest (unfortunately the current viewer only does so on a single plane). We use the im.drawmask tool to do so. As this is an imager tool, we have to give an input visibility when opening, even though we will only be working on the image.

im.open('fantasticvis.ms')
im.drawmask(image='image.im',mask='blank3.mask')

This command should launch the viewer in a familiar looking way - you have the same interface as for interactive cleaning. Use regions to select your object in each channel and it shows up in as you would for interactive clean. You want to use a separate region for each plane as we are trying to very precisely determine where there is source or not. Make sure to adjust the stretch so that the lowest level emission can be clearly seen against the background - you don't want to accidentally include noise because you couldn't see it. When you're done press the blue continue arrow as a way to quit. Then close the imager tools

im.close


You can check that this worked by looking at it in the viewer, looking at the image.im or within the image.im file/directory, by looking at the blank3.mask directly. In the mask, there are 1's for the regions we marked as having signals and 0's elsewhere.


Masks are full of boolean values - True 's and False 's In order to proceed, we need to make a mask of the mask This is done with calcmask again: (see 6.5.2 of CASA guide & toolbox tricks) Open the mask image and create a mask where all values below 0.5 are masked (to distinguish between 0s and 1s):

ia.open('blank3.mask')
ia.calcmask('"blank3.mask">0.5')
ia.close()


This has created something called mask0 We can also see this by:

ls blank3.mask


3) combining a mask with a masked image

Now we want to use immath to apply a mask to an image that already has a mask inside, i.e. we want to combine the masked image created in step 1) with the mask of step 2):

immath(imagename='image.im',mode='evalexpr',
expr='IM0',outfile='imagemasked.im',mask='mask(blank3.mask)')


This evaluates the input image.im (with its clipped mask) and applies the mask blank3.mask, writing out to imagemasked.im

Load this into viewer to check that things worked the way you expected, We should just see the selected signal.


4) copy a mask from one image to another image

If you look at the master image created above, you'll notice that we have a mask0 file within it - we want to apply this mask to other images of the exact same dimensions as image.im (e.g. from a smoothed to an unsmoothed version, or to one that was differently weighted). The way to do this is to use the maskhandler tool.

ia.open('otherimage.im')
ia.maskhandler('copy',['imagemasked.im:mask0', 'newmask'])
ia.maskhandler('set','newmask')
ia.done()

You may now use this image for further analysis, e.g. to create moment maps that are not contaminated by noise or sidelobes, or objects that you manually removed earlier.