Python bindings for the CASACORE radio astronomy library providing comprehensive interfaces for table operations, image processing, coordinate systems, and astronomical measurements.
—
Astronomical reference frames, coordinate conversions, and measurement systems. Handles directions, positions, epochs, frequencies, Doppler shifts, and baseline/UVW coordinates with full support for reference frame transformations and precise astronomical calculations.
from casacore.measures import measures, is_measureCentral server for managing astronomical reference frames and performing coordinate transformations.
class measures:
def __init__(self):
"""Create measures server instance."""
def measure(self, v, rf, off=None):
"""
Convert measure to specified reference frame.
Parameters:
- v: dict, measure to convert
- rf: str, target reference frame
- off: dict, optional offset measure
Returns:
dict, converted measure
"""
def doframe(self, v):
"""
Set measure as part of reference frame.
Parameters:
- v: dict, measure to add to frame
Returns:
bool, True if successfully added to frame
"""
def list_codes(self, m):
"""
Get valid reference codes for measure type.
Parameters:
- m: dict, measure to get codes for
Returns:
dict with 'normal' and 'extra' code lists
"""
def is_measure(v):
"""
Check if object is a valid measure.
Parameters:
- v: object to check
Returns:
bool, True if valid measure
"""Handle celestial directions with support for various coordinate systems and epochs.
class measures:
def direction(self, rf='', v0='0..', v1='90..', off=None):
"""
Create direction measure.
Parameters:
- rf: str, reference frame ('J2000', 'B1950', 'GALACTIC', 'AZEL', etc.)
- v0: str or quantity, longitude/RA (angle)
- v1: str or quantity, latitude/Dec (angle)
- off: dict, optional offset direction
Returns:
dict, direction measure with 'type': 'direction'
Reference frames:
- J2000, JMEAN, JTRUE: Julian epoch systems
- B1950, BMEAN, BTRUE: Besselian epoch systems
- APP: Apparent (topocentric)
- GALACTIC: Galactic coordinates
- SUPERGAL: Supergalactic coordinates
- ECLIPTIC, MECLIPTIC, TECLIPTIC: Ecliptic systems
- HADEC: Hour angle/declination
- AZEL: Azimuth/elevation (requires position frame)
- Planets: MERCURY, VENUS, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO, MOON, SUN
"""Handle terrestrial and celestial positions with various geodetic systems.
class measures:
def position(self, rf='', v0='0..', v1='90..', v2='0m', off=None):
"""
Create position measure.
Parameters:
- rf: str, reference frame ('WGS84', 'ITRF')
- v0: str or quantity, longitude or X (angle or length)
- v1: str or quantity, latitude or Y (angle or length)
- v2: str or quantity, height or Z (length)
- off: dict, optional offset position
Returns:
dict, position measure with 'type': 'position'
Reference frames:
- WGS84: World Geodetic System 1984
- ITRF: International Terrestrial Reference Frame
"""
def observatory(self, name):
"""
Get position measure for known observatory.
Parameters:
- name: str, observatory name (case insensitive)
Returns:
dict, position measure for observatory
Known observatories include:
ALMA, ATCA, BIMA, CLRO, DRAO, DWL, GB, JCMT,
MOPRA, NRAO12M, PKS, VLA, WSRT, and others
"""
def get_observatories(self):
"""
Get list of known observatory names.
Returns:
list of str, observatory names
"""Handle time epochs with various time systems and conversions.
class measures:
def epoch(self, rf='', v0='0.0d', off=None):
"""
Create epoch measure.
Parameters:
- rf: str, time reference frame
- v0: str or quantity, time value
- off: dict, optional offset epoch
Returns:
dict, epoch measure with 'type': 'epoch'
Reference frames:
- UTC: Coordinated Universal Time
- TAI: International Atomic Time
- LAST: Local Apparent Sidereal Time (requires position)
- LMST: Local Mean Sidereal Time (requires position)
- GMST1: Greenwich Mean Sidereal Time
- GAST: Greenwich Apparent Sidereal Time
- UT1: Universal Time 1
- UT2: Universal Time 2
- TDT: Terrestrial Dynamical Time
- TCG: Geocentric Coordinate Time
- TDB: Barycentric Dynamical Time
- TCB: Barycentric Coordinate Time
"""
def framenow(self):
"""Set epoch frame to current time."""Handle radio frequencies with Doppler corrections and reference frame conversions.
class measures:
def frequency(self, rf='', v0='0Hz', off=None):
"""
Create frequency measure.
Parameters:
- rf: str, reference frame
- v0: str or quantity, frequency value
- off: dict, optional offset frequency
Returns:
dict, frequency measure with 'type': 'frequency'
Reference frames:
- REST: Rest frequency
- LSRK: Local Standard of Rest (kinematic)
- LSRD: Local Standard of Rest (dynamic)
- BARY: Barycentric
- GEO: Geocentric (requires epoch)
- TOPO: Topocentric (requires epoch and position)
- GALACTO: Galactocentric
"""
def doppler(self, rf='', v0=0.0, off=None):
"""
Create Doppler measure.
Parameters:
- rf: str, Doppler convention
- v0: float, str, or quantity, Doppler value
- off: dict, optional offset Doppler
Returns:
dict, Doppler measure with 'type': 'doppler'
Conventions:
- RADIO: Radio convention (f_rest - f_obs)/f_rest
- OPTICAL: Optical convention (λ_obs - λ_rest)/λ_rest
- Z: Redshift z
- RATIO: Velocity ratio v/c
- RELATIVISTIC: Relativistic formula
- BETA: β = v/c
- GAMMA: Lorentz factor γ
"""
def radialvelocity(self, rf='', v0='0m/s', off=None):
"""
Create radial velocity measure.
Parameters:
- rf: str, reference frame (same as frequency frames)
- v0: str or quantity, velocity value
- off: dict, optional offset velocity
Returns:
dict, radial velocity measure with 'type': 'radialvelocity'
"""
def line(self, name):
"""
Get frequency measure for spectral line.
Parameters:
- name: str, spectral line name (minimum match)
Returns:
dict, frequency measure for line
Known lines include:
HI, OH1612, OH1665, OH1667, OH1720, CO115271,
H2O22235, SiO86847, CO230538, and others
"""
def get_lines(self):
"""
Get list of known spectral line names.
Returns:
list of str, line names
"""Handle interferometric baseline coordinates and UVW transformations.
class measures:
def baseline(self, rf='', v0='0..', v1='', v2='', off=None):
"""
Create baseline measure.
Parameters:
- rf: str, reference frame ('ITRF' or direction codes)
- v0: str or quantity, X or longitude
- v1: str or quantity, Y or latitude
- v2: str or quantity, Z or height
- off: dict, optional offset baseline
Returns:
dict, baseline measure with 'type': 'baseline'
"""
def uvw(self, rf='', v0='0..', v1='', v2='', off=None):
"""
Create UVW coordinate measure.
Parameters:
- rf: str, reference frame ('ITRF' or direction codes)
- v0: str or quantity, U coordinate
- v1: str or quantity, V coordinate
- v2: str or quantity, W coordinate
- off: dict, optional offset UVW
Returns:
dict, UVW measure with 'type': 'uvw'
"""
def touvw(self, v):
"""
Convert baseline to UVW coordinates.
Requires direction and epoch in frame.
Parameters:
- v: dict, baseline measure
Returns:
dict with UVW measure and derivatives
"""
def expand(self, v):
"""
Calculate baseline differences from positions.
Parameters:
- v: dict, position, baseline, or UVW measure
Returns:
dict with expanded measure and coordinate differences
"""
def asbaseline(self, pos):
"""
Convert position to baseline measure.
Parameters:
- pos: dict, position measure
Returns:
dict, baseline measure
"""Convert between different measure types with proper reference frame handling.
class measures:
def tofrequency(self, rf, v0, rfq):
"""
Convert Doppler to frequency.
Parameters:
- rf: str, frequency reference frame
- v0: dict, Doppler measure
- rfq: dict or quantity, rest frequency
Returns:
dict, frequency measure
"""
def to_frequency(self, rf, v0, rfq):
"""Alias for tofrequency."""
def todoppler(self, rf, v0, rfq):
"""
Convert frequency or radial velocity to Doppler.
Parameters:
- rf: str, Doppler convention
- v0: dict, frequency or radial velocity measure
- rfq: dict or quantity, rest frequency (for frequency input)
Returns:
dict, Doppler measure
"""
def to_doppler(self, rf, v0, rfq):
"""Alias for todoppler."""
def toradialvelocity(self, rf, v0):
"""
Convert Doppler to radial velocity.
Parameters:
- rf: str, velocity reference frame
- v0: dict, Doppler measure
Returns:
dict, radial velocity measure
"""
def to_radialvelocity(self, rf, v0):
"""Alias for toradialvelocity."""
def torestfrequency(self, f0, d0):
"""
Calculate rest frequency from observed frequency and Doppler.
Parameters:
- f0: dict, frequency measure
- d0: dict, Doppler measure
Returns:
dict, rest frequency measure
"""
def to_restfrequency(self, f0, d0):
"""Alias for torestfrequency."""Perform astronomical calculations like rise/set times, separations, and position angles.
class measures:
def rise(self, crd, ev='5deg'):
"""
Calculate rise/set hour angles.
Requires position and epoch in frame.
Parameters:
- crd: dict, direction measure
- ev: str or quantity, elevation limit
Returns:
dict with 'rise' and 'set' hour angles, or strings 'above'/'below'
"""
def riseset(self, crd, ev="5deg"):
"""
Calculate rise/set times in UTC and sidereal time.
Parameters:
- crd: dict, direction measure
- ev: str or quantity, elevation limit
Returns:
dict with rise/set times and solution status
"""
def posangle(self, m0, m1):
"""
Calculate position angle between two directions.
Parameters:
- m0: dict, first direction measure
- m1: dict, second direction measure
Returns:
quantity, position angle
"""
def separation(self, m0, m1):
"""
Calculate angular separation between two directions.
Parameters:
- m0: dict, first direction measure
- m1: dict, second direction measure
Returns:
quantity, angular separation
"""Access built-in catalogs of astronomical sources and reference objects.
class measures:
def source(self, name):
"""
Get direction measure for astronomical source.
Parameters:
- name: str, source name (minimum match)
Returns:
dict, direction measure for source
"""
def get_sources(self):
"""
Get list of known source names.
Returns:
list of str, source names
"""Handle Earth's magnetic field measurements and models.
class measures:
def earthmagnetic(self, rf='', v0='0G', v1='0..', v2='90..', off=None):
"""
Create Earth magnetic field measure.
Parameters:
- rf: str, reference frame ('IGRF')
- v0: str or quantity, field strength or longitude
- v1: str or quantity, latitude
- v2: str or quantity, height
- off: dict, optional offset
Returns:
dict, earth magnetic measure with 'type': 'earthmagnetic'
Reference frames:
- IGRF: International Geomagnetic Reference Field
"""Access built-in catalogs of observatories and spectral lines.
class measures:
def observatory(self, name):
"""
Get position measure for named observatory.
Parameters:
- name: str, observatory name (case-insensitive)
Returns:
dict, position measure for observatory
Common observatories: ALMA, ATCA, BIMA, CLRO, DRAO, DWL, GB, JCMT,
MOPRA, NRAO12M, PKS, VLA, WSRT
"""
def get_observatories(self):
"""
Get list of known observatory names.
Returns:
list of str, observatory names
"""
def line(self, name):
"""
Get frequency measure for spectral line.
Parameters:
- name: str, spectral line name (minimum match)
Returns:
dict, frequency measure for line
Common lines: HI, OH1612, OH1665, OH1667, OH1720, CO115271,
H2O22235, SiO86847, CO230538, H107A, H110A, etc.
"""
def get_lines(self):
"""
Get list of known spectral line names.
Returns:
list of str, spectral line names
"""Handle baseline measures and UVW coordinate transformations for interferometry.
class measures:
def touvw(self, v):
"""
Convert baseline to UVW coordinates.
Requires direction and epoch in reference frame.
Parameters:
- v: dict, baseline measure
Returns:
dict, UVW measure with additional 'xyz' and 'dot' quantities
"""
def expand(self, v):
"""
Calculate differences between position/baseline measures.
Parameters:
- v: dict, baseline, position, or UVW measure
Returns:
dict with 'measure' and 'xyz' difference quantities
"""
def asbaseline(self, pos):
"""
Convert position measure to baseline measure.
Parameters:
- pos: dict, position measure
Returns:
dict, baseline measure
"""
def as_baseline(self, pos):
"""Alias for asbaseline."""Advanced reference frame management and time handling.
class measures:
def framenow(self):
"""Set epoch frame to current time."""
def frame_now(self):
"""Alias for framenow."""
def set_data_path(self, pth):
"""
Set path to measures data directory.
Parameters:
- pth: str, absolute path to data directory
"""Utility functions for working with measures and extracting information.
class measures:
def getvalue(self, v):
"""
Get quantity values from measure.
Parameters:
- v: dict, measure
Returns:
list of quantities (m0, m1, m2, ...)
"""
def get_value(self, v):
"""Alias for getvalue."""
def get_type(self, m):
"""
Get measure type.
Parameters:
- m: dict, measure
Returns:
str, measure type
"""
def get_ref(self, m):
"""
Get reference frame.
Parameters:
- m: dict, measure
Returns:
str, reference frame code
"""
def get_offset(self, m):
"""
Get offset measure.
Parameters:
- m: dict, measure
Returns:
dict, offset measure or None
"""from casacore.measures import measures
from casacore.quanta import quantity
# Create measures server
dm = measures()
# Set reference frame (position and time)
dm.doframe(dm.observatory('VLA'))
dm.doframe(dm.epoch('UTC', 'today'))
# Create source direction
source = dm.direction('J2000', '12h30m00s', '-30d00m00s')
print(f"Source: RA={source['m0']}, Dec={source['m1']}")
# Convert to azimuth/elevation
azel = dm.measure(source, 'AZEL')
print(f"Az/El: Az={azel['m0']}, El={azel['m1']}")
# Convert to galactic coordinates
galactic = dm.measure(source, 'GALACTIC')
print(f"Galactic: l={galactic['m0']}, b={galactic['m1']}")# Create frequency measure
obs_freq = dm.frequency('TOPO', '1.42040575GHz') # Observed HI frequency
# Create Doppler measure
doppler = dm.doppler('RADIO', '100km/s')
# Get rest frequency for HI line
hi_rest = dm.line('HI')
print(f"HI rest frequency: {hi_rest['m0']}")
# Convert Doppler to frequency
conv_freq = dm.tofrequency('LSRK', doppler, hi_rest)
print(f"Converted frequency: {conv_freq['m0']}")
# Convert frequency to velocity
velocity = dm.todoppler('RADIO', obs_freq, hi_rest)
radial_vel = dm.toradialvelocity('LSRK', velocity)
print(f"Radial velocity: {radial_vel['m0']}")# Calculate rise/set times for a source
source = dm.source('3C147') # Use known source
# Set observation parameters
dm.doframe(dm.observatory('WSRT'))
dm.doframe(dm.epoch('UTC', '2023-06-15/12:00:00'))
# Calculate rise/set
riseset = dm.riseset(source, ev='10deg') # 10 degree elevation limit
if riseset['solved']:
print(f"Rise time (UTC): {riseset['rise']['utc']['m0']}")
print(f"Set time (UTC): {riseset['set']['utc']['m0']}")
print(f"Rise time (LST): {riseset['rise']['last']['m0']}")
print(f"Set time (LST): {riseset['set']['last']['m0']}")
else:
print("Source is always above or below horizon")# Create baseline measure (antenna separation)
baseline = dm.baseline('ITRF', '100m', '200m', '50m')
# Set observation parameters for UVW calculation
dm.doframe(dm.source('CYGA')) # Set source direction
dm.doframe(dm.epoch('UTC', '2023-06-15/18:00:00'))
# Convert baseline to UVW coordinates
uvw_result = dm.touvw(baseline)
uvw_coords = uvw_result
print(f"UVW: U={uvw_coords['m0']}, V={uvw_coords['m1']}, W={uvw_coords['m2']}")
# Get time derivatives (for Earth rotation tracking)
if 'dot' in uvw_result:
print(f"UVW rates: {uvw_result['dot']}")# Calculate separation between two sources
source1 = dm.source('CYGA')
source2 = dm.source('CASB')
separation = dm.separation(source1, source2)
print(f"Angular separation: {separation}")
# Calculate position angle
pos_angle = dm.posangle(source1, source2)
print(f"Position angle: {pos_angle}")Install with Tessl CLI
npx tessl i tessl/pypi-python-casacore