Ejemplo n.º 1
0
 def finalise(self):
     """
     Write out the last frame
     """
     self.onlast = 1
     if self.lastres is not None:
         ret = connectedpixels.blob_moments(self.lastres)
Ejemplo n.º 2
0
 def mergelast(self):
     """
     Merge the last two images searches
     """
     if self.lastnp == "FIRST":
         # No previous image available, this was the first
         # Swap the blob images
         self.lastbl, self.blim = self.blim, self.lastbl
         self.lastnp = self.npk
         self.lastres = self.res
         return            
     if self.npk > 0 and self.lastnp > 0:
         # Thanks to Stine West for finding a bug here
         # 
         self.npk = connectedpixels.bloboverlaps(self.lastbl,
                                                 self.lastnp,
                                                 self.lastres,
                                                 self.blim,
                                                 self.npk,
                                                 self.res,
                                                 self.verbose)
     if self.lastnp > 0:
         # Fill out the moments of the "closed" peaks
         # print "calling blobmoments with",self.lastres
         ret = connectedpixels.blob_moments(self.lastres[:self.lastnp])
     # lastres is now moved forward into res
     self.lastnp = self.npk   # This is array dim
     if self.npk > 0:
         self.lastres = self.res[:self.npk]  # free old lastres I hope
     else:
         self.lastres = None
     # Also swap the blob images
     self.lastbl, self.blim = self.blim, self.lastbl
Ejemplo n.º 3
0
    def output2dpeaks(self):
        """
        Write something compatible with the old ImageD11 format
        which fabian is reading.
        This is called before mergelast, so we write self.npk/self.res
        """
        
        ret = connectedpixels.blob_moments(self.res)

        for i in self.res[:self.npk]:
            if i[s_1] < 0.1:
                raise Exception("Empty peak on current frame")
            i[s_cen], i[f_cen] = self.corrector.correct(i[s_raw], i[f_raw])
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
    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)