Beispiel #1
0
    def propagate(self, wfr):
        """
        Propagate wavefront through beamline.

        :param wfr: Input wavefront (will be re-writed after propagation)
        :type wfr: wpg.wavefront.Wavefront
        """
        for propagation_option in self.propagation_options:
            if all([
                    isinstance(o, srwlib.SRWLOpt)
                    for o in propagation_option['optical_elements']
            ]):
                srwl_beamline = srwlib.SRWLOptC(
                    propagation_option['optical_elements'],
                    propagation_option['propagation_parameters'])

                srwl.PropagElecField(wfr._srwl_wf, srwl_beamline)

                # fixing wf._srwl_wf.mesh.zStart bug for Drift
                # TODO: Try to fix it with _treat parameter
                for opt_element in propagation_option['optical_elements']:
                    if isinstance(opt_element, srwlib.SRWLOptD):
                        wfr.params.Mesh.zCoord = wfr.params.Mesh.zCoord + \
                            opt_element.L
            else:
                raise ValueError('Unknown type of propagators')
Beispiel #2
0
    def propagate_sequential(self, wfr, outdir=None):
        """
        Propagate sequentially through each optical element in beamline.

        :param wfr: Input wavefront (will be re-writed after propagation)
        :param outdir: save directory
        """

        plotIntensity(wfr)

        print(outdir)
        if outdir is not None:

            if os.path.exists(outdir) == False:
                assert (ValueError, "Output Directory Could Not Be Found")
            else:
                pass

        if outdir is not None:
            wfr.write(outdir + "initialSource")
            plotIntensity(wfr, save=outdir + "source")

        for itr in range(len(self.propagation_options[0]['optical_elements'])):
            oe = self.propagation_options[0]['optical_elements'][itr]
            pp = self.propagation_options[0]['propagation_parameters'][itr]

            bl = srwlib.SRWLOptC([oe], [pp])

            print(oe.name)
            srwl.PropagElecField(wfr._srwl_wf, bl)

            if oe.name is None:
                oe.name = "el{}".format(itr)

            if outdir is not None:
                plotIntensity(wfr, save=outdir + oe.name)

                with open(outdir + "beamline_parameters.json", 'w') as f:
                    json.dump(self.params, f)

            elif outdir is None:
                plotIntensity(wfr)
Beispiel #3
0
    def propagate_sequential(self, wfr, return_intensity = False, return_mesh = False, savedir = "", checkpoints = []):
        """
        Propagate sequentially through each optical element in beamline.

        :param wfr: Input wavefront (will be re-writed after propagation)
        :param outdir: save directory
        """
               
        
        if return_intensity:
            intensity = []
        if return_mesh:
            mesh = []
            
        for itr in range(len(self.propagation_options[0]['optical_elements'])):
            oe = self.propagation_options[0]['optical_elements'][itr]
            pp = self.propagation_options[0]['propagation_parameters'][itr]
            
            bl = srwlib.SRWLOptC([oe],[pp])
            
            try:
                print(oe.name)
            except:
                print(oe)
             
            
            srwl.PropagElecField(wfr._srwl_wf, bl)
            
            if return_intensity:
                intensity.append(wfr.get_intensity().sum(-1))
            if return_mesh:
                mesh.append(wfr.get_mesh())
                    
            plot_intensity_map(wfr)
            
        if return_intensity:
            
            if return_mesh:
                return intensity, mesh
            else:
                return intensity
