Sunspot Band6 Feathering for CASA 6.5.4: Difference between revisions

From CASA Guides
Jump to navigationJump to search
 
(72 intermediate revisions by the same user not shown)
Line 5: Line 5:
{{CARTA_6.5.4}}
{{CARTA_6.5.4}}


This portion of the [[Sunspot Band6]] guide covers the combination process between the synthesized solar image and the full-sun image obtained with the TP array. It is the final step after: 1) calibrating the IF visibility data; 2) imaging the IF data; 3) calibrating and imaging the single-dish data. If you wish, you may skip parts 1 and 2, download the calibrated data package, ''Sunspot_Band6_CalibratedData.tgz'', and complete part 3.
This portion of the [[Sunspot Band6]] guide covers the combination process between the synthesized solar image and the full-sun image obtained with the TP array. It is the final step after:
# calibrating the IF visibility data
# imaging the IF data
# calibrating and imaging the single-dish data
 
If you wish, you may skip parts 1 and 2, download the calibrated data package, ''Sunspot_Band6_CalibratedData.tgz'', and complete part 3.


If you completed parts 1 and 2, we assume that you are working in the directory ''Sunspot_Band6_UncalibratedData''. If you skip parts 1 and 2, and use the provided calibrated data, we assume that the working directory is ''Sunspot_Band6_CalibratedData''.
If you completed parts 1 and 2, we assume that you are working in the directory ''Sunspot_Band6_UncalibratedData''. If you skip parts 1 and 2, and use the provided calibrated data, we assume that the working directory is ''Sunspot_Band6_CalibratedData''.
For this step you will need:
* ''AR12470_B6AllSpw_I.image'' - the synth image from part 2, before PB correction.
* ''AR12470_B6AllSpw_I.pb'' - the PB from part 2.
* ''uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.rescl'' - the rescaled single dish image from part 3.


