Ejemplo n.º 1
0
def wiggler_preprocessor(ener_gev=6.0,e_min=5000.0,e_max=5005.0,file_field="",plot_trajectories=0,
                        shift_x_flag=0,shift_x_value=0.0,shift_betax_flag=0,shift_betax_value=0.0):

    (traj, pars) = srfunc.wiggler_trajectory(b_from=1,
                                             inData=file_field,
                                             nPer=1,
                                             nTrajPoints=501,
                                             ener_gev=ener_gev,
                                             per=None,
                                             kValue=None,
                                             trajFile="tmp.traj",
                                             shift_x_flag=shift_x_flag,
                                             shift_x_value=shift_x_value,
                                             shift_betax_flag=shift_betax_flag,
                                             shift_betax_value=shift_betax_value)


    data = numpy.loadtxt("tmp.traj",skiprows=15)

    fig = plt.figure(1)

    fig.add_subplot(221)
    plt.plot(data[:,1],data[:,7])
    plt.title("Magnetic Field "+file_field)
    plt.xlabel("Y [m]")
    plt.ylabel("B [T]")

    fig.add_subplot(222)
    plt.plot(data[:,1],data[:,0])
    plt.title("Electron trajectory")
    plt.xlabel("Y [m]")
    plt.ylabel("X [m]")

    fig.add_subplot(223)
    plt.plot(data[:,1],data[:,3])
    plt.title("Electron velocity")
    plt.xlabel("Y [m]")
    plt.ylabel("betaX")

    fig.add_subplot(224)
    plt.plot(data[:,1],data[:,6])
    plt.title("Electron curvature")
    plt.xlabel("Y [m]")
    plt.ylabel("curvature [m^-1]")



    if plot_trajectories:
        plt.show()

    fig.savefig('sw_'+file_field+'.png')
    plt.close(fig)

    srfunc.wiggler_cdf(traj,
                       enerMin=e_min,
                       enerMax=e_max,
                       enerPoints=1001,
                       outFile="xshwig.sha",
                       elliptical=False)
Ejemplo n.º 2
0
def run_python_preprocessors(e_min=1000.0,e_max=10000.0 ):

    import srxraylib.sources.srfunc as srfunc

    wigFile = "xshwig.sha"
    inData = ""

    nPer = 5 # 50
    nTrajPoints = 501
    ener_gev = 6.04
    per = 0.040
    kValue = 7.85
    trajFile = "tmp.traj"
    shift_x_flag = 0
    shift_x_value = 0.0
    shift_betax_flag = 0
    shift_betax_value = 0.0

    # "Calculate electron trajectory"
    (traj, pars) = srfunc.wiggler_trajectory(b_from=0,
                                             inData=inData,
                                             nPer=nPer,
                                             nTrajPoints=nTrajPoints,
                                             ener_gev=ener_gev,
                                             per=per,
                                             kValue=kValue,
                                             trajFile=trajFile,
                                             shift_x_flag=shift_x_flag,
                                             shift_x_value=shift_x_value,
                                             shift_betax_flag=shift_betax_flag,
                                             shift_betax_value=shift_betax_value)


    # traj[0,ii] = yx[i]
    # traj[1,ii] = yy[i]+j * per - start_len
    # traj[2,ii] = 0.0
    # traj[3,ii] = betax[i]
    # traj[4,ii] = betay[i]
    # traj[5,ii] = 0.0
    # traj[6,ii] = curv[i]
    # traj[7,ii] = bz[i]

    # plot(traj[1,:],traj[0,:])
    # print(pars)

    #
    # calculate cdf and write file for Shadow/Source
    #
    srfunc.wiggler_cdf(traj,
                       enerMin=e_min,
                       enerMax=e_max,
                       enerPoints=1001,
                       outFile=wigFile,
                       elliptical=False)

    print("CDF written to file %s \n"%(str(wigFile)))
