def get_power_density(
        self,
        source_wavefront_parameters=WavefrontParameters(),
        power_density_precision_parameters=PowerDensityPrecisionParameters()):

        stkP = source_wavefront_parameters.to_SRWLStokes()

        srwl.CalcPowDenSR(stkP, self._electron_beam.to_SRWLPartBeam(), 0,
                          self._magnetic_structure.get_SRWLMagFldC(),
                          power_density_precision_parameters.to_SRW_array())

        hArray = numpy.zeros(stkP.mesh.nx)
        vArray = numpy.zeros(stkP.mesh.ny)
        powerArray = numpy.zeros((stkP.mesh.nx, stkP.mesh.ny))

        # fill arrays
        ij = -1
        for j in range(stkP.mesh.ny):
            for i in range(stkP.mesh.nx):
                ij += 1
                xx = stkP.mesh.xStart + i * (
                    stkP.mesh.xFin - stkP.mesh.xStart) / (stkP.mesh.nx - 1)
                yy = stkP.mesh.yStart + j * (
                    stkP.mesh.yFin - stkP.mesh.yStart) / (stkP.mesh.ny - 1)
                powerArray[i, j] = stkP.arS[ij]
                hArray[i] = xx  # mm
                vArray[j] = yy  # mm

        return (hArray, vArray, powerArray)
Example #2
0
    def run_calculation_intensity_power(self,
                                        srw_source,
                                        tickets,
                                        progress_bar_value=30):
        wf_parameters = WavefrontParameters(
            photon_energy_min=0.0,
            photon_energy_max=0.0,
            photon_energy_points=1,
            h_slit_gap=self.int_h_slit_gap,
            v_slit_gap=self.int_v_slit_gap,
            h_slit_points=self.int_h_slit_points,
            v_slit_points=self.int_v_slit_points,
            distance=self.int_distance)

        h, v, p = srw_source.get_power_density(
            source_wavefront_parameters=wf_parameters,
            power_density_precision_parameters=PowerDensityPrecisionParameters(
                precision_factor=self.pow_precision_factor,
                computation_method=self.pow_computation_method,
                initial_longitudinal_position=self.
                pow_initial_longitudinal_position,
                final_longitudinal_position=self.
                pow_final_longitudinal_position,
                number_of_points_for_trajectory_calculation=self.
                pow_number_of_points_for_trajectory_calculation))

        self.calculated_total_power = SRWLightSource.get_total_power_from_power_density(
            h, v, p)

        print("TOTAL POWER: ", self.calculated_total_power, " W")

        tickets.append(SRWPlot.get_ticket_2D(h, v, p))

        self.progressBarSet(progress_bar_value + 10)
Example #3
0
    def run_calculation_intensity_power(self,
                                        srw_source,
                                        tickets,
                                        progress_bar_value=30):
        wf_parameters = WavefrontParameters(
            photon_energy_min=self.int_photon_energy_min,
            photon_energy_max=self.int_photon_energy_max,
            photon_energy_points=self.int_photon_energy_points,
            h_slit_gap=self.int_h_slit_gap,
            v_slit_gap=self.int_v_slit_gap,
            h_slit_points=self.int_h_slit_points,
            v_slit_points=self.int_v_slit_points,
            distance=self.int_distance,
            wavefront_precision_parameters=WavefrontPrecisionParameters(
                sr_method=0
                if self.int_sr_method == 0 else self.get_automatic_sr_method(),
                relative_precision=self.int_relative_precision,
                start_integration_longitudinal_position=self.
                int_start_integration_longitudinal_position,
                end_integration_longitudinal_position=self.
                int_end_integration_longitudinal_position,
                number_of_points_for_trajectory_calculation=self.
                int_number_of_points_for_trajectory_calculation,
                use_terminating_terms=self.int_use_terminating_terms,
                sampling_factor_for_adjusting_nx_ny=self.
                int_sampling_factor_for_adjusting_nx_ny))

        srw_wavefront = srw_source.get_SRW_Wavefront(
            source_wavefront_parameters=wf_parameters)

        e, h, v, i_se = srw_wavefront.get_intensity(multi_electron=False)

        tickets.append((i_se, e, h * 1e3, v * 1e3))

        e, h, v, i_me = srw_wavefront.get_intensity(multi_electron=True)

        tickets.append((i_me, e, h * 1e3, v * 1e3))

        if len(e) > 1: energy_step = e[1] - e[0]
        else: energy_step = 1.0

        import scipy.constants as codata
        pd = i_se.sum(axis=0) * energy_step * codata.e * 1e3

        self.calculated_total_power = SRWLightSource.get_total_power_from_power_density(
            h, v, pd)

        print("TOTAL POWER: ", self.calculated_total_power, " W")

        tickets.append(SRWPlot.get_ticket_2D(h, v, pd))

        self.progressBarSet(progress_bar_value + 10)
    def calculate_wavefront_propagation(self, srw_source):
        wf_parameters = WavefrontParameters(
            photon_energy_min=self.wf_photon_energy,
            photon_energy_max=self.wf_photon_energy,
            photon_energy_points=1,
            h_slit_gap=self.wf_h_slit_gap,
            v_slit_gap=self.wf_v_slit_gap,
            h_slit_points=self.wf_h_slit_points,
            v_slit_points=self.wf_v_slit_points,
            distance=self.wf_distance,
            wavefront_precision_parameters=WavefrontPrecisionParameters(
                sampling_factor_for_adjusting_nx_ny=self.
                wf_sampling_factor_for_adjusting_nx_ny))

        return srw_source.get_SRW_Wavefront(
            source_wavefront_parameters=wf_parameters)
    def get_SRW_Wavefront(self,
                          source_wavefront_parameters=WavefrontParameters()):
        self.__source_wavefront_parameters = source_wavefront_parameters

        mesh = source_wavefront_parameters.to_SRWRadMesh()

        wfr = SRWWavefront()
        wfr.allocate(mesh.ne, mesh.nx, mesh.ny)
        wfr.mesh = mesh
        wfr.partBeam = self._electron_beam.to_SRWLPartBeam()

        srwl.CalcElecFieldSR(
            wfr, 0, self._magnetic_structure.get_SRWLMagFldC(),
            source_wavefront_parameters._wavefront_precision_parameters.
            to_SRW_array())

        return wfr
