Source code for SimEx.Calculators.GenesisPhotonSource

""":module GenesisPhotonSource: Module that holds the GenesisPhotonSource class."""
##########################################################################
#                                                                        #
# Copyright (C) 2017-2018 Carsten Fortmann-Grote                         #
# Contact: Carsten Fortmann-Grote <carsten.grote@xfel.eu>                #
#                                                                        #
# This file is part of simex_platform.                                   #
# simex_platform is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by   #
# the Free Software Foundation, either version 3 of the License, or      #
# (at your option) any later version.                                    #
#                                                                        #
# simex_platform is distributed in the hope that it will be useful,      #
# but WITHOUT ANY WARRANTY; without even the implied warranty of         #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          #
# GNU General Public License for more details.                           #
#                                                                        #
# You should have received a copy of the GNU General Public License      #
# along with this program.  If not, see <http://www.gnu.org/licenses/>.  #
#                                                                        #
##########################################################################

import numpy
import os
import subprocess
from ocelot.adaptors import genesis

from SimEx.Calculators.AbstractPhotonSource import AbstractPhotonSource
from SimEx.Utilities.IOUtilities import pic2dist

[docs]class GenesisPhotonSource(AbstractPhotonSource): """ :class GenesisPhotonSource: Representing a x-ray free electron laser photon source using the Genesis backengine. """ def __init__(self, parameters=None, input_path=None, output_path=None): """ :param parameters : Photon source parameters. :type parameters: dict :param input_path: The path to the input data for the photon source. :type input_path: str :note input_path: Accepts a native genesis beam file or openPMD conform hdf5. :param output_path: The path where to save output data. :type output: str, default FELsource_out.h5 """ # Initialize base class. super(GenesisPhotonSource, self).__init__(parameters, input_path, output_path) def _prepareGenesisRun(self): """ """ """ Private method to setup the genesis run. """ # Setup empty distribution. edist = genesis.GenesisElectronDist() # Fill in the data. Reverse time axis. edist.x = numpy.flipud(self.__input_data[:,0]) edist.xp = numpy.flipud(self.__input_data[:,1]) edist.y = numpy.flipud(self.__input_data[:,2]) edist.yp = numpy.flipud(self.__input_data[:,3]) edist.t = numpy.flipud(self.__input_data[:,4]) edist.g = numpy.flipud(self.__input_data[:,5]) edist.part_charge = self.__charge / edist.len() # Produce a genesis beam self.__genesis_beam = genesis.edist2beam(edist, step=self.parameters['time_averaging_window']) # Generate genesis input with defaults and guesses from beam peak parameters. genesis_input = genesis.generate_input( up = self.parameters['undulator_parameters'], beam=genesis.get_beam_peak(self.__genesis_beam), itdp=self.parameters['is_time_dependent'] ) # Merge guessed and external input. if hasattr(self, '_GenesisPhotonSource__genesis_input') and self.__genesis_input is not None: for key,value in list(self.__genesis_input.__dict__.items()): if value != 0.0: setattr(genesis_input, key, value) genesis_input.exp_dir = genesis_input.run_dir = self.output_path # Store merged genesis input. self.__genesis_input = genesis_input # Set beam to actual beam, not the peak parameters. self.__genesis_input.beam = self.__genesis_beam # Call "run_genesis" to setup run directories, which also issues the launcher.launch() command, which, naturall, fails here. try: genesis.run_genesis( self.__genesis_input, launcher=None, debug=0) except AttributeError: pass except: raise
[docs] def backengine(self): # Setup genesis backengine. self._prepareGenesisRun() command_sequence = 'genesis < tmp.cmd' # Run the backengine command. oldpwd = os.getcwd() os.chdir(self.output_path) proc = subprocess.Popen(command_sequence, shell=True) proc.wait() os.chdir(oldpwd) # FIXME self.__data = None
@property def data(self): """ Query for the field data. """ return self.__data def _readH5(self): """ """ self.__input_data, self.__charge = pic2dist( self.input_path, 'genesis' ) return
[docs] def saveH5(self): """ """ pass