==Prepare the Single-Dish Data for Combination==
==Prepare the Single-Dish Data for Combination==
===Obtain the RA/Dec Coordinate of the Sun Center at the Reference Time===
Before starting the combination process in CASA, we need to know the RA/Dec coordinate of the sun center at the reference time, which is used during the interferometric observation, because the observing time of the TP-array is not exactly the same. The Sun was moving on the RA/Dec coordinate frame during the gap between these observations. We need to shift the coordinate of the full-sun image based on the coordinate of the sun center at the reference time. The reference time of the observation is:<br> ''19:49:00UT, December 18 2015''.
We obtain the RA/Dec coordinate of the sun center estimated from [http://ssd.jpl.nasa.gov/horizons.cgi JPL's HORIZONS system]:<br> ''RA: 266.01898 degree<br> Dec: -23.38648 degrees.''


===List the Image Header===
===List the Image Header===
Line 21: Line 26:
<source lang='python'>
<source lang='python'>
# In CASA
# In CASA
int_base = 'AR12470_B6AllSpw_I'                        # basename of the interferometric image
if_base      = 'AR12470_B6AllSpw_I'                        # basename of the interferometric image
sd_img_base = 'uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3' # basename of the single dish image
sd_base      = 'uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3'   # basename of the single dish image
out_base = 'AR12470_B6AllSpw_I_Feather'                # basename of the combined products
combined_base = 'AR12470_B6AllSpw_I_Feather'                # basename of the combined products
</source>
</source>


The unit of the full-sun map is Kelvin. On the other hand, the unit of the synthesized image is Jy/beam. Since we will need to set the coordinate and convert the brightness unit of the single dish image, let's examine the image header with {{imhead_6.5.4}} and ''mode='list'''.
Now let's examine the single dish image header with {{imhead_6.5.4}} and ''mode='list'''.


<source lang='python'>
<source lang='python'>
# In CASA
# In CASA
imhead(imagename=sd_img_base+'.rescl', mode='list')
imhead(imagename=sd_base+'.rescl', mode='list')
</source>
</source>


Line 85: Line 90:
</pre>
</pre>


[[File:sunspot_fullsun2.png|thumb|right|'''Fig. 1.''' The full-sun map with 'Jy/beam' unit.]]
===Convert the Brightness Unit===
[[File:sunspot_sdspot.png|thumb|right|'''Fig. 2.''' The trimmed map from the full-sun map.]]


===Convert the Brightness Unit===
[[File:sunspot_singledish_coordinate_unit_CASA_6.5.4.png|500px|thumb|right|'''Fig. 1.'''<br>Left: The full-sun map with its original coordinate grid and brightness units of Kelvin.<br> Right: The shifted coordinate grid and brightness converted to units of Jy/beam.]]


First we convert the brightness values of the full-sun image from K to Jy/beam with {{immath_6.5.4}}. This will produce a new image with the scaled values.
The unit of the full-sun map is Kelvin. On the other hand, the unit of the synthesized image is Jy/beam. We retrieve frequency and beam size information with {{imhead_6.5.4}}, then convert the brightness values from K to Jy/beam with {{immath_6.5.4}}. This will produce a new image with the scaled values.


<source lang='python'>
<source lang='python'>
# In CASA
# In CASA


# derive a scaling factor based on frequency and beam size
# derive a scaling factor based on single dish frequency and beam size
crval4S= imhead(sd_img_base+'.rescl', mode='get', hdkey='crval4')
freq_SD  = imhead(sd_base+'.rescl', mode='get', hdkey='crval4')['value']
freqSD = crval4S['value']
sd_bmajor = imhead(sd_base+'.rescl', mode='get', hdkey='beammajor')['value']
sbema = imhead(sd_img_base+'.rescl', mode='get', hdkey='beammajor')
sd_bminor = imhead(sd_base+'.rescl', mode='get', hdkey='beamminor')['value']
sbemi = imhead(sd_img_base+'.rescl', mode='get', hdkey='beamminor')
 
sbmajor = sbema['value']
convK2Jb = str(13.6 * (300./(freq_SD/1.e9))**2. * (1./sd_bmajor)*(1./sd_bminor))
sbminor = sbemi['value']
# = '0.02787151811741245'
convKJb = str(13.6 * (300./(freqSD/1.e9))**2. * (1./sbmajor)*(1./sbminor))


# create a new image with scaled values
# create a new image with scaled values
immath(imagename=sd_img_base+'.rescl', expr='IM0/'+convKJb, outfile=sd_img_base+'.jyb.im')
import os
os.system(f'rm -rf {sd_base}.jyb.im')
 
immath(
  imagename=sd_base+'.rescl',
  expr='IM0/'+convK2Jb,
  outfile=sd_base+'.jyb.im')
 
# change the brightness unit in the new image header from K to Jy/beam
imhead(
  imagename=sd_base+'.jyb.im',
  mode='put',
  hdkey='bunit',
  hdvalue='Jy/beam')
</source>
</source>
<!--
<!--
# set the Stokes parameter to I
# set the Stokes parameter to I
imhead(imagename=sd_img_base+'.jyb.im', mode='put', hdkey='crval3', hdvalue=['I'])
imhead(imagename=sd_base+'.jyb.im', mode='put', hdkey='crval3', hdvalue=['I'])
-->
-->


Next, change the brightness unit of the new image from K to Jy/beam using {{imhead_6.5.4}} and ''mode='put''':
===Obtain the RA/Dec Coordinate of the Sun Center at the Reference Time===
Before starting the combination process in CASA, we need to know the RA/Dec coordinate of the sun center at the reference time, which is used during the interferometric observation, because the observing time of the TP-array is not exactly the same. The Sun was moving on the RA/Dec coordinate frame during the gap between these observations. We need to shift the coordinate of the full-sun image based on the coordinate of the sun center at the reference time. The reference time of the observation is:<br> ''19:49:00UT, December 18 2015''.


<source lang='python'>
We obtain the RA/Dec coordinate of the sun center estimated from [http://ssd.jpl.nasa.gov/horizons.cgi JPL's HORIZONS system]:<br> ''RA: 266.01898 degree<br> Dec: -23.38648 degrees.''
imhead(imagename=sd_img_base+'.jyb.im', mode='put', hdkey='bunit', hdvalue='Jy/beam')
</source>


===Change the Coordinate===
===Change the Coordinate===


RA/Dec are shown as ''ctype1/ctype2'', which correspond to ''crval1/crval2''. We shift the coordinate based on the RA/Dec coordinate obtained in the previous section by using ''mode='put''' as follows.
RA/Dec are shown in the image header as ''ctype1/ctype2'', which correspond to ''crval1/crval2''. We shift the coordinate based on the RA/Dec coordinate obtained in the previous section by using ''mode='put''' as follows.


<source lang='python'>
<source lang='python'>
Line 127: Line 142:
sun_ra = str(266.01898 * np.pi/180.)
sun_ra = str(266.01898 * np.pi/180.)
sun_dec = str(-23.38648 * np.pi/180.)
sun_dec = str(-23.38648 * np.pi/180.)
imhead(imagename=sd_img_base+'.rescl', mode='put', hdkey='crval1', hdvalue=sun_ra)
 
imhead(imagename=sd_img_base+'.rescl', mode='put', hdkey='crval2', hdvalue=sun_dec)
imhead(imagename=sd_base+'.jyb.im', mode='put', hdkey='crval1', hdvalue=sun_ra)
imhead(imagename=sd_base+'.jyb.im', mode='put', hdkey='crval2', hdvalue=sun_dec)
</source>
 
Now open the image in CARTA. If using NRAO machines, you can open a new terminal tab, cd to the working directory, then type:
 
<source lang='bash'>
# in terminal
carta --no_browser
</source>
</source>


The result of the process is shown in Figure 1. A look of the image is not changed, but you can find the changing of the values and unit in the 'Sunspot_Band6_SingleDish_for_CASA_4.7' tutorial.
Copy the output URL into a browser to view your CARTA session. Select and load:
* ''uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.rescl''
* ''uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.im''


===Regrid and Crop===
The result of the process is shown in Figure 1. The look of the image has not changed, but the coordinates and units are now changed to match the synthesized image.


Then we do the re-gridding and trimming to fit the map area to that of the synthesized image. The area of the trimming is set to the same as the CLEAN box, in the tutorial.
===Regrid, Trim, and Multiply by the Synth Primary Beam===
 
[[File:sunspot_singledish_regrid_CASA_6.5.4.png|400px|thumb|right|'''Fig. 2.'''<br>Left: The full-sun image from Figure 1.<br> Right: The full-sun image regridded based on the synthesized image.<br><br> The images are spatially matched and raster scaling matched. A circular region is drawn to clearly show the spatial matching.]]
[[File:sunspot_singledish_regrid_trim_CASA_6.5.4.png|400px|thumb|right|'''Fig. 3.'''<br>Left: The regridded full-sun image.<br> Right: The regridded image after trimming.<br><br> The images are spatially matched and raster scaling matched.]]
 
Now we regrid and trim the full-sun image with {{imregrid_6.5.4}} and {{imsubimage_6.5.4}} to match the size of the synthesized image as shown in Figure 2.
<!-- The area of the trimming is set to the same as the CLEAN box.
# Trimming to exclude noisy edge regions in the TP image -->


<source lang='python'>
<source lang='python'>
# In CASA
# In CASA
# re-griding of SD data
os.system(f'rm -rf {sd_base}.jyb.regrid')
imregrid(imagename=sd_img_base+'.jyb.im', template=int_base+'.image', axes=[0, 1], output=sd_img_base+'.jyb.regrid')
os.system(f'rm -rf {sd_base}.jyb.regrid.subim')


# Trimming to exclude noisy edge regions in the TP image
imregrid(
imsubimage(imagename=sd_img_base+'.jyb.regrid', outfile=sd_img_base+'.jyb.regrid.subim', box='100,100,400,400')
  imagename=sd_base+'.jyb.im',
  template=if_base+'.image',
  axes=[0,1],
  output=sd_base+'.jyb.regrid')
 
imsubimage(
  imagename=sd_base+'.jyb.regrid',
  outfile=sd_base+'.jyb.regrid.subim',
  box='100,100,400,400')
</source>
</source>


As the final process of the preparation of the single-dish data, we multiply the trimmed image by the primary beam response, as follows.
Follow the progression by opening the images in CARTA:
* ''uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.im''
* ''uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.regrid''
* ''uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.regrid.subim''
 
<br clear=all>
[[File:sunspot_PB_trim_CASA_6.5.4.png|400px|thumb|right|'''Fig. 4.'''<br>Left: The original primary beam used in synthesis imaging.<br> Right: The synth PB after trimming.<br><br> In CARTA, Preferences > Render Configuration > NaN color has been chosen as gray here to show that the dimension of the original includes the area outside of the primary beam cutoff of 0.73.]]
[[File:sunspot_singledish_regrid_trim_PBcorrect_CASA_6.5.4.png|400px|thumb|right|'''Fig. 5.'''<br> Left: The regridded and trimmed single dish image from Figure 3.<br> Center: The trimmed synth primary beam from Figure 4.<br> Right: The product of multiplying the first two, resulting in a single dish image that is ready to combine with the synth image.<br><br> All three have been spacially matched, and the left and right are raster scaling matched. Note the color scale of each.]]
 
Finally, we trim the primary beam response of the synthesized image, and with {{immath_6.5.4}} we multiply this by the trimmed single-dish image:


<source lang='python'>
<source lang='python'>
# In CASA
# In CASA
imsubimage(imagename=int_base+'.pb',outfile=int_base+'.flux.subim',box='100,100,400,400')
os.system(f'rm -rf {if_base}.pb.subim')
os.system(f'rm -rf {sd_base}.jyb.regrid.subim.depb')


immath(imagename=[sd_img_base+'.jyb.regrid.subim',int_base+'.flux.subim'], expr='IM0*IM1', outfile=sd_img_base+'.jyb.regrid.subim.depb')
imsubimage(
  imagename=if_base+'.pb',
  outfile=if_base+'.pb.subim',
  box='100,100,400,400')
 
immath(
  imagename=[sd_base+'.jyb.regrid.subim',
            if_base+'.pb.subim'],
  expr='IM0*IM1',
  outfile=sd_base+'.jyb.regrid.subim.depb',
  imagemd=sd_base+'.jyb.regrid.subim')
</source>
</source>
We specify ''imagemd'' so that the header metadata, including units of Jy/beam and the RA/Dec coordinate we just set, is carried over from the single dish image instead of the trimmed synth primary beam.
Follow the progression by opening the images in CARTA:
* ''AR12470_B6AllSpw_I.pb''
* ''AR12470_B6AllSpw_I.pb.subim''
* ''uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.regrid.subim.depb''
<br clear=all>


==Prepare the Synthesized Image for Combination==
==Prepare the Synthesized Image for Combination==


[[File:sunspot_syntrim.png|thumb|right|'''Fig. 3''' The trimmed map from the synthesized image.]]
[[File:sunspot_synth_trim_CASA_6.5.4.png|400px|thumb|right|'''Fig. 6.'''<br> Left: The original synth image.<br> Right: The trimmed synth image.<br><br> We set the NaN color to gray to clearly show the dimensions of the original image including the area outside the PB cutoff.]]


To fit the map area to that of the trimmed single-dish image, we do the trimming for the synthesized image.
Trim the synthesized image to fit the area of the trimmed single-dish image:


<source lang='python'>
<source lang='python'>
# In CASA
# In CASA
imsubimage(imagename=int_base+'.image', outfile=int_base+'.image.subim', box='100,100,400,400')
os.system(f'rm -rf {if_base}.image.subim')
 
imsubimage(
  imagename=if_base+'.image',
  outfile=if_base+'.image.subim',
  box='100,100,400,400')
</source>
</source>
Examine the images in CARTA:
* ''AR12470_B6AllSpw_I.image''
* ''AR12470_B6AllSpw_I.image.subim''
<br clear=all>


==Combination and Primary Beam Correction==
==Combination and Primary Beam Correction==
The combining of the maps can be done using 'feathering' task, as the same as the non-solar data.
[[File:sunspot_final_6.5.4.png|thumb|right|600px|'''Fig. 7.'''<br>Left: The regridded, trimmed, and synth-PB scaled single dish image from Figure 5.<br> Center: The trimmed synth image from Figure 6.<br> Right: The final combined single dish + synth image, PB corrected, converted to K, and exported to fits format.]]
 
The combination of the images can be done using {{feather_6.5.4}}, the same as for non-solar data.


<source lang='python'>
<source lang='python'>
# In CASA
# In CASA
feather(imagename=out_base+'.image', highres=int_base+'.image.subim',lowres=sd_img_base+'.jyb.regrid.subim.depb')
os.system(f'rm -rf {combined_base}.image')
 
feather(
  imagename=combined_base+'.image',
  highres=if_base+'.image.subim',
  lowres=sd_base+'.jyb.regrid.subim.depb',
  sdfactor=1.0)
</source>
</source>


CAUTION: In this tutorial and the packages of the solar SV data released on 2017/01/18, we use the default parameters of the task, as shown above. As a result, the averaged brightness temperature of the combined image is always larger a few % than the temperature brightness at the same position in the single-dish map, although the values have to be the same basically. It means that you need to tune the “sdfactor" parameter of the task for obtaining consistent images, before using combined images for your science. The detail of the parameter is described in Section 5.6 of “CASA User Reference & Cookbook Release 4.7.0”[https://casa.nrao.edu/docs/cookbook/index.html].
<font color="red">
CAUTION: In this tutorial and the packages of the solar SV data released on 2017/01/18, we use the default parameters of the task, as shown above. As a result, the averaged brightness temperature of the combined image is always a few % larger than the brightness temperature at the same position in the single-dish map, although the values have to be the same. This means that you need to tune the ''sdfactor'' parameter of the task to obtain consistent images before using combined images for your science. See more details in the [https://casadocs.readthedocs.io/en/v6.5.4/notebooks/image_combination.html Image Combination section of the CASA Docs].
</font>


After the feathering process, we do the primary beam correction, as follows.
After the feathering process, we do the primary beam correction with {{impbcor_6.5.4}} as follows:


<source lang='python'>
<source lang='python'>
# In CASA
# In CASA
impbcor(imagename=out_base+'.image', pbimage=int_base+'.flux.subim', outfile=out_base+'.pbcor', mode='divide')
os.system(f'rm -rf {combined_base}.pbcor')
 
impbcor(
  imagename=combined_base+'.image',
  pbimage=if_base+'.pb.subim',
  outfile=combined_base+'.pbcor',
  mode='divide')
</source>
</source>


To convert the unit from Jy/beam to Kelvin, we use the following commands.
Examine the images in CARTA as you progress:
* ''AR12470_B6AllSpw_I_Feather.image''
* ''AR12470_B6AllSpw_I_Feather.pbcor''
* ''AR12470_B6AllSpw_I_Feather_K.pbcor''
* ''AR12470_B6AllSpw_I_Feather_K.fits''


[[File:sunspot_final.png|thumb|right|'''Fig. 4.''' The trimmed map from the synthesized image.]]
To convert the unit from Jy/beam to Kelvin, we use the following commands with {{imhead_6.5.4}} and {{immath_6.5.4}}.


<source lang='python'>
<source lang='python'>
# In CASA
# In CASA
crval4I= imhead(int_base+'.image', mode='get',hdkey='crval4')
freq = crval4I['value']
fbema = imhead(out_base+'.image', mode='get',hdkey='beammajor')
fbemi = imhead(out_base+'.image', mode='get',hdkey='beamminor')
fbmajor = fbema['value']
fbminor = fbemi['value']


convKJb2 = str(13.6 * (300./(freq/1.e9))**2. * (1./fbmajor)*(1./fbminor))
# derive a scaling factor based on interferometric frequency and feather beam size
freq_IF  = imhead(if_base+'.image', mode='get', hdkey='crval4')['value']
f_bmajor = imhead(combined_base+'.image', mode='get', hdkey='beammajor')['value']
f_bminor = imhead(combined_base+'.image', mode='get', hdkey='beamminor')['value']


immath(imagename=out_base+'.pbcor',expr='IM0*'+convKJb2, outfile= out_base+'_K.pbcor')
convJb2K = str(13.6 * (300./(freq_IF/1.e9))**2. * (1./f_bmajor)*(1./f_bminor))
# = '5.629310261438283'


imhead(imagename=out_base+'_K.pbcor', mode='put', hdkey='bunit', hdvalue='K')
# create a new image with scaled values
os.system(f'rm -rf {combined_base}_K.pbcor')
 
immath(
  imagename=combined_base+'.pbcor',
  expr='IM0*'+convJb2K,
  outfile=combined_base+'_K.pbcor')
 
# change the brightness unit in the new image header from Jy/beam to K
imhead(
  imagename=combined_base+'_K.pbcor',
  mode='put',
  hdkey='bunit',
  hdvalue='K')
</source>
</source>


Finally, we create the FITS file of the combined and primary corrected map.
Finally, we create the FITS file of the combined and primary corrected map with {{exportfits_6.5.4}}.


<source lang='python'>
<source lang='python'>
# In CASA
# In CASA
exportfits(imagename=out_base+'_K.pbcor', fitsimage=out_base+'_K.fits')
os.system(f'rm -rf {combined_base}_K.fits')
 
exportfits(
  imagename=combined_base+'_K.pbcor',
  fitsimage=combined_base+'_K.fits')
</source>
</source>


The result of the combining is shown in Figure 4.
The final result is shown in Figure 7.


----
----
<font color="red">
<font color="red">
Caution: The single-dish images and feathering images in the solar SV data packages (ex. Sunspot_Band6_ReferenceImages.tgz) were not applied the re-scaling to the single-dish data (see [[Sunspot_Band6_SingleDish_for_CASA_6.5.4#Calibration_.28re-scaling.29_after_Imaging]]). Please do not use the reference image for your science.
Caution: The single-dish images and feathering images in the solar SV data packages (ex. Sunspot_Band6_ReferenceImages.tgz) were not applied the re-scaling to the single-dish data (see [[Sunspot_Band6_SingleDish_for_CASA_6.5.4#Rescaling_after_Imaging]]). Please do not use the reference image for your science.
</font>
</font>

Latest revision as of 17:04, 19 November 2024

Last checked on CASA Version 6.5.4

Overview

This guide features CARTA, the “Cube Analysis and Rendering Tool for Astronomy,” which is the new NRAO visualization tool for images and cubes. The CASA viewer (imview) has not been maintained for a few years and will be removed from future versions of CASA. We strongly recommend using CARTA, as it provides a much more efficient, stable, and feature rich user experience. A comparison of the CASA viewer and CARTA, as well as instructions on how to use CARTA at NRAO, is provided in the CARTA section of the CASA docs.

This portion of the Sunspot Band6 guide covers the combination process between the synthesized solar image and the full-sun image obtained with the TP array. It is the final step after:

  1. calibrating the IF visibility data
  2. imaging the IF data
  3. calibrating and imaging the single-dish data

If you wish, you may skip parts 1 and 2, download the calibrated data package, Sunspot_Band6_CalibratedData.tgz, and complete part 3.

If you completed parts 1 and 2, we assume that you are working in the directory Sunspot_Band6_UncalibratedData. If you skip parts 1 and 2, and use the provided calibrated data, we assume that the working directory is Sunspot_Band6_CalibratedData.

For this step you will need:

  • AR12470_B6AllSpw_I.image - the synth image from part 2, before PB correction.
  • AR12470_B6AllSpw_I.pb - the PB from part 2.
  • uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.rescl - the rescaled single dish image from part 3.

Prepare the Single-Dish Data for Combination

List the Image Header

We start by defining names for our images.

# In CASA
if_base       = 'AR12470_B6AllSpw_I'                         # basename of the interferometric image
sd_base       = 'uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3'    # basename of the single dish image
combined_base = 'AR12470_B6AllSpw_I_Feather'                 # basename of the combined products

Now let's examine the single dish image header with imhead and mode='list'.

# In CASA
imhead(imagename=sd_base+'.rescl', mode='list')

Output are the supported keywords and their values in the format hdkey: hdvalue.

General --
        -- imtype: Intensity
        -- object: Sun
        -- equinox: J2000
        -- date-obs: 2015/12/18/20:12:21.416250
        -- observer: lknee
        -- projection: SIN
        -- restfreq: [248000000000.1]
        -- reffreqtype: LSRK
        -- telescope: ALMA
        -- beammajor: 26.722411arcsec
        -- beamminor: 26.722411arcsec
        -- beampa: 0deg
        -- bunit: K
        -- masks: [mask0]
        -- shape: [800, 800, 1, 1]
        -- datamin: 83.8561
        -- datamax: 7369.92
        -- minpos: 17:44:43.874 -23.04.42.909 I 2.4799e+11Hz
        -- minpixpos: [244, 770, 0, 0]
        -- maxpos: 17:43:24.017 -23.17.12.723 I 2.4799e+11Hz
        -- maxpixpos: [611, 520, 0, 0]
axes --
        -- ctype1: Right Ascension
        -- ctype2: Declination
        -- ctype3: Stokes
        -- ctype4: Frequency
crpix --
        -- crpix1: 400.0
        -- crpix2: 400.0
        -- crpix3: 0.0
        -- crpix4: 0.0
crval --
        -- crval1:  266.02.29.400deg.min.sec
        -- crval2: - 23.23.13.143deg.min.sec
        -- crval3: ['I']
        -- crval4: 247990336130.1Hz
cdelt --
        -- cdelt1: -  0.00.03.000deg.min.sec
        -- cdelt2:    0.00.03.000deg.min.sec
        -- cdelt3: 1
        -- cdelt4: 1999922065.6Hz
units --
        -- cunit1: rad
        -- cunit2: rad
        -- cunit3: 
        -- cunit4: Hz

Convert the Brightness Unit

Fig. 1.
Left: The full-sun map with its original coordinate grid and brightness units of Kelvin.
Right: The shifted coordinate grid and brightness converted to units of Jy/beam.

The unit of the full-sun map is Kelvin. On the other hand, the unit of the synthesized image is Jy/beam. We retrieve frequency and beam size information with imhead, then convert the brightness values from K to Jy/beam with immath. This will produce a new image with the scaled values.

# In CASA

# derive a scaling factor based on single dish frequency and beam size
freq_SD   = imhead(sd_base+'.rescl', mode='get', hdkey='crval4')['value']
sd_bmajor = imhead(sd_base+'.rescl', mode='get', hdkey='beammajor')['value']
sd_bminor = imhead(sd_base+'.rescl', mode='get', hdkey='beamminor')['value']

convK2Jb = str(13.6 * (300./(freq_SD/1.e9))**2. * (1./sd_bmajor)*(1./sd_bminor))
# = '0.02787151811741245'

# create a new image with scaled values
import os
os.system(f'rm -rf {sd_base}.jyb.im')

immath(
  imagename=sd_base+'.rescl',
  expr='IM0/'+convK2Jb,
  outfile=sd_base+'.jyb.im')

# change the brightness unit in the new image header from K to Jy/beam
imhead(
  imagename=sd_base+'.jyb.im',
  mode='put',
  hdkey='bunit',
  hdvalue='Jy/beam')

Obtain the RA/Dec Coordinate of the Sun Center at the Reference Time

Before starting the combination process in CASA, we need to know the RA/Dec coordinate of the sun center at the reference time, which is used during the interferometric observation, because the observing time of the TP-array is not exactly the same. The Sun was moving on the RA/Dec coordinate frame during the gap between these observations. We need to shift the coordinate of the full-sun image based on the coordinate of the sun center at the reference time. The reference time of the observation is:
19:49:00UT, December 18 2015.

We obtain the RA/Dec coordinate of the sun center estimated from JPL's HORIZONS system:
RA: 266.01898 degree
Dec: -23.38648 degrees.

Change the Coordinate

RA/Dec are shown in the image header as ctype1/ctype2, which correspond to crval1/crval2. We shift the coordinate based on the RA/Dec coordinate obtained in the previous section by using mode='put' as follows.

# In CASA
import numpy as np
sun_ra = str(266.01898 * np.pi/180.)
sun_dec = str(-23.38648 * np.pi/180.)

imhead(imagename=sd_base+'.jyb.im', mode='put', hdkey='crval1', hdvalue=sun_ra)
imhead(imagename=sd_base+'.jyb.im', mode='put', hdkey='crval2', hdvalue=sun_dec)

Now open the image in CARTA. If using NRAO machines, you can open a new terminal tab, cd to the working directory, then type:

# in terminal
carta --no_browser

Copy the output URL into a browser to view your CARTA session. Select and load:

  • uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.rescl
  • uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.im

The result of the process is shown in Figure 1. The look of the image has not changed, but the coordinates and units are now changed to match the synthesized image.

Regrid, Trim, and Multiply by the Synth Primary Beam

Fig. 2.
Left: The full-sun image from Figure 1.
Right: The full-sun image regridded based on the synthesized image.

The images are spatially matched and raster scaling matched. A circular region is drawn to clearly show the spatial matching.
Fig. 3.
Left: The regridded full-sun image.
Right: The regridded image after trimming.

The images are spatially matched and raster scaling matched.

Now we regrid and trim the full-sun image with imregrid and imsubimage to match the size of the synthesized image as shown in Figure 2.

# In CASA
os.system(f'rm -rf {sd_base}.jyb.regrid')
os.system(f'rm -rf {sd_base}.jyb.regrid.subim')

imregrid(
  imagename=sd_base+'.jyb.im',
  template=if_base+'.image',
  axes=[0,1],
  output=sd_base+'.jyb.regrid')

imsubimage(
  imagename=sd_base+'.jyb.regrid',
  outfile=sd_base+'.jyb.regrid.subim',
  box='100,100,400,400')

Follow the progression by opening the images in CARTA:

  • uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.im
  • uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.regrid
  • uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.regrid.subim


Fig. 4.
Left: The original primary beam used in synthesis imaging.
Right: The synth PB after trimming.

In CARTA, Preferences > Render Configuration > NaN color has been chosen as gray here to show that the dimension of the original includes the area outside of the primary beam cutoff of 0.73.
Fig. 5.
Left: The regridded and trimmed single dish image from Figure 3.
Center: The trimmed synth primary beam from Figure 4.
Right: The product of multiplying the first two, resulting in a single dish image that is ready to combine with the synth image.

All three have been spacially matched, and the left and right are raster scaling matched. Note the color scale of each.

Finally, we trim the primary beam response of the synthesized image, and with immath we multiply this by the trimmed single-dish image:

# In CASA
os.system(f'rm -rf {if_base}.pb.subim')
os.system(f'rm -rf {sd_base}.jyb.regrid.subim.depb')

imsubimage(
  imagename=if_base+'.pb',
  outfile=if_base+'.pb.subim',
  box='100,100,400,400')

immath(
  imagename=[sd_base+'.jyb.regrid.subim',
             if_base+'.pb.subim'],
  expr='IM0*IM1',
  outfile=sd_base+'.jyb.regrid.subim.depb',
  imagemd=sd_base+'.jyb.regrid.subim')

We specify imagemd so that the header metadata, including units of Jy/beam and the RA/Dec coordinate we just set, is carried over from the single dish image instead of the trimmed synth primary beam.

Follow the progression by opening the images in CARTA:

  • AR12470_B6AllSpw_I.pb
  • AR12470_B6AllSpw_I.pb.subim
  • uid___A002_Xae00c5_X2e6b.PM03.StkI.Spw3.jyb.regrid.subim.depb


Prepare the Synthesized Image for Combination

Fig. 6.
Left: The original synth image.
Right: The trimmed synth image.

We set the NaN color to gray to clearly show the dimensions of the original image including the area outside the PB cutoff.

Trim the synthesized image to fit the area of the trimmed single-dish image:

# In CASA
os.system(f'rm -rf {if_base}.image.subim')

imsubimage(
  imagename=if_base+'.image',
  outfile=if_base+'.image.subim',
  box='100,100,400,400')

Examine the images in CARTA:

  • AR12470_B6AllSpw_I.image
  • AR12470_B6AllSpw_I.image.subim


Combination and Primary Beam Correction

Fig. 7.
Left: The regridded, trimmed, and synth-PB scaled single dish image from Figure 5.
Center: The trimmed synth image from Figure 6.
Right: The final combined single dish + synth image, PB corrected, converted to K, and exported to fits format.

The combination of the images can be done using feather, the same as for non-solar data.

# In CASA
os.system(f'rm -rf {combined_base}.image')

feather(
  imagename=combined_base+'.image',
  highres=if_base+'.image.subim',
  lowres=sd_base+'.jyb.regrid.subim.depb',
  sdfactor=1.0)

CAUTION: In this tutorial and the packages of the solar SV data released on 2017/01/18, we use the default parameters of the task, as shown above. As a result, the averaged brightness temperature of the combined image is always a few % larger than the brightness temperature at the same position in the single-dish map, although the values have to be the same. This means that you need to tune the sdfactor parameter of the task to obtain consistent images before using combined images for your science. See more details in the Image Combination section of the CASA Docs.

After the feathering process, we do the primary beam correction with impbcor as follows:

# In CASA
os.system(f'rm -rf {combined_base}.pbcor')

impbcor(
  imagename=combined_base+'.image',
  pbimage=if_base+'.pb.subim',
  outfile=combined_base+'.pbcor',
  mode='divide')

Examine the images in CARTA as you progress:

  • AR12470_B6AllSpw_I_Feather.image
  • AR12470_B6AllSpw_I_Feather.pbcor
  • AR12470_B6AllSpw_I_Feather_K.pbcor
  • AR12470_B6AllSpw_I_Feather_K.fits

To convert the unit from Jy/beam to Kelvin, we use the following commands with imhead and immath.

# In CASA

# derive a scaling factor based on interferometric frequency and feather beam size
freq_IF  = imhead(if_base+'.image', mode='get', hdkey='crval4')['value']
f_bmajor = imhead(combined_base+'.image', mode='get', hdkey='beammajor')['value']
f_bminor = imhead(combined_base+'.image', mode='get', hdkey='beamminor')['value']

convJb2K = str(13.6 * (300./(freq_IF/1.e9))**2. * (1./f_bmajor)*(1./f_bminor))
# = '5.629310261438283'

# create a new image with scaled values
os.system(f'rm -rf {combined_base}_K.pbcor')

immath(
  imagename=combined_base+'.pbcor',
  expr='IM0*'+convJb2K,
  outfile=combined_base+'_K.pbcor')
  
# change the brightness unit in the new image header from Jy/beam to K 
imhead(
  imagename=combined_base+'_K.pbcor',
  mode='put',
  hdkey='bunit',
  hdvalue='K')

Finally, we create the FITS file of the combined and primary corrected map with exportfits.

# In CASA
os.system(f'rm -rf {combined_base}_K.fits')

exportfits(
  imagename=combined_base+'_K.pbcor',
  fitsimage=combined_base+'_K.fits')

The final result is shown in Figure 7.


Caution: The single-dish images and feathering images in the solar SV data packages (ex. Sunspot_Band6_ReferenceImages.tgz) were not applied the re-scaling to the single-dish data (see Sunspot_Band6_SingleDish_for_CASA_6.5.4#Rescaling_after_Imaging). Please do not use the reference image for your science.