def xoppy_calc_mlayer(self): # copy the variable locally, so no more use of self. MODE = self.MODE SCAN = self.SCAN F12_FLAG = self.F12_FLAG SUBSTRATE = self.SUBSTRATE ODD_MATERIAL = self.ODD_MATERIAL EVEN_MATERIAL = self.EVEN_MATERIAL ENERGY = self.ENERGY THETA = self.THETA SCAN_STEP = self.SCAN_STEP NPOINTS = self.NPOINTS ODD_THICKNESS = self.ODD_THICKNESS EVEN_THICKNESS = self.EVEN_THICKNESS NLAYERS = self.NLAYERS FILE = self.FILE for file in ["mlayer.inp", "mlayer.par", "mlayer.f12"]: try: os.remove(os.path.join(locations.home_bin_run(), file)) except: pass # # write input file for Fortran mlayer: mlayer.inp # f = open('mlayer.inp', 'w') if SCAN == 0 and MODE == 0: a0 = 1 if SCAN == 1 and MODE == 0: a0 = 2 if SCAN == 0 and MODE == 1: a0 = 3 if SCAN == 1 and MODE == 1: a0 = 4 f.write("%d \n" % a0) f.write("N\n") f.write("%g\n" % (codata.h * codata.c / codata.e * 1e10 / ENERGY)) f.write("%g\n" % THETA) # if SCAN == 0: f.write("%g\n" % SCAN_STEP) a2 = codata.h * codata.c / codata.e * 1e10 / ENERGY a3 = codata.h * codata.c / codata.e * 1e10 / (ENERGY + SCAN_STEP) a4 = a3 - a2 if SCAN != 0: f.write("%g\n" % a4) # f.write("%d\n" % NPOINTS) if MODE == 0: f.write("%d\n" % NLAYERS) if MODE == 0: if a0 != 5: f.write("%g %g \n" % (ODD_THICKNESS, EVEN_THICKNESS)) else: for i in range(NLAYERS): f.write("%g %g \n" % (ODD_THICKNESS, EVEN_THICKNESS)) if MODE != 0: f1 = open(FILE, 'r') a5 = f1.read() f1.close() if MODE != 0: print("Number of layers in %s file is %d " % (FILE, NLAYERS)) f.write("%d\n" % NLAYERS) f.write(a5) f.write("mlayer.par\n") f.write("mlayer.dat\n") f.write("6\n") f.close() print('File written to disk: mlayer.inp') # # create f12 file # if F12_FLAG == 0: energy = numpy.arange(0, 500) elefactor = numpy.log10(10000.0 / 30.0) / 300.0 energy = 10.0 * 10**(energy * elefactor) f12_s = f1f2_calc(SUBSTRATE, energy) f12_e = f1f2_calc(EVEN_MATERIAL, energy) f12_o = f1f2_calc(ODD_MATERIAL, energy) f = open("mlayer.f12", 'w') f.write( '; File created by xoppy for materials [substrate=%s,even=%s,odd=%s]: \n' % (SUBSTRATE, EVEN_MATERIAL, ODD_MATERIAL)) f.write('; Atomic masses: \n') f.write( "%g %g %g \n" % (xraylib.AtomicWeight(xraylib.SymbolToAtomicNumber(SUBSTRATE)), xraylib.AtomicWeight( xraylib.SymbolToAtomicNumber(EVEN_MATERIAL)), xraylib.AtomicWeight( xraylib.SymbolToAtomicNumber(ODD_MATERIAL)))) f.write('; Densities: \n') f.write("%g %g %g \n" % (xraylib.ElementDensity( xraylib.SymbolToAtomicNumber(SUBSTRATE)), xraylib.ElementDensity( xraylib.SymbolToAtomicNumber(EVEN_MATERIAL)), xraylib.ElementDensity( xraylib.SymbolToAtomicNumber(ODD_MATERIAL)))) f.write('; Number of energy points: \n') f.write("%d\n" % (energy.size)) f.write( '; For each energy point, energy[eV], f1[substrate], f2[substrate], f1[even], f2[even], f1[odd], f2[odd]: \n' ) for i in range(energy.size): f.write("%g %g %g %g %g %g %g \n" % (energy[i], f12_s[0, i], f12_s[1, i], f12_e[0, i], f12_e[1, i], f12_o[0, i], f12_o[1, i])) f.close() print('File written to disk: mlayer.f12') # # run external program mlayer # if platform.system() == "Windows": command = os.path.join(locations.home_bin(), 'mlayer.exe < mlayer.inp') else: command = "'" + os.path.join(locations.home_bin(), 'mlayer') + "' < mlayer.inp" print("Running command '%s' in directory: %s " % (command, locations.home_bin_run())) print("\n--------------------------------------------------------\n") os.system(command) print("\n--------------------------------------------------------\n") #send exchange calculated_data = DataExchangeObject( "XOPPY", self.get_data_exchange_widget_name()) try: if SCAN == 0: calculated_data.add_content("xoppy_data", numpy.loadtxt("mlayer.dat")) calculated_data.add_content("plot_x_col", 0) calculated_data.add_content("plot_y_col", 3) elif SCAN == 1: # internal scan is in wavelength. Add a column with energy aa = numpy.loadtxt("mlayer.dat") photon_energy = (codata.h * codata.c / codata.e * 1e10) / aa[:, 0] bb = numpy.zeros((aa.shape[0], 1 + aa.shape[1])) bb[:, 0] = photon_energy bb[:, 1:] = aa calculated_data.add_content("xoppy_data", bb) calculated_data.add_content("plot_x_col", 0) calculated_data.add_content("plot_y_col", 4) calculated_data.add_content("units_to_degrees", 1.0) except: pass try: info = "ML %s(%3.2f A):%s(%3.2f A) %d pairs; E=%5.3f eV" % ( ODD_MATERIAL, ODD_THICKNESS, EVEN_MATERIAL, EVEN_THICKNESS, NLAYERS, ENERGY) calculated_data.add_content("info", info) except: pass return calculated_data
def xoppy_calc_xf1f2(self): MAT_FLAG = self.MAT_FLAG DESCRIPTOR = self.DESCRIPTOR density = self.DENSITY CALCULATE = self.CALCULATE GRID = self.GRID GRIDSTART = self.GRIDSTART GRIDEND = self.GRIDEND GRIDN = self.GRIDN THETAGRID = self.THETAGRID ROUGH = self.ROUGH THETA1 = self.THETA1 THETA2 = self.THETA2 THETAN = self.THETAN if MAT_FLAG == 0: # element descriptor = DESCRIPTOR density = xraylib.ElementDensity( xraylib.SymbolToAtomicNumber(DESCRIPTOR)) elif MAT_FLAG == 1: # formula descriptor = DESCRIPTOR if GRID == 0: # standard energy grid energy = numpy.arange(0, 500) elefactor = numpy.log10(10000.0 / 30.0) / 300.0 energy = 10.0 * 10**(energy * elefactor) elif GRID == 1: # user energy grid if GRIDN == 1: energy = numpy.array([GRIDSTART]) else: energy = numpy.linspace(GRIDSTART, GRIDEND, GRIDN) elif GRID == 2: # single energy point energy = numpy.array([GRIDSTART]) if THETAGRID == 0: theta = numpy.array([THETA1]) else: theta = numpy.linspace(THETA1, THETA2, THETAN) CALCULATE_items = [ 'f1', 'f2', 'delta', 'beta', 'mu [cm^-1]', 'mu [cm^2/g]', 'Cross Section [barn]', 'reflectivity-s', 'reflectivity-p', 'reflectivity-unpol', 'delta/beta ' ] out = numpy.zeros((energy.size, theta.size)) for i, itheta in enumerate(theta): if MAT_FLAG == 0: # element tmp = f1f2_calc(descriptor, energy, 1e-3 * itheta, F=1 + CALCULATE, rough=ROUGH, density=density) out[:, i] = tmp else: tmp = f1f2_calc_mix(descriptor, energy, 1e-3 * itheta, F=1 + CALCULATE, rough=ROUGH, density=density) out[:, i] = tmp if ((energy.size == 1) and (theta.size == 1)): info = "** Single value calculation E=%g eV, theta=%g mrad, Result(F=%d)=%g " % ( energy[0], theta[0], 1 + CALCULATE, out[0, 0]) labels = ["Energy [eV]", CALCULATE_items[CALCULATE]] tmp = numpy.vstack((energy, out[:, 0])) print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", energy.shape, out.shape, tmp.shape) out_dict = { "application": "xoppy", "name": "xf12", "info": info, "data": tmp, "labels": labels } elif theta.size == 1: tmp = numpy.vstack((energy, out[:, 0])) labels = ["Energy [eV]", CALCULATE_items[CALCULATE]] out_dict = { "application": "xoppy", "name": "xf12", "data": tmp, "labels": labels } elif energy.size == 1: tmp = numpy.vstack((theta, out[0, :])) labels = ["Theta [mrad]", CALCULATE_items[CALCULATE]] out_dict = { "application": "xoppy", "name": "xf12", "data": tmp, "labels": labels } else: labels = [r"energy[eV]", r"theta [mrad]"] out_dict = { "application": "xoppy", "name": "xf12", "data2D": out, "dataX": energy, "dataY": theta, "labels": labels } # # # if "info" in out_dict.keys(): print(out_dict["info"]) #send exchange calculated_data = DataExchangeObject( "XOPPY", self.get_data_exchange_widget_name()) try: calculated_data.add_content("xoppy_data", out_dict["data"].T) calculated_data.add_content("plot_x_col", 0) calculated_data.add_content("plot_y_col", -1) except: pass try: calculated_data.add_content("labels", out_dict["labels"]) except: pass try: calculated_data.add_content("info", out_dict["info"]) except: pass try: calculated_data.add_content("data2D", out_dict["data2D"]) calculated_data.add_content("dataX", out_dict["dataX"]) calculated_data.add_content("dataY", out_dict["dataY"]) 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 f1f2 results\n") print("data shape", out_dict["data"].shape) print("labels: ", out_dict["labels"]) file.write("#N 2\n") file.write("#L %s %s\n" % (out_dict["labels"][0], out_dict["labels"][1])) out = out_dict["data"] 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
file_name = oasysgui.selectFileFromDialog(None, None, "Open ASC file") congruence.checkFile(file_name) data = numpy.loadtxt(file_name, skiprows=1) energies = data[:, 0] angles = numpy.radians((180 - data[:, 3]) / 2) reflectivities = numpy.zeros((energies.size, angles.size)) density = xraylib.ElementDensity(xraylib.SymbolToAtomicNumber("Au")) for i, itheta in enumerate(angles): reflectivities[:, i] = f1f2_calc("Au", energies, itheta, F=10, rough=0.0, density=density) angles = numpy.degrees(angles) file_out = open(os.path.dirname(file_name) + "/reflectivities.out", mode="w") rows = ["Energy (eV) Theta (deg) Reflectivity\n"] for i in range(0, energies.size): for j in range(0, angles.size): rows.append( str(energies[i]) + " " + str(angles[j]) + " " + str(reflectivities[i, j]) + "\n") file_out.writelines(rows)
def xoppy_calc_mlayer(self): # copy the variable locally, so no more use of self. MODE = self.MODE SCAN = self.SCAN F12_FLAG = self.F12_FLAG SUBSTRATE = self.SUBSTRATE ODD_MATERIAL = self.ODD_MATERIAL EVEN_MATERIAL = self.EVEN_MATERIAL ENERGY = self.ENERGY THETA = self.THETA SCAN_STEP = self.SCAN_STEP NPOINTS = self.NPOINTS ODD_THICKNESS = self.ODD_THICKNESS EVEN_THICKNESS = self.EVEN_THICKNESS NLAYERS = self.NLAYERS FILE=self.FILE for file in ["mlayer.inp","mlayer.par","mlayer.f12"]: try: os.remove(os.path.join(locations.home_bin_run(),file)) except: pass # # write input file for Fortran mlayer: mlayer.inp # f = open('mlayer.inp','w') if SCAN == 0 and MODE == 0: a0 = 1 if SCAN == 1 and MODE == 0: a0 = 5 if SCAN == 0 and MODE == 1: a0 = 3 if SCAN == 1 and MODE == 1: a0 = 5 f.write("%d \n"%a0) f.write("N\n") f.write("%g\n"%( codata.h * codata.c / codata.e * 1e10 / ENERGY)) f.write("%g\n"%THETA) if SCAN == 0: f.write("%g\n"%SCAN_STEP) a2 = codata.h * codata.c / codata.e * 1e10 / ENERGY a3 = codata.h * codata.c / codata.e * 1e10 / (ENERGY + SCAN_STEP) a4 = a3 - a2 if SCAN != 0: f.write("%g\n"%a4) f.write("%d\n"%NPOINTS) if MODE == 0: f.write("%d\n"%NLAYERS) if MODE == 0: if a0 != 5: f.write("%g %g \n"%(ODD_THICKNESS,EVEN_THICKNESS)) else: for i in range(NLAYERS): f.write("%g %g \n"%(ODD_THICKNESS,EVEN_THICKNESS)) if MODE != 0: f1 = open(FILE,'r') a5 = f1.read() f1.close() if MODE != 0: print("Number of layers in %s file is %d "%(FILE,NLAYERS)) f.write("%d\n"%NLAYERS) f.write(a5) f.write("mlayer.par\n") f.write("mlayer.dat\n") f.write("6\n") f.close() print('File written to disk: mlayer.inp') # # create f12 file # if F12_FLAG == 0: energy = numpy.arange(0,500) elefactor = numpy.log10(10000.0 / 30.0) / 300.0 energy = 10.0 * 10**(energy * elefactor) f12_s = f1f2_calc(SUBSTRATE,energy) f12_e = f1f2_calc(EVEN_MATERIAL,energy) f12_o = f1f2_calc(ODD_MATERIAL,energy) f = open("mlayer.f12",'w') f.write('; File created by xoppy for materials [substrate=%s,even=%s,odd=%s]: \n'%(SUBSTRATE,EVEN_MATERIAL,ODD_MATERIAL)) f.write('; Atomic masses: \n') f.write("%g %g %g \n"%(xraylib.AtomicWeight(xraylib.SymbolToAtomicNumber(SUBSTRATE)), xraylib.AtomicWeight(xraylib.SymbolToAtomicNumber(EVEN_MATERIAL)), xraylib.AtomicWeight(xraylib.SymbolToAtomicNumber(ODD_MATERIAL)) )) f.write('; Densities: \n') f.write("%g %g %g \n"%(xraylib.ElementDensity(xraylib.SymbolToAtomicNumber(SUBSTRATE)), xraylib.ElementDensity(xraylib.SymbolToAtomicNumber(EVEN_MATERIAL)), xraylib.ElementDensity(xraylib.SymbolToAtomicNumber(ODD_MATERIAL)) )) f.write('; Number of energy points: \n') f.write("%d\n"%(energy.size)) f.write('; For each energy point, energy[eV], f1[substrate], f2[substrate], f1[even], f2[even], f1[odd], f2[odd]: \n') for i in range(energy.size): f.write("%g %g %g %g %g %g %g \n"%(energy[i],f12_s[0,i],f12_s[1,i],f12_e[0,i],f12_e[1,i],f12_o[0,i],f12_o[1,i])) f.close() print('File written to disk: mlayer.f12') # # run external program mlayer # command = os.path.join(locations.home_bin(), 'mlayer') + " < mlayer.inp" print("Running command '%s' in directory: %s "%(command, locations.home_bin_run())) print("\n--------------------------------------------------------\n") os.system(command) print("\n--------------------------------------------------------\n") #send exchange calculated_data = DataExchangeObject("XOPPY", self.get_data_exchange_widget_name()) try: calculated_data.add_content("xoppy_data", numpy.loadtxt("mlayer.dat")) calculated_data.add_content("plot_x_col", 0) calculated_data.add_content("plot_y_col", 3) calculated_data.add_content("units_to_degrees", 1.0) except: pass try: calculated_data.add_content("labels",["Grazing angle Theta [deg]","s-reflectivity","p-reflectivity","averaged reflectivity","s-phase shift","p-phase shift","(s-electric field)^2","(p-electric field)^2"]) except: pass try: info = "ML %s(%3.2f A):%s(%3.2f A) %d pairs; E=%5.3f eV"%(ODD_MATERIAL,ODD_THICKNESS,EVEN_MATERIAL,EVEN_THICKNESS,NLAYERS,ENERGY) calculated_data.add_content("info",info) except: pass return calculated_data
def xoppy_calc_xf1f2(self): MAT_FLAG = self.MAT_FLAG DESCRIPTOR = self.DESCRIPTOR density = self.DENSITY CALCULATE = self.CALCULATE GRID = self.GRID GRIDSTART = self.GRIDSTART GRIDEND = self.GRIDEND GRIDN = self.GRIDN THETAGRID = self.THETAGRID ROUGH = self.ROUGH THETA1 = self.THETA1 THETA2 = self.THETA2 THETAN = self.THETAN if MAT_FLAG == 0: # element descriptor = DESCRIPTOR density = xraylib.ElementDensity(xraylib.SymbolToAtomicNumber(DESCRIPTOR)) elif MAT_FLAG == 1: # formula descriptor = DESCRIPTOR if GRID == 0: # standard energy grid energy = numpy.arange(0,500) elefactor = numpy.log10(10000.0 / 30.0) / 300.0 energy = 10.0 * 10**(energy * elefactor) elif GRID == 1: # user energy grid if GRIDN == 1: energy = numpy.array([GRIDSTART]) else: energy = numpy.linspace(GRIDSTART,GRIDEND,GRIDN) elif GRID == 2: # single energy point energy = numpy.array([GRIDSTART]) if THETAGRID == 0: theta = numpy.array([THETA1]) else: theta = numpy.linspace(THETA1,THETA2,THETAN) CALCULATE_items=['f1', 'f2', 'delta', 'beta', 'mu [cm^-1]', 'mu [cm^2/g]', 'Cross Section [barn]', 'reflectivity-s', 'reflectivity-p', 'reflectivity-unpol', 'delta/beta '] out = numpy.zeros((energy.size,theta.size)) for i,itheta in enumerate(theta): if MAT_FLAG == 0: # element tmp = f1f2_calc(descriptor,energy,1e-3*itheta,F=1+CALCULATE,rough=ROUGH,density=density) out[:,i] = tmp else: tmp = f1f2_calc_mix(descriptor,energy,1e-3*itheta,F=1+CALCULATE,rough=ROUGH,density=density) out[:,i] = tmp if ((energy.size == 1) and (theta.size == 1)): info = "** Single value calculation E=%g eV, theta=%g mrad, Result(F=%d)=%g "%(energy[0],theta[0],1+CALCULATE,out[0,0]) labels = ["Energy [eV]",CALCULATE_items[CALCULATE]] tmp = numpy.vstack((energy,out[:,0])) print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",energy.shape,out.shape,tmp.shape) out_dict = {"application":"xoppy","name":"xf12","info":info, "data":tmp,"labels":labels} elif theta.size == 1: tmp = numpy.vstack((energy,out[:,0])) labels = ["Energy [eV]",CALCULATE_items[CALCULATE]] out_dict = {"application":"xoppy","name":"xf12","data":tmp,"labels":labels} elif energy.size == 1: tmp = numpy.vstack((theta,out[0,:])) labels = ["Theta [mrad]",CALCULATE_items[CALCULATE]] out_dict = {"application":"xoppy","name":"xf12","data":tmp,"labels":labels} else: labels = [r"energy[eV]",r"theta [mrad]"] out_dict = {"application":"xoppy","name":"xf12","data2D":out,"dataX":energy,"dataY":theta,"labels":labels} # # # if "info" in out_dict.keys(): print(out_dict["info"]) #send exchange calculated_data = DataExchangeObject("XOPPY", self.get_data_exchange_widget_name()) try: calculated_data.add_content("xoppy_data", out_dict["data"].T) calculated_data.add_content("plot_x_col", 0) calculated_data.add_content("plot_y_col", -1) except: pass try: calculated_data.add_content("labels", out_dict["labels"]) except: pass try: calculated_data.add_content("info", out_dict["info"]) except: pass try: calculated_data.add_content("data2D", out_dict["data2D"]) calculated_data.add_content("dataX", out_dict["dataX"]) calculated_data.add_content("dataY", out_dict["dataY"]) except: pass return calculated_data
ytitle="Ray deviation [m]") # # Reflectivity # from orangecontrib.xoppy.util.xoppy_xraylib_util import f1f2_calc reflectivity = energies * 0.0 for i, energy in enumerate(energies): a = f1f2_calc( "Au", energy, theta=numpy.pi / 2 - Alpha[i], F=8, density=None, rough=0.0, ) reflectivity[i] = a # print(">>",energy,90.0-Alpha[i]*180.0/numpy.pi,a) if do_plot: plot(energies, reflectivity, yrange=[0, 1], xtitle="Photon energy [eV]", ytitle="Reflectivity(Pi-Alpha(E))") # # resolving power