Source code for casinotools.fileformat.casino3.Trajectory

#!/usr/bin/env python
""" """

# Script information for the file.
__author__ = "Hendrix Demers (hendrix.demers@mail.mcgill.ca)"
__version__ = ""
__date__ = ""
__copyright__ = "Copyright (c) 2009 Hendrix Demers"
__license__ = ""

# Standard library modules.
#import logging
import os
import struct

# Third party modules.

# Local modules.
import casinotools.fileformat.FileReaderWriterTools as FileReaderWriterTools
import casinotools.fileformat.casino3.TrajectoryCollision as TrajectoryCollision

# Globals and constants variables.
TRAJ_TYPE_NONE = 0x00;
TRAJ_TYPE_BACKSCAT = 0x01;
TRAJ_TYPE_TRANSMIT = 0x02;
TRAJ_TYPE_DETEC = 0x04;
TRAJ_TYPE_SECONDARY = 0x08;
TRAJ_DISPLAY = 0x100;

[docs]class Trajectory(FileReaderWriterTools.FileReaderWriterTools): def __init__(self): self._file = None self._startPosition = 0 self._startPositionCollisions = 0 self._endPosition = 0 self._filePathname = "" self._fileDescriptor = 0 self._version = None self._trajectoryCollisions = None
[docs] def read(self, file): assert getattr(file, 'mode', 'rb') == 'rb' self._file = file self._startPosition = file.tell() self._filePathname = file.name self._fileDescriptor = file.fileno() #logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "read", self._startPosition) self._startPosition = file.tell() #self._readHeaderFast(file) self._readHeader(file) self._startPositionCollisions = file.tell() sizeScatteringEvent = TrajectoryCollision.getSizeScatteringEvent() skipOffset = sizeScatteringEvent * self._numberScatteringEvents file.seek(skipOffset, os.SEEK_CUR) self._endPosition = file.tell()
#logging.debug("File position at the end of %s.%s: %i", self.__class__.__name__, "read", self._endPosition) def _readHeader(self, file): self._file.seek(self._startPosition) self._version = self.readInt(file) # TRAJ_TYPE_BACKSCAT self._type = self.readInt(file) # TRAJ_TYPE_TRANSMIT self._type |= self.readInt(file) # TRAJ_TYPE_DETEC self._type |= self.readInt(file) # TRAJ_TYPE_SECONDARY self._type |= self.readInt(file) # TRAJ_DISPLAY (0 or 1 for this version) if self.readInt(file): self._type |= TRAJ_DISPLAY self._order = self.readInt(file) self._dirX = self.readDouble(file) self._dirY = self.readDouble(file) self._dirZ = self.readDouble(file) self._readNumberScatteringEvents(file) def _readHeaderFast(self, file): size = struct.calcsize("=7i3d4x16s") file.seek(size, os.SEEK_CUR) self._readNumberScatteringEventsFast(file) def _readNumberScatteringEvents(self, file): #logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "_readNumberScatteringEvents", file.tell()) tagID = b"NbElec" self.findTag(file, tagID) #logging.debug("File position after findtag of %s.%s: %i", self.__class__.__name__, "_readNumberScatteringEvents", file.tell()) self._numberScatteringEvents = self.readInt(file) #logging.debug("File position at the end of %s.%s: %i", self.__class__.__name__, "_readNumberScatteringEvents", file.tell()) def _readNumberScatteringEventsFast(self, file): #tagID = "NbElec" #self.findTag(file, tagID) self._numberScatteringEvents = self.readInt(file) def _readScatteringEvents(self): self._readScatteringEventsOptimized() def _readScatteringEventsOriginal(self): closeFile = False if self._file.closed: self._file = open(self._filePathname, 'rb') closeFile = True self._file.seek(self._startPositionCollisions) self._trajectoryCollisions = [] for dummy in range(self._numberScatteringEvents): trajectoryCollision = TrajectoryCollision.TrajectoryCollision() trajectoryCollision.read(self._file) self._trajectoryCollisions.append(trajectoryCollision) if closeFile: self._file.close() def _readScatteringEventsOptimized(self): closeFile = False if self._file.closed: self._file = open(self._filePathname, 'rb') closeFile = True self._file.seek(self._startPositionCollisions) format = "5d2i"*self._numberScatteringEvents items = self.readMultipleValues(self._file, format) self._trajectoryCollisions = [TrajectoryCollision.TrajectoryCollision(items[index * 7:(index * 7) + 7]) for index in range(self._numberScatteringEvents)] if closeFile: self._file.close()
[docs] def getNumberScatteringEvents(self): return self._numberScatteringEvents
[docs] def getScatteringEvent(self, index): if self._trajectoryCollisions is None: self._readScatteringEvents() return self._trajectoryCollisions[index]
[docs] def getScatteringEvents(self): if self._trajectoryCollisions is None: self._readScatteringEvents() return self._trajectoryCollisions
[docs] def getScatteringEventsByType(self, type): if self._trajectoryCollisions is None: self._readScatteringEvents() collisions = [] for collision in self._trajectoryCollisions: if collision.getCollisionType() == type: collisions.append(collision) return collisions
[docs] def deleteAllTrajectoryCollisions(self): del self._trajectoryCollisions self._trajectoryCollisions = None
[docs] def getVersion(self): if self._version is None: self._readHeader(self._file) return self._version
[docs] def getType(self): if self._type is None: self._readHeader(self._file) return self._type
[docs] def getTypeName(self): name = "" if self.isTypeNone(): name += "None " elif self.isTypeBackscattered(): name += "BSE " elif self.isTypeTransmitted(): name += "TE " elif self.isTypeDetected(): name += "Detected " elif self.isTypeSecondary(): name += "SE " elif self.isTypeDisplayed(): name += "Displayed " return name
[docs] def isTypeNone(self): return self._isType(TRAJ_TYPE_NONE)
[docs] def isTypeBackscattered(self): return self._isType(TRAJ_TYPE_BACKSCAT)
[docs] def isTypeTransmitted(self): return self._isType(TRAJ_TYPE_TRANSMIT)
[docs] def isTypeDetected(self): return self._isType(TRAJ_TYPE_DETEC)
[docs] def isTypeSecondary(self): return self._isType(TRAJ_TYPE_SECONDARY)
[docs] def isTypeDisplayed(self): return self._isType(TRAJ_DISPLAY)
def _isType(self, trajectoryType): return self.getType() & trajectoryType