""" Classes for stroing various configurations needed for reduction. """ from dataclasses import dataclass, field from typing import Optional, Tuple from datetime import datetime import logging class Defaults: # fileIdentifier dataPath = '.' raw = ['.', './raw', '../raw', '../../raw'] year = datetime.now().year normalisationFileIdentifier = [] normalisationMethod = 'o' # 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 # @dataclass class ReaderConfig: year: int dataPath: str raw: 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] 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 @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 self.reader.dataPath != '.': inpt += f' --dataPath {self.reader.dataPath}' #if self.reader.raw != '.': # inpt = f' --rawd {self.reader.raw}' 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.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