def copy_src_parameters(self): global shadow_src_to_copy shadow_src_to_copy = ShadowSource.create_src() self.populateFields(shadow_src_to_copy) shadow_src_to_copy.set_source_type(self.__class__.__name__)
# WEIRD MEMORY INITIALIZATION BY FORTRAN. JUST A FIX. def fix_Intensity(polarization, beam_out): if polarization == 0: for index in range(0, len(beam_out._beam.rays)): beam_out._beam.rays[index, 15] = 0 beam_out._beam.rays[index, 16] = 0 beam_out._beam.rays[index, 17] = 0 ################################################ fixWeirdShadowBug() shadow_src = ShadowSource.create_src() shadow_src.src.NPOINT = 50000 # number_of_rays shadow_src.src.ISTAR1 = 23423423 # seed shadow_src.src.FGRID = 0 shadow_src.src.IDO_VX = 0 shadow_src.src.IDO_VZ = 0 shadow_src.src.IDO_X_S = 0 shadow_src.src.IDO_Y_S = 0 shadow_src.src.IDO_Z_S = 0 shadow_src.src.FSOUR = 0 # spatial_type (point) shadow_src.src.FDISTR = 1 # angular_distribution (flat) shadow_src.src.HDIV1 = -1.0e-6
def runShadowSource(self): self.setStatusMessage("") self.progressBarInit() # this is to be able to start the widget out of Oasys try: tmp = self.workspace_units except: self.workspace_units = 'm' self.workspace_units_label = 'm' self.workspace_units_to_m = 1.0 self.workspace_units_to_cm = 1e2 self.workspace_units_to_mm = 1e3 self.checkFields() self.progressBarSet(10) self.setStatusMessage("Running SHADOW") sys.stdout = EmittingStream(textWritten=self.writeStdOut) if self.trace_shadow: grabber = TTYGrabber() grabber.start() self.progressBarSet(50) try: self.shadow_output.setText("") su = Undulator.initialize_as_vertical_undulator( K=self.K, period_length=self.period_length, periods_number=int(self.periods_number)) ebeam = ElectronBeam( energy_in_GeV=self.energy_in_GeV, energy_spread = 0.0, current = self.current, number_of_bunches = 1, moment_xx=(self.sigma_x)**2, moment_xxp=0.0, moment_xpxp=(self.sigma_divergence_x)**2, moment_yy=(self.sigma_z)**2, moment_yyp=0.0, moment_ypyp=(self.sigma_divergence_z)**2 ) print(ebeam.info()) codes = ["internal","pySRU","SRW"] selected_code = codes[self.code_undul_phot] self.sourceundulator = SourceUndulator( name="shadowOui-Full-Undulator", syned_electron_beam=ebeam, syned_undulator=su, flag_emittance=self.use_emittances_combo, flag_size=self.flag_size, emin=1000, # to be set later emax=1001, # to be set later ng_e=2, # to be set later maxangle=self.maxangle_urad*1e-6, ng_t=self.ng_t, ng_p=self.ng_p, ng_j=self.ng_j, code_undul_phot=selected_code) if self.set_at_resonance == 0: if self.delta_e == 0: self.sourceundulator.set_energy_box(self.photon_energy,self.photon_energy,1) else: self.sourceundulator.set_energy_box(self.photon_energy-0.5*self.delta_e, self.photon_energy+0.5*self.delta_e,self.ng_e) else: self.sourceundulator.set_energy_monochromatic_at_resonance(self.harmonic) if self.delta_e > 0.0: e0,e1,ne = self.sourceundulator.get_energy_box() self.sourceundulator.set_energy_box(e0-0.5*self.delta_e,e0+0.5*self.delta_e,self.ng_e) rays = self.sourceundulator.calculate_rays( user_unit_to_m=self.workspace_units_to_m, F_COHER=self.coherent, SEED=self.seed, NRAYS=self.number_of_rays) if self.plot_aux_graph: self.set_PlotAuxGraphs() print(self.sourceundulator.info()) shadow3_beam = Shadow3Beam(N=rays.shape[0]) shadow3_beam.rays = rays if self.file_to_write_out >= 1: shadow3_beam.write("begin.dat") print("File written to disk: begin.dat") if self.file_to_write_out >= 2: SourceUndulatorInputOutput.write_file_undul_phot_h5(self.sourceundulator.get_result_dictionary(), file_out="radiation.h5",mode="w",entry_name="radiation") beam_out = ShadowBeam(beam=shadow3_beam) beam_out.getOEHistory().append(ShadowOEHistoryItem(shadow_source_start=ShadowSource.create_src(), shadow_source_end=ShadowSource.create_src(), widget_class_name="Full Undulator")) if self.add_power: additional_parameters = {} pd, vx, vy = self.sourceundulator.get_power_density_interpolated_cartesian() total_power = self.power_step if self.power_step > 0 else pd.sum()*(vx[1]-vx[0])*(vy[1]-vy[0]) additional_parameters["total_power"] = total_power additional_parameters["photon_energy_step"] = self.delta_e beam_out.setScanningData(ShadowBeam.ScanningData("photon_energy", self.photon_energy, "Energy for Power Calculation", "eV", additional_parameters)) if self.delta_e == 0.0: beam_out.set_initial_flux(self.sourceundulator.get_flux()[0]) self.progressBarSet(80) self.plot_results(beam_out) # # create python script for creating the shadow3 beam and display the script in the standard output # dict_parameters = { "K" : self.K, "period_length" : self.period_length, "periods_number" : self.periods_number, "energy_in_GeV" : self.energy_in_GeV, "energy_spread" : 0.0, "current" : self.current, "number_of_bunches" : 1, "moment_xx" : (self.sigma_x) ** 2, "moment_xxp" : 0.0, "moment_xpxp" : (self.sigma_divergence_x) ** 2, "moment_yy" : (self.sigma_z) ** 2, "moment_yyp" : 0.0, "moment_ypyp" : (self.sigma_divergence_z) ** 2, "name" : "shadowOui-Full-Undulator", "flag_emittance" : self.use_emittances_combo, "flag_size" : self.flag_size, "emin" : 1000, # to be set later "emax" : 1001, # to be set later "ng_e" : 2, # to be set later "maxangle" : self.maxangle_urad * 1e-6, "ng_t" : self.ng_t, "ng_p" : self.ng_p, "ng_j" : self.ng_j, "code_undul_phot" : selected_code, "user_unit_to_m" : self.workspace_units_to_m, "F_COHER" : self.coherent, "SEED" : self.seed, "NRAYS" : self.number_of_rays, "EMIN": self.sourceundulator._EMIN, "EMAX": self.sourceundulator._EMAX, "NG_E": self.sourceundulator._NG_E, "MAXANGLE": self.sourceundulator._MAXANGLE, } # write python script in standard output print(self.script_template().format_map(dict_parameters)) self.setStatusMessage("") self.send("Beam", beam_out) except Exception as exception: QtWidgets.QMessageBox.critical(self, "Error", str(exception), QtWidgets.QMessageBox.Ok) if self.IS_DEVELOP: raise exception self.progressBarFinished()