From d13bc86178c214f34dfdf9a6945a5cc8154f0ea7 Mon Sep 17 00:00:00 2001 From: Paul Kienzle Date: Wed, 5 Aug 2026 19:18:20 -0400 Subject: [PATCH 1/2] Tag shared beam parameters with probe name for probeset and polarized --- refl1d/probe/probe.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/refl1d/probe/probe.py b/refl1d/probe/probe.py index 3061935c..a388b12c 100644 --- a/refl1d/probe/probe.py +++ b/refl1d/probe/probe.py @@ -1297,11 +1297,14 @@ def shared_beam(self, intensity=1, background=0, back_absorption=1, theta_offset with an explicit parameter in an individual segment if that parameter is independent. """ - intensity = Parameter.default(intensity, name="intensity") - background = Parameter.default(background, name="background", limits=[0, None]) - back_absorption = Parameter.default(back_absorption, name="back_absorption", limits=[0, 1]) - theta_offset = Parameter.default(theta_offset, name="theta_offset") - sample_broadening = Parameter.default(sample_broadening, name="sample_broadening", limits=[None, None]) + qualifier = f" {self.name}" if self.name else "" + intensity = Parameter.default(intensity, name=f"intensity{qualifier}") + background = Parameter.default(background, name=f"background{qualifier}", limits=[0, None]) + back_absorption = Parameter.default(back_absorption, name=f"back_absorption{qualifier}", limits=[0, 1]) + theta_offset = Parameter.default(theta_offset, name=f"theta_offset{qualifier}") + sample_broadening = Parameter.default( + sample_broadening, name=f"sample_broadening{qualifier}", limits=[None, None] + ) for p in self.probes: p.intensity = intensity p.background = background @@ -1630,11 +1633,14 @@ def shared_beam(self, intensity=1, background=0, back_absorption=1, theta_offset with an explicit parameter in an individual cross section if that parameter is independent. """ - intensity = Parameter.default(intensity, name="intensity") - background = Parameter.default(background, name="background", limits=[0, None]) - back_absorption = Parameter.default(back_absorption, name="back_absorption", limits=[0, 1]) - theta_offset = Parameter.default(theta_offset, name="theta_offset") - sample_broadening = Parameter.default(sample_broadening, name="sample_broadening", limits=[None, None]) + qualifier = f" {self.name}" if self.name else "" + intensity = Parameter.default(intensity, name="intensity" + qualifier) + background = Parameter.default(background, name="background" + qualifier, limits=[0, None]) + back_absorption = Parameter.default(back_absorption, name="back_absorption" + qualifier, limits=[0, 1]) + theta_offset = Parameter.default(theta_offset, name="theta_offset" + qualifier) + sample_broadening = Parameter.default( + sample_broadening, name="sample_broadening" + qualifier, limits=[None, None] + ) for x in self.xs: if x is not None: x.intensity = intensity From e80d061b431bbe0e00b4f0ea642a53bcdc660c81 Mon Sep 17 00:00:00 2001 From: Paul Kienzle Date: Wed, 5 Aug 2026 20:54:27 -0400 Subject: [PATCH 2/2] default shared beam parameters to the first available probe --- refl1d/probe/probe.py | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/refl1d/probe/probe.py b/refl1d/probe/probe.py index a388b12c..8597e653 100644 --- a/refl1d/probe/probe.py +++ b/refl1d/probe/probe.py @@ -1287,7 +1287,9 @@ def parts(self, theory): yield p, (Q[offset : offset + n], R[offset : offset + n]) offset += n - def shared_beam(self, intensity=1, background=0, back_absorption=1, theta_offset=0, sample_broadening=0): + def shared_beam( + self, intensity=None, background=None, back_absorption=None, theta_offset=None, sample_broadening=None + ): """ Share beam parameters across all segments. @@ -1297,6 +1299,18 @@ def shared_beam(self, intensity=1, background=0, back_absorption=1, theta_offset with an explicit parameter in an individual segment if that parameter is independent. """ + default_probe = self.probes[0] + if intensity is None: + intensity = default_probe.intensity + if background is None: + background = default_probe.background + if back_absorption is None: + back_absorption = default_probe.back_absorption + if theta_offset is None: + theta_offset = default_probe.theta_offset + if sample_broadening is None: + sample_broadening = default_probe.sample_broadening + qualifier = f" {self.name}" if self.name else "" intensity = Parameter.default(intensity, name=f"intensity{qualifier}") background = Parameter.default(background, name=f"background{qualifier}", limits=[0, None]) @@ -1623,7 +1637,9 @@ def _check(self): else: raise ValueError("Cannot mix front and back reflectivity measurements") - def shared_beam(self, intensity=1, background=0, back_absorption=1, theta_offset=0, sample_broadening=0): + def shared_beam( + self, intensity=None, background=None, back_absorption=None, theta_offset=None, sample_broadening=None + ): """ Share beam parameters across all four cross sections. @@ -1633,6 +1649,20 @@ def shared_beam(self, intensity=1, background=0, back_absorption=1, theta_offset with an explicit parameter in an individual cross section if that parameter is independent. """ + # Default parameters to the first non-empty cross section + # Note: this may be a non-spinflip channel if the mm cross section is missing. + default_probe = next(x for x in self.xs if x is not None) + if intensity is None: + intensity = default_probe.intensity + if background is None: + background = default_probe.background + if back_absorption is None: + back_absorption = default_probe.back_absorption + if theta_offset is None: + theta_offset = default_probe.theta_offset + if sample_broadening is None: + sample_broadening = default_probe.sample_broadening + qualifier = f" {self.name}" if self.name else "" intensity = Parameter.default(intensity, name="intensity" + qualifier) background = Parameter.default(background, name="background" + qualifier, limits=[0, None])