Source code for turbustat.cube_tools.sim_cubes
# Licensed under an MIT open source license - see LICENSE
'''
Wrapper on spectral_cube for simulated datasets
'''
import numpy as np
from spectral_cube import SpectralCube, CompositeMask
try:
from signal_id import Noise
except ImportError:
pass
prefix = "/srv/astro/erickoch/" # Adjust if you're not me!
execfile(prefix + "Dropbox/code_development/signal-id/signal_id/noise.py")
from cube_utils import _check_mask, _check_beam, _get_int_intensity
[docs]class SimCube(object):
'''
A wrapping class to prepare a simulated spectral data cube for
comparison with another cube.
'''
def __init__(self, cube, beam=None, mask=None, method="MAD", compute=True):
# Initialize cube object
self.cube = SpectralCube.read(cube)
if mask is not None:
_check_mask(mask)
self.mask = mask
if beam is not None:
_check_beam(mask)
# Initialize noise object
self.noise = Noise(self.cube, beam=beam, method=method)
[docs] def add_noise(self):
'''
Use Noise to add synthetic noise to the data. Then update
SpectralCube.
'''
# Create the noisy cube
self.noise.get_noise_cube()
noise_data = self.noise.noise_cube +\
self.cube.filled_data[:]
# Update SpectralCube object
self._update(data=noise_data)
return self
[docs] def clean_cube(self, algorithm=None):
raise NotImplementedError("")
[docs] def apply_mask(self, mask=None):
'''
Check if the given mask is acceptable abd apply to
SpectralCube.
'''
# Update mask
if mask is not None:
_check_mask(mask)
self.mask = mask
# Create the mask, auto masking nan values
default_mask = np.isfinite(self.cube.filled_data[:])
if self.mask is not None:
self.mask = CompositeMask(default_mask, self.mask)
else:
self.mask = default_mask
# Apply mask to spectral cube object
self.cube = self.cube.with_mask(mask)
return self
def _update(self, data=None, wcs=None, beam=None, method="MAD"):
'''
Helper function to update classes.
'''
# Check if we need a new SpectralCube
if data is None and wcs is None:
pass
else:
if data is None:
data = self.cube.unmasked_data[:]
if wcs is None:
wcs = self.cube.wcs
# Make new SpectralCube object
self.cube = SpectralCube(data=data, wcs=wcs)
if beam is not None:
_check_beam(beam)
self.noise = Noise(self.cube, beam=beam, method=method)
[docs] def compute_properties(self):
'''
Use SpectralCube to compute the moments. Also compute the integrated
intensity based on the noise properties from Noise.
'''
self._moment0 = self.cube.moment0().value
self._moment1 = self.cube.moment1().value
self._moment2 = self.cube.moment2().value
_get_int_intensity(self)
return self
@property
def moment0(self):
return self._moment0
@property
def moment1(self):
return self._moment1
@property
def moment2(self):
return self._moment2
@property
def intint(self):
return self._intint
[docs] def sim_prep(self, mask=None):
'''
Prepares the cube when being compared to another simulation.
This entails:
* Optionally applying a mask to the data.
* Computing the cube's property arrays
'''
if not mask is None:
self.apply_mask()
self.compute_properties()
return self
[docs] def obs_prep(self, mask=None):
'''
Prepares the cube when being compared to observational data.
This entails:
* Optionally applying a mask to the data.
* Add synthetic noise based on the cube's properties.
* Computing the cube's property arrays
'''
if not mask is None:
self.apply_mask()
self.add_noise()
self.compute_properties()
return self