Exemplo n.º 1
0
def surface_check():
    func = double_diamond
    cube = cube_lattice(lattice_num=70, flambda=func)
    delt = 0.1
    cube_d = (np.abs(cube)<delt).astype(float)
    plt.imshow(cube_d[:,:,-1])
    plt.colorbar()
    plt.show()
    qsvec, intens_str = straight_intensity(cube_d, peakmax=5)
    lenqs = qsvec_to_lenqs(qsvec)
    intens_str /= (intens_str*lenqs*lenqs).sum()
    intens_mod = np.load("../data/dd_model_surf.npy")
    intens_paper = np.load("../data/dd_paper_surf.npy")
    plt.title("DD")
    plt.plot(lenqs,intens_mod,'bo',label="surface appr")
    plt.plot(lenqs, intens_str,'^g', label="direct surface")
    plt.plot(lenqs, intens_paper,'r+',label="paper data")

    #for x in range(len(qsvec)):
     #   print x, qsvec[x]

    cube_b = ((cube)<0).astype(float)
    qsvec, intens_bulk = straight_intensity(cube_b, peakmax=5)
    intens_bulk /= (intens_bulk*lenqs*lenqs).sum()
    plt.plot(lenqs, intens_bulk,'xk', label="direct bulk")
    plt.legend()
    plt.show()

    plt.imshow(cube_b[:,:,-1])
    plt.colorbar()
    plt.show()
Exemplo n.º 2
0
def factor_calc_molecular(qsvec, layer, ddens, alph=1):
    """
    :param qsvec:   3d scattering vector
    :param layer:   width of layer
    :param alph:    'podgon' coefficient
    :param ddens:   delta density up/down the surface
    :return:        molecular(form) factor in qvec point(or qvec points) for polygonized surface
    """
    t = qsvec.shape
    assert t[len(t)-1] == 3, "Molecular factor needs qsvec"

    lenqs = 2*np.pi* qsvec_to_lenqs(qsvec)
    factor = ddens* 2./lenqs * np.sin(alph * lenqs * layer/2.)
    return factor
Exemplo n.º 3
0
def factor_calc_structural(qsvec, cube):
    """
    :param qsvec:   3d scattering vector or vectors
    :param cube:    cubic mesh with values of implicit surface
    :return:        structural factor for given qsvec
    """
    t = qsvec.shape
    assert t[len(t)-1] == 3, "Structural factor needs qsvec"

    rvec, surfvec = center_area_cube(cube)
    qsvec_local = deepcopy(qsvec)
    qsvec_local = qsvec_local.transpose()

    try:
        lensurf = qsvec_to_lenqs(surfvec)
    except:
        print(len(surfvec))
        raise ValueError()

    exponent = np.dot(rvec, 2*np.pi*qsvec_local)
    sf = np.dot(lensurf, np.exp(1j*exponent))
    return np.abs(sf)
Exemplo n.º 4
0
def task_surface():
    try:
        mkdir(addr)
    except:
        pass

    #parameter space generation
    qsvec, lenqs = generate_qvecs_lenqs_deprecated(peakmax=peakmax)
    const_s = np.linspace(bounds_const[0], bounds_const[-1], pnum_const)
    layer_s = np.linspace(bounds_const[0], bounds_const[-1], pnum_layer)

    #experimental data correction
    lenqs_exp_grand, intens_exp_grand = read_exp_data(scat_exp_file, intens_exp_file)

    peaks_indices = find_peaks_ind_in_smooth_profile(intens_exp_grand, cond='>')
    lenqs_exp = lenqs_exp_grand[peaks_indices]
    intens_exp = intens_exp_grand[peaks_indices]

    lattice_parameter = get_lattice_parameter(lenqs_exp_abs=lenqs_exp, peaks_file=peaks_file)

    lenqs_exp /= lattice_parameter
    lenqs_exp_grand /= lattice_parameter

    lenqs_exp = peaks_file_to_lenqs(peaks_file)

    exp_ind_in_model = find_exp_indices(lenqs_exp_short=lenqs_exp, lenqs_model=lenqs, corr_file=peaks_file) #corrction of model
    intens_exp = insert_exp_peaks(intensity_exp=intens_exp, indices_exp=exp_ind_in_model, lenqs_model=lenqs)

    #for model correction
    ind_forbid = []
    peak_max = exp_ind_in_model[-1]
    if qsvec_forbid is not None:
        ind_forbid = find_indices(qsvec_forbid, lenqs)
        print("ind forbid: "+str(ind_forbid))

    #for output xaxis
    ind_exp = np.nonzero(intens_exp)[0]
    xaxis = [round(lenqs[ind_exp[0]])-1, round(lenqs[ind_exp[-1]])+1]

    #init
    err_map = np.zeros((pnum_const, pnum_layer))
    lenqs = qsvec_to_lenqs(qsvec)

    #brute_force
    for num_const, val_const in enumerate(const_s):
        func_p = lambda x, y, z: double_diamond(x, y, z, const=val_const)
        cube_p = cube_lattice(lattice_num, func_p)
        func_n = lambda x, y, z: -double_diamond(x, y, z, const=-val_const)
        cube_n = cube_lattice(lattice_num, func_n)

        factor_struct = factor_calc_structural(qsvec, cube_p*cube_n)
        for num_layer, val_layer in enumerate(layer_s):
            temp_intens_exp = deepcopy(intens_exp)
            qsvec_new, intens_mod = calc_model_set_fstruct(factor_struct, val_layer, ddens=1., peakmax=peakmax)

            assert (qsvec_new == qsvec).prod(), "Something went wrong with qsvec's "
            err = calculate_error(lenqs, intens_mod, lenqs, temp_intens_exp, norm='area')

            err_map[num_const, num_layer] = err
            if err<errtr:
                assert (temp_intens_exp/max(temp_intens_exp)).all() == (intens_exp/max(intens_exp)).all(),"intens was changed during err calc"
                name_cur = "p1(%1.2f) p2(%1.2f) " % (val_const, val_layer)
                output(name=name_cur,pic_path=addr, lenqs=lenqs, intens_exp=temp_intens_exp, intens_mod=intens_mod,
                   error=err, lenqs_exp_grand=lenqs_exp_grand, intens_exp_grand=intens_exp_grand, xaxis=xaxis)

    np.save(addr+'/'+model_name+"results.npy", err_map)
    parameters = np.array([const_s, layer_s])
    np.save(addr+'/'+model_name+"params.npy", parameters)
