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)
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)))
def script_template(self): return """
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()
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()
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
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)
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
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