Exemple #1
0
 def __call__(self, img):
     # choose the pixels that are != 0 and not masked
     nnz = select(img, self.msk, self.row, self.col, self.val, cut=self.cut)
     # copy these into a "sparse" format
     s = sparseframe.sparse_frame(self.row[:nnz], self.col[:nnz], img.shape)
     s.set_pixels("intensity", self.val[:nnz])
     # label them according to the connected objects
     sparseframe.sparse_connected_pixels(s,
                                         threshold=self.cut,
                                         data_name='intensity',
                                         label_name='cp')
     # only keep spots with more than 3 pixels ...
     mom = sparseframe.sparse_moments(s,
                                      intensity_name='intensity',
                                      labels_name='cp')
     npx = mom[:, cImageD11.s2D_1]
     pxcounts = npx[s.pixels['cp'] - 1]
     msk = pxcounts > self.pixels_in_spot
     if msk.sum() == 0:
         return None
     r = s.mask(msk)
     sparseframe.sparse_connected_pixels(r,
                                         threshold=self.cut,
                                         label_name='connectedpixels',
                                         data_name='intensity')
     return r
Exemple #2
0
 def peaksearch(self, frm):
     # -> f.pixels['localmax']
     sparseframe.sparse_localmax(frm)
     # -> f.pixels['connectedpixels']
     sparseframe.sparse_connected_pixels(frm,
                                         threshold=np.finfo(np.float32).min)
     # which localmax peaks overlap each other
     adj = sparseframe.overlaps(frm, 'localmax', frm, 'connectedpixels')
     r, c = self.adj2overlap(adj)
     return frm, r, c
Exemple #3
0
def choose_parallel(args):
    """reads a frame and sends back a sparse frame"""
    h5name, address, frame_num = args
    frm = get_dset(h5name, address)[frame_num]
    if choose_parallel.cache is None:
        # cache the mallocs on this function. Should be one per process
        row = np.empty(OPTIONS.MASK.size, np.uint16)
        col = np.empty(OPTIONS.MASK.size, np.uint16)
        val = np.empty(OPTIONS.MASK.size, frm.dtype)
        choose_parallel.cache = row, col, val
    else:
        row, col, val = choose_parallel.cache
    nnz = select(frm, OPTIONS.MASK, row, col, val, OPTIONS.CUT)
    if nnz == 0:
        sf = None
    else:
        if nnz > OPTIONS.HOWMANY:
            nnz = top_pixels(nnz, row, col, val, OPTIONS.HOWMANY,
                             OPTIONS.THRESHOLDS)
        # Now get rid of the single pixel 'peaks'
        #   (for the mallocs, data is copied here)
        s = sparseframe.sparse_frame(row[:nnz].copy(), col[:nnz].copy(),
                                     frm.shape)
        s.set_pixels("intensity", val[:nnz].copy())
        if OPTIONS.PIXELS_IN_SPOT <= 1:
            sf = s
        else:
            # label them according to the connected objects
            sparseframe.sparse_connected_pixels(s,
                                                threshold=OPTIONS.CUT,
                                                data_name="intensity",
                                                label_name="cp")
            # only keep spots with more than 3 pixels ...
            mom = sparseframe.sparse_moments(s,
                                             intensity_name="intensity",
                                             labels_name="cp")
            npx = mom[:, cImageD11.s2D_1]
            pxcounts = npx[s.pixels["cp"] - 1]
            pxmsk = pxcounts >= OPTIONS.PIXELS_IN_SPOT
            if pxmsk.sum() == 0:
                sf = None
            else:
                sf = s.mask(pxmsk)
    return frame_num, sf
Exemple #4
0
def newpks(
    hf,
    scans=None,
    npixels=1,
    monitor=None,
    monval=1e3,
):
    """ do a peak search in a sparse frame series """
    titles = 's_raw f_raw avg_intensity Number_of_pixels sum_intensity omega dty'.split(
    )
    c = {}
    for name in titles:
        c[name] = []
    # using the python file open overcomes some threading crap
    with h5py.File(open(hf, "rb"), 'r') as hin:
        # scan numbers
        if scans is None:
            scans = list(hin['/'])
        for scan in scans:
            gin = hin[scan]
            shape = gin.attrs['shape0'], gin.attrs['shape1']
            # import pdb; pdb.set_trace()
            omega = gin['measurement/rot'][:]
            difty = gin['instrument/positioners/dty'][()]
            row = gin['row'][()]
            col = gin['col'][()]
            sig = gin['intensity'][()]
            if monitor is not None:
                mon = monval / gin[monitor][()]
            ipt = np.cumsum(gin['nnz'][:])
            iprev = 0
            for k, nnz in enumerate(gin['nnz'][()]):
                inext = iprev + nnz
                if nnz == 0:
                    continue
                f = sparseframe.sparse_frame(row[iprev:inext],
                                             col[iprev:inext], shape)
                f.set_pixels("intensity", sig[iprev:inext])
                sparseframe.sparse_connected_pixels(f, threshold=0.1)
                pks = sparseframe.sparse_moments(f, "intensity",
                                                 "connectedpixels")
                # sparseframe.sparse_localmax(f)
                # pks = sparseframe.sparse_moments(f, "intensity", "localmax")
                s, f, a, n = moments(pks)
                m = n > npixels
                c['s_raw'].append(s[m])
                c['f_raw'].append(f[m])
                if monitor is not None:
                    c['avg_intensity'].append(a[m] * mon[k])
                    c['sum_intensity'].append(a[m] * n[m] * mon[k])
                else:
                    c['avg_intensity'].append(a[m])
                    c['sum_intensity'].append(a[m] * n[m])
                c['Number_of_pixels'].append(n[m])
                npk = m.sum()
                c['omega'].append(np.full(npk, omega[k]))
                c['dty'].append(np.full(npk, difty))
                iprev = inext
    for t in titles:
        c[t] = np.concatenate(c[t])
    return c