Example #6
0
    def get_SRW_Wavefront(self,
                          source_wavefront_parameters=WavefrontParameters()):
        self.__source_wavefront_parameters = source_wavefront_parameters

        source_wavefront_parameters.photon_energy_min = self.photon_energy
        source_wavefront_parameters.photon_energy_max = self.photon_energy
        source_wavefront_parameters.photon_energy_points = 1

        mesh = source_wavefront_parameters.to_SRWRadMesh()

        GsnBm = SRWLGsnBm()  #Gaussian Beam structure (just parameters)
        GsnBm.x = self.beam_center_at_waist_x
        GsnBm.y = self.beam_center_at_waist_y
        GsnBm.z = self.beam_center_at_waist_z
        GsnBm.xp = self.average_angle_at_waist_x
        GsnBm.yp = self.average_angle_at_waist_y
        GsnBm.avgPhotEn = self.photon_energy
        GsnBm.pulseEn = self.energy_per_pulse
        GsnBm.repRate = self.repetition_rate
        GsnBm.polar = self.polarization
        GsnBm.sigX = self.horizontal_sigma_at_waist
        GsnBm.sigY = self.vertical_sigma_at_waist
        GsnBm.sigT = self.pulse_duration
        GsnBm.mx = self.transverse_gauss_hermite_mode_order_x
        GsnBm.my = self.transverse_gauss_hermite_mode_order_y

        wfr = SRWWavefront()
        wfr.allocate(mesh.ne, mesh.nx, mesh.ny)
        wfr.mesh = mesh

        wfr.partBeam.partStatMom1.x = GsnBm.x
        wfr.partBeam.partStatMom1.y = GsnBm.y
        wfr.partBeam.partStatMom1.z = GsnBm.z
        wfr.partBeam.partStatMom1.xp = GsnBm.xp
        wfr.partBeam.partStatMom1.yp = GsnBm.yp

        arPrecPar = [
            source_wavefront_parameters._wavefront_precision_parameters.
            _sampling_factor_for_adjusting_nx_ny
        ]

        srwl.CalcElecFieldGaussian(wfr, GsnBm, arPrecPar)

        return wfr
Example #7
0
    def calculate_wavefront_propagation(self, srw_source):
        photon_energy = self.get_photon_energy_for_wavefront_propagation(srw_source)

        wf_parameters = WavefrontParameters(photon_energy_min = photon_energy,
                                            photon_energy_max = photon_energy,
                                            photon_energy_points=1,
                                            h_slit_gap = self.wf_h_slit_gap,
                                            v_slit_gap = self.wf_v_slit_gap,
                                            h_slit_points=self.wf_h_slit_points,
                                            v_slit_points=self.wf_v_slit_points,
                                            distance = self.wf_distance,
                                            wavefront_precision_parameters=WavefrontPrecisionParameters(sr_method=0 if self.wf_sr_method == 0 else self.get_automatic_sr_method(),
                                                                                                        relative_precision=self.wf_relative_precision,
                                                                                                        start_integration_longitudinal_position=self.wf_start_integration_longitudinal_position,
                                                                                                        end_integration_longitudinal_position=self.wf_end_integration_longitudinal_position,
                                                                                                        number_of_points_for_trajectory_calculation=self.wf_number_of_points_for_trajectory_calculation,
                                                                                                        use_terminating_terms=self.wf_use_terminating_terms,
                                                                                                        sampling_factor_for_adjusting_nx_ny=self.wf_sampling_factor_for_adjusting_nx_ny))
        return srw_source.get_SRW_Wavefront(source_wavefront_parameters=wf_parameters)
    def get_undulator_flux(
        self,
        source_wavefront_parameters=WavefrontParameters(),
        flux_precision_parameters=FluxPrecisionParameters()):

        stkF = source_wavefront_parameters.to_SRWLStokes()

        srwl.CalcStokesUR(stkF, self._electron_beam.to_SRWLPartBeam(),
                          self._magnetic_structure.get_SRWMagneticStructure(),
                          flux_precision_parameters.to_SRW_array())

        eArray = numpy.zeros(stkF.mesh.ne)
        intensArray = numpy.zeros(stkF.mesh.ne)

        for i in range(source_wavefront_parameters._photon_energy_points):
            eArray[i] = stkF.mesh.eStart + i * (
                stkF.mesh.eFin - stkF.mesh.eStart) / numpy.array(
                    (stkF.mesh.ne - 1)).clip(min=1)
            intensArray[i] = stkF.arS[i]

        return (eArray, intensArray)
