193 lines
6.4 KiB
Python
193 lines
6.4 KiB
Python
"""
|
|
Classes for stroing various configurations needed for reduction.
|
|
"""
|
|
from dataclasses import dataclass, field
|
|
from typing import Optional, Tuple
|
|
from datetime import datetime
|
|
from os import path
|
|
import numpy as np
|
|
|
|
import logging
|
|
|
|
class Defaults:
|
|
# fileIdentifier
|
|
outputPath = '.'
|
|
rawPath = ['.', path.join('.','raw'), path.join('..','raw'), path.join('..','..','raw')]
|
|
year = datetime.now().year
|
|
normalisationFileIdentifier = []
|
|
normalisationMethod = 'o'
|
|
monitorType = 'auto'
|
|
# subtract
|
|
outputName = "fromEOS"
|
|
outputFormat = ['Rqz.ort']
|
|
incidentAngle = 'alphaF'
|
|
qResolution = 0.01
|
|
#timeSlize
|
|
scale = [1]
|
|
# autoscale
|
|
lambdaRange = [2., 15.]
|
|
thetaRange = [-12., 12.]
|
|
thetaRangeR = [-0.75, 0.75]
|
|
yRange = [11, 41]
|
|
qzRange = [0.005, 0.30]
|
|
chopperSpeed = 500
|
|
chopperPhase = -13.5
|
|
chopperPhaseOffset = 7
|
|
muOffset = 0
|
|
mu = 0
|
|
nu = 0
|
|
sampleModel = None
|
|
lowCurrentThreshold = 50
|
|
#
|
|
|
|
|
|
|
|
@dataclass
|
|
class ReaderConfig:
|
|
year: int
|
|
rawPath: Tuple[str]
|
|
startTime: Optional[float] = 0
|
|
|
|
@dataclass
|
|
class ExperimentConfig:
|
|
incidentAngle: str
|
|
chopperPhase: float
|
|
yRange: Tuple[float, float]
|
|
lambdaRange: Tuple[float, float]
|
|
qzRange: Tuple[float, float]
|
|
monitorType: str
|
|
lowCurrentThreshold: float
|
|
|
|
sampleModel: Optional[str] = None
|
|
chopperPhaseOffset: float = 0
|
|
mu: Optional[float] = None
|
|
nu: Optional[float] = None
|
|
muOffset: Optional[float] = None
|
|
|
|
@dataclass
|
|
class ReductionConfig:
|
|
normalisationMethod: str
|
|
qResolution: float
|
|
qzRange: Tuple[float, float]
|
|
thetaRange: Tuple[float, float]
|
|
thetaRangeR: Tuple[float, float]
|
|
|
|
fileIdentifier: list = field(default_factory=lambda: ["0"])
|
|
scale: list = field(default_factory=lambda: [1]) #per file scaling; if less elements than files use the last one
|
|
|
|
autoscale: Optional[Tuple[bool, bool]] = None
|
|
subtract: Optional[str] = None
|
|
normalisationFileIdentifier: Optional[list] = None
|
|
timeSlize: Optional[list] = None
|
|
|
|
@dataclass
|
|
class OutputConfig:
|
|
outputFormats: list
|
|
outputName: str
|
|
outputPath: str
|
|
|
|
@dataclass
|
|
class EOSConfig:
|
|
reader: ReaderConfig
|
|
experiment: ExperimentConfig
|
|
reduction: ReductionConfig
|
|
output: OutputConfig
|
|
|
|
_call_string_overwrite=None
|
|
|
|
#@property
|
|
#def call_string(self)->str:
|
|
# if self._call_string_overwrite:
|
|
# return self._call_string_overwrite
|
|
# else:
|
|
# return self.calculate_call_string()
|
|
|
|
def call_string(self):
|
|
base = 'python eos.py'
|
|
|
|
inpt = ''
|
|
if self.reader.year:
|
|
inpt += f' -Y {self.reader.year}'
|
|
else:
|
|
inpt += f' -Y {datetime.now().year}'
|
|
if np.shape(self.reader.rawPath)[0] == 1:
|
|
inpt += f' --rawPath {self.reader.rawPath}'
|
|
if self.reduction.subtract:
|
|
inpt += f' -subtract {self.reduction.subtract}'
|
|
if self.reduction.normalisationFileIdentifier:
|
|
inpt += f' -n {" ".join(self.reduction.normalisationFileIdentifier)}'
|
|
if self.reduction.fileIdentifier:
|
|
inpt += f' -f {" ".join(self.reduction.fileIdentifier)}'
|
|
|
|
otpt = ''
|
|
if self.reduction.qResolution:
|
|
otpt += f' -r {self.reduction.qResolution}'
|
|
if self.output.outputPath != '.':
|
|
inpt += f' --outputdPath {self.output.outputPath}'
|
|
if self.output.outputName:
|
|
otpt += f' -o {self.output.outputName}'
|
|
if self.output.outputFormats != ['Rqz.ort']:
|
|
otpt += f' -of {" ".join(self.output.outputFormats)}'
|
|
|
|
mask = ''
|
|
if self.experiment.yRange != Defaults.yRange:
|
|
mask += f' -y {" ".join(str(ii) for ii in self.experiment.yRange)}'
|
|
if self.experiment.lambdaRange!= Defaults.lambdaRange:
|
|
mask += f' -l {" ".join(str(ff) for ff in self.experiment.lambdaRange)}'
|
|
if self.reduction.thetaRange != Defaults.thetaRange:
|
|
mask += f' -t {" ".join(str(ff) for ff in self.reduction.thetaRange)}'
|
|
elif self.reduction.thetaRangeR != Defaults.thetaRangeR:
|
|
mask += f' -T {" ".join(str(ff) for ff in self.reduction.thetaRangeR)}'
|
|
if self.experiment.qzRange!= Defaults.qzRange:
|
|
mask += f' -q {" ".join(str(ff) for ff in self.experiment.qzRange)}'
|
|
|
|
para = ''
|
|
if self.experiment.chopperPhase != Defaults.chopperPhase:
|
|
para += f' --chopperPhase {self.experiment.chopperPhase}'
|
|
if self.experiment.chopperPhaseOffset != Defaults.chopperPhaseOffset:
|
|
para += f' --chopperPhaseOffset {self.experiment.chopperPhaseOffset}'
|
|
if self.experiment.mu:
|
|
para += f' --mu {self.experiment.mu}'
|
|
elif self.experiment.muOffset:
|
|
para += f' --muOffset {self.experiment.muOffset}'
|
|
if self.experiment.nu:
|
|
para += f' --nu {self.experiment.nu}'
|
|
|
|
modl = ''
|
|
if self.experiment.sampleModel:
|
|
modl += f" --sampleModel '{self.experiment.sampleModel}'"
|
|
|
|
acts = ''
|
|
if self.reduction.autoscale:
|
|
acts += f' --autoscale {" ".join(str(ff) for ff in self.reduction.autoscale)}'
|
|
if self.reduction.scale != Defaults.scale:
|
|
acts += f' --scale {self.reduction.scale}'
|
|
if self.reduction.timeSlize:
|
|
acts += f' --timeSlize {" ".join(str(ff) for ff in self.reduction.timeSlize)}'
|
|
|
|
mlst = base + inpt + otpt
|
|
if mask:
|
|
mlst += mask
|
|
if para:
|
|
mlst += para
|
|
if acts:
|
|
mlst += acts
|
|
if modl:
|
|
mlst += modl
|
|
|
|
if len(mlst) > 70:
|
|
mlst = base + ' ' + inpt + ' ' + otpt
|
|
if mask:
|
|
mlst += ' ' + mask
|
|
if para:
|
|
mlst += ' ' + para
|
|
if acts:
|
|
mlst += ' ' + acts
|
|
if modl:
|
|
mlst += ' ' + modl
|
|
|
|
logging.debug(f'Argument list build in EOSConfig.call_string: {mlst}')
|
|
return mlst
|
|
|
|
|