#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
.. py:currentmodule:: casinotools.fileformat.casino2.SimulationData
.. 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.
import casinotools.fileformat.FileReaderWriterTools as FileReaderWriterTools
import casinotools.fileformat.casino2.SimulationOptions as SimulationOptions
import casinotools.fileformat.casino2.RegionOptions as RegionOptions
import casinotools.fileformat.casino2.TrajectoriesData as TrajectoriesData
import casinotools.fileformat.casino2.SimulationResults as SimulationResults
from casinotools.fileformat.casino2.Element import \
LINE_K, LINE_L, LINE_M, GENERATED, EMITTED # @UnusedImport
from casinotools.fileformat.casino2.line import ATOMLINE_KA1, ATOMLINE_KA2, ATOMLINE_KB1, ATOMLINE_KB2, ATOMLINE_LA, \
ATOMLINE_LB1, ATOMLINE_LB2, ATOMLINE_LG, ATOMLINE_MA
from casinotools.fileformat.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(FileReaderWriterTools.FileReaderWriterTools):
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 = self.readStrLength(file, 26)
logging.debug("File pos: %i", file.tell())
tag_id = TAG_VERSION
if self.findTag(file, tag_id):
logging.debug("File pos: %i", file.tell())
self._version = self.readInt(file)
tag_id = TAG_STATUS
if self.findTag(file, tag_id):
self._status = self.readStrLength(file, 1)
tag_id = TAG_SAVE_SETUP
if self.findTag(file, tag_id):
self._save_simulations = self.readInt(file)
self._save_regions = self.readInt(file)
self._save_trajectories = self.readInt(file)
self._save_distributions = self.readInt(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)
def _read_simulation_options(self, file):
self._simulation_options = SimulationOptions.SimulationOptions()
self._simulation_options.read(file, self._version)
def _read_region_options(self, file):
if self._simulation_options.FEmissionRX:
self._region_options = RegionOptions.RegionOptions(self._simulation_options.NbreCoucheRX)
else:
self._region_options = RegionOptions.RegionOptions(0)
self._region_options.read(file, self._version)
def _read_trajectories(self, file):
self._trajectoriesData = TrajectoriesData.TrajectoriesData(self._is_skip_reading_data)
self._trajectoriesData.read(file)
def _read_simulation_results(self, file):
self._simulationResults = 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())
self.writeStrLength(file, self._header, 26)
tag_id = TAG_VERSION
self.addTagOld(file, tag_id)
self.writeInt(file, self._version)
tag_id = TAG_STATUS
self.addTagOld(file, tag_id)
self.writeStrLength(file, self._status, 1)
tag_id = TAG_SAVE_SETUP
self.addTagOld(file, tag_id)
self.writeInt(file, self._save_simulations)
self.writeInt(file, self._save_regions)
self.writeInt(file, self._save_trajectories)
self.writeInt(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)
def _write_simulation_options(self, file):
self._simulation_options.write(file)
def _write_region_options(self, file):
self._region_options.write(file)
def _write_trajectories(self, file):
raise NotImplementedError
def _write_simulation_results(self, file):
raise NotImplementedError
[docs] def getVersion(self):
return self._version
[docs] def getSimulationOptions(self):
return self._simulation_options
[docs] def setSimulationOptions(self, simulation_options):
self._simulation_options = simulation_options
[docs] def getRegionOptions(self):
return self._region_options
[docs] def setRegionsOptions(self, region_options):
self._region_options = region_options
[docs] def getSimulationResults(self):
return self._simulationResults
[docs] def getTrajectoriesData(self):
return self._trajectoriesData
[docs] def getTotalXrayIntensities(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.getRegionOptions().getRegions():
for element in region.getElements():
z = element.getAtomicNumber()
delta = element.getTotalXrayIntensities()
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 * steradian).
The dictionary is structured as followed: atomic number, line.
The lines can either be :const:`ATOMLINE_KA1`, :const:`ATOMLINE_KA2`, :const:`ATOMLINE_KB1`,
:const:`ATOMLINE_KB2`, :const:`ATOMLINE_LA`, :const:`ATOMLINE_LB1`, :const:`ATOMLINE_LB2`,
:const:`ATOMLINE_LG`, :const:`ATOMLINE_MA`.
:rtype: class:`dict`
"""
intensities = {}
for region in self.getRegionOptions().getRegions():
for element in region.getElements():
z = element.getAtomicNumber()
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