Source code for pymcxray.FileFormat.MicroscopeParameters

#!/usr/bin/env python
"""
.. py:currentmodule:: FileFormat.MicroscopeParameters
.. moduleauthor:: Hendrix Demers <hendrix.demers@mail.mcgill.ca>

MCXRay microscope parameters input file.
"""

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

# Subversion informations for the file.
__svnRevision__ = "$Revision$"
__svnDate__ = "$Date$"
__svnId__ = "$Id$"

# Standard library modules.
import copy

# Third party modules.

# Local modules.

# Project modules
import pymcxray.FileFormat.Version as Version
from pymcxray.FileFormat.FileReaderWriterTools import reduceAfterDot

# Globals and constants variables.
KEY_BEAM_ENERGY_keV = "BeamEnergy"
KEY_BEAM_CURRENT_A = "BeamCurrent"
KEY_BEAM_TIME_s = "AcquisitionTime"
KEY_BEAM_DIAMETER_A = "BeamDiameter"
KEY_BEAM_POSITION_X_A = "BeamPosX"
KEY_BEAM_POSITION_Y_A = "BeamPosY"
KEY_BEAM_TILT_deg = "BeamTilt"
KEY_BEAM_STANDARD_DEVIATION_A = "BeamStandardDeviation"
KEY_DETECTOR_CRYSTAL_ATOM = "DetectorCrystalAtom"
KEY_DETECTOR_CRYSTAL_THICKNESS_cm = "DetectorCrystalThickness"
KEY_DETECTOR_CRYSTAL_RADIUS_cm = "DetectorCrystalRadius"
KEY_DETECTOR_CRYSTAL_DISTANCE_cm = "DetectorCrystalDistance"
KEY_DETECTOR_DEAD_LAYER_A = "DetectorDeadLayer"
KEY_DETECTOR_DIFFUSION_LENGHT_A = "DetectorDiffusionLenght"
KEY_DETECTOR_SURFACE_QUALITY = "DetectorSurfaceQuality"
KEY_DETECTOR_NOISE_eV = "DetectorNoise"
KEY_DETECTOR_TOA_deg = "DetectorTOA"
KEY_DETECTOR_CHANNEL_WIDTH_eV = "DetectorChannelWidth"
KEY_DETECTOR_PITCH_deg = "DetectorPitch"
KEY_DETECTOR_BF_LOW_rad = "DetectorBFLow"
KEY_DETECTOR_BF_HIGH_RAD = "DetectorBFHigh"
KEY_DETECTOR_DF_LOW_rad = "DetectorDFLow"
KEY_DETECTOR_DF_HIGH_rad = "DetectorDFHigh"
KEY_DETECTOR_HAADF_LOW_rad = "DetectorHAADFLow"
KEY_DETECTOR_HAADF_HIGH_rad = "DetectorHAADFHigh"

