#!/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 math
# Third party modules.
# Local modules.
import casinotools.fileformat.FileReaderWriterTools as FileReaderWriterTools
# Globals and constants variables.
LINE_K = 'K'
LINE_L = 'LIII'
LINE_M = 'MV'
GENERATED = "Generated"
EMITTED = "Emitted"
TAG_ELEMENT_DATA = b"*ELEMENTDATA_XX"
[docs]class Element(FileReaderWriterTools.FileReaderWriterTools):
def __init__(self):
self._version = None
self._elementID = 0
self._weightFraction = 1.0
self._atomicFraction = 1.0
self._sigmaTElastic = 0.0
self._repetition = 1
self.Z = 0
self._virtualElementInteger = 0
self.Nom = ""
self.Rho = 0.0
self.A = 0.0
self.J = 0.0
self.K_Gauvin = 0.0
self.K_Monsel = 0.0
self.ef = 0.0
self.kf = 0.0
self.ep = 0.0
self.Int_PRZ = []
self.Int_PRZ_ABS = []
for dummy in range(3):
self.Int_PRZ.append(0.0)
self.Int_PRZ_ABS.append(0.0)
[docs] def read(self, file):
logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "read", file.tell())
tagID = TAG_ELEMENT_DATA
self.findTag(file, tagID)
self._version = self.readInt(file)
self._elementID = self.readInt(file)
self._weightFraction = self.readDouble(file)
self._atomicFraction = self.readDouble(file)
self._sigmaTElastic = self.readDouble(file)
self._repetition = self.readInt(file)
self.Z = self.readDouble(file)
self._virtualElementInteger = self.readInt(file)
self.Nom = self.readStrLength(file, 3)
self.Rho = self.readDouble(file)
self.A = self.readDouble(file)
self.J = self.readDouble(file)
self.K_Gauvin = self.readDouble(file)
self.K_Monsel = self.readDouble(file)
self.ef = self.readDouble(file)
self.kf = self.readDouble(file)
self.ep = self.readDouble(file)
# This is the intensities as displayed in the casino program.
self.Int_PRZ = []
for dummy in range(3):
value = self.readDouble(file)
self.Int_PRZ.append(value)
self.Int_PRZ_ABS = []
for dummy in range(3):
value = self.readDouble(file)
self.Int_PRZ_ABS.append(value)
[docs] def write(self, file):
raise NotImplementedError
assert getattr(file, 'mode', 'wb') == 'wb'
logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "write", file.tell())
def _modify(self, file):
logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "write", file.tell())
tagID = TAG_ELEMENT_DATA
self.findTag(file, tagID)
self.writeInt(file, self._version)
self.writeInt(file, self._elementID)
self.writeDouble(file, self._weightFraction)
self.writeDouble(file, self._atomicFraction)
self.writeDouble(file, self._sigmaTElastic)
self.writeInt(file, self._repetition)
self.writeDouble(file, self.Z)
self.writeInt(file, self._virtualElementInteger)
self.writeStrLength(file, self.Nom, 3)
self.writeDouble(file, self.Rho)
self.writeDouble(file, self.A)
self.writeDouble(file, self.J)
self.writeDouble(file, self.K_Gauvin)
self.writeDouble(file, self.K_Monsel)
self.writeDouble(file, self.ef)
self.writeDouble(file, self.kf)
self.writeDouble(file, self.ep)
# This is the intensities as displayed in the casino program.
assert len(self.Int_PRZ) == 3
for index in range(3):
value = self.Int_PRZ[index]
self.writeDouble(file, value)
assert len(self.Int_PRZ_ABS) == 3
for index in range(3):
value = self.Int_PRZ_ABS[index]
self.writeDouble(file, value)
[docs] def getAtomicNumber(self):
return self.Z
[docs] def getSymbol(self):
return self.Nom
[docs] def getTotalXrayIntensities(self):
intensities = {}
if self.Int_PRZ[0] > 0.0:
intensities.setdefault(LINE_K, {})
intensities[LINE_K][GENERATED] = self.Int_PRZ[0]
intensities[LINE_K][EMITTED] = self.Int_PRZ_ABS[0]
if self.Int_PRZ[1] > 0.0:
intensities.setdefault(LINE_L, {})
intensities[LINE_L][GENERATED] = self.Int_PRZ[1]
intensities[LINE_L][EMITTED] = self.Int_PRZ_ABS[1]
if self.Int_PRZ[2] > 0.0:
intensities.setdefault(LINE_M, {})
intensities[LINE_M][GENERATED] = self.Int_PRZ[2]
intensities[LINE_M][EMITTED] = self.Int_PRZ_ABS[2]
return intensities
[docs] def getTotalXrayIntensityByLineType(self, line, type=EMITTED):
if LINE_K.startswith(line[0]):
line = LINE_K
elif LINE_L.startswith(line[0]):
line = LINE_L
elif LINE_M.startswith(line[0]):
line = LINE_M
intensities = self.getTotalXrayIntensities()
return intensities[line][type]
[docs] def getRadialXrayDistribution(self):
"""
Return the radial x-ray distributions.
:note: Remove last value, because it is the accumulator for all out of range values.
"""
distributions = {}
if max(self.COUCHE_RADIAL_K) > 0.0:
distributions.setdefault(LINE_K, {})
distributions[LINE_K][GENERATED] = self.COUCHE_RADIAL_K[:-1]
distributions[LINE_K][EMITTED] = self.COUCHE_RADIAL_K_ABS[:-1]
if max(self.COUCHE_RADIAL_LIII) > 0.0:
distributions.setdefault(LINE_L, {})
distributions[LINE_L][GENERATED] = self.COUCHE_RADIAL_LIII[:-1]
distributions[LINE_L][EMITTED] = self.COUCHE_RADIAL_LIII_ABS[:-1]
if max(self.COUCHE_RADIAL_MV) > 0.0:
distributions.setdefault(LINE_M, {})
distributions[LINE_M][GENERATED] = self.COUCHE_RADIAL_MV[:-1]
distributions[LINE_M][EMITTED] = self.COUCHE_RADIAL_MV_ABS[:-1]
return distributions
[docs] def setElement(self, symbol, weightFraction=1.0, index=0):
_, rho, z, a, ef, kf, ep = NUATOM(symbol)
self.Z = z
self.Nom = symbol
self.Rho = rho
self.A = a
self.ef = ef
self.kf = kf
self.ep = ep
self.J = _computeJ(self.Z)
self.K = _computeK(self.Z)
[docs] def getComposition(self):
return self._composition
[docs] def getWeightFraction(self):
return self._composition.FWt
[docs] def setWeightFraction(self, weightFraction):
self._composition.setWeightFraction(weightFraction)
[docs] def getAtomicFraction(self):
return self._composition.FAt
[docs] def setAtomicFraction(self, atomicFraction):
self._composition.setAtomicFraction(atomicFraction)
self._composition.FAt = atomicFraction
[docs] def getMassDensity_g_cm3(self):
return self.Rho
[docs] def getRepetition(self):
return self._composition.Rep
[docs] def getAtomicWeight_g_mol(self):
return self.A
def _computeJ(atomicNumber):
import casinotools.fileformat.casino2.MeanIonizationPotential as MeanIonizationPotential
meanIonizationPotential = MeanIonizationPotential.MeanIonizationPotential(MeanIonizationPotential.MODEL_JOY)
return meanIonizationPotential.computeJ(atomicNumber)
def _computeK(atomicNumber):
k = 0.734 * math.pow(atomicNumber, 0.037)
return k
[docs]def NUATOM(symbol):
"""
Transcription du symbole atomique.
"""
rho = 0.0
z = 0
a = 0.0
ef = 0.0
kf = 0.0
ep = 0.0
fnuatom = 1
if len(symbol) == 1:
symbol += '\0'
assert len(symbol) == 2
if symbol[0] == 'A':
if symbol[1] == 'c' : z = 89;rho = 10.07;a = 227.0278;ef = 1.0;kf = 7.0e7;ep = 25;
elif symbol[1] == 'g' : z = 47; rho = 10.50; a = 107.868; ef = 5.5; kf = 1.19e8; ep = 15;
elif symbol[1] == 'l' : z = 13; rho = 2.70; a = 26.98154; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'm' : z = 95; rho = 13.6; a = 243; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'r' : z = 18; rho = 1.784; a = 39.948; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 's' : z = 33; rho = 5.72; a = 74.9216; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 't' : z = 85; rho = 0; a = 210; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'u' : z = 79; rho = 19.3; a = 196.9665; ef = 5.5; kf = 1.19e8; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'B' :
if symbol[1] == 'a' : z = 56; rho = 3.5; a = 137.33; ef = 1.0; kf = 7.0e7; ep = 7.2;
elif symbol[1] == '\0' : z = 5; rho = 2.34; a = 10.81; ef = 1.0; kf = 7.0e7; ep = 22.7;
elif symbol[1] == 'e' : z = 4; rho = 1.85; a = 9.01218; ef = 1.0; kf = 7.0e7; ep = 18.7;
elif symbol[1] == 'i' : z = 83; rho = 9.8; a = 209.0; ef = 1.0; kf = 7.0e7; ep = 14.2;
elif symbol[1] == 'k' : z = 97; rho = 0; a = 247; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'r' : z = 35; rho = 3.12; a = 79.904; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'C' :
if symbol[1] == 'a' : z = 20; rho = 1.56; a = 40.08; ef = 1.0; kf = 7.0e7; ep = 8.8;
elif symbol[1] == '\0' : z = 6; rho = 2.62; a = 12.011; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'd' : z = 48; rho = 8.65; a = 112.41; ef = 1.0; kf = 7.0e7; ep = 19.2;
elif symbol[1] == 'e' : z = 58; rho = 6.78; a = 140.12; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'f' : z = 98; rho = 0; a = 251; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'l' : z = 17; rho = 8.96; a = 35.453; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'm' : z = 96; rho = 13.511; a = 247; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'o' : z = 27; rho = 8.9; a = 58.9332; ef = 1.0; kf = 7.0e7; ep = 20.9;
elif symbol[1] == 'r' : z = 24; rho = 7.19; a = 51.996; ef = 1.0; kf = 7.0e7; ep = 24.9;
elif symbol[1] == 's' : z = 55; rho = 1.87; a = 132.9054; ef = 1.0; kf = 7.0e7; ep = 2.9;
elif symbol[1] == 'u' : z = 29; rho = 8.96; a = 63.546; ef = 7.0; kf = 1.35e8; ep = 19.3;
else: fnuatom = 0
elif symbol[0] == 'D' :
if symbol[1] == 'y' : z = 66; rho = 8.54; a = 160.5; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'E' :
if symbol[1] == 'r' : z = 68; rho = 9.05; a = 167.26; ef = 1.0; kf = 7.0e7; ep = 14;
elif symbol[1] == 's' : z = 99; rho = 0; a = 254; ep = 15;
elif symbol[1] == 'u' : z = 63; rho = 5.26; a = 151.96; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'F' :
if symbol[1] == 'e' : z = 26; rho = 7.86; a = 55.847; ef = 1.0; kf = 7.0e7; ep = 23;
elif symbol[1] == '\0' : z = 9; rho = 1.696; a = 18.9994; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'm' : z = 100; rho = 0; a = 257; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'r' : z = 87; rho = 0; a = 223; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'G' :
if symbol[1] == 'a' : z = 31; rho = 5.91; a = 69.72; ef = 1.0; kf = 7.0e7; ep = 13.8;
elif symbol[1] == 'd' : z = 64; rho = 7.89; a = 157.25; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'e' : z = 32; rho = 5.32; a = 72.59; ef = 1.0; kf = 7.0e7; ep = 16.2;
else: fnuatom = 0
elif symbol[0] == 'H' :
if symbol[1] == 'e' : z = 2; rho = 0.1787; a = 4.00260; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'f' : z = 72; rho = 13.1; a = 178.49; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'g' : z = 80; rho = 13.53; a = 200.59; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == '\0' : z = 1; rho = 0.0899; a = 1.0079; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'o' : z = 67; rho = 10.07; a = 164.9; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'I' :
if symbol[1] == '\0' : z = 53; rho = 4.92; a = 126.9045; ef = 1.0; kf = 7.0e7; ep = 11.4;
elif symbol[1] == 'n' : z = 49; rho = 7.31; a = 114.82; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'r' : z = 77; rho = 22.5; a = 192.22; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'K' :
if symbol[1] == '\0' : z = 19; rho = 0.86; a = 39.0983; ef = 1.0; kf = 7.0e7; ep = 3.7;
elif symbol[1] == 'r' : z = 36; rho = 3.74; a = 83.8; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'L' :
if symbol[1] == 'a' : z = 57; rho = 6.7; a = 138.9055; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'i' : z = 3; rho = 0.53; a = 6.941; ef = 4.7; kf = 1.1e8; ep = 7.1;
elif symbol[1] == 'r' : z = 103; rho = 0; a = 257; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'u' : z = 71; rho = 9.84; a = 174.967; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'M' :
if symbol[1] == 'd' : z = 101; rho = 0; a = 257; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'g' : z = 12; rho = 1.74; a = 24.305; ef = 1.0; kf = 7.0e7; ep = 10.3;
elif symbol[1] == 'n' : z = 25; rho = 7.43; a = 54.9380; ef = 1.0; kf = 7.0e7; ep = 21.6;
elif symbol[1] == 'o' : z = 42; rho = 10.2; a = 95.94; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'N' :
if symbol[1] == 'a' : z = 11; rho = 0.97; a = 22.98977; ef = 3.1; kf = 9.0e7; ep = 5.7;
elif symbol[1] == 'b' : z = 41; rho = 8.56; a = 92.9064; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'd' : z = 60; rho = 7; a = 144.24; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'e' : z = 10; rho = 0.901; a = 20.179; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'i' : z = 28; rho = 8.90; a = 58.7; ef = 1.0; kf = 7.0e7; ep = 20.7;
elif symbol[1] == '\0' : z = 7; rho = 1.251; a = 14.0067; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'o' : z = 102; rho = 0; a = 254; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'p' : z = 93; rho = 20.4; a = 237.0482; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'O' :
if symbol[1] == '\0' : z = 8; rho = 1.429; a = 15.9994; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 's' : z = 76; rho = 22.4; a = 190.2; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'P' :
if symbol[1] == 'a' : z = 91; rho = 15.4; a = 231.0359; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'b' : z = 82; rho = 11.4; a = 207.2; ef = 1.0; kf = 7.0e7; ep = 13;
elif symbol[1] == 'd' : z = 46; rho = 12; a = 106.4; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'm' : z = 61; rho = 6.475; a = 145; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'o' : z = 84; rho = 9.4; a = 210; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == '\0' : z = 15; rho = 1.827; a = 30.97376; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'r' : z = 59; rho = 6.77; a = 140.9077; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 't' : z = 78; rho = 21.4; a = 195.09; ef = 1.0; kf = 7.0e7; ep = 35;
elif symbol[1] == 'u' : z = 94; rho = 19.8; a = 244; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'R' :
if symbol[1] == 'a' : z = 88; rho = 5; a = 226.0254; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'b' : z = 37; rho = 1.53; a = 85.4678; ef = 1.0; kf = 7.0e7; ep = 3.41;
elif symbol[1] == 'e' : z = 75; rho = 21; a = 186.207; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'h' : z = 45; rho = 12.4; a = 102.9055; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'n' : z = 86; rho = 9.91; a = 222; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'u' : z = 44; rho = 12.2; a = 101.07; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'S' :
if symbol[1] == 'b' : z = 51; rho = 6.68; a = 121.75; ef = 1.0; kf = 7.0e7; ep = 15.2;
elif symbol[1] == 'c' : z = 21; rho = 3; a = 44.9559; ef = 1.0; kf = 7.0e7; ep = 14;
elif symbol[1] == 'e' : z = 34; rho = 4.8; a = 78.96; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'i' : z = 14; rho = 2.33; a = 28.0855; ef = .555; kf = 4.0e7; ep = 16.7;
elif symbol[1] == 'm' : z = 62; rho = 7.54; a = 150.4; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'n' : z = 50; rho = 7.3; a = 118.69; ef = 1.0; kf = 7.0e7; ep = 13.4;
elif symbol[1] == 'r' : z = 38; rho = 2.6; a = 87.62; ef = 1.0; kf = 7.0e7; ep = 8.;
elif symbol[1] == '\0' : z = 16; rho = 2.07; a = 32.06; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'T' :
if symbol[1] == 'a' : z = 73; rho = 16.6; a = 180.9479; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'b' : z = 65; rho = 8.27; a = 158.9254; ef = 1.0; kf = 7.0e7; ep = 13.3;
elif symbol[1] == 'c' : z = 43; rho = 11.5; a = 98.91; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'e' : z = 52; rho = 6.24; a = 127.6; ef = 1.0; kf = 7.0e7; ep = 17;
elif symbol[1] == 'h' : z = 90; rho = 11.7; a = 232.0381; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'i' : z = 22; rho = 4.5; a = 47.9; ef = 1.0; kf = 7.0e7; ep = 17.9;
elif symbol[1] == 'l' : z = 81; rho = 11.85; a = 204.37; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == 'm' : z = 69; rho = 9.33; a = 168.9342; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'U' :
if symbol[1] == '\0' : z = 92; rho = 18.9; a = 238.029; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'V' :
if symbol[1] == 'a': z = 0; rho = 1; a = 1; ef = 0; kf = 0; ep = 0;
elif symbol[1] == '\0' : z = 23; rho = 5.8; a = 50.9415; ef = 1.0; kf = 7.0e7; ep = 21.8;
else: fnuatom = 0
elif symbol[0] == 'W' :
if symbol[1] == '\0' : z = 74; rho = 19.3; a = 183.85; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'X' :
if symbol[1] == 'e' : z = 54; rho = 5.89; a = 131.3; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
elif symbol[0] == 'Y' :
if symbol[1] == 'b' : z = 70; rho = 6.98; a = 173.04; ef = 1.0; kf = 7.0e7; ep = 15;
elif symbol[1] == '\0' : z = 39; rho = 4.5; a = 88.9059; ef = 1.0; kf = 7.0e7; ep = 12.5;
else: fnuatom = 0
elif symbol[0] == 'Z' :
if symbol[1] == 'n' : z = 30; rho = 7.14; a = 65.38; ef = 1.0; kf = 7.0e7; ep = 17.2;
elif symbol[1] == 'r' : z = 40; rho = 6.49; a = 91.22; ef = 1.0; kf = 7.0e7; ep = 15;
else: fnuatom = 0
else:
fnuatom = 0;
return fnuatom, rho, z, a, ef, kf, ep