Beispiel #4
0
def set_optics(v=None):
    el = []
    # 1,2 White_B: aperture 14.0m
    el.append(srwlib.SRWLOptA("r", "a", 0.0006, 0.0006, 0.0, 0.0))  # .0004
    el.append(srwlib.SRWLOptD(1.0))

    # 3,4 HFM: sphericalMirror 15.0m
    el.append(
        srwlib.SRWLOptMirSph(
            _r=8871.45,
            _size_tang=0.95,
            _size_sag=0.005,
            _nvx=0.999902524484,
            _nvy=0.0,
            _nvz=-0.0139621463437,
            _tvx=0.0139621463437,
            _tvy=0.0,
            _x=0.0,
            _y=0.0,
        ))

    el.append(srwlib.SRWLOptD(1.0))
    # 5 DCM1: crystal 16.0m
    opCr = srwlib.SRWLOptCryst(
        _d_sp=3.13557135638,
        _psi0r=-1.43534717388e-05,
        _psi0i=3.16676479565e-07,
        _psi_hr=-7.5926201741e-06,
        _psi_hi=2.21095173107e-07,
        _psi_hbr=-7.5926201741e-06,
        _psi_hbi=2.21095173107e-07,
        _tc=0.01,
        _ang_as=0.0,
    )
    # Set crystal orientation:
    opCr.set_orient(
        -0.970946542231,
        6.59748146207e-09,
        -0.239296494187,
        -0.239296494187,
        1.62599496025e-09,
    )
    el.append(opCr)

    # 6,7 DCM2: crystal 16.0m
    opCr = srwlib.SRWLOptCryst(
        _d_sp=3.13557135638,
        _psi0r=-1.43534717388e-05,
        _psi0i=3.16676479565e-07,
        _psi_hr=-7.5926201741e-06,
        _psi_hi=2.21095173107e-07,
        _psi_hbr=-7.5926201741e-06,
        _psi_hbi=2.21095173107e-07,
        _tc=0.01,
        _ang_as=0.0,
    )
    #  Set crystal orientation:
    opCr.set_orient(
        -3.48549712965e-09,
        -0.970946542231,
        -0.239296494187,
        -8.59024886897e-10,
        -0.239296494187,
    )
    el.append(opCr)

    el.append(srwlib.SRWLOptD(2.0))
    # 8,9  Exit_S: aperture 18.0m
    el.append(srwlib.SRWLOptA("r", "a", 0.0006, 0.0006, 0.0, 0.0))  # .00025
    el.append(srwlib.SRWLOptD(12.0))
    # 10  Sec_Src_Ap: aperture 30.0m
    el.append(srwlib.SRWLOptA("r", "a", 2e-05, 2e-05, 0.0, 0.0))
    # 11 Sec_SRC_W: watch 30.0m

    el.append(srwlib.SRWLOptD(4.99))  # 4.9
    # 12 KBM_S: aperture 34.9m
    el.append(srwlib.SRWLOptA("r", "a", 2e-05, 2e-05, 0.0, 0.0))
    # el.append(srwlib.SRWLOptA("r", "a", 1000e-05, 1000e-05, 0.0, 0.0))
    # 13 KBM_S_W: watch 34.9m

    el.append(srwlib.SRWLOptD(0.01))  # 0.1
    # 14, 15 KBMV: ellipsoidMirror 35.0m
    el.append(
        srwlib.SRWLOptMirEl(
            _p=35.0,
            _q=0.47,
            _ang_graz=0.003,
            _size_tang=0.22,
            _size_sag=0.22,
            _nvx=0.999995500003,
            _nvy=0.0,
            _nvz=-0.0029999955,
            _tvx=0.0029999955,
            _tvy=0.0,
            _x=0.0,
            _y=0.0,
        ))

    el.append(srwlib.SRWLOptD(0.22))
    # 16,17 KBMH: ellipsoidMirror 35.22m
    el.append(
        srwlib.SRWLOptMirEl(
            _p=5.22,
            _q=0.25,
            _ang_graz=0.003,
            _size_tang=0.22,
            _size_sag=0.22,
            _nvx=0.0,
            _nvy=0.999995500003,
            _nvz=-0.0029999955,
            _tvx=0.0,
            _tvy=0.0029999955,
            _x=0.0,
            _y=0.0,
        ))

    el.append(srwlib.SRWLOptD(0.25))

    return srwlib.SRWLOptC(el)
Beispiel #5
0
def set_optics(mirror_profile=False):

    el = []

    el.append(srwlib.SRWLOptD(0.71))
    # M2: ellipsoidMirror 170.0m
    el.append(
        srwlib.SRWLOptMirEl(_p=170.0,
                            _q=1.6,
                            _ang_graz=0.01385,
                            _size_tang=0.184,
                            _size_sag=0.01,
                            _nvx=-0.999904090283,
                            _nvy=0.0,
                            _nvz=-0.013849557214,
                            _tvx=-0.013849557214,
                            _tvy=0.0,
                            _x=0.0,
                            _y=0.0))

    ifnElMirror1 = mirror_profile
    if ifnElMirror1:
        assert os.path.isfile(
            ifnElMirror1
        ), "Missing input file mirror_2d.dat, required by M2 beamline element"
        hProfDataElMirror1 = srwlib.srwl_uti_read_data_cols(ifnElMirror1, "\t")
        el.append(
            srwlib.srwl_opt_setup_surf_height_2d(hProfDataElMirror1,
                                                 _dim="x",
                                                 _ang=0.01385,
                                                 _amp_coef=1.0))
    el.append(srwlib.SRWLOptD(0.5))
    # M3: ellipsoidMirror 170.5m
    el.append(
        srwlib.SRWLOptMirEl(_p=170.5,
                            _q=1.1,
                            _ang_graz=0.01385,
                            _size_tang=0.184,
                            _size_sag=0.01,
                            _nvx=0.0,
                            _nvy=0.999904090283,
                            _nvz=-0.013849557214,
                            _tvx=0.0,
                            _tvy=0.013849557214,
                            _x=0.0,
                            _y=0.0))

    ifnElMirror2 = mirror_profile
    if ifnElMirror2:
        assert os.path.isfile(
            ifnElMirror2
        ), "Missing input file mirror_2d.dat, required by M3 beamline element"
        hProfDataElMirror2 = srwlib.srwl_uti_read_data_cols(ifnElMirror2, "\t")
        el.append(
            srwlib.srwl_opt_setup_surf_height_2d(hProfDataElMirror2,
                                                 _dim="y",
                                                 _ang=0.01385,
                                                 _amp_coef=1.0))
    el.append(srwlib.SRWLOptD(1.1))
    # Sample: watch 171.6m

    pp = []
    pp.append([
        0, 0, 1.0, 1, 0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        0.0
    ])
    # M2
    pp.append([
        0, 0, 1.0, 1, 0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        0.0
    ])
    if ifnElMirror1:
        pp.append([0, 0, 1.0, 0, 0, 1.0, 1.0, 1.0, 1.0])
    pp.append([
        0, 0, 1.0, 1, 0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        0.0
    ])
    # M3
    pp.append([
        0, 0, 1.0, 1, 0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        0.0
    ])
    if ifnElMirror2:
        pp.append([0, 0, 1.0, 0, 0, 1.0, 1.0, 1.0, 1.0])
    pp.append([
        0, 0, 1.0, 1, 0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        0.0
    ])
    # Sample
    # final post-propagation
    pp.append([
        0, 0, 1.0, 0, 0, 0.05, 20.0, 0.05, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        0.0, 0.0
    ])
    return srwlib.SRWLOptC(el, pp)