Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
continue
segm_img, _ = ndimage.label(data2, structure=selem)
# remove objects with less than npixels
# NOTE: for typical data, making the cutout images is ~10x faster
# than using segm_img directly
segm_slices = ndimage.find_objects(segm_img)
for i, slices in enumerate(segm_slices):
cutout = segm_img[slices]
segment_mask = (cutout == (i+1))
if np.count_nonzero(segment_mask) < npixels:
cutout[segment_mask] = 0
if np.count_nonzero(segm_img) == 0:
warnings.warn('No sources were found.', NoDetectionsWarning)
if deblend_skip:
continue
else:
segms.append(None)
continue
segm = object.__new__(SegmentationImage)
segm._data = segm_img
if deblend_skip and segm.nlabels == 1:
continue
else:
segm.relabel_consecutive()
segms.append(segm)
return segms
peak_goodmask[-border_width:] = False
peak_goodmask = peak_goodmask.swapaxes(0, i)
peak_goodmask = np.logical_and(peak_goodmask, (data > threshold))
y_peaks, x_peaks = peak_goodmask.nonzero()
peak_values = data[y_peaks, x_peaks]
nxpeaks = len(x_peaks)
if nxpeaks > npeaks:
idx = np.argsort(peak_values)[::-1][:npeaks]
x_peaks = x_peaks[idx]
y_peaks = y_peaks[idx]
peak_values = peak_values[idx]
if nxpeaks == 0:
warnings.warn('No local peaks were found.', NoDetectionsWarning)
return None
# construct the output Table
colnames = ['x_peak', 'y_peak', 'peak_value']
coldata = [x_peaks, y_peaks, peak_values]
table = Table(coldata, names=colnames)
if wcs is not None:
skycoord_peaks = _pixel_to_world(x_peaks, y_peaks, wcs)
table.add_column(skycoord_peaks, name='skycoord_peak', index=2)
# perform centroiding
if centroid_func is not None:
from ..centroids import centroid_sources # prevents circular import
if not callable(centroid_func):
steps = np.arange(1., nlevels + 1)
if mode == 'exponential':
if source_min == 0:
source_min = source_max * 0.01
thresholds = source_min * ((source_max / source_min) **
(steps / (nlevels + 1)))
elif mode == 'linear':
thresholds = source_min + ((source_max - source_min) /
(nlevels + 1)) * steps
else:
raise ValueError('"{0}" is an invalid mode; mode must be '
'"exponential" or "linear"'.format(mode))
# suppress NoDetectionsWarning during deblending
warnings.filterwarnings('ignore', category=NoDetectionsWarning)
mask = ~segm_mask
segments = _detect_sources(data, thresholds, npixels=npixels,
connectivity=connectivity, mask=mask,
deblend_skip=True)
selem = _make_binary_structure(data.ndim, connectivity)
# define the sources (markers) for the watershed algorithm
nsegments = len(segments)
if nsegments == 0: # no deblending
return segment_img
else:
for i in range(nsegments - 1):
segm_lower = segments[i].data
segm_upper = segments[i + 1].data
* ``peak``: the peak, sky-subtracted, pixel value of the object.
* ``flux``: the object instrumental flux.
* ``mag``: the object instrumental magnitude calculated as
``-2.5 * log10(flux)``.
`None` is returned if no stars are found.
"""
star_cutouts = _find_stars(data, self.kernel, self.threshold,
min_separation=self.min_separation,
mask=mask,
exclude_border=self.exclude_border)
if star_cutouts is None:
warnings.warn('No sources were found.', NoDetectionsWarning)
return None
self._star_cutouts = star_cutouts
star_props = []
for star_cutout in star_cutouts:
props = _IRAFStarFindProperties(star_cutout, self.kernel,
self.sky)
# star cutout needs more than one non-zero value
if np.count_nonzero(props.data) <= 1:
continue
if (props.sharpness <= self.sharplo or
props.sharpness >= self.sharphi):
continue
star_groups = self.group_maker(init_guess_tab)
table, self._residual_image = super().nstar(
self._residual_image, star_groups)
star_groups = star_groups.group_by('group_id')
table = hstack([star_groups, table])
table['iter_detected'] = n*np.ones(table['x_fit'].shape,
dtype=np.int32)
output_table = vstack([output_table, table])
# do not warn if no sources are found beyond the first iteration
with warnings.catch_warnings():
warnings.simplefilter('ignore', NoDetectionsWarning)
sources = self.finder(self._residual_image)
n += 1
return output_table
# ignore RuntimeWarning caused by > comparison when data contains NaNs
warnings.simplefilter('ignore', category=RuntimeWarning)
selem = _make_binary_structure(data.ndim, connectivity)
segms = []
for threshold in thresholds:
data2 = data > threshold
if mask is not None:
data2 &= ~mask
# return if threshold was too high to detect any sources
if np.count_nonzero(data2) == 0:
warnings.warn('No sources were found.', NoDetectionsWarning)
if deblend_skip:
continue
else:
segms.append(None)
continue
segm_img, _ = ndimage.label(data2, structure=selem)
# remove objects with less than npixels
# NOTE: for typical data, making the cutout images is ~10x faster
# than using segm_img directly
segm_slices = ndimage.find_objects(segm_img)
for i, slices in enumerate(segm_slices):
cutout = segm_img[slices]
segment_mask = (cutout == (i+1))
if np.count_nonzero(segment_mask) < npixels:
Returns
-------
output : `~astropy.table.Table` or `None`
A table containing the x and y pixel location of the peaks and
their values. If ``centroid_func`` is input, then the table
will also contain the centroid position. If no peaks are found
then `None` is returned.
"""
from scipy.ndimage import maximum_filter
data = np.asanyarray(data)
if np.all(data == data.flat[0]):
warnings.warn('Input data is constant. No local peaks can be found.',
NoDetectionsWarning)
return None
if not np.isscalar(threshold):
threshold = np.asanyarray(threshold)
if data.shape != threshold.shape:
raise ValueError('A threshold array must have the same shape as '
'the input data.')
# remove NaN values to avoid runtime warnings
nan_mask = np.isnan(data)
if np.any(nan_mask):
data = np.copy(data) # ndarray
data[nan_mask] = np.nanmin(data)
if footprint is not None:
data_max = maximum_filter(data, footprint=footprint, mode='constant',
ypad = kernel.yradius
xpad = kernel.xradius
pad = ((ypad, ypad), (xpad, xpad))
# mode must be a string for numpy < 0.11
# (see https://github.com/numpy/numpy/issues/7112)
mode = str('constant')
data = np.pad(data, pad, mode=mode, constant_values=[0.])
if mask is not None:
mask = np.pad(mask, pad, mode=mode, constant_values=[0.])
convolved_data = np.pad(convolved_data, pad, mode=mode,
constant_values=[0.])
# find local peaks in the convolved data
with warnings.catch_warnings():
# suppress any NoDetectionsWarning from find_peaks
warnings.filterwarnings('ignore', category=NoDetectionsWarning)
tbl = find_peaks(convolved_data, threshold_eff, footprint=footprint,
mask=mask)
if tbl is None:
return None
coords = np.transpose([tbl['y_peak'], tbl['x_peak']])
star_cutouts = []
for (ypeak, xpeak) in coords:
# now extract the object from the data, centered on the peak
# pixel in the convolved image, with the same size as the kernel
x0 = xpeak - kernel.xradius
x1 = xpeak + kernel.xradius + 1
y0 = ypeak - kernel.yradius
y1 = ypeak + kernel.yradius + 1