def get_delta(input_parameters, calculation_parameters): density = xraylib.ElementDensity(xraylib.SymbolToAtomicNumber(input_parameters.crl_material)) energy_in_KeV = ShadowPhysics.getEnergyFromWavelength(calculation_parameters.gwavelength*input_parameters.widget.workspace_units_to_m*1e10)/1000 delta = 1-xraylib.Refractive_Index_Re(input_parameters.crl_material, energy_in_KeV, density) return delta
def plot_efficiency(self): if self.type_of_zp == PHASE_ZP: if self.energy_plot == 1: if self.plot_canvas[5] is None: self.plot_canvas[5] = oasysgui.plotWindow(roi=False, control=False, position=True, logScale=False) self.tab[5].layout().addWidget(self.plot_canvas[5] ) self.plot_canvas[5].clear() self.plot_canvas[5].setDefaultPlotLines(True) self.plot_canvas[5].setActiveCurveColor(color='blue') self.plot_canvas[5].setGraphTitle('Thickness: ' + str(self.zone_plate_thickness) + " nm") self.plot_canvas[5].getXAxis().setLabel('Energy [eV]') self.plot_canvas[5].getYAxis().setLabel('Efficiency [%]') x_values = numpy.linspace(self.energy_from, self.energy_to, 100) y_values = numpy.zeros(100) for index in range(len(x_values)): y_values[index], _, _ = ZonePlate.calculate_efficiency(ShadowPhysics.getWavelengthFromEnergy(x_values[index])/10, self.zone_plate_material, self.zone_plate_thickness) y_values = numpy.round(100.0*y_values, 3) self.plot_canvas[5].addCurve(x_values, y_values, "Efficiency vs Energy", symbol='', color='blue', replace=True) else: if not self.plot_canvas[5] is None: self.plot_canvas[5].clear() if self.thickness_plot == 1: if self.plot_canvas[6] is None: self.plot_canvas[6] = oasysgui.plotWindow(roi=False, control=False, position=True, logScale=False) self.tab[6].layout().addWidget(self.plot_canvas[6] ) self.plot_canvas[6].setDefaultPlotLines(True) self.plot_canvas[6].setActiveCurveColor(color='blue') self.plot_canvas[6].setGraphTitle('Energy: ' + str(round(ShadowPhysics.getEnergyFromWavelength(self.avg_wavelength*10), 3)) + " eV") self.plot_canvas[6].getXAxis().setLabel('Thickness [nm]') self.plot_canvas[6].getYAxis().setLabel('Efficiency [%]') x_values = numpy.linspace(self.thickness_from, self.thickness_to, 100) y_values = numpy.zeros(100) for index in range(len(x_values)): y_values[index], _, _ = ZonePlate.calculate_efficiency(self.avg_wavelength, self.zone_plate_material, x_values[index]) y_values = numpy.round(100*y_values, 3) self.plot_canvas[6].addCurve(x_values, y_values, "Efficiency vs Thickness", symbol='', color='blue', replace=True) else: if not self.plot_canvas[6] is None: self.plot_canvas[6].clear() else: if not self.plot_canvas[5] is None: self.plot_canvas[5].clear() if not self.plot_canvas[6] is None: self.plot_canvas[6].clear()
def calculate_efficiency(cls, wavelength, zone_plate_material, zone_plate_thickness): energy_in_KeV = ShadowPhysics.getEnergyFromWavelength(wavelength*10)/1000 density = xraylib.ElementDensity(xraylib.SymbolToAtomicNumber(zone_plate_material)) delta = (1-xraylib.Refractive_Index_Re(zone_plate_material, energy_in_KeV, density)) beta = xraylib.Refractive_Index_Im(zone_plate_material, energy_in_KeV, density) phi = 2*numpy.pi*zone_plate_thickness*delta/wavelength rho = beta/delta efficiency = (1/(numpy.pi**2))*(1 + numpy.exp(-2*rho*phi) - (2*numpy.exp(-rho*phi)*numpy.cos(phi))) max_efficiency = (1/(numpy.pi**2))*(1 + numpy.exp(-2*rho*numpy.pi) + (2*numpy.exp(-rho*numpy.pi))) thickness_max_efficiency = numpy.round(wavelength/(2*delta), 2) return efficiency, max_efficiency, thickness_max_efficiency