Usage of PyCupid Interfaces of Cupid’s Clumping Algorithms

from pycupid import clumpfind, fellwalker, reinhold, gaussclumps
from astropy.io import fits
import numpy as np
import numpy.ma as ma
import matplotlib.pyplot as plt

def estimate_rms(data):
    """
    Computes RMS value of an N-dimensional numpy array
    """

    if isinstance(data, ma.MaskedArray):
        ret = np.sum(data*data) / (np.size(data) - np.sum(data.mask))
    else:
        ret = np.sum(data*data) / np.size(data)
    return np.sqrt(ret)

def load_data(fits_path):
    hdulist = fits.open(fits_path)
    data = hdulist[0].data
    # droping out the stokes dimension
    data = np.ascontiguousarray(data[0])

    # in case NaN values exist on cube
    mask = np.isnan(data)
    if np.any(mask): data = ma.masked_array(data, mask=mask)

    # map to 0-1 intensity range
    data -= data.min()
    data /= data.max()

    if data.shape[0]==1:
        data = np.ascontiguousarray(data[0])
        if np.any(mask):
            mask = np.ascontiguousarray(mask[0])
            data = ma.masked_array(data, mask=mask)
    return data

Loading FITS data

data = load_data('Orion.cont.image.fits')
rms = estimate_rms(data)

GaussClump

out_gc = gaussclumps(data, 0.5*rms)
out_gc[out_gc==out_gc.min()] = 0.
plt.figure(figsize=(10,10))
plt.imshow(out_gc)
plt.axis('off')
plt.show()
_images/pycupid_usage_7_0.png

ClumpFind

out_cf = clumpfind(data, 0.5*rms)
out_cf[out_cf==out_cf.min()] = 0.
plt.figure(figsize=(10,10))
plt.imshow(out_cf)
plt.axis('off')
plt.show()
_images/pycupid_usage_11_0.png

FellWalker

out_fw = fellwalker(data, 0.5*rms)
out_fw[out_fw==out_fw.min()] = 0.
plt.figure(figsize=(10,10))
plt.imshow(out_fw)
plt.axis('off')
plt.show()
_images/pycupid_usage_15_0.png

Reinhold

out_rh = reinhold(data, 0.5*rms)
out_rh[out_rh==out_rh.min()] = 0.
plt.figure(figsize=(10,10))
plt.imshow(out_rh)
plt.axis('off')
plt.show()
_images/pycupid_usage_19_0.png