def xoppy_calc_xcrystal(self): CRYSTAL_MATERIAL = self.CRYSTAL_MATERIAL MILLER_INDEX_H = self.MILLER_INDEX_H MILLER_INDEX_K = self.MILLER_INDEX_K MILLER_INDEX_L = self.MILLER_INDEX_L TEMPER = self.TEMPER MOSAIC = self.MOSAIC GEOMETRY = self.GEOMETRY SCAN = self.SCAN UNIT = self.UNIT SCANFROM = self.SCANFROM SCANTO = self.SCANTO SCANPOINTS = self.SCANPOINTS ENERGY = self.ENERGY ASYMMETRY_ANGLE = self.ASYMMETRY_ANGLE THICKNESS = self.THICKNESS MOSAIC_FWHM = self.MOSAIC_FWHM RSAG = self.RSAG RMER = self.RMER ANISOTROPY = self.ANISOTROPY POISSON = self.POISSON CUT = self.CUT FILECOMPLIANCE = self.FILECOMPLIANCE for file in ["diff_pat.dat","diff_pat.gle","diff_pat.par","diff_pat.xop","xcrystal.bra"]: try: os.remove(os.path.join(locations.home_bin_run(),file)) except: pass if (GEOMETRY == 1) or (GEOMETRY == 3): if ASYMMETRY_ANGLE == 0.0: print("xoppy_calc_xcrystal: WARNING: In xcrystal the asymmetry angle is the angle between Bragg planes and crystal surface,"+ "in BOTH Bragg and Laue geometries.") descriptor = Crystal_GetCrystalsList()[CRYSTAL_MATERIAL] if SCAN == 3: # energy scan emin = SCANFROM - 1 emax = SCANTO + 1 else: emin = ENERGY - 100.0 emax = ENERGY + 100.0 print("Using crystal descriptor: ",descriptor) bragg_dictionary = bragg_calc(descriptor=descriptor, hh=MILLER_INDEX_H,kk=MILLER_INDEX_K,ll=MILLER_INDEX_L, temper=float(TEMPER), emin=emin,emax=emax,estep=5.0,fileout="xcrystal.bra") with open("xoppy.inp", "wt") as f: f.write("xcrystal.bra\n") f.write("%d\n"%MOSAIC) f.write("%d\n"%GEOMETRY) if MOSAIC == 1: f.write("%g\n"%MOSAIC_FWHM) f.write("%g\n"%THICKNESS) else: f.write("%g\n"%THICKNESS) f.write("%g\n"%ASYMMETRY_ANGLE) scan_flag = 1 + SCAN f.write("%d\n"%scan_flag) f.write("%19.9f\n"%ENERGY) if scan_flag <= 3: f.write("%d\n"%UNIT) f.write("%g\n"%SCANFROM) f.write("%g\n"%SCANTO) f.write("%d\n"%SCANPOINTS) if MOSAIC > 1: # bent f.write("%g\n"%RSAG) f.write("%g\n"%RMER) f.write("0\n") if ( (descriptor == "Si") or (descriptor == "Si2") or (descriptor == "Si_NIST") or (descriptor == "Ge") or descriptor == "Diamond"): pass else: # not Si,Ge,Diamond if ((ANISOTROPY == 1) or (ANISOTROPY == 2)): raise Exception("Anisotropy data not available for this crystal. Either use isotropic or use external compliance file. Please change and run again'") f.write("%d\n"%ANISOTROPY) if ANISOTROPY == 0: f.write("%g\n"%POISSON) elif ANISOTROPY == 1: f.write("%d\n"%CRYSTAL_MATERIAL) f.write("%g\n"%ASYMMETRY_ANGLE) f.write("%d\n"%MILLER_INDEX_H) f.write("%d\n"%MILLER_INDEX_K) f.write("%d\n"%MILLER_INDEX_L) elif ANISOTROPY == 2: f.write("%d\n"%CRYSTAL_MATERIAL) f.write("%g\n"%ASYMMETRY_ANGLE) # TODO: check syntax for CUT: Cut syntax is: valong_X valong_Y valong_Z ; vnorm_X vnorm_Y vnorm_Z ; vperp_x vperp_Y vperp_Z f.write("%s\n"%CUT.split(";")[0]) f.write("%s\n"%CUT.split(";")[1]) f.write("%s\n"%CUT.split(";")[2]) elif ANISOTROPY == 3: f.write("%s\n"%FILECOMPLIANCE) command = "'" + os.path.join(locations.home_bin(), 'diff_pat') + "' < xoppy.inp" print("Running command '%s' in directory: %s "%(command, locations.home_bin_run())) print("\n--------------------------------------------------------\n") os.system(command) print("\n--------------------------------------------------------\n") #show calculated parameters in standard output txt_info = open("diff_pat.par").read() for line in txt_info: print(line,end="") calculated_data = DataExchangeObject("XOPPY", self.get_data_exchange_widget_name()) try: calculated_data.add_content("xoppy_data", numpy.loadtxt("diff_pat.dat", skiprows=5)) calculated_data.add_content("plot_x_col",0) calculated_data.add_content("plot_y_col",-1) calculated_data.add_content("units_to_degrees", self.get_units_to_degrees()) except Exception as e: raise Exception("Error loading diff_pat.dat :" + str(e)) try: calculated_data.add_content("labels", ["Th-ThB{in} [" + self.unit_combo.itemText(self.UNIT) + "]", "Th-ThB{out} [" + self.unit_combo.itemText(self.UNIT) + "]", "phase_p[rad]", "phase_s[rad]","Circ Polariz", "p-polarized reflectivity", "s-polarized reflectivity"]) except: pass try: with open("diff_pat.par") as f: info = f.readlines() calculated_data.add_content("info",info) except: pass return calculated_data
def xoppy_calc_xfh(self): #TODO: remove I_ABSORP ILATTICE = self.ILATTICE HMILLER = self.HMILLER KMILLER = self.KMILLER LMILLER = self.LMILLER I_PLOT = self.I_PLOT TEMPER = self.TEMPER ENERGY = self.ENERGY ENERGY_END = self.ENERGY_END NPOINTS = self.NPOINTS descriptor = Crystal_GetCrystalsList()[ILATTICE] print("Using crystal descriptor: ", descriptor) bragg_dictionary = bragg_calc(descriptor=descriptor, hh=HMILLER, kk=KMILLER, ll=LMILLER, temper=TEMPER, emin=ENERGY, emax=ENERGY_END, estep=50.0, fileout=None) energy = numpy.linspace(ENERGY, ENERGY_END, NPOINTS) out = numpy.zeros((25, NPOINTS)) info = "" for i, ienergy in enumerate(energy): dic2 = crystal_fh(bragg_dictionary, ienergy) print("Energy=%g eV FH=(%g,%g)" % (ienergy, dic2["STRUCT"].real, dic2["STRUCT"].imag)) out[0, i] = ienergy out[1, i] = dic2["WAVELENGTH"] * 1e10 out[2, i] = dic2["THETA"] * 180 / numpy.pi out[3, i] = dic2["F_0"].real out[4, i] = dic2["F_0"].imag out[5, i] = dic2["FH"].real out[6, i] = dic2["FH"].imag out[7, i] = dic2["FH_BAR"].real out[8, i] = dic2["FH_BAR"].imag out[9, i] = dic2["psi_0"].real out[10, i] = dic2["psi_0"].imag out[11, i] = dic2["psi_h"].real out[12, i] = dic2["psi_h"].imag out[13, i] = dic2["psi_hbar"].real out[14, i] = dic2["psi_hbar"].imag out[15, i] = dic2["STRUCT"].real out[16, i] = dic2["STRUCT"].imag out[17, i] = dic2["DELTA_REF"] out[18, i] = dic2["REFRAC"].real out[19, i] = dic2["REFRAC"].imag out[20, i] = dic2["ABSORP"] out[21, i] = 1e6 * dic2["ssr"] # in microrads out[22, i] = 1e6 * dic2["spr"] # in microrads out[23, i] = dic2["RATIO"] out[24, i] = dic2["psi_over_f"] info += "#\n#\n#\n" info += dic2["info"] #send exchange calculated_data = DataExchangeObject( "XOPPY", self.get_data_exchange_widget_name()) try: calculated_data.add_content("xoppy_data", out.T) calculated_data.add_content("plot_x_col", 0) calculated_data.add_content("plot_y_col", I_PLOT) except: pass try: calculated_data.add_content("labels", self.plotOptionList()) except: pass try: calculated_data.add_content("info", info) except: pass if self.DUMP_TO_FILE: with open(self.FILE_NAME, "w") as file: try: file.write("#F %s\n" % self.FILE_NAME) file.write("\n#S 1 xoppy CrossSec results\n") file.write("#N %d\n" % (out.shape[0])) tmp = "#L" for item in self.plotOptionList(): tmp += " %s" % (item) tmp += "\n" file.write(tmp) for j in range(out.shape[1]): file.write( ("%19.12e " * out.shape[0] + "\n") % tuple(out[i, j] for i in range(out.shape[0]))) file.close() print("File written to disk: %s \n" % self.FILE_NAME) except: raise Exception( "CrossSec: The data could not be dumped onto the specified file!\n" ) return calculated_data
def xoppy_calc_xcrystal(self): CRYSTAL_MATERIAL = self.CRYSTAL_MATERIAL MILLER_INDEX_H = self.MILLER_INDEX_H MILLER_INDEX_K = self.MILLER_INDEX_K MILLER_INDEX_L = self.MILLER_INDEX_L TEMPER = self.TEMPER MOSAIC = self.MOSAIC GEOMETRY = self.GEOMETRY SCAN = self.SCAN UNIT = self.UNIT SCANFROM = self.SCANFROM SCANTO = self.SCANTO SCANPOINTS = self.SCANPOINTS ENERGY = self.ENERGY ASYMMETRY_ANGLE = self.ASYMMETRY_ANGLE THICKNESS = self.THICKNESS MOSAIC_FWHM = self.MOSAIC_FWHM RSAG = self.RSAG RMER = self.RMER ANISOTROPY = self.ANISOTROPY POISSON = self.POISSON CUT = self.CUT FILECOMPLIANCE = self.FILECOMPLIANCE for file in ["diff_pat.dat","diff_pat.gle","diff_pat.par","diff_pat.xop","xcrystal.bra"]: try: os.remove(os.path.join(locations.home_bin_run(),file)) except: pass if (GEOMETRY == 1) or (GEOMETRY == 3): if ASYMMETRY_ANGLE == 0.0: print("xoppy_calc_xcrystal: WARNING: In xcrystal the asymmetry angle is the angle between Bragg planes and crystal surface,"+ "in BOTH Bragg and Laue geometries.") descriptor = Crystal_GetCrystalsList()[CRYSTAL_MATERIAL] if SCAN == 3: # energy scan emin = SCANFROM - 1 emax = SCANTO + 1 else: emin = ENERGY - 100.0 emax = ENERGY + 100.0 print("Using crystal descriptor: ",descriptor) bragg_dictionary = bragg_calc(descriptor=descriptor, hh=MILLER_INDEX_H,kk=MILLER_INDEX_K,ll=MILLER_INDEX_L, temper=float(TEMPER), emin=emin,emax=emax,estep=5.0,fileout="xcrystal.bra") with open("xoppy.inp", "wt") as f: f.write("xcrystal.bra\n") f.write("%d\n"%MOSAIC) f.write("%d\n"%GEOMETRY) if MOSAIC == 1: f.write("%g\n"%MOSAIC_FWHM) f.write("%g\n"%THICKNESS) else: f.write("%g\n"%THICKNESS) f.write("%g\n"%ASYMMETRY_ANGLE) scan_flag = 1 + SCAN f.write("%d\n"%scan_flag) f.write("%19.9f\n"%ENERGY) if scan_flag <= 3: f.write("%d\n"%UNIT) f.write("%g\n"%SCANFROM) f.write("%g\n"%SCANTO) f.write("%d\n"%SCANPOINTS) if MOSAIC > 1: # bent f.write("%g\n"%RSAG) f.write("%g\n"%RMER) f.write("0\n") if ( (descriptor == "Si") or (descriptor == "Si2") or (descriptor == "Si_NIST") or (descriptor == "Ge") or descriptor == "Diamond"): pass else: # not Si,Ge,Diamond if ((ANISOTROPY == 1) or (ANISOTROPY == 2)): raise Exception("Anisotropy data not available for this crystal. Either use isotropic or use external compliance file. Please change and run again'") f.write("%d\n"%ANISOTROPY) if ANISOTROPY == 0: f.write("%g\n"%POISSON) elif ANISOTROPY == 1: f.write("%d\n"%CRYSTAL_MATERIAL) f.write("%g\n"%ASYMMETRY_ANGLE) f.write("%d\n"%MILLER_INDEX_H) f.write("%d\n"%MILLER_INDEX_K) f.write("%d\n"%MILLER_INDEX_L) elif ANISOTROPY == 2: f.write("%d\n"%CRYSTAL_MATERIAL) f.write("%g\n"%ASYMMETRY_ANGLE) # TODO: check syntax for CUT: Cut syntax is: valong_X valong_Y valong_Z ; vnorm_X vnorm_Y vnorm_Z ; vperp_x vperp_Y vperp_Z f.write("%s\n"%CUT.split(";")[0]) f.write("%s\n"%CUT.split(";")[1]) f.write("%s\n"%CUT.split(";")[2]) elif ANISOTROPY == 3: f.write("%s\n"%FILECOMPLIANCE) command = os.path.join(locations.home_bin(), 'diff_pat') + " < xoppy.inp" print("Running command '%s' in directory: %s "%(command, locations.home_bin_run())) print("\n--------------------------------------------------------\n") os.system(command) print("\n--------------------------------------------------------\n") #show calculated parameters in standard output txt_info = open("diff_pat.par").read() for line in txt_info: print(line,end="") calculated_data = DataExchangeObject("XOPPY", self.get_data_exchange_widget_name()) try: calculated_data.add_content("xoppy_data", numpy.loadtxt("diff_pat.dat", skiprows=5)) calculated_data.add_content("plot_x_col",0) calculated_data.add_content("plot_y_col",-1) calculated_data.add_content("units_to_degrees", self.get_units_to_degrees()) except Exception as e: raise Exception("Error loading diff_pat.dat :" + str(e)) try: calculated_data.add_content("labels", ["Th-ThB{in} [" + self.unit_combo.itemText(self.UNIT) + "]", "Th-ThB{out} [" + self.unit_combo.itemText(self.UNIT) + "]", "phase_p[rad]", "phase_s[rad]","Circ Polariz", "p-polarized reflectivity", "s-polarized reflectivity"]) except: pass try: with open("diff_pat.par") as f: info = f.readlines() calculated_data.add_content("info",info) except: pass return calculated_data
def calculate_with_xoppy( bragg_or_laue=0, # diffracted_or_transmitted=0, # crystal_name="Si", # string thickness=1e-2, # meters miller_h=1, # int miller_k=1, # int miller_l=1, # int asymmetry_angle=0.0, # radians energy=8000.0, # eV angle_deviation_min=-100e-6, # radians angle_deviation_max=100e-6, # radians angle_deviation_points=500, ): MILLER_INDEX_H = miller_h MILLER_INDEX_K = miller_k MILLER_INDEX_L = miller_l TEMPER = 1.0 MOSAIC = 0 if bragg_or_laue == 0: if diffracted_or_transmitted == 0: GEOMETRY = 0 elif diffracted_or_transmitted == 1: GEOMETRY = 2 else: raise Exception("Bad geometry type") elif bragg_or_laue == 1: if diffracted_or_transmitted == 0: GEOMETRY = 1 elif diffracted_or_transmitted == 1: GEOMETRY = 3 else: raise Exception("Bad geometry type") else: raise Exception("Bad geometry type") SCAN = 2 UNIT = 0 # rad SCANFROM = angle_deviation_min SCANTO = angle_deviation_max SCANPOINTS = angle_deviation_points ENERGY = energy ASYMMETRY_ANGLE = asymmetry_angle * 180.0 / numpy.pi THICKNESS = thickness * 100 MOSAIC_FWHM = 0.0 RSAG = 0.0 RMER = 0.0 ANISOTROPY = 0 POISSON = 0.0 CUT = 0 FILECOMPLIANCE = "" for file in [ "diff_pat.dat", "diff_pat.gle", "diff_pat.par", "diff_pat.xop", "xcrystal.bra" ]: try: os.remove(os.path.join(locations.home_bin_run(), file)) except: pass if (GEOMETRY == 1) or (GEOMETRY == 3): if ASYMMETRY_ANGLE == 0.0: print( "xoppy_calc_xcrystal: WARNING: In xcrystal the asymmetry angle is the angle between Bragg planes and crystal surface," + "in BOTH Bragg and Laue geometries.") descriptor = crystal_name if SCAN == 3: # energy scan emin = SCANFROM - 1 emax = SCANTO + 1 else: emin = ENERGY - 100.0 emax = ENERGY + 100.0 print("Using crystal descriptor: ", descriptor) bragg_dictionary = bragg_calc(descriptor=descriptor, hh=MILLER_INDEX_H, kk=MILLER_INDEX_K, ll=MILLER_INDEX_L, temper=float(TEMPER), emin=emin, emax=emax, estep=5.0, fileout="xcrystal.bra") with open("xoppy.inp", "wt") as f: f.write("xcrystal.bra\n") f.write("%d\n" % MOSAIC) f.write("%d\n" % GEOMETRY) if MOSAIC == 1: f.write("%g\n" % MOSAIC_FWHM) f.write("%g\n" % THICKNESS) else: f.write("%g\n" % THICKNESS) f.write("%g\n" % ASYMMETRY_ANGLE) scan_flag = 1 + SCAN f.write("%d\n" % scan_flag) f.write("%19.9f\n" % ENERGY) if scan_flag <= 3: f.write("%d\n" % UNIT) f.write("%g\n" % SCANFROM) f.write("%g\n" % SCANTO) f.write("%d\n" % SCANPOINTS) if MOSAIC > 1: # bent f.write("%g\n" % RSAG) f.write("%g\n" % RMER) f.write("0\n") if ((descriptor == "Si") or (descriptor == "Si2") or (descriptor == "Si_NIST") or (descriptor == "Ge") or descriptor == "Diamond"): pass else: # not Si,Ge,Diamond if ((ANISOTROPY == 1) or (ANISOTROPY == 2)): raise Exception( "Anisotropy data not available for this crystal. Either use isotropic or use external compliance file. Please change and run again'" ) f.write("%d\n" % ANISOTROPY) if ANISOTROPY == 0: f.write("%g\n" % POISSON) elif ANISOTROPY == 1: f.write("%d\n" % CRYSTAL_MATERIAL) f.write("%g\n" % ASYMMETRY_ANGLE) f.write("%d\n" % MILLER_INDEX_H) f.write("%d\n" % MILLER_INDEX_K) f.write("%d\n" % MILLER_INDEX_L) elif ANISOTROPY == 2: f.write("%d\n" % CRYSTAL_MATERIAL) f.write("%g\n" % ASYMMETRY_ANGLE) # TODO: check syntax for CUT: Cut syntax is: valong_X valong_Y valong_Z ; vnorm_X vnorm_Y vnorm_Z ; vperp_x vperp_Y vperp_Z f.write("%s\n" % CUT.split(";")[0]) f.write("%s\n" % CUT.split(";")[1]) f.write("%s\n" % CUT.split(";")[2]) elif ANISOTROPY == 3: f.write("%s\n" % FILECOMPLIANCE) command = os.path.join(locations.home_bin(), 'diff_pat') + " < xoppy.inp" print("Running command '%s' in directory: %s " % (command, locations.home_bin_run())) print("\n--------------------------------------------------------\n") os.system(command) print("\n--------------------------------------------------------\n") #show calculated parameters in standard output txt_info = open("diff_pat.par").read() for line in txt_info: print(line, end="") try: calculated_data = numpy.loadtxt("diff_pat.dat", skiprows=5) except Exception as e: raise Exception("Error loading diff_pat.dat :" + str(e)) print(calculated_data.shape) deviations = calculated_data[:, 0].copy() intensityS = calculated_data[:, 6].copy() intensityP = calculated_data[:, 5].copy() return deviations, intensityS, intensityP
def xoppy_calc_xfh(self): #TODO: remove I_ABSORP ILATTICE = self.ILATTICE HMILLER = self.HMILLER KMILLER = self.KMILLER LMILLER = self.LMILLER I_PLOT = self.I_PLOT TEMPER = self.TEMPER ENERGY = self.ENERGY ENERGY_END = self.ENERGY_END NPOINTS = self.NPOINTS descriptor = Crystal_GetCrystalsList()[ILATTICE] print("Using crystal descriptor: ",descriptor) bragg_dictionary = bragg_calc(descriptor=descriptor,hh=HMILLER,kk=KMILLER,ll=LMILLER,temper=TEMPER, emin=ENERGY,emax=ENERGY_END,estep=50.0,fileout="/dev/null") energy = numpy.linspace(ENERGY,ENERGY_END,NPOINTS) out = numpy.zeros((25,NPOINTS)) info = "" for i,ienergy in enumerate(energy): dic2 = crystal_fh(bragg_dictionary,ienergy) print("Energy=%g eV FH=(%g,%g)"%(ienergy,dic2["STRUCT"].real,dic2["STRUCT"].imag)) out[0,i] = ienergy out[1,i] = dic2["WAVELENGTH"]*1e10 out[2,i] = dic2["THETA"]*180/numpy.pi out[3,i] = dic2["F_0"].real out[4,i] = dic2["F_0"].imag out[5,i] = dic2["FH"].real out[6,i] = dic2["FH"].imag out[7,i] = dic2["FH_BAR"].real out[8,i] = dic2["FH_BAR"].imag out[9,i] = dic2["psi_0"].real out[10,i] = dic2["psi_0"].imag out[11,i] = dic2["psi_h"].real out[12,i] = dic2["psi_h"].imag out[13,i] = dic2["psi_hbar"].real out[14,i] = dic2["psi_hbar"].imag out[15,i] = dic2["STRUCT"].real out[16,i] = dic2["STRUCT"].imag out[17,i] = dic2["DELTA_REF"] out[18,i] = dic2["REFRAC"].real out[19,i] = dic2["REFRAC"].imag out[20,i] = dic2["ABSORP"] out[21,i] = 1e6 * dic2["ssr"] # in microrads out[22,i] = 1e6 * dic2["spr"] # in microrads out[23,i] = dic2["RATIO"] out[24,i] = dic2["psi_over_f"] info += "#\n#\n#\n" info += dic2["info"] #send exchange calculated_data = DataExchangeObject("XOPPY", self.get_data_exchange_widget_name()) try: calculated_data.add_content("xoppy_data", out.T) calculated_data.add_content("plot_x_col",0) calculated_data.add_content("plot_y_col", I_PLOT) except: pass try: calculated_data.add_content("labels",self.plotOptionList()) except: pass try: calculated_data.add_content("info",info) except: pass return calculated_data