コード例 #1
0
def filt_vols( vols, fscs, mask3D ):
	from math          import sqrt
	from sp_filter        import fit_tanh, filt_tanl, filt_table
	from sp_fundamentals  import rops_table
	from sp_morphology    import threshold

	flmin = 1.0
	flmax = -1.0
	nvol = len(vols)
	for i in range(nvol):
		fl, aa = fit_tanh( fscs[i] )
		if (fl < flmin):
			flmin = fl
			aamin = aa
		if (fl > flmax):
			flmax = fl
			idmax = i
	sxprint(" Filter tanl, parameters: ",flmin-0.05, "  ",  aamin)
	volmax = vols[idmax]
	volmax = filt_tanl( volmax, flmin-0.05, aamin )
	pmax = rops_table( volmax )

	for i in range(nvol):
		ptab = rops_table( vols[i] )
		for j in range( len(ptab) ):
			ptab[j] = sqrt( pmax[j]/ptab[j] )

		vols[i] = filt_table( vols[i], ptab )
		#stat = Util.infomask( vols[i], mask3D, False )
		#volf -= stat[0]
		Util.mul_img( vols[i], mask3D )
		#volf = threshold( volf )

	return vols
コード例 #2
0
ファイル: sp_compute_isac_avg.py プロジェクト: spamrick/eman2
def adjust_pw_to_model(image, pixel_size, roo):
    c1 = -4.5
    c2 = 15.0
    c3 = 0.2
    c4 = -1.0
    c5 = old_div(1.0, 5.0)
    c6 = 0.25  # six params are fitted to Yifan channel model
    rot1 = sp_fundamentals.rops_table(image)
    fil = [None] * len(rot1)
    if roo is None:  # adjusted to the analytic model, See Penczek Methods Enzymol 2010
        pu = []
        for ifreq in range(len(rot1)):
            x = old_div(old_div(float(ifreq), float(len(rot1))), pixel_size)
            v = numpy.exp(c1 + old_div(c2, (old_div(x, c3) + 1)**2)
                          ) + numpy.exp(c4 - 0.5 *
                                        (old_div((x - c5), c6**2)**2))
            pu.append(v)
        s = sum(pu)
        for ifreq in range(len(rot1)):
            fil[ifreq] = numpy.sqrt(old_div(pu[ifreq], (rot1[ifreq] * s)))
    else:  # adjusted to a given 1-d rotational averaged pw2
        if roo[0] < 0.1 or roo[0] > 1.0:
            s = sum(roo)
        else:
            s = 1.0
        for ifreq in range(len(rot1)):
            fil[ifreq] = numpy.sqrt(old_div(roo[ifreq], (rot1[ifreq] * s)))
    return sp_filter.filt_table(image, fil)
コード例 #3
0
ファイル: sp_compute_isac_avg.py プロジェクト: spamrick/eman2
def adjust_pw_to_model(image, pixel_size, roo):
    pass  #IMPORTIMPORTIMPORT from sp_fundamentals import rops_table
    pass  #IMPORTIMPORTIMPORT from sp_filter       import filt_table
    pass  #IMPORTIMPORTIMPORT from math         import exp, sqrt
    c1 = -4.5
    c2 = 15.0
    c3 = 0.2
    c4 = -1.0
    c5 = 1. / 5.
    c6 = 0.25  # six params are fitted to Yifan channel model
    rot1 = sp_fundamentals.rops_table(image)
    fil = [None] * len(rot1)
    if roo is None:  # adjusted to the analytic model, See Penczek Methods Enzymol 2010
        pu = []
        for ifreq in range(len(rot1)):
            x = float(ifreq) / float(len(rot1)) / pixel_size
            v = numpy.exp(c1 + c2 /
                          (x / c3 + 1)**2) + numpy.exp(c4 - 0.5 *
                                                       (((x - c5) / c6**2)**2))
            pu.append(v)
        s = sum(pu)
        for ifreq in range(len(rot1)):
            fil[ifreq] = numpy.sqrt(pu[ifreq] / (rot1[ifreq] * s))
    else:  # adjusted to a given 1-d rotational averaged pw2
        if roo[0] < 0.1 or roo[0] > 1.: s = sum(roo)
        else: s = 1.0
        for ifreq in range(len(rot1)):
            fil[ifreq] = numpy.sqrt(roo[ifreq] / (rot1[ifreq] * s))
    return sp_filter.filt_table(image, fil)
