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()
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
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)
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)
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)