Source code for pymcxray.SimulationsParameters

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

Simulations parameters
"""

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

# Standard library modules.
import logging
import csv

# Third party modules.

# Local modules.
import pymcxray.multipleloop as multipleloop

# Project modules

# Globals and constants variables.
PARAMETER_INCIDENT_ENERGY_keV = "incidentEnergy"
PARAMETER_NUMBER_ELECTRONS = "numberElectrons"
PARAMETER_NUMBER_XRAYS = "numberXrays"

PARAMETER_REPETITION = "Repetition"

PARAMETER_SPHERE_DIAMETER_nm = "sphereDiameter"
PARAMETER_SPHERE_DEPTH_FRACTION_RADIUS = "sphereDepthFractionRadius"
PARAMETER_BOX_SIDE_nm = "boxSide"
PARAMETER_BOX_WIDTH_nm = "boxWidth"
PARAMETER_BOX_DEPTH_nm = "boxDepth"
PARAMETER_FILM_THICKNESS_nm = "filmThickness"

PARAMETER_MEAN_NUMBER_COLLISIONS = "meanNumberCollisions"

PARAMETER_SPECIMEN = "specimen"
PARAMETER_SAMPLE_NAME = "sampleName"
PARAMETER_ELASTIC_CROSS_SECTION_SCALING_FACTOR = "elasticCrossSectionScalingFactor"
PARAMETER_ENERGY_LOSS_SCALING_FACTOR = "energyLossScalingFactor"

PARAMETER_TIME_s = "time"
PARAMETER_CURRENT_nA = "current"
PARAMETER_ATOMIC_NUMBER = "atomicNumber"
PARAMETER_BEAM_DIAMETER_nm = "beamDiameter"
PARAMETER_BEAM_TILT_deg = "beamTilt"
PARAMETER_BEAM_POSITION_nm = "beamPosition"

PARAMETER_DETECTOR_DISTANCE_cm = "detectorDistance"
PARAMETER_DETECTOR_RADIUS_cm = "detectorRadius"
PARAMETER_DETECTOR_THICKNESS_cm = "detectorThickness"
PARAMETER_DETECTOR_NOISE_eV = "detectorNoise"
PARAMETER_DETECTOR_CHANNEL_WIDTH_eV = "detectorChannelWidth"
PARAMETER_TOA_deg = "detectorTOA"
PARAMETER_DETECTOR_AZIMUTHAL_ANGLE_deg = "azimuthalAngle_deg"
PARAMETER_NUMBER_WINDOWS = "numberBackgroundWindows"

PARAMETER_NUMBER_LAYERS_X = "numberLayersX"
PARAMETER_NUMBER_LAYERS_Y = "numberLayersY"
PARAMETER_NUMBER_LAYERS_Z = "numberLayersZ"

PARAMETER_WEIGHT_FRACTION = "weightFraction"
PARAMETER_WEIGHT_FRACTIONS = "weightFractions"
PARAMETER_ATOMIC_FRACTION = "atomicFraction"
PARAMETER_ATOMIC_FRACTIONs = "atomicFractions"
PARAMETER_ELEMENTS = "elements"
PARAMETER_USER_MASS_DENSITY = "userMassDensity"

PARAMETER_TRACER_ATOMIC_NUMBER = "tracerAtomicNumber"
PARAMETER_TRACER_THICKNESS_nm = "tracerThickness"
PARAMETER_TRACER_LINE = "tracerLine"

PARAMETER_MODEL_SAMPLE_ENERGY_LOSS = "modelSampleEnergyLoss"
PARAMETER_MODEL_XRAY_CHARACTERISTIC = "modelXrayCharacteristic"
PARAMETER_MODEL_XRAY_BREMSSTRAHLUNG = "modelXrayBremsstrahlung"
PARAMETER_MODEL_ATOM_CROSS_SECTION = "modelAtomCrossSection"
PARAMETER_MODEL_ATOM_COLLISION = "modelAtomCollision"
PARAMETER_MODEL_ATOM_MAC = "modelAtomMac"

[docs]class SimulationsParameters(dict): def __init__(self): self._variedParameters = {} self._fixedParameters = {} self._computedParameters = set()
[docs] def addVaried(self, parameterKey, values): if parameterKey not in self._variedParameters: self._variedParameters[parameterKey] = [] self._variedParameters[parameterKey].extend(values) self._removeDuplicated(self._variedParameters[parameterKey])
def _removeDuplicated(self, parameters): numberBefore = len(parameters) try: parameters = list(set(parameters)) except TypeError: pass numberAfter = len(parameters) numberDuplicated = numberBefore - numberAfter if numberDuplicated > 0: logging.info("Removed %i duplicated items", numberDuplicated)
[docs] def addFixed(self, parameterKey, value): self._fixedParameters[parameterKey] = value
[docs] def addCompute(self, parameterKey): self._computedParameters.add(parameterKey)
[docs] def getAllSimulationParameters(self): parametersList = {} parametersList.update(self._variedParameters) parametersList.update(self._fixedParameters) allValues, names, dummyVaried = multipleloop.combine(parametersList) experiments = [] for values in allValues: experiment = dict(zip(names, values)) for parameterKey in self._computedParameters: if parameterKey == PARAMETER_NUMBER_XRAYS: value = self.computeNumberXrays(experiment) experiment[PARAMETER_NUMBER_XRAYS] = value experiments.append(experiment) return experiments
[docs] def computeNumberXrays(self, experiment): reader = csv.reader(open(self.computeNumberXraysFilepath, 'r')) next(reader) for row in reader: if float(row[0]) == float(experiment[PARAMETER_INCIDENT_ENERGY_keV]) and float(row[1]) == float(experiment[PARAMETER_SPHERE_DIAMETER_nm]): counts_1_sAsr = float(row[2]) break else: logging.warning("counts_1_sAsr not found for these conditions.") return 0 current_A = experiment[PARAMETER_CURRENT_nA]*1.0e-9 time_s = experiment[PARAMETER_TIME_s] solidAngle_sr = 0.0351945099176 numberXrays = int(counts_1_sAsr*current_A*time_s*solidAngle_sr) return numberXrays
[docs] def getVariedParameterLabels(self): return sorted(self._variedParameters.keys())
@property def computeNumberXraysFilepath(self): return self._computeNumberXraysFilepath @computeNumberXraysFilepath.setter def computeNumberXraysFilepath(self, filepath): self._computeNumberXraysFilepath = filepath @property def fixedParameters(self): return self._fixedParameters @property def variedParameters(self): return self._variedParameters
[docs]class SimulationsParametersFixed(object): def __init__(self): self._experiments = []
[docs] def addExperiment(self, experiment): self._experiments.append(experiment)
[docs] def getAllSimulationParameters(self): return self._experiments