Example #9
0
    def run_calculation_flux(self, srw_source, tickets, progress_bar_value=50):
        wf_parameters = WavefrontParameters(
            photon_energy_min=self.spe_photon_energy_min,
            photon_energy_max=self.spe_photon_energy_max,
            photon_energy_points=self.spe_photon_energy_points,
            h_slit_gap=self.spe_h_slit_gap,
            v_slit_gap=self.spe_v_slit_gap,
            h_slit_points=self.spe_h_slit_points,
            v_slit_points=self.spe_v_slit_points,
            distance=self.spe_distance,
            wavefront_precision_parameters=WavefrontPrecisionParameters(
                sr_method=0
                if self.spe_sr_method == 0 else self.get_automatic_sr_method(),
                relative_precision=self.spe_relative_precision,
                start_integration_longitudinal_position=self.
                spe_start_integration_longitudinal_position,
                end_integration_longitudinal_position=self.
                spe_end_integration_longitudinal_position,
                number_of_points_for_trajectory_calculation=self.
                spe_number_of_points_for_trajectory_calculation,
                use_terminating_terms=self.spe_use_terminating_terms,
                sampling_factor_for_adjusting_nx_ny=self.
                spe_sampling_factor_for_adjusting_nx_ny))

        srw_wavefront = srw_source.get_SRW_Wavefront(
            source_wavefront_parameters=wf_parameters)

        if isinstance(self.received_light_source, SRWBendingMagnetLightSource):
            e, i = srw_wavefront.get_flux(
                multi_electron=True,
                polarization_component_to_be_extracted=self.
                spe_polarization_component_to_be_extracted)
        elif isinstance(self.received_light_source, SRWUndulatorLightSource):
            e, i = srw_source.get_undulator_flux(
                source_wavefront_parameters=wf_parameters,
                flux_precision_parameters=FluxPrecisionParameters(
                    initial_UR_harmonic=self.spe_initial_UR_harmonic,
                    final_UR_harmonic=self.spe_final_UR_harmonic,
                    longitudinal_integration_precision_parameter=self.
                    spe_longitudinal_integration_precision_parameter,
                    azimuthal_integration_precision_parameter=self.
                    spe_azimuthal_integration_precision_parameter,
                    calculation_type=1))

        tickets.append(SRWPlot.get_ticket_1D(e, i))

        wf_parameters = WavefrontParameters(
            photon_energy_min=self.spe_photon_energy_min,
            photon_energy_max=self.spe_photon_energy_max,
            photon_energy_points=self.spe_photon_energy_points,
            h_slit_gap=0.0,
            v_slit_gap=0.0,
            h_slit_points=1,
            v_slit_points=1,
            h_position=self.spe_on_axis_x,
            v_position=self.spe_on_axis_y,
            distance=self.spe_distance,
            wavefront_precision_parameters=WavefrontPrecisionParameters(
                sr_method=0
                if self.spe_sr_method == 0 else self.get_automatic_sr_method(),
                relative_precision=self.spe_relative_precision,
                start_integration_longitudinal_position=self.
                spe_start_integration_longitudinal_position,
                end_integration_longitudinal_position=self.
                spe_end_integration_longitudinal_position,
                number_of_points_for_trajectory_calculation=self.
                spe_number_of_points_for_trajectory_calculation,
                use_terminating_terms=self.spe_use_terminating_terms,
                sampling_factor_for_adjusting_nx_ny=self.
                spe_sampling_factor_for_adjusting_nx_ny))

        power = i * 1e3 * (e[1] - e[0]) * codata.e
        cumulated_power = numpy.cumsum(power)
        self.calculated_total_power = cumulated_power[-1]

        srw_wavefront = srw_source.get_SRW_Wavefront(
            source_wavefront_parameters=wf_parameters)

        e, i = srw_wavefront.get_flux(
            multi_electron=False,
            polarization_component_to_be_extracted=self.
            spe_polarization_component_to_be_extracted)

        tickets.append(SRWPlot.get_ticket_1D(e, i))

        tickets.append(SRWPlot.get_ticket_1D(e, power))

        tickets.append(SRWPlot.get_ticket_1D(e, cumulated_power))

        self.progressBarSet(progress_bar_value)