Ejemplo n.º 3
0
 def script_template(self):
     return """
Ejemplo n.º 4
0
    def runShadowSource(self):
        #self.error(self.error_id)
        self.setStatusMessage("")
        self.progressBarInit()

        sys.stdout = EmittingStream(textWritten=self.writeStdOut)
        if self.trace_shadow:
            grabber = TTYGrabber()
            grabber.start()

        try:
            self.checkFields()

            ###########################################
            # TODO: TO BE ADDED JUST IN CASE OF BROKEN
            #       ENVIRONMENT: MUST BE FOUND A PROPER WAY
            #       TO TEST SHADOW
            self.fixWeirdShadowBug()
            ###########################################

            wigFile = bytes(congruence.checkFileName("xshwig.sha"), 'utf-8')

            if self.type_combo == 0:
                inData = ""
            elif self.type_combo == 1:
                inData = congruence.checkUrl(self.file_with_b_vs_y)
            elif self.type_combo == 2:
                inData = congruence.checkUrl(self.file_with_harmonics)

            self.progressBarSet(10)
            #self.information(0, "Calculate electron trajectory")

            self.shadow_output.setText("")

            self.setStatusMessage("Calculate electron trajectory")


            (traj, pars) = srfunc.wiggler_trajectory(b_from=self.type_combo,
                                                     inData=inData,
                                                     nPer=self.number_of_periods,
                                                     nTrajPoints=501,
                                                     ener_gev=self.energy,
                                                     per=self.id_period,
                                                     kValue=self.k_value,
                                                     trajFile=congruence.checkFileName("tmp.traj"),
                                                     shift_x_flag=self.shift_x_flag,
                                                     shift_x_value=self.shift_x_value,
                                                     shift_betax_flag=self.shift_betax_flag,
                                                     shift_betax_value=self.shift_betax_value)

            #
            # calculate cdf and write file for Shadow/Source
            #

            self.progressBarSet(20)
            #self.information(0, "Calculate cdf and write file for Shadow/Source")
            self.setStatusMessage("Calculate cdf and write file for Shadow/Source")

            srfunc.wiggler_cdf(traj,
                               enerMin=self.e_min,
                               enerMax=self.e_max,
                               enerPoints=1001,
                               outFile=wigFile,
                               elliptical=False)

            #self.information(0, "CDF written to file %s \n"%(wigFile))
            self.setStatusMessage("CDF written to file %s \n"%(str(wigFile)))

            self.progressBarSet(40)

            #self.information(0, "Set the wiggler parameters in the wiggler container")
            self.setStatusMessage("Set the wiggler parameters in the wiggler container")

            shadow_src = ShadowSource.create_wiggler_src()

            self.populateFields(shadow_src)

            shadow_src.src.FILE_TRAJ = wigFile


            self.progressBarSet(50)

            self.setStatusMessage("Running Shadow/Source")

            write_begin_file, write_start_file, write_end_file = self.get_write_file_options()

            beam_out = ShadowBeam.traceFromSource(shadow_src,
                                                  write_begin_file=write_begin_file,
                                                  write_start_file=write_start_file,
                                                  write_end_file=write_end_file)

            if self.trace_shadow:
                grabber.stop()

                for row in grabber.ttyData:
                   self.writeStdOut(row)

            #self.information(0, "Plotting Results")
            self.setStatusMessage("Plotting Results")

            self.progressBarSet(80)

            self.plot_results(beam_out, progressBarValue=80)

            self.setStatusMessage("Plotting Wiggler Data")

            self.plot_wiggler_results()

            #self.information()
            self.setStatusMessage("")

            self.send("Beam", beam_out)

            #
            # create python script for the preprocessors and display in the standard output
            #
            dict_parameters = {
                "b_from"               : self.type_combo,
                "inData"               : inData,
                "nPer"                 : self.number_of_periods,
                "nTrajPoints"          : 501,
                "ener_gev"             : self.energy,
                "per"                  : self.id_period,
                "kValue"               : self.k_value,
                "trajFile"             : "tmp.traj",
                "shift_x_flag"         : self.shift_x_flag,
                "shift_x_value"        : self.shift_x_value,
                "shift_betax_flag"     : self.shift_betax_flag,
                "shift_betax_value"    : self.shift_betax_value,
                "enerMin"              : self.e_min,
                "enerMax"              : self.e_max,
                "enerPoints"           : 1001,
                "outFile"              : wigFile,
                "elliptical"           : False,
                "electron_current_mA"  : self.electron_current,
            }

            # write python script in standard output
            print(self.script_template().format_map(dict_parameters))

        except Exception as exception:
            QtWidgets.QMessageBox.critical(self, "Error",
                                       str(exception),
                QtWidgets.QMessageBox.Ok)

            #self.error_id = self.error_id + 1
            #self.error(self.error_id, "Exception occurred: " + str(exception))


        self.progressBarFinished()
Ejemplo n.º 5
0
    def runShadowSource(self):
        #self.error(self.error_id)
        self.setStatusMessage("")
        self.progressBarInit()

        try:
            self.checkFields()

            ###########################################
            # TODO: TO BE ADDED JUST IN CASE OF BROKEN
            #       ENVIRONMENT: MUST BE FOUND A PROPER WAY
            #       TO TEST SHADOW
            self.fixWeirdShadowBug()
            ###########################################

            wigFile = bytes(congruence.checkFileName("xshwig.sha"), 'utf-8')

            if self.type_combo == 0:
                inData = ""
            elif self.type_combo == 1:
                inData = congruence.checkFileName(self.file_with_b_vs_y)
            elif self.type_combo == 2:
                inData = congruence.checkFileName(self.file_with_harmonics)

            self.progressBarSet(10)
            #self.information(0, "Calculate electron trajectory")
            self.setStatusMessage("Calculate electron trajectory")

            (traj, pars) = srfunc.wiggler_trajectory(b_from=self.type_combo,
                                                     inData=inData,
                                                     nPer=self.number_of_periods,
                                                     nTrajPoints=501,
                                                     ener_gev=self.energy,
                                                     per=self.id_period,
                                                     kValue=self.k_value,
                                                     trajFile=congruence.checkFileName("tmp.traj"),
                                                     shift_x_flag=self.shift_x_flag,
                                                     shift_x_value=self.shift_x_value,
                                                     shift_betax_flag=self.shift_betax_flag,
                                                     shift_betax_value=self.shift_betax_value)

            #
            # calculate cdf and write file for Shadow/Source
            #

            self.progressBarSet(20)
            #self.information(0, "Calculate cdf and write file for Shadow/Source")
            self.setStatusMessage("Calculate cdf and write file for Shadow/Source")

            srfunc.wiggler_cdf(traj,
                               enerMin=self.e_min,
                               enerMax=self.e_max,
                               enerPoints=1001,
                               outFile=wigFile,
                               elliptical=False)

            #self.information(0, "CDF written to file %s \n"%(wigFile))
            self.setStatusMessage("CDF written to file %s \n"%(str(wigFile)))

            self.progressBarSet(40)

            #self.information(0, "Set the wiggler parameters in the wiggler container")
            self.setStatusMessage("Set the wiggler parameters in the wiggler container")

            shadow_src = ShadowSource.create_wiggler_src()

            self.populateFields(shadow_src)

            shadow_src.src.FILE_TRAJ = wigFile

            sys.stdout = EmittingStream(textWritten=self.writeStdOut)
            if self.trace_shadow:
                grabber = TTYGrabber()
                grabber.start()

            self.progressBarSet(50)

            self.setStatusMessage("Running Shadow/Source")

            write_begin_file, write_start_file, write_end_file = self.get_write_file_options()

            beam_out = ShadowBeam.traceFromSource(shadow_src,
                                                  write_begin_file=write_begin_file,
                                                  write_start_file=write_start_file,
                                                  write_end_file=write_end_file)

            if self.trace_shadow:
                grabber.stop()

                for row in grabber.ttyData:
                   self.writeStdOut(row)

            #self.information(0, "Plotting Results")
            self.setStatusMessage("Plotting Results")

            self.progressBarSet(80)

            self.plot_results(beam_out, 80)

            self.setStatusMessage("Plotting Wiggler Data")

            self.plot_wiggler_results()

            #self.information()
            self.setStatusMessage("")

            self.send("Beam", beam_out)
        except Exception as exception:
            QtGui.QMessageBox.critical(self, "Error",
                                       str(exception),
                QtGui.QMessageBox.Ok)

            #self.error_id = self.error_id + 1
            #self.error(self.error_id, "Exception occurred: " + str(exception))


        self.progressBarFinished()
Ejemplo n.º 6
0
def run_source_wiggler():
    from srxraylib.sources import srfunc
    (traj,
     pars) = srfunc.wiggler_trajectory(b_from=1,
                                       inData="/home/manuel/Oasys/BM_only7.b",
                                       nPer=1,
                                       nTrajPoints=501,
                                       ener_gev=2.0,
                                       per=0.01,
                                       kValue=1.0,
                                       trajFile="tmp.traj",
                                       shift_x_flag=4,
                                       shift_x_value=0.042,
                                       shift_betax_flag=4,
                                       shift_betax_value=0.035)

    #
    # calculate cdf and write file for Shadow/Source
    #

    srfunc.wiggler_cdf(traj,
                       enerMin=1000.0,
                       enerMax=1000.1,
                       enerPoints=1001,
                       outFile=b'/home/manuel/Oasys/xshwig.sha',
                       elliptical=False)

    calculate_spectrum = False

    if calculate_spectrum:
        e, f, w = srfunc.wiggler_spectrum(traj,
                                          enerMin=1000.0,
                                          enerMax=1000.1,
                                          nPoints=500,
                                          electronCurrent=500.0 * 1e-3,
                                          outFile="spectrum.dat",
                                          elliptical=False)
        from srxraylib.plot.gol import plot
        plot(e,
             f,
             xlog=False,
             ylog=False,
             show=False,
             xtitle="Photon energy [eV]",
             ytitle="Flux [Photons/s/0.1%bw]",
             title="Flux")
        plot(e,
             w,
             xlog=False,
             ylog=False,
             show=True,
             xtitle="Photon energy [eV]",
             ytitle="Spectral Power [E/eV]",
             title="Spectral Power")
    #
    # end script
    #

    # write (1) or not (0) SHADOW files start.xx end.xx star.xx
    iwrite = 0

    #
    # initialize shadow3 source (oe0) and beam
    #
    beam = Shadow.Beam()
    oe0 = Shadow.Source()

    #
    # Define variables. See meaning of variables in:
    #  https://raw.githubusercontent.com/srio/shadow3/master/docs/source.nml
    #  https://raw.githubusercontent.com/srio/shadow3/master/docs/oe.nml
    #

    oe0.BENER = 2.0
    oe0.CONV_FACT = 1.0
    oe0.EPSI_X = 70e-12
    oe0.EPSI_Z = 70e-12
    oe0.FDISTR = 0
    oe0.FILE_TRAJ = b'/home/manuel/Oasys/xshwig.sha'
    oe0.FSOUR = 0
    oe0.FSOURCE_DEPTH = 0
    oe0.F_COLOR = 0
    oe0.F_PHOT = 0
    oe0.F_WIGGLER = 1
    oe0.HDIV1 = 1.0
    oe0.HDIV2 = 1.0
    oe0.IDO_VX = 0
    oe0.IDO_VZ = 0
    oe0.IDO_X_S = 0
    oe0.IDO_Y_S = 0
    oe0.IDO_Z_S = 0
    oe0.ISTAR1 = 5676561
    oe0.NCOL = 0
    oe0.NPOINT = 50000
    oe0.N_COLOR = 0
    oe0.PH1 = 1000.0
    oe0.PH2 = 1000.1
    oe0.POL_DEG = 0.0
    oe0.SIGMAX = 7e-06
    oe0.SIGMAY = 0.0
    oe0.SIGMAZ = 1e-05
    oe0.VDIV1 = 1.0
    oe0.VDIV2 = 1.0
    oe0.WXSOU = 0.0
    oe0.WYSOU = 0.0
    oe0.WZSOU = 0.0

    #Run SHADOW to create the source

    if iwrite:
        oe0.write("start.00")

    beam.genSource(oe0)

    if iwrite:
        oe0.write("end.00")
        beam.write("begin.dat")

    return beam
Ejemplo n.º 7
0
    def __calculate_radiation(self):

        wiggler = self.get_magnetic_structure()
        electron_beam = self.get_electron_beam()

        if wiggler._magnetic_field_periodic == 1:

            (traj, pars) = wiggler_trajectory(
                b_from=0,
                inData="",
                nPer=wiggler.number_of_periods(),
                nTrajPoints=wiggler._NG_J,
                ener_gev=electron_beam._energy_in_GeV,
                per=wiggler.period_length(),
                kValue=wiggler.K_vertical(),
                trajFile="",
            )

        elif wiggler._magnetic_field_periodic == 0:

            print(">>>>>>>>>>>>>>>>>>>>>>", "shift_x_flag =      ",
                  wiggler._shift_x_flag, "shift_x_value =     ",
                  wiggler._shift_x_value, "shift_betax_flag =  ",
                  wiggler._shift_betax_flag, "shift_betax_value = ",
                  wiggler._shift_betax_value)

            (traj, pars) = wiggler_trajectory(
                b_from=1,
                inData=wiggler._file_with_magnetic_field,
                nPer=1,
                nTrajPoints=wiggler._NG_J,
                ener_gev=electron_beam._energy_in_GeV,
                # per=self.syned_wiggler.period_length(),
                # kValue=self.syned_wiggler.K_vertical(),
                trajFile="",
                shift_x_flag=wiggler._shift_x_flag,
                shift_x_value=wiggler._shift_x_value,
                shift_betax_flag=wiggler._shift_betax_flag,
                shift_betax_value=wiggler._shift_betax_value,
            )

        self.__result_trajectory = traj
        self.__result_parameters = pars

        # print(">>>>>>>>>> traj pars: ",traj.shape,pars)
        #
        # plot(traj[1, :], traj[0, :], xtitle="Y", ytitle="X")
        # plot(traj[1, :], traj[3, :], xtitle="Y", ytitle="BetaX")
        # plot(traj[1, :], traj[6, :], xtitle="Y", ytitle="Curvature")
        # plot(traj[1, :], traj[7, :], xtitle="Y", ytitle="B")

        # traj[0,ii] = yx[i]
        # traj[1,ii] = yy[i]+j * per - start_len
        # traj[2,ii] = 0.0
        # traj[3,ii] = betax[i]
        # traj[4,ii] = betay[i]
        # traj[5,ii] = 0.0
        # traj[6,ii] = curv[i]
        # traj[7,ii] = bz[i]

        #
        # calculate cdf and write file for Shadow/Source
        #

        print(
            ">>>>>>>>>>>>>>>>>>>>  wiggler._EMIN,wiggler._EMAX,wiggler._NG_E",
            wiggler._EMIN, wiggler._EMAX, wiggler._NG_E)
        self.__result_cdf = wiggler_cdf(self.__result_trajectory,
                                        enerMin=wiggler._EMIN,
                                        enerMax=wiggler._EMAX,
                                        enerPoints=wiggler._NG_E,
                                        outFile="tmp.cdf",
                                        elliptical=False)
Ejemplo n.º 8
0
def calculate_spectrum(emin, emax, npoints=500, do_plot=False):
    #
    # script to run the wiggler preprocessor (created by ShadowOui:Wiggler)
    #

    (traj, pars) = srfunc.wiggler_trajectory(b_from=1,
                                             inData="Bz_Alba_rev3.dat",
                                             nPer=1,
                                             nTrajPoints=501,
                                             ener_gev=2.5,
                                             per=0.755,
                                             kValue=211.0,
                                             trajFile="tmp.traj",
                                             shift_x_flag=4,
                                             shift_x_value=0.0,
                                             shift_betax_flag=4,
                                             shift_betax_value=0.0)

    #
    # calculate cdf and write file for Shadow/Source
    #

    srfunc.wiggler_cdf(traj,
                       enerMin=emin,
                       enerMax=emax,
                       enerPoints=1001,
                       outFile=b'xshwig.sha',
                       elliptical=False)

    calculate_spectrum = True

    if calculate_spectrum:
        e, f, w = srfunc.wiggler_spectrum(traj,
                                          enerMin=emin,
                                          enerMax=emax,
                                          nPoints=npoints,
                                          electronCurrent=400 * 1e-3,
                                          outFile="spectrum.dat",
                                          elliptical=False)

        if do_plot:
            from srxraylib.plot.gol import plot
            plot(e,
                 f,
                 xlog=False,
                 ylog=False,
                 show=False,
                 xtitle="Photon energy [eV]",
                 ytitle="Flux [Photons/s/0.1%bw]",
                 title="Flux")
            plot(e,
                 w,
                 xlog=False,
                 ylog=False,
                 show=False,
                 xtitle="Photon energy [eV]",
                 ytitle="Spectral Power [W/eV]",
                 title="Spectral Power")
    #
    # end script
    #
    return e, w
Ejemplo n.º 9
0
def run_shadow3(photon_energy, n_rays=5e5, emittance=True):
    #
    # script to run the wiggler preprocessor (created by ShadowOui:Wiggler)
    #

    (traj, pars) = srfunc.wiggler_trajectory(b_from=1,
                                             inData="Bz_Alba_rev3.dat",
                                             nPer=1,
                                             nTrajPoints=501,
                                             ener_gev=2.5,
                                             per=0.755,
                                             kValue=211.0,
                                             trajFile="tmp.traj",
                                             shift_x_flag=4,
                                             shift_x_value=0.0,
                                             shift_betax_flag=4,
                                             shift_betax_value=0.0)

    #
    # calculate cdf and write file for Shadow/Source
    #

    srfunc.wiggler_cdf(
        traj,
        enerMin=photon_energy,  # 5000.0,
        enerMax=photon_energy + 1.0,
        enerPoints=1001,
        outFile=b'xshwig.sha',
        elliptical=False)

    #
    # end script
    #

    #
    #
    # Python script to run shadow3. Created automatically with ShadowTools.make_python_script_from_list().

    # write (1) or not (0) SHADOW files start.xx end.xx star.xx
    iwrite = 0

    #
    # initialize shadow3 source (oe0) and beam
    #
    beam = Shadow.Beam()
    oe0 = Shadow.Source()
    oe1 = Shadow.OE()

    #
    # Define variables. See meaning of variables in:
    #  https://raw.githubusercontent.com/srio/shadow3/master/docs/source.nml
    #  https://raw.githubusercontent.com/srio/shadow3/master/docs/oe.nml
    #

    oe0.BENER = 2.5
    oe0.CONV_FACT = 1000.0
    # oe0.EPSI_X = 2.574e-05
    # oe0.EPSI_Z = 2.574e-07
    if emittance:
        oe0.EPSI_X = 2.574e-05
        oe0.EPSI_Z = 2.574e-07
    oe0.FDISTR = 0
    oe0.FILE_TRAJ = b'xshwig.sha'
    oe0.FSOUR = 0
    oe0.FSOURCE_DEPTH = 0
    oe0.F_COLOR = 0
    oe0.F_PHOT = 0
    oe0.F_WIGGLER = 1
    oe0.HDIV1 = 1.0
    oe0.HDIV2 = 1.0
    oe0.IDO_VX = 0
    oe0.IDO_VZ = 0
    oe0.IDO_X_S = 0
    oe0.IDO_Y_S = 0
    oe0.IDO_Z_S = 0
    oe0.ISTAR1 = 420024
    oe0.NCOL = 0
    oe0.NPOINT = n_rays
    oe0.N_COLOR = 0
    oe0.POL_DEG = 0.0
    # oe0.PH1 = 40000.0
    # oe0.PH2 = 40001.0
    oe0.SIGMAX = 0.8208
    oe0.SIGMAZ = 0.014
    if emittance:
        oe0.SIGMAX = 0.8208
        oe0.SIGMAZ = 0.0142
    else:
        oe0.SIGMAX = 0.0
        oe0.SIGMAZ = 0.0

    oe0.SIGMAY = 0.0
    oe0.VDIV1 = 1.0
    oe0.VDIV2 = 1.0
    oe0.WXSOU = 0.0
    oe0.WYSOU = 0.0
    oe0.WZSOU = 0.0

    oe1.DUMMY = 0.1
    oe1.FWRITE = 3
    oe1.F_REFRAC = 2
    oe1.F_SCREEN = 1
    oe1.N_SCREEN = 1
    oe1.T_IMAGE = 0.0
    oe1.T_INCIDENCE = 0.0
    oe1.T_REFLECTION = 180.0
    oe1.T_SOURCE = 30000.0

    # Run SHADOW to create the source

    if iwrite:
        oe0.write("start.00")

    beam.genSource(oe0)

    if iwrite:
        oe0.write("end.00")
        beam.write("begin.dat")

    return beam, oe0