Source code for casinotools.file_format.casino3.exported.trajectories

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

"""
.. py:currentmodule:: casinotools.file_format.casino3.exported.trajectories
.. moduleauthor:: Hendrix Demers <hendrix.demers@mail.mcgill.ca>

Description
"""

###############################################################################
# Copyright 2020 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.

# Third party modules.

# Local modules.

# Project modules.

# Globals and constants variables.
X_nm = "X (nm)"
Y_nm = "Y (nm)"
Z_nm = "z (nm)"

KEYWORD_TRAJECTORY = '"Trajectory"'
KEYWORD_NUMBER_COLLISIONS = '"NbCollisions"'
KEYWORD_SCAN_POINT_X = '"X"'
KEYWORD_SCAN_POINT_Y = '"Y"'


[docs] class ExportedTrajectories(object): def __init__(self, filepath): self._filepath = filepath self._trajectories = None
[docs] def get_positions_at_z_nm(self, z_nm): if self._trajectories is None: self._read_data_file() positions = [] for trajectory in self._trajectories: for collision in trajectory: if collision[Z_nm] == z_nm: position = (collision[X_nm], collision[Y_nm], collision[Z_nm]) positions.append(position) return positions
[docs] def get_scan_point_position_nm(self): if self._trajectories is None: self._read_data_file() return self._scanPointX, self._scanPointY
[docs] def _read_data_file(self): lines = open(self._filepath, 'rb').readlines() trajectories = [] number_collisions = None collisions = None for line in lines: if line.startswith(KEYWORD_TRAJECTORY): if number_collisions is not None: trajectories.append(collisions) elif line.startswith(KEYWORD_SCAN_POINT_X): items = line.split() if len(items) == 2: try: self._scanPointX = float(items[1]) except ValueError: pass elif line.startswith(KEYWORD_SCAN_POINT_Y): items = line.split() if len(items) == 2: try: self._scanPointY = float(items[1]) except ValueError: pass elif line.startswith(KEYWORD_NUMBER_COLLISIONS): if number_collisions is not None: assert len(collisions) == number_collisions trajectories.append(collisions) items = line.split() number_collisions = int(items[1]) collisions = [] elif self._is_collision_data_line(line): collision = self._read_collision_data_line(line) collisions.append(collision) self._trajectories = trajectories
[docs] @staticmethod def _is_collision_data_line(line): items = line.split() if len(items) == 10: try: float(items[0]) return True except ValueError: return False
[docs] @staticmethod def _read_collision_data_line(line): items = line.split() collision = {X_nm: float(items[0]), Y_nm: float(items[1]), Z_nm: float(items[2])} return collision