Пример #1
0
    def get_Wavefront1D_from_profile(self, axis, coordinate):
        # swap axis - changed giovanni+manuel
        if axis == 1: # fixed X
            index = numpy.argmin(numpy.abs(self._electric_field_matrix.x_coord - coordinate))

            return GenericWavefront1D(wavelength=self._wavelength,
                                      electric_field_array=ScaledArray(scale=self._electric_field_matrix.y_coord,
                                                                       np_array=self._electric_field_matrix.z_values[index, :]))
        elif axis == 0:
            index = numpy.argmin(numpy.abs(self._electric_field_matrix.y_coord - coordinate))

            return GenericWavefront1D(wavelength=self._wavelength,
                                      electric_field_array=ScaledArray(scale=self._electric_field_matrix.x_coord,
                                                                       np_array=self._electric_field_matrix.z_values[:, index]))
Пример #2
0
    def propagate_wavefront(cls,
                            wavefront,
                            propagation_distance,
                            magnification_x=1.0,
                            magnification_N=1.0):
        method = 0

        wavenumber = numpy.pi * 2 / wavefront.get_wavelength()

        x = wavefront.get_abscissas()

        if magnification_N != 1.0:
            npoints_exit = int(magnification_N * x.size)
        else:
            npoints_exit = x.size

        detector_abscissas = numpy.linspace(magnification_x * x[0],
                                            magnification_x * x[-1],
                                            npoints_exit)

        if method == 0:
            # calculate via loop pver detector coordinates
            x1 = wavefront.get_abscissas()
            x2 = detector_abscissas
            fieldComplexAmplitude = numpy.zeros_like(x2, dtype=complex)
            for ix, x in enumerate(x2):
                r = numpy.sqrt(
                    numpy.power(x1 - x, 2) +
                    numpy.power(propagation_distance, 2))
                distances_array = numpy.exp(1.j * wavenumber * r)
                fieldComplexAmplitude[ix] = (
                    wavefront.get_complex_amplitude() * distances_array).sum()
        elif method == 1:
            # calculate via outer product, it spreads over a lot of memory, but it is OK for 1D
            x1 = numpy.outer(wavefront.get_abscissas(),
                             numpy.ones(detector_abscissas.size))
            x2 = numpy.outer(numpy.ones(wavefront.size()), detector_abscissas)
            r = numpy.sqrt(
                numpy.power(x1 - x2, 2) + numpy.power(propagation_distance, 2))

            distances_matrix = numpy.exp(1.j * wavenumber * r)
            fieldComplexAmplitude = numpy.dot(
                wavefront.get_complex_amplitude(), distances_matrix)

        wavefront_out = GenericWavefront1D(
            wavefront.get_wavelength(),
            ScaledArray.initialize_from_steps(
                fieldComplexAmplitude, detector_abscissas[0],
                detector_abscissas[1] - detector_abscissas[0]))

        # added [email protected] 2018-03-23 to conserve energy - TODO: review method!
        # wavefront_out.rescale_amplitude( numpy.sqrt(wavefront.get_intensity().sum() /
        #                                             wavefront_out.get_intensity().sum()
        #                                             / magnification_x))

        wavefront_out.rescale_amplitude( (1/numpy.sqrt(1j*wavefront.get_wavelength()*propagation_distance))*(x1[1]-x1[0]) * \
                                         numpy.exp(1j * wavenumber * propagation_distance))

        return wavefront_out
    def __init__(self, wofry_wavefront=GenericWavefront1D()):
        self.wofry_wavefront = wofry_wavefront

        wavelength = wofry_wavefront.get_wavelength()
        waist0 = fwhm(wofry_wavefront.get_abscissas(),
                      wofry_wavefront.get_intensity()) * numpy.sqrt(2) / 1.66

        print("WAIST", waist0)

        super(DummyElement, self).__init__(Lambda=wavelength, Waist0=waist0)
Пример #4
0
    def propagate_wavefront(cls, wavefront, propagation_distance):

        fft_scale = numpy.fft.fftfreq(wavefront.size()) / wavefront.delta()

        fft = numpy.fft.fft(wavefront.get_complex_amplitude())
        fft *= numpy.exp((-1.0j) * numpy.pi * wavefront.get_wavelength() *
                         propagation_distance * fft_scale**2)
        ifft = numpy.fft.ifft(fft)

        return GenericWavefront1D(
            wavefront.get_wavelength(),
            ScaledArray.initialize_from_steps(ifft, wavefront.offset(),
                                              wavefront.delta()))
