Source
xxxxxxxxxx
##########################################################################
# task_specflux.py
#
# Copyright (C) 2008, 2009, 2010
# Associated Universities, Inc. Washington DC, USA.
#
# This script is free software; you can redistribute it and/or modify it
# under the terms of the GNU Library General Public License as published by
# the Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This library is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
# License for more details.
#
# You should have received a copy of the GNU Library General Public License
# along with this library; if not, write to the Free Software Foundation,
# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
#
# Correspondence concerning AIPS++ should be adressed as follows:
# Internet email: aips2-request@nrao.edu.
# Postal address: AIPS++ Project Office
# National Radio Astronomy Observatory
# 520 Edgemont Road
# Charlottesville, VA 22903-2475 USA
#
# <author>
# Dave Mehringer
# </author>
#
###########################################################################
import os.path
import numpy
from casatasks.private.casa_transition import *
if is_CASA6:
from casatools import image, regionmanager, quanta
from casatasks import casalog
from .ialib import write_image_history, get_created_images
else:
from taskinit import *
from taskinit import iatool as image
from ialib import write_image_history, get_created_images
image = iatool
regionmanager = rgtool
quanta = qatool
def specflux(
imagename, region, box, chans, stokes, mask, stretch,
function, unit, major, minor, logfile, overwrite
):
casalog.origin('specflux')
myia = image()
myrg = regionmanager()
_qa = quanta()
try:
if logfile and not overwrite and os.path.exists(logfile):
raise Exception(logfile + " exists and overwrite is False")
funclower = function.lower()
if not (
funclower.startswith("f") or funclower.startswith("mea")
or funclower.startswith("med") or funclower.startswith("s")
):
raise Exception("Unsupported function " + function)
if bool(major) != bool(minor):
raise Exception("You must specify both of major and minor, or neither of them")
myia.open(imagename)
bunit = myia.brightnessunit()
unit_is_perbeam = bunit.find("/beam") >= 0
if not bunit or not (unit_is_perbeam or bunit.endswith("K")):
_no_unit_no_beam_message()
# we must be able to compute the flux density, this is part of
# the requirements. See eg CAS-10791
if (unit_is_perbeam and not bool(major) and not bool(myia.restoringbeam())):
_no_unit_no_beam_message()
try:
axis = myia.coordsys().axiscoordinatetypes().index("Spectral")
except Exception:
raise RuntimeError("Image does not have a spectral coordinate, cannot proceed")
if myia.shape()[axis] == 1:
raise Exception("This application only supports multi-channel images")
csys = myia.coordsys()
reg = myrg.frombcs(
csys=csys.torecord(), shape=myia.shape(), box=box,
chans=chans, stokes=stokes, stokescontrol="a", region=region
)
if bool(major):
if (unit_is_perbeam):
myia = myia.subimage()
myia.setrestoringbeam(major=major, minor=minor, pa="0deg")