Source code for casinotools.file_format.casino2.simulation_data

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
.. py:currentmodule:: casinotools.file_format.casino2.simulation_data

.. moduleauthor:: Hendrix Demers <hendrix.demers@mail.mcgill.ca>

Read one simulation data from a CASINO v2 file.
"""

###############################################################################
# Copyright 2017 Hendrix Demers
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
###############################################################################

# Standard library modules.
import logging

# Third party modules.

# Local modules.
from casinotools.file_format.file_reader_writer_tools import _read_str_length, read_int, _write_str_length, \
    write_int
from casinotools.file_format.tags import add_tag_old, find_tag
from casinotools.file_format.casino2.simulation_options import SimulationOptions
from casinotools.file_format.casino2.region_options import RegionOptions
from casinotools.file_format.casino2.trajectories_data import TrajectoriesData
from casinotools.file_format.casino2.simulation_results import SimulationResults
from casinotools.file_format.casino2.element import GENERATED, EMITTED
from casinotools.file_format.casino2.version import CURRENT_VERSION

# Globals and constants variables.
HEADER = b"WinCasino Simulation File"
TAG_VERSION = b"*VERSION%%%%%%%"
TAG_STATUS = b"*STATUS%%%%%%%%"
TAG_SAVE_SETUP = b"*SAVESETUP%%%%%"


[docs] class SimulationData: def __init__(self, is_skip_reading_data=False): self._is_skip_reading_data = is_skip_reading_data self.header = HEADER self.version = CURRENT_VERSION self.status = None self.save_simulations = None self.save_regions = None self.save_trajectories = None self.save_distributions = None self.simulation_options = None self.region_options = None
[docs] def read(self, file): assert getattr(file, 'mode', 'rb') == 'rb' logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "read", file.tell()) self.header = _read_str_length(file, 26) logging.debug("File pos: %i", file.tell()) tag_id = TAG_VERSION if find_tag(file, tag_id): logging.debug("File pos: %i", file.tell()) self.version = read_int(file) else: return tag_id = TAG_STATUS if find_tag(file, tag_id): self.status = _read_str_length(file, 1) tag_id = TAG_SAVE_SETUP if find_tag(file, tag_id): self.save_simulations = read_int(file) self.save_regions = read_int(file) self.save_trajectories = read_int(file) self.save_distributions = read_int(file) if self.save_simulations: self._read_simulation_options(file) if self.save_regions: self._read_region_options(file) if self.save_regions and self.save_trajectories: self._read_trajectories(file) if self.save_distributions: self._read_simulation_results(file)
[docs] def _read_simulation_options(self, file): self.simulation_options = SimulationOptions() self.simulation_options.read(file, self.version)
[docs] def _read_region_options(self, file): if self.simulation_options.FEmissionRX: self.region_options = RegionOptions(self.simulation_options.NbreCoucheRX) else: self.region_options = RegionOptions(0) self.region_options.read(file, self.version)
[docs] def _read_trajectories(self, file): self._trajectoriesData = TrajectoriesData(self._is_skip_reading_data) self._trajectoriesData.read(file)
[docs] def _read_simulation_results(self, file): self._simulationResults = SimulationResults(self._is_skip_reading_data) self._simulationResults.read(file, self.simulation_options, self.version)
[docs] def write(self, file): assert getattr(file, 'mode', 'wb') == 'wb' logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "write", file.tell()) _write_str_length(file, self.header, 26) tag_id = TAG_VERSION add_tag_old(file, tag_id) write_int(file, self.version) tag_id = TAG_STATUS add_tag_old(file, tag_id) _write_str_length(file, self.status, 1) tag_id = TAG_SAVE_SETUP add_tag_old(file, tag_id) write_int(file, self.save_simulations) write_int(file, self.save_regions) write_int(file, self.save_trajectories) write_int(file, self.save_distributions) if self.save_simulations: self._write_simulation_options(file) if self.save_regions: self._write_region_options(file) if self.save_regions and self.save_trajectories: self._write_trajectories(file) if self.save_distributions: self._write_simulation_results(file)
[docs] def _write_simulation_options(self, file): self.simulation_options.write(file)
[docs] def _write_region_options(self, file): self.region_options.write(file)
[docs] def _write_trajectories(self, file): raise NotImplementedError
[docs] def _write_simulation_results(self, file): raise NotImplementedError
[docs] def get_version(self): return self.version
[docs] def get_simulation_options(self): return self.simulation_options
[docs] def set_simulation_options(self, simulation_options): self.simulation_options = simulation_options
[docs] def get_region_options(self): return self.region_options
[docs] def set_regions_options(self, region_options): self.region_options = region_options
[docs] def get_simulation_results(self): return self._simulationResults
[docs] def get_trajectories_data(self): return self._trajectoriesData
[docs] def get_total_xray_intensities(self): """ Returns a :class:`dict` with the intensities (generated and emitted) of all the lines and elements in the simulation. The dictionary is structured as followed: atomic number, line, :const:`EMITTED` or :const:`GENERATED`. The lines can either be :const:`LINE_K`, :const:`LINE_L`, :const:`LINE_M`. :rtype: class:`dict` """ intensities = {} for region in self.get_region_options().get_regions(): for element in region.get_elements(): z = element.get_atomic_number() delta = element.get_total_xray_intensities() intensities.setdefault(z, {}) for line in delta.keys(): if line in intensities[z]: intensities[z][line][GENERATED] += delta[line][GENERATED] intensities[z][line][EMITTED] += delta[line][EMITTED] else: intensities[z].setdefault(line, {}) intensities[z][line][GENERATED] = delta[line][GENERATED] intensities[z][line][EMITTED] = delta[line][EMITTED] return intensities
[docs] def get_total_xray_intensities_1_esr(self): """ Returns a :class:`dict` with the intensities (emitted) of all the lines and elements in the simulation in photon / (electron * steradians). The dictionary is structured as followed: atomic number, line. The lines can either be :const:`ATOM_LINE_KA1`, :const:`ATOM_LINE_KA2`, :const:`ATOM_LINE_KB1`, :const:`ATOM_LINE_KB2`, :const:`ATOM_LINE_LA`, :const:`ATOM_LINE_LB1`, :const:`ATOM_LINE_LB2`, :const:`ATOM_LINE_LG`, :const:`ATOM_LINE_MA`. :rtype: class:`dict` """ intensities = {} for region in self.get_region_options().get_regions(): for element in region.get_elements(): z = element.get_atomic_number() delta = element.get_total_xray_intensities_1_esr() intensities.setdefault(z, {}) for line in delta.keys(): if line in intensities[z]: intensities[z][line] += delta[line] else: intensities[z][line] = delta[line] return intensities