Source code for casinotools.fileformat.casino2.SimulationOptions

#!/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

# Third party modules.

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

# Globals and constants variables.
TAG_BSE_COEFFICIENT = b"*BECOEFF%%%%%%%"
TAG_PHYSIC_MODELS = b"*PHYSMODELS%%%%"
TAG_MICROSCOPE_SETUP = b"*MICROSETUP%%%%"
TAG_XRAY = b"*XRAY%%%%%%%%%%"
TAG_SMULATION_OPTIONS = b"*SIMOPTIONS%%%%"
TAG_DISPLAY_OPTIONS = b"*DISPLAYOPTIONS"
TAG_REGION_INFO = b"*REGIONINFO%%%%"
TAG_ENERGY_POSITIONS = b"*ENERGYBYPOS%%%"
TAG_DISTRIBUTION_SELECTION = b"*DISTSELECT%%%%"
TAG_DISTRIBUTION_POINTS = b"*DISTNUMPTS%%%%"
TAG_INTERRUPTED_SIMULATION_DATA = b"*INTSIMDATA%%%%"
TAG_SCALE_GRID = b"*SCALEGRID%%%%%"

DIRECTION_COSINES_SOUM = 0
DIRECTION_COSINES_DROUIN = 1

[docs]def getDirectionCosinesString(type): if type == DIRECTION_COSINES_SOUM: return 'Soum et al.' elif type == DIRECTION_COSINES_DROUIN: return 'Drouin' else: raise ValueError('Unknown direction cosines')
CROSS_SECTION_MOTT_JOY = 0 CROSS_SECTION_MOTT_EQUATION = 1 CROSS_SECTION_MOTT_BROWNING = 2 CROSS_SECTION_MOTT_RUTHERFORD = 3
[docs]def getElasticCrossSectionTypeString(type): if type == CROSS_SECTION_MOTT_JOY: return "Czyzewski" elif type == CROSS_SECTION_MOTT_EQUATION: return "Drouin" elif type == CROSS_SECTION_MOTT_BROWNING: return "Browning" elif type == CROSS_SECTION_MOTT_RUTHERFORD: return "Rutherford" else: raise ValueError('Unknown elastic cross section')
IONIZATION_CROSS_SECTION_GAUVIN = 0 IONIZATION_CROSS_SECTION_POUCHOU = 1 IONIZATION_CROSS_SECTION_BROWN_POWELL = 2 IONIZATION_CROSS_SECTION_CASNATI = 3 IONIZATION_CROSS_SECTION_GRYZINSKI = 4 IONIZATION_CROSS_SECTION_JAKOBY = 5
[docs]def getIonizationCrossSectionTypeString(type): if type == IONIZATION_CROSS_SECTION_GAUVIN: return "Gauvin" elif type == IONIZATION_CROSS_SECTION_POUCHOU: return "Pouchou" elif type == IONIZATION_CROSS_SECTION_BROWN_POWELL: return "BrownPowell" elif type == IONIZATION_CROSS_SECTION_CASNATI: return "Casnati" elif type == IONIZATION_CROSS_SECTION_GRYZINSKI: return "Gryzinski" elif type == IONIZATION_CROSS_SECTION_JAKOBY: return "Jakoby" else: raise ValueError('Unknown ionization cross section')
IONIZATION_POTENTIAL_JOY = 0 IONIZATION_POTENTIAL_BERGER = 1 IONIZATION_POTENTIAL_HOVINGTON = 2
[docs]def getIonizationPotentialTypeString(type): if type == IONIZATION_POTENTIAL_JOY: return "Joy" elif type == IONIZATION_POTENTIAL_BERGER: return "Berger" elif type == IONIZATION_POTENTIAL_HOVINGTON: return "Hovington" else: raise ValueError('Unknown ionization potential')
RANDOM_NUMBER_GENERATOR_PRESS_ET_AL = 0 RANDOM_NUMBER_GENERATOR_MERSENNE_TWISTER = 1
[docs]def getRandomNumberGeneratorString(type): if type == RANDOM_NUMBER_GENERATOR_PRESS_ET_AL: return 'Press et al.' elif type == RANDOM_NUMBER_GENERATOR_MERSENNE_TWISTER: return 'Mersenne - Twister' else: raise ValueError("Unknown random number generator")
ENERGY_LOSS_JOY_LUO = 0
[docs]def getEnergyLossString(type): if type == ENERGY_LOSS_JOY_LUO: return 'Joy and Luo' else: raise ValueError('Unknown energy loss')
[docs]class SimulationOptions(FileReaderWriterTools.FileReaderWriterTools):
[docs] def read(self, file, version): assert getattr(file, 'mode', 'rb') == 'rb' logging.debug("File position at the start of %s.%s: %i", self.__class__.__name__, "read", file.tell()) tagID = TAG_BSE_COEFFICIENT if not self.findTag(file, tagID): raise IOError self._bseCoefficient = self.readDouble(file) # Selected Physical Model variables tagID = TAG_PHYSIC_MODELS if not self.findTag(file, tagID): raise IOError self.FRan = self.readInt(file) self.FDeds = self.readInt(file) self.FSecTotal = self.readInt(file) self.FSecPartiel = self.readInt(file) self.FCosDirect = self.readInt(file) self.FSecIon = self.readInt(file) self.FPotMoy = self.readInt(file) # Microscope SetUp tagID = TAG_MICROSCOPE_SETUP if not self.findTag(file, tagID): raise IOError self.Beam_angle = self.readDouble(file) self.Beam_Diameter = self.readDouble(file) self.Electron_Number = self.readLong(file) self.KEV_End = self.readDouble(file) self.KEV_Start = self.readDouble(file) self.KEV_Step = self.readDouble(file) self.Scan_Image = self.readInt(file) POS_End = self.readDouble(file) self._positionEnd_nm = POS_End POS_Start = self.readDouble(file) self._positionStart_nm = POS_Start # In CASINO POS_NStep is the step length. POS_NStep = self.readDouble(file) self._positionStep_nm = POS_NStep # In CASINO POS_Step is the number of steps and not used. POS_Step = self.readDouble(file) self._positionNumberStep = POS_Step if version >= 21: self.Scan_Energy = self.readInt(file) if version >= 25: self.UseEnBack = self.readBool(file) self.WorkDist = self.readDouble(file) self.DetectScaleX = self.readDouble(file) self.DetectScaleY = self.readDouble(file) if self.UseEnBack: self._matrixDetector = [] for dummy1 in range(101): row = [] for dummy2 in range(101): value = self.readDouble(file) row.append(value) self._matrixDetector.append(row) # XRay tagID = TAG_XRAY if not self.findTag(file, tagID): raise IOError self.FEmissionRX = self.readInt(file) self.NbreCoucheRX = self.readLong(file) self.EpaisCouche = self.readDouble(file) self.TOA = self.readDouble(file) self.PhieRX = self.readFloat(file) self.RkoMax = self.readDouble(file) if version >= 22: self.RkoMaxW = self.readDouble(file) # Simulation options tagID = TAG_SMULATION_OPTIONS if not self.findTag(file, tagID): raise IOError self.Eminimum = self.readDouble(file) self.Electron_Display = self.readLong(file) self.Electron_Save = self.readLong(file) self.Memory_Keep = self.readInt(file) self.First = self.readInt(file) self.Keep_Sim = self.readInt(file) # Display Options tagID = TAG_DISPLAY_OPTIONS if not self.findTag(file, tagID): raise IOError self.Display_Colision = self.readInt(file) self.Display_Color = self.readInt(file) self.Display_Projection = self.readInt(file) self.Display_Back = self.readInt(file) self.Display_Refresh = self.readInt(file) self.Minimum_Trajectory_Display_Distance = self.readDouble(file) # Region Info tagID = TAG_REGION_INFO if not self.findTag(file, tagID): raise IOError self.FForme = self.readInt(file) self.Total_Thickness = self.readDouble(file) self.Half_Width = self.readDouble(file) # Energy by position if version >= 22: tagID = TAG_ENERGY_POSITIONS if not self.findTag(file, tagID): raise IOError self.ShowFadedSqr = self.readInt(file) self.ShowRegions = self.readInt(file) self.SetPointstoRelativePosition = self.readInt(file) self.Summation = self.readInt(file) self.XZorXY = self.readInt(file) self.Yplane = self.readInt(file) self.Zplane = self.readInt(file) # Distribution selection tagID = TAG_DISTRIBUTION_SELECTION if not self.findTag(file, tagID): raise IOError self.FDZmax = self.readInt(file) self.FDenr = self.readInt(file) self.FDent = self.readInt(file) self.FDPoire = self.readInt(file) self.FDrsr = self.readInt(file) self.FDrsrLit = self.readInt(file) self.FDncr = self.readInt(file) self.FDEpos = 0 if version >= 22: self.FDEpos = self.readInt(file) if version >= 25: self.FDbang = self.readInt(file) if version >= 26: self.FDAngleVSEnergie = self.readInt(file) # Distribution points tagID = TAG_DISTRIBUTION_POINTS if not self.findTag(file, tagID): raise IOError self.NbPointDZMax = self.readLong(file) self.NbPointDENR = self.readLong(file) self.NbPointDENT = self.readLong(file) self.NbPointDRSR = self.readLong(file) self.NbPointDNCR = self.readLong(file) if version >= 22: self.NbPointDEpos_X = self.readLong(file) self.NbPointDEpos_Y = self.readLong(file) self.NbPointDEpos_Z = self.readLong(file) if version >= 25: self.NbPointDBANG = self.readLong(file) if version >= 26: self.NbPointDAngleVSEnergie = self.readLong(file) if version >= 23: self.RangeFinder = self.readInt(file) self.RangeSafetyFactor = self.readDouble(file) self.FixedRange = self.readDouble(file) if version >= 24: self.BEMin_Angle = self.readDouble(file) self.BEMax_Angle = self.readDouble(file) self.FEFilter = self.readInt(file) self.EFilterMax = self.readDouble(file) self.EFilterMin = self.readDouble(file) self.EFilterVal = [] for dummy in range(101): value = self.readDouble(file) self.EFilterVal.append(value) if version >= 2040601: self.FDZmax = self.readInt(file) self.FDZmaxLog = self.readInt(file) self.NbPointDZMax = self.readLong(file) self.DZmaxMax = self.readDouble(file) self.DZmaxMin = self.readDouble(file) self.FDenr = self.readInt(file) self.FDenrLog = self.readInt(file) self.NbPointDENR = self.readLong(file) self.DenrMax = self.readDouble(file) self.DenrMin = self.readDouble(file) self.FDent = self.readInt(file) self.FDentLog = self.readInt(file) self.NbPointDENT = self.readLong(file) self.DentMax = self.readDouble(file) self.DentMin = self.readDouble(file) self.FDrsr = self.readInt(file) self.FDrsrLog = self.readInt(file) self.NbPointDRSR = self.readLong(file) self.DrsrMax = self.readDouble(file) self.DrsrMin = self.readDouble(file) self.FDbang = self.readInt(file) self.FDbangLog = self.readInt(file) self.NbPointDBANG = self.readLong(file) self.DbangMax = self.readDouble(file) self.DbangMin = self.readDouble(file) self.FDAngleVSEnergie = self.readInt(file) self.FDAngleVSEnergieLog = self.readInt(file) self.NbPointDAngleVSEnergie = self.readLong(file) self.DAngleVSEnergieMax = self.readDouble(file) self.DAngleVSEnergieMin = self.readDouble(file) # Interrupted Simulation Data tagID = TAG_INTERRUPTED_SIMULATION_DATA if not self.findTag(file, tagID): raise IOError self.Eo = self.readDouble(file) self.NoElec = self.readLong(file) self.PositionF_X = self.readDouble(file) self.PositionF_Y = self.readDouble(file) self.Theta0 = self.readDouble(file) self.Phi0 = self.readDouble(file) self.num_at = self.readLong(file) if version > 23: self.Tot_Ret = self.readDouble(file) else: self.Tot_Ret = self.readLong(file) self.MinX = self.readDouble(file) self.MinY = self.readDouble(file) self.MinZ = self.readDouble(file) self.MaxX = self.readDouble(file) self.MaxY = self.readDouble(file) self.MaxZ = self.readDouble(file) self.NbCollMax = self.readDouble(file) self.NbCollMax2 = self.readDouble(file) self.RatioX = self.readDouble(file) self.RatioY = self.readDouble(file) self.RatioZ = self.readDouble(file) if version >= 25: self.Tot_Ret_En = self.readDouble(file) # Scale & grid data tagID = TAG_SCALE_GRID if not self.findTag(file, tagID): raise IOError self.NumVtabs = self.readInt(file) self.NumHtabs = self.readInt(file)
[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()) tagID = TAG_BSE_COEFFICIENT self.addTagOld(file, tagID) self.writeDouble(file, self._bseCoefficient) tagID = TAG_PHYSIC_MODELS self.addTagOld(file, tagID) self.writeInt(file, self.FRan) self.writeInt(file, self.FDeds) self.writeInt(file, self.FSecTotal) self.writeInt(file, self.FSecPartiel) self.writeInt(file, self.FCosDirect) self.writeInt(file, self.FSecIon) self.writeInt(file, self.FPotMoy) tagID = TAG_MICROSCOPE_SETUP self.addTagOld(file, tagID) self.writeDouble(file, self.Beam_angle) self.writeDouble(file, self.Beam_Diameter) self.writeLong(file, self.Electron_Number) self.writeDouble(file, self.KEV_End) self.writeDouble(file, self.KEV_Start) self.writeDouble(file, self.KEV_Step) self.writeInt(file, self.Scan_Image) POS_End = self._positionEnd_nm self.writeDouble(file, POS_End) POS_Start = self._positionStart_nm self.writeDouble(file, POS_Start) # In CASINO POS_NStep is the step length. POS_NStep = self._positionStep_nm self.writeDouble(file, POS_NStep) # In CASINO POS_Step is the number of steps and not used. POS_Step = self._positionNumberStep self.writeDouble(file, POS_Step) self.writeInt(file, self.Scan_Energy) self.writeBool(file, self.UseEnBack) self.writeDouble(file, self.WorkDist) self.writeDouble(file, self.DetectScaleX) self.writeDouble(file, self.DetectScaleY) if self.UseEnBack: assert len(self._matrixDetector) == 101 for index1 in range(101): row = self._matrixDetector[index1] assert len(row) == 101 for index2 in range(101): value = row[index2] self.writeDouble(file, value) tagID = TAG_XRAY self.addTagOld(file, tagID) self.writeInt(file, self.FEmissionRX) self.writeLong(file, self.NbreCoucheRX) self.writeDouble(file, self.EpaisCouche) self.writeDouble(file, self.TOA) self.writeFloat(file, self.PhieRX) self.writeDouble(file, self.RkoMax) self.writeDouble(file, self.RkoMaxW) tagID = TAG_SMULATION_OPTIONS self.addTagOld(file, tagID) self.writeDouble(file, self.Eminimum) self.writeLong(file, self.Electron_Display) self.writeLong(file, self.Electron_Save) self.writeInt(file, self.Memory_Keep) self.writeInt(file, self.First) self.writeInt(file, self.Keep_Sim) tagID = TAG_DISPLAY_OPTIONS self.addTagOld(file, tagID) self.writeInt(file, self.Display_Colision) self.writeInt(file, self.Display_Color) self.writeInt(file, self.Display_Projection) self.writeInt(file, self.Display_Back) self.writeInt(file, self.Display_Refresh) self.writeDouble(file, self.Minimum_Trajectory_Display_Distance) tagID = TAG_REGION_INFO self.addTagOld(file, tagID) self.writeInt(file, self.FForme) self.writeDouble(file, self.Total_Thickness) self.writeDouble(file, self.Half_Width) tagID = TAG_ENERGY_POSITIONS self.addTagOld(file, tagID) self.writeInt(file, self.ShowFadedSqr) self.writeInt(file, self.ShowRegions) self.writeInt(file, self.SetPointstoRelativePosition) self.writeInt(file, self.Summation) self.writeInt(file, self.XZorXY) self.writeInt(file, self.Yplane) self.writeInt(file, self.Zplane) tagID = TAG_DISTRIBUTION_SELECTION self.addTagOld(file, tagID) self.writeInt(file, self.FDZmax) self.writeInt(file, self.FDenr) self.writeInt(file, self.FDent) self.writeInt(file, self.FDPoire) self.writeInt(file, self.FDrsr) self.writeInt(file, self.FDrsrLit) self.writeInt(file, self.FDncr) self.writeInt(file, self.FDEpos) self.writeInt(file, self.FDbang) self.writeInt(file, self.FDAngleVSEnergie) tagID = TAG_DISTRIBUTION_POINTS self.addTagOld(file, tagID) self.writeLong(file, self.NbPointDZMax) self.writeLong(file, self.NbPointDENR) self.writeLong(file, self.NbPointDENT) self.writeLong(file, self.NbPointDRSR) self.writeLong(file, self.NbPointDNCR) self.writeLong(file, self.NbPointDEpos_X) self.writeLong(file, self.NbPointDEpos_Y) self.writeLong(file, self.NbPointDEpos_Z) self.writeLong(file, self.NbPointDBANG) self.writeLong(file, self.NbPointDAngleVSEnergie) self.writeInt(file, self.RangeFinder) self.writeDouble(file, self.RangeSafetyFactor) self.writeDouble(file, self.FixedRange) self.writeDouble(file, self.BEMin_Angle) self.writeDouble(file, self.BEMax_Angle) self.writeInt(file, self.FEFilter) self.writeDouble(file, self.EFilterMax) self.writeDouble(file, self.EFilterMin) assert len(self.EFilterVal) == 101 for index in range(101): self.writeDouble(file, self.EFilterVal[index]) self.writeInt(file, self.FDZmax) self.writeInt(file, self.FDZmaxLog) self.writeLong(file, self.NbPointDZMax) self.writeDouble(file, self.DZmaxMax) self.writeDouble(file, self.DZmaxMin) self.writeInt(file, self.FDenr) self.writeInt(file, self.FDenrLog) self.writeLong(file, self.NbPointDENR) self.writeDouble(file, self.DenrMax) self.writeDouble(file, self.DenrMin) self.writeInt(file, self.FDent) self.writeInt(file, self.FDentLog) self.writeLong(file, self.NbPointDENT) self.writeDouble(file, self.DentMax) self.writeDouble(file, self.DentMin) self.writeInt(file, self.FDrsr) self.writeInt(file, self.FDrsrLog) self.writeLong(file, self.NbPointDRSR) self.writeDouble(file, self.DrsrMax) self.writeDouble(file, self.DrsrMin) self.writeInt(file, self.FDbang) self.writeInt(file, self.FDbangLog) self.writeLong(file, self.NbPointDBANG) self.writeDouble(file, self.DbangMax) self.writeDouble(file, self.DbangMin) self.writeInt(file, self.FDAngleVSEnergie) self.writeInt(file, self.FDAngleVSEnergieLog) self.writeLong(file, self.NbPointDAngleVSEnergie) self.writeDouble(file, self.DAngleVSEnergieMax) self.writeDouble(file, self.DAngleVSEnergieMin) tagID = TAG_INTERRUPTED_SIMULATION_DATA self.addTagOld(file, tagID) self.writeDouble(file, self.Eo) self.writeLong(file, self.NoElec) self.writeDouble(file, self.PositionF_X) self.writeDouble(file, self.PositionF_Y) self.writeDouble(file, self.Theta0) self.writeDouble(file, self.Phi0) self.writeLong(file, self.num_at) self.writeDouble(file, self.Tot_Ret) self.writeDouble(file, self.MinX) self.writeDouble(file, self.MinY) self.writeDouble(file, self.MinZ) self.writeDouble(file, self.MaxX) self.writeDouble(file, self.MaxY) self.writeDouble(file, self.MaxZ) self.writeDouble(file, self.NbCollMax) self.writeDouble(file, self.NbCollMax2) self.writeDouble(file, self.RatioX) self.writeDouble(file, self.RatioY) self.writeDouble(file, self.RatioZ) self.writeDouble(file, self.Tot_Ret_En) tagID = TAG_SCALE_GRID self.addTagOld(file, tagID) self.writeInt(file, self.NumVtabs) self.writeInt(file, self.NumHtabs)
[docs] def setNumberElectrons(self, numberElectrons): self.Electron_Number = numberElectrons
[docs] def getNumberElectrons(self): return self.Electron_Number
[docs] def setIncidentEnergy_keV(self, energy_keV): if self.Scan_Energy == False: self.KEV_End = energy_keV self.KEV_Step = 1.0 self.KEV_Start = energy_keV
[docs] def getIncidentEnergy_keV(self, index=None): if index == None: return self.KEV_Start else: incidentEnergy_keV = self.KEV_Start + index * self.KEV_Step if incidentEnergy_keV <= self.KEV_End: return incidentEnergy_keV else: raise ValueError
[docs] def setTOA_deg(self, toa_deg): self.TOA = toa_deg
[docs] def getTOA_deg(self): return self.TOA
[docs] def setBeamAngle_deg(self, beamAngle_deg): self.Beam_angle = beamAngle_deg
[docs] def getBeamAngle_deg(self): return self.TOA
[docs] def getNumberXRayLayers(self): return self.NbreCoucheRX
[docs] def setDirectionCosines(self, directionCosinesModel): self.FCosDirect = directionCosinesModel
[docs] def getDirectionCosines(self): return self.FCosDirect
[docs] def setTotalElectronElasticCrossSection(self, crossSectionModel): self.FSecTotal = crossSectionModel
[docs] def getTotalElectronElasticCrossSection(self): return self.FSecTotal
[docs] def setPartialElectronElasticCrossSection(self, crossSectionModel): self.FSecPartiel = crossSectionModel
[docs] def getPartialElectronElasticCrossSection(self): return self.FSecPartiel
[docs] def setElasticCrossSectionType(self, crossSectionModel): self.FSecTotal = crossSectionModel self.FSecPartiel = crossSectionModel
[docs] def setIonizationCrossSectionType(self, type): self.FSecIon = type
[docs] def getIonizationCrossSectionType(self): return self.FSecIon
[docs] def setIonizationPotentialType(self, type): self.FPotMoy = type
[docs] def getIonizationPotentialType(self): return self.FPotMoy
[docs] def setRandomNumberGeneratorType(self, type): self.FRan = type
[docs] def getRandomNumberGeneratorType(self): return self.FRan
[docs] def setEnergyLossType(self, type): self.FDeds = type
[docs] def getEnergyLossType(self): return self.FDeds
[docs] def setTotalThickness_nm(self, totalThickness_nm): self.Total_Thickness = totalThickness_nm
[docs] def getBseCoefficient(self): return self._bseCoefficient
[docs] def getLinescanParameters(self): parameters = (self._positionStart_nm, self._positionEnd_nm, self._positionNumberStep, self._positionStep_nm) return parameters
[docs] def setLinescanParameters(self, start_nm, end_nm, step_nm): """ Sets the linescan parameters. If the beam is stationary, use :meth:`.setPosition` instead. .. note:: The CASINO v2 code is very bad with naming variables. The POS_NStep is actually the step length and the POS_Step is not used. The correct variable are used in the read and write methods. :arg start_nm: start position (in nm) :arg end_nm: end position (in nm) :arg step_nm: step length (in nm) """ nstep = (end_nm - start_nm) / step_nm self.Scan_Image = 1 # Turn on the line scan mode self._positionStart_nm = start_nm self._positionEnd_nm = end_nm self._positionNumberStep = nstep self._positionStep_nm = step_nm
[docs] def setPosition(self, pos_nm): """ Sets the position of the beam. :arg pos_nm: position of the beam (in nm) """ self.Scan_Image = 0 # Turn off the line scan mode self._positionStart_nm = pos_nm self._positionEnd_nm = pos_nm self._positionNumberStep = 1 self._positionStep_nm = 1.0 # Cannot be 0.0 as Casino2 returns "Out of memory" error
[docs] def getMaximumDepth_nm(self): return self.RkoMax
[docs] def getMaximumLateralWidth(self): return self.RkoMaxW