コード例 #1
0
    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
コード例 #2
0
ファイル: xf1f2.py プロジェクト: Python3pkg/Orange-XOPPY
    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
コード例 #3
0
ファイル: annabianco.py プロジェクト: PaNOSC-ViNYL/ShadowOui
        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)
コード例 #4
0
ファイル: mlayer.py プロジェクト: lucarebuffi/XOPPY
    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
コード例 #5
0
ファイル: xf1f2.py プロジェクト: lucarebuffi/XOPPY
    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
コード例 #6
0
             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