コード例 #4
0
ファイル: sp_filter.py プロジェクト: jcbollinger/eman2
def filt_matched(ima, SNR, Pref):
    """ 
		Calculate Matched filter. The reference image is 
		assumed to be a Wiener average
		See paper Alignment under noise by PRB et al
	"""

    from sp_filter import filt_from_fsc_bwt, filt_table
    from math import sqrt
    from EMAN2 import EMData
    from sp_fundamentals import rops_table

    ctf_2 = ima.get_attr('ctf_2')
    PU = ima.get_attr('PU')
    Pn1 = ima.get_attr('Pn1')
    Pn2 = ima.get_attr('Pn2')
    TE = ima.get_attr('TE')
    HM = []
    TMP1 = []
    TMP2 = []
    for j in range(len(Pref) - 1):
        if (SNR[j] > .05):
            thm = SNR[j] * (SNR[j] + 1.) * PU[j] / Pref[j]
            sxprint(thm)
            hm = sqrt(thm)
            deno = (SNR[j] + 1) * (ctf_2[j] * Pn2[j] * TE[j]**2 +
                                   Pn1[j]) + ctf_2[j] * PU[j] * TE[j]**2
            xval = hm / deno
        else:
            hm = 0.0
            xval = 0.0
        HM.append(xval)
        TMP1.append(Pref[j])
        TMP2.append(hm)

    img = filt_table(ima, HM)
    res = []
    res.append(img)
    res.append(TMP1)
    res.append(TMP2)
    del HM
    return res
