diff --git a/eos/options.py b/eos/options.py index 7398747..43c6d05 100644 --- a/eos/options.py +++ b/eos/options.py @@ -91,10 +91,12 @@ class ArgParsable: if get_origin(typ) is list: args['nargs'] = '+' typ = get_args(typ)[0] + if get_origin(typ) is tuple: + # tuple of items are put together during evaluation + typ = get_args(typ)[0] elif get_origin(typ) is tuple: args['nargs'] = len(get_args(typ)) typ = get_args(typ)[0] - if issubclass(typ, StrEnum): args['choices'] = [ci.value for ci in typ] if field.default is not MISSING: @@ -149,7 +151,12 @@ class ArgParsable: if get_origin(field.type) is Union and type(None) in get_args(field.type): # optional argument typ = get_args(field.type)[0] - + if get_origin(typ) is list: + item_typ = get_args(typ)[0] + if get_origin(item_typ) is tuple: + # tuple of items are put together during evaluation + tuple_length = len(get_args(item_typ)) + value = [tuple(value[i*tuple_length+j] for j in range(tuple_length)) for i in range(len(value)//tuple_length)] if isinstance(typ, type) and issubclass(typ, StrEnum): # convert str to enum try: @@ -359,6 +366,14 @@ class ReflectivityReductionConfig(ArgParsable): 'help': 'theta region of interest w.r.t. beam center', }, ) + thetaFilters: List[Tuple[float, float]] = field( + default_factory=lambda: [], + metadata={ + 'short': 'TF', + 'group': 'region of interest', + 'help': 'add one or more theta ranges that will be filtered in reduction', + }, + ) normalisationMethod: NormalisationMethod = field( default=NormalisationMethod.over_illuminated, metadata={ @@ -701,6 +716,15 @@ class E2HReductionConfig(ArgParsable): }, ) + thetaFilters: List[Tuple[float, float]] = field( + default_factory=lambda: [], + metadata={ + 'short': 'TF', + 'group': 'region of interest', + 'help': 'add one or more theta ranges that will be filtered in reduction', + }, + ) + fontsize: float = field( default=8., metadata={ diff --git a/eos/reduction_e2h.py b/eos/reduction_e2h.py index 9506510..2561bf9 100644 --- a/eos/reduction_e2h.py +++ b/eos/reduction_e2h.py @@ -154,6 +154,8 @@ class E2HReduction: self.projection.correct_gravity(last_file_header.geometry.detectorDistance) self.projection.apply_lamda_mask(self.config.experiment.lambdaRange) self.projection.apply_theta_mask(thetaRange) + for thi in self.config.reduction.thetaFilters: + self.projection.apply_theta_filter((thi[0]+tthh, thi[1]+tthh)) self.projection.apply_norm_mask(self.norm) if self.config.reduction.plot==E2HPlotSelection.Q: @@ -163,6 +165,8 @@ class E2HReduction: plz.calculate_q() plz.apply_lamda_mask(self.config.experiment.lambdaRange) plz.apply_theta_mask(thetaRange) + for thi in self.config.reduction.thetaFilters: + self.projection.apply_theta_filter((thi[0]+tthh, thi[1]+tthh)) plz.apply_norm_mask(self.norm) self.projection = ReflectivityProjector(plz, self.norm) @@ -191,6 +195,8 @@ class E2HReduction: plz.calculate_q() plz.apply_lamda_mask(self.config.experiment.lambdaRange) plz.apply_theta_mask(thetaRange) + for thi in self.config.reduction.thetaFilters: + plz.apply_theta_filter((thi[0]+tthh, thi[1]+tthh)) plz.apply_norm_mask(self.norm) pr = ReflectivityProjector(plz, self.norm) pyz = YZProjection() diff --git a/eos/reduction_reflectivity.py b/eos/reduction_reflectivity.py index 52860a7..0a737dc 100644 --- a/eos/reduction_reflectivity.py +++ b/eos/reduction_reflectivity.py @@ -373,8 +373,8 @@ class ReflectivityReduction: proj = LZProjection.from_dataset(dataset, self.grid, has_offspecular=(self.config.experiment.incidentAngle!=IncidentAngle.alphaF)) + t0 = dataset.geometry.nu-dataset.geometry.mu if not self.config.reduction.is_default('thetaRangeR'): - t0 = dataset.geometry.nu - dataset.geometry.mu # adjust range based on detector center thetaRange = [ti+t0 for ti in self.config.reduction.thetaRangeR] proj.apply_theta_mask(thetaRange) @@ -384,6 +384,9 @@ class ReflectivityReduction: thetaRange = [dataset.geometry.nu - dataset.geometry.mu - dataset.geometry.div/2, dataset.geometry.nu - dataset.geometry.mu + dataset.geometry.div/2] proj.apply_theta_mask(thetaRange) + for thi in self.config.reduction.thetaFilters: + # apply theta filters relative to angle on detector (issues with parts of the incoming divergence) + proj.apply_theta_filter((thi[0]+t0, thi[1]+t0)) proj.apply_lamda_mask(self.config.experiment.lambdaRange)