Exemplo n.º 5
0
def single_point(*args):
    try:
        mkdir(addr)
    except:
        pass

    if args is not ():
        phi1 = args[0]
        phi2 = args[1]
        rho_abs_h20, rho_abs_pol, rho_abs_alk = args[2]
        val_debye = args[3]
    else:
        global phi1, phi2, rho_abs_h20
        global rho_abs_pol, rho_abs_alk, val_debye
    print(phi1, phi2, (rho_abs_h20,rho_abs_pol, rho_abs_alk), val_debye)
    qsvec, lenqs = generate_qvecs_lenqs(peakmax=lenqsmax)

    #experimental data correction
    lenqs_exp_grand, intens_exp_grand = read_exp_data(scat_exp_file, intens_exp_file)

    peaks_indices = find_peaks_ind_in_smooth_profile(intens_exp_grand, cond='>')
    lenqs_exp = lenqs_exp_grand[peaks_indices]
    intens_exp = intens_exp_grand[peaks_indices]

    lattice_parameter = get_lattice_parameter(lenqs_exp_abs=lenqs_exp, peaks_file=peaks_file)
    print("lattice parameter: {:1.3f}".format(1./lattice_parameter))
    lenqs_exp /= lattice_parameter
    lenqs_exp_grand /= lattice_parameter

    lenqs_exp = peaks_file_to_lenqs(peaks_file)

    exp_ind_in_model = find_exp_indices(lenqs_exp_short=lenqs_exp, lenqs_model=lenqs, corr_file=peaks_file) #corrction of model
    intens_exp = insert_exp_peaks(intensity_exp=intens_exp, indices_exp=exp_ind_in_model, lenqs_model=lenqs)

    #for model correction
    ind_forbid = []
    peak_max = exp_ind_in_model[-1]

    print("inices higher than {} ({}) are forbidden".format(peak_max, qsvec[peak_max]))
    if qsvec_forbid is not None:
        ind_forbid = find_indices(qsvec_forbid, lenqs)
        print("hkl forbid: {}, ind forbid{}:".format(str(qsvec_forbid), ind_forbid))

    #for output xaxis
    ind_exp = np.nonzero(intens_exp)[0]
    xaxis = [round(lenqs[ind_exp[0]])-1, round(lenqs[ind_exp[-1]])+1]
    #init
    lenqs = qsvec_to_lenqs(qsvec)
    #brute force
    con1 = phi_to_const(phi1)
    cube_in = build_lattice_function(lattice_num=lattice_num, func=model_function, con=con1, warn=global_warn, sizelat=sizelat)

    con2 = phi_to_const(phi2+phi1)
    cube_out = build_lattice_function(lattice_num=lattice_num, func=model_function, con=con2, warn=global_warn, sizelat=sizelat)

    cube = (1.-cube_out)*rho_abs_alk
    cube += (cube_out - cube_in)*rho_abs_pol
    cube += cube_in*rho_abs_h20
    print(rho_abs_alk, rho_abs_pol, rho_abs_h20)
    plt.title(u"Электронная плотность в срезе")
    plt.imshow(cube[0], extent=[0,1,0,1])
    plt.colorbar()
    plt.show()
    cube -= cube.sum()/lattice_num**3

    lenqs2, intens_mod = straight_intensity(cube, peakmax=lenqsmax, sizelat=sizelat)
    assert lenqs.all()==lenqs2.all(),'trouble!'

    debye_factor = np.exp(-(lenqs*val_debye)**2)
    intens_mod *= debye_factor

    intens_mod[peak_max+1::] = 0.0
    intens_mod[ind_forbid] = 0.0

    err = calculate_error(lenqs, intens_mod, lenqs, intens_exp, norm='area')

    name_cur = "$\phi={}; $\phi2={}, rho=({},{},{}), d={}$".format(phi1, phi2,
                                                                          rho_abs_h20,rho_abs_pol,rho_abs_alk, val_debye)
    output(name=name_cur,pic_path=addr, lenqs=lenqs, intens_exp=intens_exp, intens_mod=intens_mod,
                               error=err, lenqs_exp_grand=lenqs_exp_grand, intens_exp_grand=intens_exp_grand, xaxis=xaxis)