def find_peaks(group, threshold=None, z_min=None, z_max=None): field = group.nxsignal try: mask = field.nxentry['instrument/detector/pixel_mask'].nxdata if len(mask.shape) > 2: mask = mask[0] except Exception: mask = None if threshold is None: if 'maximum' in field.nxgroup.attrs: threshold = np.float32(field.nxgroup.maximum) / 20 elif 'maximum' in field.attrs: threshold = np.float32(field.maximum) / 20 else: raise NeXusError('Must give threshold if the field maximum is unknown') if z_min == None: z_min = 0 if z_max == None: z_max = field.shape[0] lio = labelimage(field.shape[-2:], flipper=flip1) allpeaks = [] if len(field.shape) == 2: res = None else: chunk_size = field.nxfile[field.nxpath].chunks[0] pixel_tolerance = 50 frame_tolerance = 10 for i in range(0, field.shape[0], chunk_size): try: if i + chunk_size > z_min and i < z_max: print 'Processing', i v = field[i:i+chunk_size,:,:].nxdata for j in range(chunk_size): if i+j >= z_min and i+j <= z_max: omega = np.float32(i+j) lio.peaksearch(v[j], threshold, omega) if lio.res is not None: blob_moments(lio.res) for k in range(lio.res.shape[0]): res = lio.res[k] peak = NXpeak(res[0], res[22], res[23], res[24], omega, res[27], res[26], res[29], threshold, pixel_tolerance, frame_tolerance) if peak.isvalid(mask): allpeaks.append(peak) except IndexError as error: pass if not allpeaks: raise NeXusError('No peaks found') allpeaks = sorted(allpeaks) merged_peaks = [] for z in range(z_min, z_max+1): frame = [peak for peak in allpeaks if peak.z == z] if not merged_peaks: merged_peaks.extend(frame) else: for peak1 in frame: combined = False for peak2 in last_frame: if peak1 == peak2: for idx in range(len(merged_peaks)): if peak1 == merged_peaks[idx]: break peak1.combine(merged_peaks[idx]) merged_peaks[idx] = peak1 combined = True break if not combined: reversed_peaks = [p for p in reversed(merged_peaks) if p.z >= peak1.z - frame_tolerance] for peak2 in reversed_peaks: if peak1 == peak2: for idx in range(len(merged_peaks)): if peak1 == merged_peaks[idx]: break peak1.combine(merged_peaks[idx]) merged_peaks[idx] = peak1 combined = True break if not combined: merged_peaks.append(peak1) if frame: last_frame = frame merged_peaks = sorted(merged_peaks) for peak in merged_peaks: peak.merge() merged_peaks = sorted(merged_peaks) peaks = merged_peaks print '%s peaks found' % len(peaks) if len(peaks) > 0: write_peaks(field, peaks)
def find_peaks(self): field = self.entry["data"].nxsignal try: self.mask = self.entry["instrument/detector/pixel_mask"] except NeXusError: self.mask = None self.layout.removeWidget(self.find_button) self.find_button.setVisible(False) if len(field.shape) == 2: self.layout.addWidget(self.close_buttons(save=True)) elif len(field.shape) > 2: self.layout.addLayout(self.progress_layout(save=True)) threshold = self.get_threshold() self.blim = np.zeros(field.shape[-2:], np.int32) self.verbose = 0 lio = labelimage(field.shape[-2:], flipper=flip1) allpeaks = [] if len(field.shape) == 2: res = None else: chunk_size = field.nxfile[field.nxpath].chunks[0] z_min, z_max = self.get_limits() pixel_tolerance, frame_tolerance = self.get_tolerance() self.progress_bar.setRange(z_min, z_max) for i in range(0, field.shape[0], chunk_size): try: if i + chunk_size > z_min and i < z_max: self.progress_bar.setValue(i) self.update_progress() v = field[i : i + chunk_size, :, :].nxdata for j in range(chunk_size): if i + j >= z_min and i + j <= z_max: omega = np.float32(i + j) lio.peaksearch(v[j], threshold, omega) if lio.res is not None: blob_moments(lio.res) for k in range(lio.res.shape[0]): res = lio.res[k] peak = NXpeak( res[0], res[22], res[23], res[24], omega, res[27], res[26], res[29], threshold, pixel_tolerance, frame_tolerance, ) if peak.isvalid(self.mask): allpeaks.append(peak) except IndexError as error: pass if not allpeaks: self.reject() report_error("Finding peaks", "No peaks found") allpeaks = sorted(allpeaks) self.progress_bar.reset() self.progress_bar.setRange(z_min, z_max) merged_peaks = [] for z in range(z_min, z_max + 1): self.progress_bar.setValue(z) self.update_progress() frame = [peak for peak in allpeaks if peak.z == z] if not merged_peaks: merged_peaks.extend(frame) else: for peak1 in frame: combined = False for peak2 in last_frame: if peak1 == peak2: for idx in range(len(merged_peaks)): if peak1 == merged_peaks[idx]: break peak1.combine(merged_peaks[idx]) merged_peaks[idx] = peak1 combined = True break if not combined: reversed_peaks = [p for p in reversed(merged_peaks) if p.z >= peak1.z - frame_tolerance] for peak2 in reversed_peaks: if peak1 == peak2: for idx in range(len(merged_peaks)): if peak1 == merged_peaks[idx]: break peak1.combine(merged_peaks[idx]) merged_peaks[idx] = peak1 combined = True break if not combined: merged_peaks.append(peak1) if frame: last_frame = frame merged_peaks = sorted(merged_peaks) for peak in merged_peaks: peak.merge() merged_peaks = sorted(merged_peaks) self.peaks = merged_peaks self.progress_bar.setVisible(False) self.peak_count.setText("%s peaks found" % len(self.peaks)) self.peak_count.setVisible(True)