예제 #1
0
    def to_python_code(self, data=None):
        wavefront = data[0]
        is_multi_electron = data[1] == True

        text_code = "from srwlib import *\nfrom uti_plot import *\nimport numpy\n\n"

        if is_multi_electron:
            text_code += "#if not srwl_uti_proc_is_master(): exit()\n"
        else:
            text_code += "if not srwl_uti_proc_is_master(): exit()\n"

        text_code += "\n####################################################\n# LIGHT SOURCE\n\n"
        text_code += self.get_light_source().to_python_code(is_multi_electron)

        if not is_multi_electron:
            text_code += "\n"
            text_code += "mesh0 = deepcopy(wfr.mesh)" + "\n"
            text_code += "arI = array('f', [0]*mesh0.nx*mesh0.ny)" + "\n"
            text_code += "srwl.CalcIntFromElecField(arI, wfr, 6, 0, 3, mesh0.eStart, 0, 0)" + "\n"
            text_code += "arIx = array('f', [0]*mesh0.nx)" + "\n"
            text_code += "srwl.CalcIntFromElecField(arIx, wfr, 6, 0, 1, mesh0.eStart, 0, 0)" + "\n"
            text_code += "arIy = array('f', [0]*mesh0.ny)" + "\n"
            text_code += "srwl.CalcIntFromElecField(arIy, wfr, 6, 0, 2, mesh0.eStart, 0, 0)" + "\n"
            text_code += "#save ascii file with intensity" + "\n"
            text_code += "#srwl_uti_save_intens_ascii(arI, mesh0, <file_path>)" + "\n"
            text_code += "plotMesh0x = [1000*mesh0.xStart, 1000*mesh0.xFin, mesh0.nx]" + "\n"
            text_code += "plotMesh0y = [1000*mesh0.yStart, 1000*mesh0.yFin, mesh0.ny]" + "\n"
            text_code += "uti_plot2d1d (arI, plotMesh0x, plotMesh0y, labels=['Horizontal Position [mm]', 'Vertical Position [mm]', 'Intensity Before Propagation'])" + "\n"

        if self.get_beamline_elements_number() > 0:
            text_code += "\n####################################################\n# BEAMLINE\n\n"
            text_code += "srw_oe_array = []" + "\n"
            text_code += "srw_pp_array = []" + "\n"
            text_code += "\n"

            for index in range(self.get_beamline_elements_number()):
                oe_name = "oe_" + str(index)
                data_oe = [oe_name, wavefront]

                beamline_element = self.get_beamline_element_at(index)

                optical_element = beamline_element.get_optical_element()
                coordinates = beamline_element.get_coordinates()

                # DRIFT BEFORE ----------------

                if coordinates.p() != 0.0:
                    text_code += "drift_before_" + oe_name + " = " + "SRWLOptD(" + str(
                        coordinates.p()) + ")" + "\n"

                    wp, wop = self.get_wavefront_propagation_parameters_at(
                        index, Where.DRIFT_BEFORE)
                    drift_pp_array = wp.to_python_code()
                    if not wop is None:
                        drift_pp_array = wop.append_to_python_code(
                            drift_pp_array)

                    text_code += "pp_drift_before_" + oe_name + " = " + drift_pp_array + "\n"
                    text_code += "\n"
                    text_code += "srw_oe_array.append(drift_before_" + oe_name + ")" + "\n"
                    text_code += "srw_pp_array.append(pp_drift_before_" + oe_name + ")" + "\n"
                    text_code += "\n"

                wp, wop = self.get_wavefront_propagation_parameters_at(
                    index, Where.OE)

                # OPTICAL ELEMENT ----------------

                if not wp is None:  # SCREEN!!!
                    text_code += optical_element.to_python_code(data_oe)

                    oe_pp_array = wp.to_python_code()
                    if not wop is None:
                        oe_pp_array = wop.append_to_python_code(oe_pp_array)

                    text_code += "\n"

                    if not optical_element.displacement is None:
                        data_oe.append(SRWOpticalElementDisplacement.BEFORE)

                        text_code += optical_element.displacement.to_python_code(
                            data_oe)

                        text_code += "\n"

                        if optical_element.displacement.has_shift:
                            text_code += "srw_oe_array.append(shift_before_" + oe_name + ")" + "\n"
                            text_code += "srw_pp_array.append(pp_shift_before_" + oe_name + ")" + "\n"
                            text_code += "\n"

                        if optical_element.displacement.has_rotation:
                            text_code += "srw_oe_array.append(rotation_before_" + oe_name + ")" + "\n"
                            text_code += "srw_pp_array.append(pp_rotation_before_" + oe_name + ")" + "\n"
                            text_code += "\n"

                    if hasattr(optical_element,
                               "add_acceptance_slit") and getattr(
                                   optical_element, "add_acceptance_slit"
                               ) == True:  # MIRROR AND GRATINGS

                        text_code += "pp_acceptance_slits_" + oe_name + " = " + oe_pp_array + "\n"
                        text_code += "pp_" + oe_name + " = " + WavefrontPropagationParameters(
                        ).to_python_code() + "\n"
                        text_code += "\n"

                        text_code += "srw_oe_array.append(acceptance_slits_" + oe_name + ")" + "\n"
                        text_code += "srw_pp_array.append(pp_acceptance_slits_" + oe_name + ")" + "\n"

                    else:
                        text_code += "pp_" + oe_name + " = " + oe_pp_array + "\n"

                    text_code += "\n"
                    text_code += "srw_oe_array.append(" + oe_name + ")" + "\n"
                    text_code += "srw_pp_array.append(pp_" + oe_name + ")" + "\n"

                    if hasattr(
                            optical_element,
                            "height_profile_data_file"):  # MIRROR AND GRATINGS
                        if not getattr(optical_element,
                                       "height_profile_data_file") is None:
                            text_code += "\n"
                            text_code += "srw_oe_array.append(optTrEr_" + oe_name + ")" + "\n"
                            text_code += "srw_pp_array.append(" + WavefrontPropagationParameters(
                            ).to_python_code() + ")" + "\n"

                    if not optical_element.displacement is None:
                        data_oe[2] = SRWOpticalElementDisplacement.AFTER

                        text_code += "\n"

                        text_code += optical_element.displacement.to_python_code(
                            data_oe)

                        text_code += "\n"

                        if optical_element.displacement.has_shift:
                            text_code += "srw_oe_array.append(shift_after_" + oe_name + ")" + "\n"
                            text_code += "srw_pp_array.append(pp_shift_after_" + oe_name + ")" + "\n"
                            text_code += "\n"

                        if optical_element.displacement.has_rotation:
                            text_code += "srw_oe_array.append(rotation_after_" + oe_name + ")" + "\n"
                            text_code += "srw_pp_array.append(pp_rotation_after_" + oe_name + ")" + "\n"
                            text_code += "\n"

                # DRIFT AFTER ----------------

                if coordinates.q() != 0.0:
                    text_code += "\n"
                    text_code += "drift_after_" + oe_name + " = " + "SRWLOptD(" + str(
                        coordinates.q()) + ")" + "\n"

                    wp, wop = self.get_wavefront_propagation_parameters_at(
                        index, Where.DRIFT_AFTER)
                    drift_pp_array = wp.to_python_code()
                    if not wop is None:
                        drift_pp_array = wop.append_to_python_code(
                            drift_pp_array)

                    text_code += "pp_drift_after_" + oe_name + " = " + drift_pp_array + "\n"
                    text_code += "\n"
                    text_code += "srw_oe_array.append(drift_after_" + oe_name + ")" + "\n"
                    text_code += "srw_pp_array.append(pp_drift_after_" + oe_name + ")" + "\n"

                text_code += "\n"

            text_code += "\n####################################################\n# PROPAGATION\n\n"
            text_code += "optBL = SRWLOptC(srw_oe_array, srw_pp_array)" + "\n"
            if not is_multi_electron:
                text_code += "srwl.PropagElecField(wfr, optBL)" + "\n"
            text_code += "\n"

            if not is_multi_electron:
                text_code += "mesh1 = deepcopy(wfr.mesh)" + "\n"
                text_code += "arI1 = array('f', [0]*mesh1.nx*mesh1.ny)" + "\n"
                text_code += "srwl.CalcIntFromElecField(arI1, wfr, 6, 0, 3, mesh1.eStart, 0, 0)" + "\n"
                text_code += "arI1x = array('f', [0]*mesh1.nx)" + "\n"
                text_code += "srwl.CalcIntFromElecField(arI1x, wfr, 6, 0, 1, mesh1.eStart, 0, 0)" + "\n"
                text_code += "arI1y = array('f', [0]*mesh1.ny)" + "\n"
                text_code += "srwl.CalcIntFromElecField(arI1y, wfr, 6, 0, 2, mesh1.eStart, 0, 0)" + "\n"
                text_code += "#save ascii file with intensity" + "\n"
                text_code += "#srwl_uti_save_intens_ascii(arI1, mesh1, <file_path>)" + "\n"
                text_code += "plotMesh1x = [1000*mesh1.xStart, 1000*mesh1.xFin, mesh1.nx]" + "\n"
                text_code += "plotMesh1y = [1000*mesh1.yStart, 1000*mesh1.yFin, mesh1.ny]" + "\n"
                text_code += "uti_plot2d1d(arI1, plotMesh1x, plotMesh1y, labels=['Horizontal Position [mm]', 'Vertical Position [mm]', 'Intensity After Propagation'])" + "\n"

        if not is_multi_electron: text_code += "uti_plot_show()" + "\n"

        if is_multi_electron:
            parameters = data[2]

            sampFactNxNyForProp = parameters[0]
            nMacroElec = parameters[1]
            nMacroElecAvgOneProc = parameters[2]
            nMacroElecSavePer = parameters[3]
            srCalcMeth = parameters[4]
            srCalcPrec = parameters[5]
            strIntPropME_OutFileName = parameters[6]
            _char = parameters[7]

            text_code += "\n\n####################################################\n# MULTI ELECTRON PROPAGATION\n\n"

            text_code += "radStokesProp = srwl_wfr_emit_prop_multi_e(part_beam," + "\n"
            text_code += "                                           magnetic_field_container," + "\n"
            text_code += "                                           initial_mesh," + "\n"
            text_code += "                                           " + str(
                srCalcMeth) + "," + "\n"
            text_code += "                                           " + str(
                srCalcPrec) + "," + "\n"
            text_code += "                                           " + str(
                nMacroElec) + "," + "\n"
            text_code += "                                           " + str(
                nMacroElecAvgOneProc) + "," + "\n"
            text_code += "                                           " + str(
                nMacroElecSavePer) + "," + "\n"
            text_code += "                                           '" + str(
                strIntPropME_OutFileName) + "'," + "\n"
            text_code += "                                           " + str(
                sampFactNxNyForProp) + "," + "\n"
            text_code += "                                           optBL," + "\n"
            text_code += "                                           _char=" + str(
                int(_char)) + ")" + "\n"

        return text_code
예제 #2
0
 def get_default_propagation_parameters(self):
     return WavefrontPropagationParameters().to_SRW_array()