[docs]class MicroscopeParameters(object): def __init__(self): self.version = copy.deepcopy(Version.CURRENT_VERSION) self._keys = self._createKeys() self._parameters = {} self.defaultValues() def _createKeys(self): keys = [] keys.append(KEY_BEAM_ENERGY_keV) keys.append(KEY_BEAM_CURRENT_A) keys.append(KEY_BEAM_TIME_s) keys.append(KEY_BEAM_DIAMETER_A) keys.append(KEY_BEAM_POSITION_X_A) keys.append(KEY_BEAM_POSITION_Y_A) keys.append(KEY_BEAM_TILT_deg) keys.append(KEY_BEAM_STANDARD_DEVIATION_A) keys.append(KEY_DETECTOR_CRYSTAL_ATOM) keys.append(KEY_DETECTOR_CRYSTAL_THICKNESS_cm) keys.append(KEY_DETECTOR_CRYSTAL_RADIUS_cm) keys.append(KEY_DETECTOR_CRYSTAL_DISTANCE_cm) keys.append(KEY_DETECTOR_DEAD_LAYER_A) keys.append(KEY_DETECTOR_DIFFUSION_LENGHT_A) keys.append(KEY_DETECTOR_SURFACE_QUALITY) keys.append(KEY_DETECTOR_NOISE_eV) keys.append(KEY_DETECTOR_TOA_deg) #keys.append(KEY_DETECTOR_CHANNEL_WIDTH_eV) keys.append(KEY_DETECTOR_PITCH_deg) keys.append(KEY_DETECTOR_BF_LOW_rad) keys.append(KEY_DETECTOR_BF_HIGH_RAD) keys.append(KEY_DETECTOR_DF_LOW_rad) keys.append(KEY_DETECTOR_DF_HIGH_rad) keys.append(KEY_DETECTOR_HAADF_LOW_rad) keys.append(KEY_DETECTOR_HAADF_HIGH_rad) return keys
[docs] def defaultValues(self): self.beamEnergy_keV = 20.0 self.beamCurrent_A = 1e-10 self.time_s = 100.0 self.beamDiameter_A = 10.0 self.beamPositionX_A = 0.0 self.beamPositionY_A = 0.0 self.beamTilt_deg = 0.0 self.beamStandardDeviation_A = 3.03030303030303 self.detectorCrystalAtomSymbol = 'Si' self.detectorCrystalThickness_cm = 0.3 self.detectorCrystalRadius_cm = 0.3 self.detectorCrystalDistance_cm = 4.0 self.detectorDeadLayer_A = 200.0 self.detectorDiffusionLenght_A = 0.5 self.detectorSurfaceQuality = 1.0 self.detectorNoise_eV = 50.0 self.detectorTOA_deg = 40.0 self.detectorPitch_deg = 90.0 self.detectorBFLow_rad = 0.0 self.detectorBFHigh_rad = 0.01 self.detectorDFLow_rad = 0.02 self.detectorDFHigh_rad = 0.1 self.detectorHAADFLow_rad = 0.15 self.detectorHAADFHigh_rad = 0.3 self.detectorChannelWidth_eV = 5.0
def _createExtractMethod(self): extractMethods = {} extractMethods[KEY_BEAM_ENERGY_keV] = float extractMethods[KEY_BEAM_CURRENT_A] = float extractMethods[KEY_BEAM_TIME_s] = float extractMethods[KEY_BEAM_DIAMETER_A] = float extractMethods[KEY_BEAM_POSITION_X_A] = float extractMethods[KEY_BEAM_POSITION_Y_A] = float extractMethods[KEY_BEAM_TILT_deg] = float extractMethods[KEY_BEAM_STANDARD_DEVIATION_A] = float extractMethods[KEY_DETECTOR_CRYSTAL_ATOM] = str extractMethods[KEY_DETECTOR_CRYSTAL_THICKNESS_cm] = float extractMethods[KEY_DETECTOR_CRYSTAL_RADIUS_cm] = float extractMethods[KEY_DETECTOR_CRYSTAL_DISTANCE_cm] = float extractMethods[KEY_DETECTOR_DEAD_LAYER_A] = float extractMethods[KEY_DETECTOR_DIFFUSION_LENGHT_A] = float extractMethods[KEY_DETECTOR_SURFACE_QUALITY] = float extractMethods[KEY_DETECTOR_NOISE_eV] = float extractMethods[KEY_DETECTOR_TOA_deg] = float extractMethods[KEY_DETECTOR_CHANNEL_WIDTH_eV] = float extractMethods[KEY_DETECTOR_PITCH_deg] = float extractMethods[KEY_DETECTOR_BF_LOW_rad] = float extractMethods[KEY_DETECTOR_BF_HIGH_RAD] = float extractMethods[KEY_DETECTOR_DF_LOW_rad] = float extractMethods[KEY_DETECTOR_DF_HIGH_rad] = float extractMethods[KEY_DETECTOR_HAADF_LOW_rad] = float extractMethods[KEY_DETECTOR_HAADF_HIGH_rad] = float return extractMethods
[docs] def read(self, filepath): self.version.readFromFile(filepath) lines = open(filepath, 'r').readlines() extractMethods = self._createExtractMethod() for line in lines: line = line.strip() for key in self._keys: if line.startswith(key): items = line.split('=') self._parameters[key] = extractMethods[key](items[-1])
[docs] def write(self, filepath): outputFile = open(filepath, 'w') self._writeHeader(outputFile) self.version.writeLine(outputFile) formats = self._createFormats() for key in self._createKeys(): value = formats[key](self._parameters[key]) if "e-" in value: value = value.replace('e-', 'e-0') if "e+" in value: value = value.replace('e+', 'e+0') line = "%s=%s\n" % (key, value) outputFile.write(line)
def _writeHeader(self, outputFile): headerLines = [ "********************************************************************************", "*** MICROSCOPE", "***", "*** BeamEnergy = Tension of the collimated electrons", "*** BeamCurrent = Current of the electron beam", "*** BeamDiameter = Diameter at 90% of the electron beam", "*** BeamPosX = Position in X of the electron beam", "*** BeamPosY = Position in Y of the electron beam", "*** BeamTilt = Theta angle of the electron beam (deg)", "*** BeamStandardDeviation = Standard deviation of the Gaussian distribution of the electrons in the beam", "*** DetectorCrystalAtom = Atomic symbol, name or number of the detector crystal", "*** DetectorCrystalThickness = Thickness of the detector crystal", "*** DetectorCrystalRadius = Radius of the detector crystal", "*** DetectorCrystalDistance = Distance of the detector crystal to the sample", "*** DetectorDeadLayer = Thickness of the detector dead layer", "*** DetectorDiffusionLenght = Diffusion lenght of the detector", "*** DetectorSurfaceQuality = Surface quality of the detector", "*** DetectorNoise = Noise at EDS", "*** DetectorTOA = Take off angle of the detector (deg)", "*** DetectorPitch = Phi angle of the detector (deg)", "*** DetectorBFLow = Bright Field low angle (rad)", "*** DetectorBFHigh = Bright Field high angle (rad)", "*** DetectorDFLow = Dark Field low angle (rad)", "*** DetectorDFHigh = Dark Field high angle (rad)", "*** DetectorHAADFLow = High Angle Annular Dark Field low angle (rad)", "*** DetectorHAADFHigh = High Angle Annular Dark Field high angle (rad)", "***", "********************************************************************************"] for line in headerLines: outputFile.write(line+'\n') def _createFormats(self): formats = {} formats[KEY_BEAM_ENERGY_keV] = lambda value: "%.6f" % (value) formats[KEY_BEAM_CURRENT_A] = lambda value: "%.16g" % (value) formats[KEY_BEAM_TIME_s] = lambda value: "%.16g" % (value) formats[KEY_BEAM_DIAMETER_A] = lambda value: "%.16g" % (value) formats[KEY_BEAM_POSITION_X_A] = lambda value: reduceAfterDot("%.6f" % (value)) formats[KEY_BEAM_POSITION_Y_A] = lambda value: reduceAfterDot("%.6f" % (value)) formats[KEY_BEAM_TILT_deg] = lambda value: "%.6f" % (value) formats[KEY_BEAM_STANDARD_DEVIATION_A] = lambda value: reduceAfterDot("%.6g" % (value)) formats[KEY_DETECTOR_CRYSTAL_ATOM] = lambda value: "%s" % (value) formats[KEY_DETECTOR_CRYSTAL_THICKNESS_cm] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_CRYSTAL_RADIUS_cm] = lambda value: reduceAfterDot("%.6f" % (value)) formats[KEY_DETECTOR_CRYSTAL_DISTANCE_cm] = lambda value: reduceAfterDot("%.6f" % (value)) formats[KEY_DETECTOR_DEAD_LAYER_A] = lambda value: reduceAfterDot("%.6f" % (value)) formats[KEY_DETECTOR_DIFFUSION_LENGHT_A] = lambda value: reduceAfterDot("%.6f" % (value)) formats[KEY_DETECTOR_SURFACE_QUALITY] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_NOISE_eV] = lambda value: reduceAfterDot("%.6f" % (value)) formats[KEY_DETECTOR_TOA_deg] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_CHANNEL_WIDTH_eV] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_PITCH_deg] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_BF_LOW_rad] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_BF_HIGH_RAD] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_DF_LOW_rad] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_DF_HIGH_rad] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_HAADF_LOW_rad] = lambda value: "%.6f" % (value) formats[KEY_DETECTOR_HAADF_HIGH_rad] = lambda value: "%.6f" % (value) return formats @property def version(self): return self._version @version.setter def version(self, version): self._version = version @property def beamEnergy_keV(self): return self._parameters[KEY_BEAM_ENERGY_keV] @beamEnergy_keV.setter def beamEnergy_keV(self, beamEnergy_keV): self._parameters[KEY_BEAM_ENERGY_keV] = beamEnergy_keV @property def beamCurrent_A(self): return self._parameters[KEY_BEAM_CURRENT_A] @beamCurrent_A.setter def beamCurrent_A(self, beamCurrent_A): self._parameters[KEY_BEAM_CURRENT_A] = beamCurrent_A @property def time_s(self): return self._parameters[KEY_BEAM_TIME_s] @time_s.setter def time_s(self, time_s): self._parameters[KEY_BEAM_TIME_s] = time_s @property def beamDiameter_A(self): return self._parameters[KEY_BEAM_DIAMETER_A] @beamDiameter_A.setter def beamDiameter_A(self, beamDiameter_A): self._parameters[KEY_BEAM_DIAMETER_A] = beamDiameter_A @property def beamPositionX_A(self): return self._parameters[KEY_BEAM_POSITION_X_A] @beamPositionX_A.setter def beamPositionX_A(self, beamPositionX_A): self._parameters[KEY_BEAM_POSITION_X_A] = beamPositionX_A @property def beamPositionY_A(self): return self._parameters[KEY_BEAM_POSITION_Y_A] @beamPositionY_A.setter def beamPositionY_A(self, beamPositionY_A): self._parameters[KEY_BEAM_POSITION_Y_A] = beamPositionY_A @property def beamTilt_deg(self): return self._parameters[KEY_BEAM_TILT_deg] @beamTilt_deg.setter def beamTilt_deg(self, beamTilt_deg): self._parameters[KEY_BEAM_TILT_deg] = beamTilt_deg @property def beamStandardDeviation_A(self): return self._parameters[KEY_BEAM_STANDARD_DEVIATION_A] @beamStandardDeviation_A.setter def beamStandardDeviation_A(self, beamStandardDeviation_A): self._parameters[KEY_BEAM_STANDARD_DEVIATION_A] = beamStandardDeviation_A @property def detectorCrystalAtomSymbol(self): return self._parameters[KEY_DETECTOR_CRYSTAL_ATOM] @detectorCrystalAtomSymbol.setter def detectorCrystalAtomSymbol(self, detectorCrystalAtomSymbol): self._parameters[KEY_DETECTOR_CRYSTAL_ATOM] = detectorCrystalAtomSymbol @property def detectorCrystalThickness_cm(self): return self._parameters[KEY_DETECTOR_CRYSTAL_THICKNESS_cm] @detectorCrystalThickness_cm.setter def detectorCrystalThickness_cm(self, detectorCrystalThickness_cm): self._parameters[KEY_DETECTOR_CRYSTAL_THICKNESS_cm] = detectorCrystalThickness_cm @property def detectorCrystalRadius_cm(self): return self._parameters[KEY_DETECTOR_CRYSTAL_RADIUS_cm] @detectorCrystalRadius_cm.setter def detectorCrystalRadius_cm(self, detectorCrystalRadius_cm): self._parameters[KEY_DETECTOR_CRYSTAL_RADIUS_cm] = detectorCrystalRadius_cm @property def detectorCrystalDistance_cm(self): return self._parameters[KEY_DETECTOR_CRYSTAL_DISTANCE_cm] @detectorCrystalDistance_cm.setter def detectorCrystalDistance_cm(self, detectorCrystalDistance_cm): self._parameters[KEY_DETECTOR_CRYSTAL_DISTANCE_cm] = detectorCrystalDistance_cm @property def detectorDeadLayer_A(self): return self._parameters[KEY_DETECTOR_DEAD_LAYER_A] @detectorDeadLayer_A.setter def detectorDeadLayer_A(self, detectorDeadLayer_A): self._parameters[KEY_DETECTOR_DEAD_LAYER_A] = detectorDeadLayer_A @property def detectorDiffusionLenght_A(self): return self._parameters[KEY_DETECTOR_DIFFUSION_LENGHT_A] @detectorDiffusionLenght_A.setter def detectorDiffusionLenght_A(self, detectorDiffusionLenght_A): self._parameters[KEY_DETECTOR_DIFFUSION_LENGHT_A] = detectorDiffusionLenght_A @property def detectorSurfaceQuality(self): return self._parameters[KEY_DETECTOR_SURFACE_QUALITY] @detectorSurfaceQuality.setter def detectorSurfaceQuality(self, detectorSurfaceQuality): self._parameters[KEY_DETECTOR_SURFACE_QUALITY] = detectorSurfaceQuality @property def detectorNoise_eV(self): return self._parameters[KEY_DETECTOR_NOISE_eV] @detectorNoise_eV.setter def detectorNoise_eV(self, detectorNoise_eV): self._parameters[KEY_DETECTOR_NOISE_eV] = detectorNoise_eV @property def detectorTOA_deg(self): return self._parameters[KEY_DETECTOR_TOA_deg] @detectorTOA_deg.setter def detectorTOA_deg(self, detectorTOA_deg): self._parameters[KEY_DETECTOR_TOA_deg] = detectorTOA_deg @property def detectorAzimuthalAngle_deg(self): return self._parameters[KEY_DETECTOR_PITCH_deg] @detectorAzimuthalAngle_deg.setter def detectorAzimuthalAngle_deg(self, detectorAzimuthalAngle_deg): self._parameters[KEY_DETECTOR_PITCH_deg] = detectorAzimuthalAngle_deg @property def detectorChannelWidth_eV(self): return self._parameters[KEY_DETECTOR_CHANNEL_WIDTH_eV] @detectorChannelWidth_eV.setter def detectorChannelWidth_eV(self, detectorChannelWidth_eV): self._parameters[KEY_DETECTOR_CHANNEL_WIDTH_eV] = detectorChannelWidth_eV @property def detectorPitch_deg(self): return self._parameters[KEY_DETECTOR_PITCH_deg] @detectorPitch_deg.setter def detectorPitch_deg(self, detectorPitch_deg): self._parameters[KEY_DETECTOR_PITCH_deg] = detectorPitch_deg @property def detectorBFLow_rad(self): return self._parameters[KEY_DETECTOR_BF_LOW_rad] @detectorBFLow_rad.setter def detectorBFLow_rad(self, detectorBFLow_rad): self._parameters[KEY_DETECTOR_BF_LOW_rad] = detectorBFLow_rad @property def detectorBFHigh_rad(self): return self._parameters[KEY_DETECTOR_BF_HIGH_RAD] @detectorBFHigh_rad.setter def detectorBFHigh_rad(self, detectorBFHigh_rad): self._parameters[KEY_DETECTOR_BF_HIGH_RAD] = detectorBFHigh_rad @property def detectorDFLow_rad(self): return self._parameters[KEY_DETECTOR_DF_LOW_rad] @detectorDFLow_rad.setter def detectorDFLow_rad(self, detectorDFLow_rad): self._parameters[KEY_DETECTOR_DF_LOW_rad] = detectorDFLow_rad @property def detectorDFHigh_rad(self): return self._parameters[KEY_DETECTOR_DF_HIGH_rad] @detectorDFHigh_rad.setter def detectorDFHigh_rad(self, detectorDFHigh_rad): self._parameters[KEY_DETECTOR_DF_HIGH_rad] = detectorDFHigh_rad @property def detectorHAADFLow_rad(self): return self._parameters[KEY_DETECTOR_HAADF_LOW_rad] @detectorHAADFLow_rad.setter def detectorHAADFLow_rad(self, detectorHAADFLow_rad): self._parameters[KEY_DETECTOR_HAADF_LOW_rad] = detectorHAADFLow_rad @property def detectorHAADFHigh_rad(self): return self._parameters[KEY_DETECTOR_HAADF_HIGH_rad] @detectorHAADFHigh_rad.setter def detectorHAADFHigh_rad(self, detectorHAADFHigh_rad): self._parameters[KEY_DETECTOR_HAADF_HIGH_rad] = detectorHAADFHigh_rad