def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_newsrw() self.ui.setupUi(self) self.up = UP() self.beam = srwlib.SRWLPartBeam() self.precis = Precis() # load initial values from excel self.workbook = open_workbook(resource.filename("SRWinitialvalues.xls")) self.thin(self.ui.deparg.currentIndex()) # set srw initial values column = self.workbook.sheet_by_name("thin undulator").col(0) units = self.workbook.sheet_by_name("thin undulator").col(1) units = self.unitstr(units) self.GetUndParams(DialogU(self, units, column)) column = self.workbook.sheet_by_name("thin beam").col(0) units = self.workbook.sheet_by_name("thin beam").col(1) units = self.unitstr(units) self.GetBeamParams(DialogB(self, units, column)) column = self.workbook.sheet_by_name("thin precision").col(0) units = self.workbook.sheet_by_name("thin precision").col(1) units = self.unitstr(units) self.GetPrecision(DialogP(self, units, column)) # removed exy option self.ui.deparg.removeItem(6) # connections self.ui.undulator.clicked.connect(self.makeund) self.ui.beam.clicked.connect(self.makebeam) self.ui.precision.clicked.connect(self.setprec) self.ui.deparg.currentIndexChanged.connect(self.thin) self.ui.sim.clicked.connect(self.srwbuttonThin) self.ui.analyze.clicked.connect(self.AnalyticA) # indicators self.ui.status.setText("Initiated") self.ui.analytic.setText("No calculations performed...As of Yet")
class rbsrw(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_newsrw() self.ui.setupUi(self) self.up = UP() self.beam = srwlib.SRWLPartBeam() self.precis = Precis() # load initial values from excel self.workbook = open_workbook(resource.filename("SRWinitialvalues.xls")) self.thin(self.ui.deparg.currentIndex()) # set srw initial values column = self.workbook.sheet_by_name("thin undulator").col(0) units = self.workbook.sheet_by_name("thin undulator").col(1) units = self.unitstr(units) self.GetUndParams(DialogU(self, units, column)) column = self.workbook.sheet_by_name("thin beam").col(0) units = self.workbook.sheet_by_name("thin beam").col(1) units = self.unitstr(units) self.GetBeamParams(DialogB(self, units, column)) column = self.workbook.sheet_by_name("thin precision").col(0) units = self.workbook.sheet_by_name("thin precision").col(1) units = self.unitstr(units) self.GetPrecision(DialogP(self, units, column)) # removed exy option self.ui.deparg.removeItem(6) # connections self.ui.undulator.clicked.connect(self.makeund) self.ui.beam.clicked.connect(self.makebeam) self.ui.precision.clicked.connect(self.setprec) self.ui.deparg.currentIndexChanged.connect(self.thin) self.ui.sim.clicked.connect(self.srwbuttonThin) self.ui.analyze.clicked.connect(self.AnalyticA) # indicators self.ui.status.setText("Initiated") self.ui.analytic.setText("No calculations performed...As of Yet") def AnalyticA(self): (Kx, Ky, lam_rn, e_phn) = IDWaveLengthPhotonEnergy( self.up.undPer, self.up.Bx, self.up.By, self.beam.partStatMom1.gamma ) # Outputs: (UP.Kx=0.934*UP.By*UP.undPer, UP.K, RAD.ephn, UP.WorU)= # 1. derived Kx from UP.By and UP.undPer # 2. Introduced new class RAD.ephn = radiation class, variable phot energy of nth harmonics # 3. UP.WorU=flag indicating wiggler or undulator situation # Inputs: (harmB.n, UP.undPer, UP.Bx, UP.By, self.beam.partStatMom1.gamma) stri = ( "# Ky:" + "{:.3f}".format(Kx) + " # Kx:" + "{:.3f}".format(Ky) + "\n" + "# Wavelength, m Phot. energy, eV" + "\n" + "1st harmonic " + "{:.3e}".format(lam_rn) + " " + "{:.3f}".format(e_phn) + "\n" + "3rd harmonic " + "{:.3e}".format(lam_rn / 3.0) + " " + "{:.3f}".format(e_phn * 3.0) + "\n" + "5th harmonic " + "{:.3e}".format(lam_rn / 5.0) + " " + "{:.3f}".format(e_phn * 5.0) + "\n" ) E_c = CriticalEnergyWiggler(self.up.By, self.up.Bx, self.beam.partStatMom1.gamma) # Outputs: (RAD.Ecrit,UPWorU) where RAD.Ecrit is critical energy of Wiggler Radiation # Inputs: (UP.Bx, self.beam.partStatMom1.gamma,UP.Kx) stra = ( stri + "# Critical energy:" + "{:.3e}".format(E_c) + ", eV" + "\n" + "-----------------------------------" + "\n" ) (P_W, L_id) = RadiatedPowerPlanarWiggler( self.up.undPer, self.up.By, self.up.numPer, self.beam.partStatMom1.gamma, self.beam.Iavg ) # Outputs: (RAD.PowW,UP.L) where RAD.PowW is radiated power of Wiggler Radiation, UP.L=length of ID # Inputs: (UP.undPer,UP.Bx,UP.numPer,self.beam.partStatMom1.gamma,self.beam.Iavg) standart SRW class variables # RadiatedPowerPlanarWiggler(lam_u,Bx,N_u,Gam,I_b): (RadSpotSize, RadSpotDivergence) = UndulatorSourceSizeDivergence(lam_rn, L_id) stre = stra + "# Rad spot size: " + "{:.3e}".format(RadSpotSize) + ", m" + "\n" strf = ( stre + "# Rad divergence: " + "{:.3e}".format(RadSpotDivergence) + ", rad" + "\n" + "-----------------------------------" + "\n" ) strb = ( strf + "# Length of ID:" + "{:.3f}".format(L_id) + ", m" + "\n" + "# Radiated power:" + "{:.3e}".format(P_W) + ", W" + "\n" ) P_Wdc = CentralPowerDensityPlanarWiggler( self.up.By, self.up.numPer, self.beam.partStatMom1.gamma, self.beam.Iavg ) # Outputs: (RAD.PowCPD) where RAD.PowCPD is radiated central cone power density of Wiggler Radiation # Inputs: (UP.undPer,UP.Bx,UP.numPer,self.beam.partStatMom1.gamma,self.beam.Iavg) standart SRW class variables strc = strb + "# Central Power Density: " + "{:.3e}".format(P_Wdc) + ", W/mrad2" + "\n" SpectralFluxValue = SpectralFlux(self.up.numPer, self.beam.partStatMom1.gamma, 1, self.beam.Iavg, Kx) strd = strc + "# Spectral flux: " + "{:.3e}".format(SpectralFluxValue) + ", phot/(sec mrad 0.1% BW)" + "\n" RadBrightness = SpectralCenBrightness(self.up.numPer, self.beam.partStatMom1.gamma, self.beam.Iavg) strw = ( strd + "# Spectral Central Brightness: " + "{:.3e}".format(RadBrightness) + ", phot/(sec mrad2 0.1% BW)" + "\n" + "-----------------------------------" + "\n" ) self.ui.analytic.setText(strw) def GetUndParams(self, dialog): units = dialog.u self.up.numPer = convertUnitsStringToNumber(dialog.ui.numper.text(), units[0]) self.up.undPer = convertUnitsStringToNumber(dialog.ui.undper.text(), units[1]) self.up.Bx = convertUnitsStringToNumber(dialog.ui.bx.text(), units[2]) self.up.By = convertUnitsStringToNumber(dialog.ui.by.text(), units[3]) self.up.phBx = convertUnitsStringToNumber(dialog.ui.phbx.text(), units[4]) self.up.phBy = convertUnitsStringToNumber(dialog.ui.phby.text(), units[5]) self.up.sBx = convertUnitsStringToNumber(dialog.ui.sbx.text(), units[6]) self.up.sBy = convertUnitsStringToNumber(dialog.ui.sby.text(), units[7]) self.up.xcID = convertUnitsStringToNumber(dialog.ui.xcid.text(), units[8]) self.up.ycID = convertUnitsStringToNumber(dialog.ui.ycid.text(), units[9]) self.up.zcID = convertUnitsStringToNumber(dialog.ui.zcid.text(), units[10]) def ShowUndParams(self, dialog): units = dialog.u dialog.ui.numper.setText(displayWithUnitsNumber(self.up.numPer, units[0])) dialog.ui.undper.setText(displayWithUnitsNumber(self.up.undPer, units[1])) dialog.ui.bx.setText(displayWithUnitsNumber(self.up.Bx, units[2])) dialog.ui.by.setText(displayWithUnitsNumber(self.up.By, units[3])) dialog.ui.phbx.setText(displayWithUnitsNumber(self.up.phBx, units[4])) dialog.ui.phby.setText(displayWithUnitsNumber(self.up.phBy, units[5])) dialog.ui.sbx.setText(displayWithUnitsNumber(self.up.sBx, units[6])) dialog.ui.sby.setText(displayWithUnitsNumber(self.up.sBy, units[7])) dialog.ui.xcid.setText(displayWithUnitsNumber(self.up.xcID, units[8])) dialog.ui.ycid.setText(displayWithUnitsNumber(self.up.ycID, units[9])) dialog.ui.zcid.setText(displayWithUnitsNumber(self.up.zcID, units[10])) def GetBeamParams(self, dialog): units = dialog.u # (P_W, L_id)=RadiatedPowerPlanarWiggler(self.up.undPer,self.up.By,self.up.numPer,self.beam.partStatMom1.gamma,self.beam.Iavg) # self.beam.partStatMom1.z=-L_id self.beam.Iavg = convertUnitsStringToNumber(dialog.ui.iavg.text(), units[0]) self.beam.partStatMom1.x = convertUnitsStringToNumber(dialog.ui.partstatmom1x.text(), units[1]) self.beam.partStatMom1.y = convertUnitsStringToNumber(dialog.ui.partstatmom1y.text(), units[2]) self.beam.partStatMom1.z = convertUnitsStringToNumber(dialog.ui.partstatmom1z.text(), units[3]) self.beam.partStatMom1.xp = convertUnitsStringToNumber(dialog.ui.partstatmom1xp.text(), units[4]) self.beam.partStatMom1.yp = convertUnitsStringToNumber(dialog.ui.partstatmom1yp.text(), units[5]) self.beam.partStatMom1.gamma = convertUnitsStringToNumber(dialog.ui.partstatmom1gamma.text(), units[6]) def ShowBeamParams(self, dialog): units = dialog.u dialog.ui.iavg.setText(displayWithUnitsNumber(self.beam.Iavg, units[0])) dialog.ui.partstatmom1x.setText(displayWithUnitsNumber(self.beam.partStatMom1.x, units[1])) dialog.ui.partstatmom1y.setText(displayWithUnitsNumber(self.beam.partStatMom1.y, units[2])) dialog.ui.partstatmom1z.setText(displayWithUnitsNumber(self.beam.partStatMom1.z, units[3])) dialog.ui.partstatmom1xp.setText(displayWithUnitsNumber(self.beam.partStatMom1.xp, units[4])) dialog.ui.partstatmom1yp.setText(displayWithUnitsNumber(self.beam.partStatMom1.yp, units[5])) dialog.ui.partstatmom1gamma.setText(displayWithUnitsNumber(self.beam.partStatMom1.gamma, units[6])) def WfrSetUpE(self, wfrE): # wfrE = srwlib.SRWLWfr() this is the waveform class Nenergy = int(float(self.ui.tableWidget.item(0, 0).text())) # float? Nx = int(float(self.ui.tableWidget.item(1, 0).text())) Ny = int(float(self.ui.tableWidget.item(2, 0).text())) wfrE.allocate(Nenergy, Nx, Ny) wfrE.mesh.zStart = float(self.ui.tableWidget.item(3, 0).text()) wfrE.mesh.eStart = float(self.ui.tableWidget.item(4, 0).text()) wfrE.mesh.eFin = float(self.ui.tableWidget.item(5, 0).text()) wfrE.mesh.xStart = float(self.ui.tableWidget.item(6, 0).text()) wfrE.mesh.xFin = float(self.ui.tableWidget.item(8, 0).text()) wfrE.mesh.yStart = float(self.ui.tableWidget.item(7, 0).text()) wfrE.mesh.yFin = float(self.ui.tableWidget.item(9, 0).text()) def GetPrecision(self, dialog): units = dialog.u self.precis.meth = dialog.ui.meth.currentIndex() self.precis.relPrec = convertUnitsStringToNumber(dialog.ui.relprec.text(), units[1]) self.precis.zStartInteg = convertUnitsStringToNumber(dialog.ui.zstartint.text(), units[2]) self.precis.zEndInteg = convertUnitsStringToNumber(dialog.ui.zendint.text(), units[3]) self.precis.npTraj = convertUnitsStringToNumber(dialog.ui.nptraj.text(), units[4]) self.precis.useTermin = dialog.ui.usetermin.currentIndex() self.precis.sampFactNxNyForProp = convertUnitsStringToNumber(dialog.ui.sampfactnxny.text(), units[6]) def ShowPrecision(self, dialog): units = dialog.u dialog.ui.meth.setCurrentIndex(self.precis.meth) dialog.ui.relprec.setText(displayWithUnitsNumber(self.precis.relPrec, units[1])) dialog.ui.zstartint.setText(displayWithUnitsNumber(self.precis.zStartInteg, units[2])) dialog.ui.zendint.setText(displayWithUnitsNumber(self.precis.zEndInteg, units[3])) dialog.ui.nptraj.setText(displayWithUnitsNumber(self.precis.npTraj, units[4])) dialog.ui.usetermin.setCurrentIndex(self.precis.useTermin) dialog.ui.sampfactnxny.setText(displayWithUnitsNumber(self.precis.sampFactNxNyForProp, units[6])) def srwbuttonThin(self): # UP = self.UndParams() und = srwlib.SRWLMagFldU( [ srwlib.SRWLMagFldH(1, "v", self.up.By, self.up.phBy, self.up.sBy, 1), srwlib.SRWLMagFldH(1, "h", self.up.Bx, self.up.phBx, self.up.sBx, 1), ], self.up.undPer, self.up.numPer, ) magFldCnt = srwlib.SRWLMagFldC( [und], array("d", [self.up.xcID]), array("d", [self.up.ycID]), array("d", [self.up.zcID]) ) # elecBeam = srwlib.SRWLPartBeam() # self.BeamParams(elecBeam) # self.AnalyticA() # precis = self.Precision() arPrecPar = [ self.precis.meth, self.precis.relPrec, self.precis.zStartInteg, self.precis.zEndInteg, self.precis.npTraj, self.precis.useTermin, self.precis.sampFactNxNyForProp, ] wfrE = srwlib.SRWLWfr() self.WfrSetUpE(wfrE) wfrE.partBeam = self.beam wfrXY = srwlib.SRWLWfr() self.WfrSetUpE(wfrXY) wfrXY.partBeam = self.beam mesh = deepcopy(wfrE.mesh) wfrIn = deepcopy(wfrE) Polar = self.ui.polar.currentIndex() Intens = self.ui.intensity.currentIndex() DependArg = self.ui.deparg.currentIndex() # print (Polar, Intens, DependArg) if DependArg == 0: # after setting the text call self.ui.status.repaint() to have it immediately show otherwise it will wait till it exits the block to draw str1 = "* Performing Electric Field (spectrum vs photon energy) calculation ... \n \n" self.ui.status.setText(str1) self.ui.status.repaint() srwlib.srwl.CalcElecFieldSR(wfrE, 0, magFldCnt, arPrecPar) str2 = "* Extracting Intensity from calculated Electric Field ... \n \n" self.ui.status.setText(str1 + str2) self.ui.status.repaint() arI1 = array("f", [0] * wfrE.mesh.ne) srwlib.srwl.CalcIntFromElecField(arI1, wfrE, Polar, Intens, DependArg, wfrE.mesh.eStart, 0, 0) str3 = "* Plotting the results ...\n" self.ui.status.setText(str1 + str2 + str3) # time.sleep(1) self.ui.status.repaint() uti_plot.uti_plot1d( arI1, [wfrE.mesh.eStart, wfrE.mesh.eFin, wfrE.mesh.ne], ["Photon energy, eV", "Spectral intensity, ph/s/0.1%BW", "Intensity vs photon energy"], ) elif DependArg == 1: str1 = "* Performing Electric Field (intensity vs x-coordinate) calculation ... \n \n" self.ui.status.setText(str1) srwlib.srwl.CalcElecFieldSR(wfrXY, 0, magFldCnt, arPrecPar) str2 = "* Extracting Intensity from calculated Electric Field ... \n \n " self.ui.status.setText(str1 + str2) self.ui.status.repaint() arI1 = array("f", [0] * wfrXY.mesh.nx) srwlib.srwl.CalcIntFromElecField(arI1, wfrXY, Polar, Intens, DependArg, 0, wfrXY.mesh.xStart, 0) str3 = "* Plotting the results ...\n" self.ui.status.setText(str1 + str2 + str3) self.ui.status.repaint() uti_plot.uti_plot1d( arI1, [wfrXY.mesh.xStart, wfrXY.mesh.xFin, wfrXY.mesh.nx], ["Horizontal Position [m]", "Spectral intensity, ph/s/0.1%BW", "Intensity vs x-coordinate"], ) elif DependArg == 2: str1 = "* Performing Electric Field (intensity vs y-coordinate) calculation ... \n \n" self.ui.status.setText(str1) self.ui.status.repaint() srwlib.srwl.CalcElecFieldSR(wfrXY, 0, magFldCnt, arPrecPar) str2 = "* Extracting Intensity from calculated Electric Field ... \n \n " self.ui.status.setText(str1 + str2) self.ui.status.repaint() arI1 = array("f", [0] * wfrXY.mesh.ny) srwlib.srwl.CalcIntFromElecField(arI1, wfrXY, Polar, Intens, DependArg, 0, wfrXY.mesh.yStart, 0) str3 = "* Plotting the results ...\n" self.ui.status.setText(str1 + str2 + str3) self.ui.status.repaint() uti_plot.uti_plot1d( arI1, [wfrXY.mesh.yStart, wfrXY.mesh.yFin, wfrXY.mesh.ny], ["Vertical Position [m]", "Spectral intensity, ph/s/0.1%BW", "Intensity vs y-coordinate"], ) elif DependArg == 3: str1 = "* Performing Electric Field (intensity vs x- and y-coordinate) calculation ... \n \n" self.ui.status.setText(str1) self.ui.status.repaint() srwlib.srwl.CalcElecFieldSR(wfrXY, 0, magFldCnt, arPrecPar) str2 = "* Extracting Intensity from calculated Electric Field ... \n \n " self.ui.status.setText(str1 + str2) self.ui.status.repaint() arI1 = array("f", [0] * wfrXY.mesh.nx * wfrXY.mesh.ny) srwlib.srwl.CalcIntFromElecField( arI1, wfrXY, Polar, Intens, DependArg, wfrXY.mesh.eStart, wfrXY.mesh.xStart, wfrXY.mesh.yStart ) str3 = "* Plotting the results ...\n" self.ui.status.setText(str1 + str2 + str3) self.ui.status.repaint() uti_plot.uti_plot2d( arI1, [1 * wfrXY.mesh.xStart, 1 * wfrXY.mesh.xFin, wfrXY.mesh.nx], [1 * wfrXY.mesh.yStart, 1 * wfrXY.mesh.yFin, wfrXY.mesh.ny], ["Horizontal Position [m]", "Vertical Position [m]", "Intensity at " + str(wfrXY.mesh.eStart) + " eV"], ) elif DependArg == 4: str1 = "* Performing Electric Field (intensity vs energy- and x-coordinate) calculation ... \n \n " self.ui.status.setText(str1) self.ui.status.repaint() srwlib.srwl.CalcElecFieldSR(wfrXY, 0, magFldCnt, arPrecPar) str2 = "* Extracting Intensity from calculated Electric Field ... \n \n " self.ui.status.setText(str1 + str2) self.ui.status.repaint() arI1 = array("f", [0] * wfrXY.mesh.ne * wfrXY.mesh.nx) srwlib.srwl.CalcIntFromElecField( arI1, wfrXY, Polar, Intens, DependArg, wfrXY.mesh.eStart, wfrXY.mesh.xStart, wfrXY.mesh.yStart ) str3 = "* Plotting the results ...\n" self.ui.status.setText(str1 + str2 + str3) self.ui.status.repaint() uti_plot.uti_plot2d( arI1, [1 * wfrXY.mesh.eStart, 1 * wfrXY.mesh.eFin, wfrXY.mesh.ne], [1 * wfrXY.mesh.xStart, 1 * wfrXY.mesh.xFin, wfrXY.mesh.nx], [ "Energy [eV]", "Horizontal Position [m]", "Intensity integrated from " + str(wfrXY.mesh.yStart) + " to " + str(wfrXY.mesh.yFin) + " ,m in y-coordinate", ], ) elif DependArg == 5: str1 = "* Performing Electric Field (intensity vs energy- and y-coordinate) calculation ... \n \n" self.ui.status.setText(str1) self.ui.status.repaint() srwlib.srwl.CalcElecFieldSR(wfrXY, 0, magFldCnt, arPrecPar) str2 = "* Extracting Intensity from calculated Electric Field ... \n \n " self.ui.status.setText(str1 + str2) self.ui.status.repaint() arI1 = array("f", [0] * wfrXY.mesh.ne * wfrXY.mesh.ny) srwlib.srwl.CalcIntFromElecField( arI1, wfrXY, Polar, Intens, DependArg, wfrXY.mesh.eStart, wfrXY.mesh.xStart, wfrXY.mesh.yStart ) str3 = "* Plotting the results ...\n" self.ui.status.setText(str1 + str2 + str3) self.ui.status.repaint() uti_plot.uti_plot2d( arI1, [1 * wfrXY.mesh.eStart, 1 * wfrXY.mesh.eFin, wfrXY.mesh.ne], [1 * wfrXY.mesh.yStart, 1 * wfrXY.mesh.yFin, wfrXY.mesh.ny], [ "Energy [eV]", "Vertical Position [m]", "Intensity integrated from " + str(wfrXY.mesh.xStart) + " to " + str(wfrXY.mesh.xFin) + " ,m in x-coordinate", ], ) else: print "Error" uti_plot.uti_plot_show() def thin(self, i): thinsheet = self.workbook.sheet_by_name("thin table") for n, c in enumerate(thinsheet.col(i)): self.ui.tableWidget.setItem(n, 0, QtGui.QTableWidgetItem(str(c.value))) def unitstr(self, units): for n, u in enumerate(units): units[n] = str(u.value) return units def makeund(self): units = self.workbook.sheet_by_name("thin undulator").col(1) units = self.unitstr(units) dialog = DialogU(self, units) self.ShowUndParams(dialog) if dialog.exec_(): self.GetUndParams(dialog) def makebeam(self): units = self.workbook.sheet_by_name("thin beam").col(1) units = self.unitstr(units) dialog = DialogB(self, units) self.ShowBeamParams(dialog) if dialog.exec_(): self.GetBeamParams(dialog) def setprec(self): units = self.workbook.sheet_by_name("thin precision").col(1) units = self.unitstr(units) dialog = DialogP(self, units) self.ShowPrecision(dialog) if dialog.exec_(): self.GetPrecision(dialog)