#!/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 decimal
# Third party modules.
# Local modules.
import casinotools.fileformat.FileReaderWriterTools as FileReaderWriterTools
import casinotools.fileformat.casino3.Element as Element
# Globals and constants variables.
decimal.getcontext().prec = 28
EPSILON = 1.0e-4
NB_PAR_MAX = 4
TAG_REGIONS_DATA = b"*regionSDATA%%%"
[docs]class Region(FileReaderWriterTools.FileReaderWriterTools):
def __init__(self):
pass
[docs] def read(self, file):
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._version = self.readInt(file)
tagID = TAG_REGIONS_DATA
self.findTag(file, tagID)
if self._version > 30104072:
self._carrierDiffusionLength = self.readDouble(file)
if self._version < 30105005:
self.IDed = self.readInt(file)
self._numberElements = self.readInt(file)
self.Rho = self.readDouble(file)
if self._version < 30105001:
self.Zmoy = self.readDouble(file)
self._workFunction = self.readDouble(file)
self._averagePlasmonEnergy = self.readDouble(file)
self.ID = self.readInt(file)
self.Substrate = self.readInt(file)
self.User_Density = self.readInt(file)
self.User_Composition = self.readInt(file)
self._checked = self.readInt(file)
if self._version < 30105022:
self._energyIntensity = self.readDouble(file)
self.Name = self.readStr(file)
self._numberSampleObjects = self.readInt(file)
self._sampleObjectIDs = {}
for dummy in range(self._numberSampleObjects):
id = self.readInt(file)
insideOrOutside = self.readInt(file)
self._sampleObjectIDs[id] = insideOrOutside
self._mollerInit = self.readDouble(file)
self._triangleColor_X = self.readDouble(file)
self._triangleColor_Y = self.readDouble(file)
self._triangleColor_Z = self.readDouble(file)
self._elements = []
for dummy in range(self._numberElements):
element = Element.Element()
element.read(file)
self._elements.append(element)
self._chemicalName = self.readStr(file)
def _modify(self, file):
assert file.mode == 'r+b'
logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "_write", file.tell())
tagID = TAG_REGIONS_DATA
if self.findTag(file, tagID):
self.writeInt(file, self._version)
self.writeDouble(file, self._carrierDiffusionLength)
self.writeInt(file, self._numberElements)
self.writeDouble(file, self.Rho)
self.writeDouble(file, self._workFunction)
self.writeDouble(file, self._averagePlasmonEnergy)
self.writeInt(file, self.ID)
self.writeInt(file, self.Substrate)
self.writeInt(file, self.User_Density)
self.writeInt(file, self.User_Composition)
self.writeInt(file, self._checked)
self.writeStr(file, self.Name)
self.writeInt(file, self._numberSampleObjects)
for objectID in sorted(self._sampleObjectIDs.keys()):
self.writeInt(file, objectID)
self.writeInt(file, self._sampleObjectIDs[objectID])
self.writeDouble(file, self._mollerInit)
self.writeDouble(file, self._triangleColor_X)
self.writeDouble(file, self._triangleColor_Y)
self.writeDouble(file, self._triangleColor_Z)
for element in self._elements:
element._modify(file)
self.writeStr(file, self._chemicalName)
[docs] def write(self, file):
raise NotImplementedError
[docs] def modifyName(self, name):
self.Name = name
if not self._file.closed:
currentPosition = self._file.tell()
self._file.close()
else:
currentPosition = 0
self._file = open(self._filePathname, 'r+b')
self._file.seek(self._startPosition)
self._modify(self._file)
self._file.close()
self._file = open(self._filePathname, 'rb')
self._file.seek(currentPosition)
[docs] def getNumberElements(self):
assert len(self._elements) == self._numberElements
return self._numberElements
[docs] def removeAllElements(self):
self._numberElements = 0
self._elements = []
assert len(self._elements) == self._numberElements
[docs] def addElement(self, symbol, weightFraction=1.0, numberXRayLayers=500):
self._numberElements += 1
element = Element.Element(numberXRayLayers)
element.setElement(symbol, weightFraction)
self._elements.append(element)
assert len(self._elements) == self._numberElements
[docs] def getElement(self, index):
return self._elements[index]
[docs] def getElementBySymbol(self, symbol):
for element in self._elements:
if element.getSymbol() == symbol:
return element
[docs] def update(self):
self._numberElements = self._computeNumberElements()
self.Rho = self._computeMeanMassDensity_g_cm3()
self.Zmoy = self._computeMeanAtomicNumber()
self.Name = self._generateName()
self._computeAtomicFractionElements()
self._checkWeightFraction()
self._checkAtomicFraction()
def _computeNumberElements(self):
return len(self._elements)
def _computeMeanMassDensity_g_cm3(self):
inverseTotal = 0.0
for element in self._elements:
weightFraction = element.getWeightFraction()
massDensity_g_cm3 = element.getMassDensity_g_cm3()
inverseTotal += weightFraction / massDensity_g_cm3
meanMassDensity = 1.0 / inverseTotal
return meanMassDensity
def _computeMeanAtomicNumber(self):
Total_Z = 0.0
Total_Elements = 0.0
for element in self._elements:
repetition = element.getRepetition()
Total_Elements += repetition
Total_Z += element.getAtomicNumber() * repetition
meanAtomicNumber = Total_Z / Total_Elements
return meanAtomicNumber
def _generateName(self):
name = ""
for element in self._elements:
name += element.getSymbol().strip()
return name
def _computeAtomicFractionElements(self):
total = 0.0
for element in self._elements:
weightFraction = element.getWeightFraction()
atomicWeight = element.getAtomicWeight_g_mol()
total += weightFraction / atomicWeight
for element in self._elements:
weightFraction = element.getWeightFraction()
atomicWeight = element.getAtomicWeight_g_mol()
atomicFraction = (weightFraction / atomicWeight) / total
element.setAtomicFraction(atomicFraction)
def _checkWeightFraction(self):
weightFractions = [element.getWeightFraction() for element in self._elements]
total = sum(weightFractions)
assert abs(total - 1.0) < EPSILON
for element in self._elements:
newWeightFraction = decimal.Decimal(str(element.getWeightFraction())) / decimal.Decimal(str(total))
element.setWeightFraction(float(newWeightFraction))
weightFractions = [element.getWeightFraction() for element in self._elements]
total = sum(weightFractions)
assert abs(total - 1.0) < EPSILON * EPSILON
def _checkAtomicFraction(self):
atomicFractions = [element.getAtomicFraction() for element in self._elements]
total = sum(atomicFractions)
assert abs(total - 1.0) < EPSILON
for element in self._elements:
newAtomicFraction = decimal.Decimal(str(element.getAtomicFraction())) / decimal.Decimal(str(total))
element.setAtomicFraction(float(newAtomicFraction))
atomicFractions = [element.getAtomicFraction() for element in self._elements]
total = sum(atomicFractions)
assert abs(total - 1.0) < EPSILON * EPSILON
[docs] def getMeanMassDensity_g_cm3(self):
return self.Rho
[docs] def getMeanAtomicNumber(self):
return self.Zmoy
[docs] def getName(self):
return self.Name
[docs] def getComposition(self):
return self._chemicalName
[docs] def getId(self):
return self.ID
[docs] def export(self, exportFile):
# todo: implement the export method.
logging.error("implement the export method.")