コード例 #5
0
ファイル: sp_proj_compare.py プロジェクト: tutut1234/eman2
def compare_projs(reconfile,
                  classavgstack,
                  inputanglesdoc,
                  outdir,
                  interpolation_method=1,
                  log=None,
                  verbose=False):
    """
	Make comparison stack between class averages (even-numbered (starts from 0)) and re-projections (odd-numbered).
	
	Arguments:
		reconfile : Input volume from which to generate re-projections
		classavgstack ; Input image stack
		inputanglesdoc : Input Euler angles doc
		outdir ; Output directory
		interpolation_method : Interpolation method: nearest neighbor (nn, 0), trilinear (1, default), gridding (-1)
		log : Logger object
		verbose : (boolean) Whether to write additional information to screen
	Returns:
		compstack : Stack of comparisons between input image stack (even-numbered (starts from 0)) and input volume (odd-numbered)
	"""

    recondata = EMAN2.EMData(reconfile)
    nx = recondata.get_xsize()

    # Resample reference
    reconprep = prep_vol(recondata,
                         npad=2,
                         interpolation_method=interpolation_method)

    ccclist = []

    #  Here you need actual radius to compute proper ccc's, but if you do, you have to deal with translations, PAP
    mask = model_circle(nx // 2 - 2, nx, nx)
    mask.write_image(os.path.join(outdir, 'maskalign.hdf'))
    compstack = os.path.join(outdir, 'comp-proj-reproj.hdf')

    # Number of images may have changed
    nimg1 = EMAN2.EMUtil.get_image_count(classavgstack)
    angleslist = read_text_row(inputanglesdoc)

    for imgnum in range(nimg1):
        # Get class average
        classimg = get_im(classavgstack, imgnum)

        # Compute re-projection
        prjimg = prgl(reconprep,
                      angleslist[imgnum],
                      interpolation_method=1,
                      return_real=False)

        # Calculate 1D power spectra
        rops_dst = rops_table(classimg * mask)
        rops_src = rops_table(prjimg)

        #  Set power spectrum of reprojection to the data.
        #  Since data has an envelope, it would make more sense to set data to reconstruction,
        #  but to do it one would have to know the actual resolution of the data.
        #  you can check sxprocess.py --adjpw to see how this is done properly  PAP
        table = [0.0] * len(rops_dst)  # initialize table
        for j in range(len(rops_dst)):
            table[j] = sqrt(rops_dst[j] / rops_src[j])
        prjimg = fft(filt_table(
            prjimg,
            table))  # match FFT amplitudes of re-projection and class average

        cccoeff = ccc(prjimg, classimg, mask)
        #print imgnum, cccoeff
        classimg.set_attr_dict({'cross-corr': cccoeff})
        prjimg.set_attr_dict({'cross-corr': cccoeff})

        montagestack = []
        montagestack.append(prjimg)
        montagestack.append(classimg)
        comparison_pair = montage2(montagestack, ncol=2, marginwidth=1)
        comparison_pair.write_image(compstack, imgnum)

        ccclist.append(cccoeff)
    del angleslist
    meanccc = sum(ccclist) / nimg1
    print_log_msg("Average CCC is %s\n" % meanccc, log, verbose)

    nimg2 = EMAN2.EMUtil.get_image_count(compstack)

    for imgnum in range(nimg2):  # xrange will be deprecated in Python3
        prjimg = get_im(compstack, imgnum)
        meanccc1 = prjimg.get_attr_default('mean-cross-corr', -1.0)
        prjimg.set_attr_dict({'mean-cross-corr': meanccc})
        write_header(compstack, prjimg, imgnum)

    return compstack
コード例 #6
0
def recons3d_trl_struct_MPI(
    myid,
    main_node,
    prjlist,
    paramstructure,
    refang,
    rshifts_shrank,
    delta,
    upweighted=True,
    mpi_comm=None,
    CTF=True,
    target_size=-1,
    avgnorm=1.0,
    norm_per_particle=None,
):
    """
		recons3d_4nn_ctf - calculate CTF-corrected 3-D reconstruction from a set of projections using three Eulerian angles, two shifts, and CTF settings for each projeciton image
		Input
			list_of_prjlist: list of lists of projections to be included in the reconstruction
	"""

    if mpi_comm == None:
        mpi_comm = mpi.MPI_COMM_WORLD

    refvol = sp_utilities.model_blank(target_size)
    refvol.set_attr("fudge", 1.0)

    if CTF:
        do_ctf = 1
    else:
        do_ctf = 0

    fftvol = EMAN2_cppwrap.EMData()
    weight = EMAN2_cppwrap.EMData()

    params = {
        "size": target_size,
        "npad": 2,
        "snr": 1.0,
        "sign": 1,
        "symmetry": "c1",
        "refvol": refvol,
        "fftvol": fftvol,
        "weight": weight,
        "do_ctf": do_ctf,
    }
    r = EMAN2_cppwrap.Reconstructors.get("nn4_ctfw", params)
    r.setup()

    if prjlist:
        if norm_per_particle == None:
            norm_per_particle = len(prjlist) * [1.0]

        nnx = prjlist[0].get_xsize()
        nny = prjlist[0].get_ysize()
        nshifts = len(rshifts_shrank)
        for im in range(len(prjlist)):
            #  parse projection structure, generate three lists:
            #  [ipsi+iang], [ishift], [probability]
            #  Number of orientations for a given image
            numbor = len(paramstructure[im][2])
            ipsiandiang = [
                old_div(paramstructure[im][2][i][0], 1000)
                for i in range(numbor)
            ]
            allshifts = [
                paramstructure[im][2][i][0] % 1000 for i in range(numbor)
            ]
            probs = [paramstructure[im][2][i][1] for i in range(numbor)]
            #  Find unique projection directions
            tdir = list(set(ipsiandiang))
            bckgn = prjlist[im].get_attr("bckgnoise")
            ct = prjlist[im].get_attr("ctf")
            #  For each unique projection direction:
            data = [None] * nshifts
            for ii in range(len(tdir)):
                #  Find the number of times given projection direction appears on the list, it is the number of different shifts associated with it.
                lshifts = sp_utilities.findall(tdir[ii], ipsiandiang)
                toprab = 0.0
                for ki in range(len(lshifts)):
                    toprab += probs[lshifts[ki]]
                recdata = EMAN2_cppwrap.EMData(nny, nny, 1, False)
                recdata.set_attr("is_complex", 0)
                for ki in range(len(lshifts)):
                    lpt = allshifts[lshifts[ki]]
                    if data[lpt] == None:
                        data[lpt] = sp_fundamentals.fshift(
                            prjlist[im], rshifts_shrank[lpt][0],
                            rshifts_shrank[lpt][1])
                        data[lpt].set_attr("is_complex", 0)
                    EMAN2_cppwrap.Util.add_img(
                        recdata,
                        EMAN2_cppwrap.Util.mult_scalar(
                            data[lpt], old_div(probs[lshifts[ki]], toprab)),
                    )
                recdata.set_attr_dict({
                    "padffted": 1,
                    "is_fftpad": 1,
                    "is_fftodd": 0,
                    "is_complex_ri": 1,
                    "is_complex": 1,
                })
                if not upweighted:
                    recdata = sp_filter.filt_table(recdata, bckgn)
                recdata.set_attr_dict({"bckgnoise": bckgn, "ctf": ct})
                ipsi = tdir[ii] % 100000
                iang = old_div(tdir[ii], 100000)
                r.insert_slice(
                    recdata,
                    EMAN2_cppwrap.Transform({
                        "type":
                        "spider",
                        "phi":
                        refang[iang][0],
                        "theta":
                        refang[iang][1],
                        "psi":
                        refang[iang][2] + ipsi * delta,
                    }),
                    old_div(toprab * avgnorm, norm_per_particle[im]),
                )
        #  clean stuff
        del bckgn, recdata, tdir, ipsiandiang, allshifts, probs

    sp_utilities.reduce_EMData_to_root(fftvol, myid, main_node, comm=mpi_comm)
    sp_utilities.reduce_EMData_to_root(weight, myid, main_node, comm=mpi_comm)

    if myid == main_node:
        dummy = r.finish(True)
    mpi.mpi_barrier(mpi_comm)

    if myid == main_node:
        return fftvol, weight, refvol
    else:
        return None, None, None