Пример #5
0
    def _back_propagation_for_size_calculation(self,theta,radiation_flux,photon_energy,
                                                distance=100.0,magnification=0.010000):
        """
        Calculate the radiation_flux vs theta at a "distance"
        Back propagate to -distance
        The result is the size distrubution

        :param theta:
        :param radiation_flux:
        :param photon_energy:
        :param distance:
        :param magnification:
        :return: None; stores results in self._photon_size_distribution
        """

        from wofry.propagator.wavefront1D.generic_wavefront import GenericWavefront1D
        from wofry.propagator.propagator import PropagationManager, PropagationElements, PropagationParameters
        from syned.beamline.beamline_element import BeamlineElement
        from syned.beamline.element_coordinates import ElementCoordinates
        from wofry.propagator.propagators1D.fresnel_zoom import FresnelZoom1D
        from wofry.beamline.optical_elements.ideal_elements.screen import WOScreen1D


        input_wavefront = GenericWavefront1D().initialize_wavefront_from_arrays(theta*distance,numpy.sqrt(radiation_flux)+0j)
        input_wavefront.set_photon_energy(photon_energy)
        input_wavefront.set_spherical_wave(radius=distance,complex_amplitude=numpy.sqrt(radiation_flux)+0j)
        # input_wavefront.save_h5_file("tmp2.h5","wfr")

        optical_element = WOScreen1D()
        #
        # propagating
        #
        #
        propagation_elements = PropagationElements()
        beamline_element = BeamlineElement(optical_element=optical_element,
                        coordinates=ElementCoordinates(p=0.0,q=-distance,
                        angle_radial=numpy.radians(0.000000),
                        angle_azimuthal=numpy.radians(0.000000)))
        propagation_elements.add_beamline_element(beamline_element)
        propagation_parameters = PropagationParameters(wavefront=input_wavefront.duplicate(),propagation_elements = propagation_elements)
        propagation_parameters.set_additional_parameters('magnification_x', magnification)

        #
        propagator = PropagationManager.Instance()
        try:
            propagator.add_propagator(FresnelZoom1D())
        except:
            pass
        output_wavefront = propagator.do_propagation(propagation_parameters=propagation_parameters,handler_name='FRESNEL_ZOOM_1D')

        self._result_photon_size_distribution = {"x":output_wavefront.get_abscissas(),"y":output_wavefront.get_intensity()}
    def __init__(self, wofry_wavefront=GenericWavefront1D(), ZOrigin = 0, YOrigin = 0, Theta = 0, units_converter=1e-2):
        self.wofry_wavefront=wofry_wavefront
        self.Lambda = self.wofry_wavefront._wavelength
        self.Name = 'Wofry Wavefront @ %0.2fnm' % (self.Lambda *1e9)

        self.ZOrigin = ZOrigin
        self.YOrigin = YOrigin
        self.ThetaPropagation = Theta

        parameters, covariance_matrix_pv = WofryWavefrontSource_1d.gaussian_fit(self.wofry_wavefront.get_intensity(), self.wofry_wavefront.get_abscissas())

        self.Waist0 = parameters[3]

        self.units_converter = units_converter
Пример #7
0
    def propagate_wavefront(cls, wavefront, propagation_distance):

        kernel = numpy.exp(1j * 2 * numpy.pi / wavefront.get_wavelength() *
                           wavefront.get_abscissas()**2 / 2 /
                           propagation_distance)
        kernel *= numpy.exp(1j * 2 * numpy.pi / wavefront.get_wavelength() *
                            propagation_distance)
        kernel /= 1j * wavefront.get_wavelength() * propagation_distance
        tmp = numpy.convolve(wavefront.get_complex_amplitude(),
                             kernel,
                             mode='same')

        wavefront_out = GenericWavefront1D(
            wavefront.get_wavelength(),
            ScaledArray.initialize_from_steps(tmp, wavefront.offset(),
                                              wavefront.delta()))

        # added [email protected] 2018-03-23 to conserve energy - TODO: review method!
        wavefront_out.rescale_amplitude(
            numpy.sqrt(wavefront.get_intensity().sum() /
                       wavefront_out.get_intensity().sum()))

        return wavefront_out
Пример #8
0
TODO: remove this file
"""

from wofry.propagator.wavefront1D.generic_wavefront import GenericWavefront1D
from srxraylib.plot.gol import plot

#
# Import section
#
import numpy
from wofry.propagator.propagator import PropagationManager, PropagationElements, PropagationParameters
from syned.beamline.beamline_element import BeamlineElement
from shadow4.syned.element_coordinates import ElementCoordinates
from wofry.propagator.propagators1D.fresnel_zoom import FresnelZoom1D

input_wavefront = GenericWavefront1D()
input_wavefront = input_wavefront.load_h5_file(
    "/users/srio/OASYS1.1/minishadow/minishadow/undulator/tmp.h5", "wfr")

# input_wavefront.rescale_amplitude( 1.0/numpy.sqrt(input_wavefront.get_intensity().max()))

# input_wavefront.set_spherical_wave(radius=100,complex_amplitude=numpy.abs(input_wavefront.get_intensity()) )
# plot(input_wavefront.get_abscissas()*1e6,input_wavefront.get_intensity())

from wofry.beamline.optical_elements.ideal_elements.screen import WOScreen1D

optical_element = WOScreen1D()

#
# propagating
#