From 2a8bb33da33c7734ba4e271181a00bfa2fdfea15 Mon Sep 17 00:00:00 2001 From: Andrew Nelson Date: Tue, 30 Mar 2021 15:41:57 +1100 Subject: [PATCH 1/6] MAINT: pnr_reduction --- refnx/reduce/reduce.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/refnx/reduce/reduce.py b/refnx/reduce/reduce.py index 89bbbc84..d8965d55 100644 --- a/refnx/reduce/reduce.py +++ b/refnx/reduce/reduce.py @@ -529,6 +529,14 @@ def _reduce_single_angle(self, scale=1): return datasets, deepcopy(reduction) +class PolarisedReduce: + def __init__(self, spin_set): + self.spin_set = spin_set + + def reduce(self, **reduction_options): + + + class SpatzReduce(ReflectReduce): """ Reduces Spatz reflectometer data to give the specular reflectivity. From 77f8b19e50d0442bc294650c0ae6927de2b61347 Mon Sep 17 00:00:00 2001 From: Andrew Nelson Date: Tue, 30 Mar 2021 16:26:34 +1100 Subject: [PATCH 2/6] ENH: polarised reduction --- refnx/reduce/reduce.py | 57 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/refnx/reduce/reduce.py b/refnx/reduce/reduce.py index d8965d55..68f5a8db 100644 --- a/refnx/reduce/reduce.py +++ b/refnx/reduce/reduce.py @@ -17,6 +17,7 @@ basename_datafile, SpatzNexus, ReductionOptions, + calculate_wavelength_bins, ) from refnx.util import ErrorProp as EP import refnx.util.general as general @@ -530,11 +531,61 @@ def _reduce_single_angle(self, scale=1): class PolarisedReduce: - def __init__(self, spin_set): - self.spin_set = spin_set + def __init__(self, spin_set_direct): + self.spin_set_direct = spin_set_direct - def reduce(self, **reduction_options): + def reduce(self, spin_set_reflect, **reduction_options): + # get a default set of reduction options + options = ReductionOptions() + options.update(reduction_options) + + # set up the wavelength bins + if options["wavelength_bins"] is None: + wb = calculate_wavelength_bins( + options["lo_wavelength"], + options["hi_wavelength"], + options["rebin_percent"], + ) + options["wavelength_bins"] = wb + + # go through each spin channel and reduce it + reducers = {} + for sc in ["dd", "uu", "du", "ud"]: + # first get the correct reduction options + rdo = getattr(self.spin_set_reflect, f"{sc}_opts") + if rdo is None: + rdo = options + else: + # overwrite properties that need to be common + rdo["wavelength_bins"] = options["wavelength_bins"] + + if sc in ["dd", "du"]: + db = getattr(self.spin_set_direct, "dd") + elif sc in ["uu", "ud"]: + db = getattr(self.spin_set_direct, "uu") + rb = getattr(self.spin_set_reflect, sc) + if rb is not None: + reducer = PlatypusReduce(db) + reducer.reduce(rb, save=False, **rdo) + reducers[sc] = reducer + else: + reducers[sc] = None + + # by this point an unpolarised reduction has been done. But we need to + # correct the spectra for PNR. The following spectra (N, T) should be + # overwritten: + # reducers["dd"].reflected_beam.m_spec + # reducers["dd"].reflected_beam.m_spec_sd + # reducers["dd"].direct_beam.m_spec + # reducers["dd"].direct_beam.m_spec_sd + + + # once the wavelength spectra have been corrected/overwritten then the + # reflectivities need to be recalculated + + # now write out the corrected reflectivity files + class SpatzReduce(ReflectReduce): From 6f9c5208de9f3d55b246f621be982e6bcf199810 Mon Sep 17 00:00:00 2001 From: Andrew Nelson Date: Tue, 30 Mar 2021 16:47:07 +1100 Subject: [PATCH 3/6] MAINT: more pnr reduction --- refnx/reduce/reduce.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/refnx/reduce/reduce.py b/refnx/reduce/reduce.py index 68f5a8db..0fa667dc 100644 --- a/refnx/reduce/reduce.py +++ b/refnx/reduce/reduce.py @@ -579,13 +579,33 @@ def reduce(self, spin_set_reflect, **reduction_options): # reducers["dd"].reflected_beam.m_spec_sd # reducers["dd"].direct_beam.m_spec # reducers["dd"].direct_beam.m_spec_sd - + # THIS IS WHERE THE MAGIC HAPPENS # once the wavelength spectra have been corrected/overwritten then the - # reflectivities need to be recalculated - - # now write out the corrected reflectivity files - + # reflectivities need to be recalculated. + # this doesn't correct the offspecular + for reducer in reducers: + reducer.y, reducer.y_err = EP.EPdiv( + reducer.reflected_beam.m_spec, + reducer.reflected_beam.m_spec_sd, + reducer.direct_beam.m_spec, + reducer.direct_beam.m_spec_sd, + ) + # now write out the corrected reflectivity files + fnames = [] + datasets = [] + datafilename = reducer.reflected_beam.datafilename + datafilename = os.path.basename(datafilename.split(".nx.hdf")[0]) + + for i in range(np.size(reducer.y, 0)): + data_tup = reducer.data(scanpoint=i) + datasets.append(ReflectDataset(data_tup)) + + for i, dataset in enumerate(datasets): + fname = f"{datafilename}_{i}.dat" + fnames.append(fname) + with open(fname, "wb") as f: + dataset.save(f) class SpatzReduce(ReflectReduce): From c58b16479066a589dc5241b83be3943e941c7f79 Mon Sep 17 00:00:00 2001 From: Andrew Nelson Date: Wed, 31 Mar 2021 15:18:21 +1100 Subject: [PATCH 4/6] MAINT: small correction --- refnx/reduce/reduce.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/refnx/reduce/reduce.py b/refnx/reduce/reduce.py index 0fa667dc..95718990 100644 --- a/refnx/reduce/reduce.py +++ b/refnx/reduce/reduce.py @@ -535,7 +535,6 @@ def __init__(self, spin_set_direct): self.spin_set_direct = spin_set_direct def reduce(self, spin_set_reflect, **reduction_options): - # get a default set of reduction options options = ReductionOptions() options.update(reduction_options) @@ -553,7 +552,7 @@ def reduce(self, spin_set_reflect, **reduction_options): reducers = {} for sc in ["dd", "uu", "du", "ud"]: # first get the correct reduction options - rdo = getattr(self.spin_set_reflect, f"{sc}_opts") + rdo = getattr(spin_set_reflect, f"{sc}_opts") if rdo is None: rdo = options else: From 28bf5351df1a68eb0883133191884304e336e6a1 Mon Sep 17 00:00:00 2001 From: Andrew Nelson Date: Wed, 31 Mar 2021 16:25:50 +1100 Subject: [PATCH 5/6] MAINT: refactor PolarisedReduce a little --- refnx/reduce/reduce.py | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/refnx/reduce/reduce.py b/refnx/reduce/reduce.py index 95718990..fe1ac40d 100644 --- a/refnx/reduce/reduce.py +++ b/refnx/reduce/reduce.py @@ -533,6 +533,15 @@ def _reduce_single_angle(self, scale=1): class PolarisedReduce: def __init__(self, spin_set_direct): self.spin_set_direct = spin_set_direct + self.reducers = {} + for sc in ["dd", "du"]: + self.reducers[sc] = PlatypusReduce( + spin_set_direct.dd + ) + for sc in ["uu", "ud"]: + self.reducers[sc] = PlatypusReduce( + spin_set_direct.uu + ) def reduce(self, spin_set_reflect, **reduction_options): # get a default set of reduction options @@ -548,8 +557,9 @@ def reduce(self, spin_set_reflect, **reduction_options): ) options["wavelength_bins"] = wb + reduced_successfully = [] + # go through each spin channel and reduce it - reducers = {} for sc in ["dd", "uu", "du", "ud"]: # first get the correct reduction options rdo = getattr(spin_set_reflect, f"{sc}_opts") @@ -559,31 +569,31 @@ def reduce(self, spin_set_reflect, **reduction_options): # overwrite properties that need to be common rdo["wavelength_bins"] = options["wavelength_bins"] - if sc in ["dd", "du"]: - db = getattr(self.spin_set_direct, "dd") - elif sc in ["uu", "ud"]: - db = getattr(self.spin_set_direct, "uu") + db = self.reducers[sc] rb = getattr(self.spin_set_reflect, sc) if rb is not None: - reducer = PlatypusReduce(db) - reducer.reduce(rb, save=False, **rdo) - reducers[sc] = reducer + db.reduce(rb, save=False, **rdo) + reduced_successfully.append(sc) else: - reducers[sc] = None + # no reflected beam for a spin channel + continue # by this point an unpolarised reduction has been done. But we need to # correct the spectra for PNR. The following spectra (N, T) should be # overwritten: - # reducers["dd"].reflected_beam.m_spec - # reducers["dd"].reflected_beam.m_spec_sd - # reducers["dd"].direct_beam.m_spec - # reducers["dd"].direct_beam.m_spec_sd + # TODO + # self.reducers["dd"].reflected_beam.m_spec + # self.reducers["dd"].reflected_beam.m_spec_sd + # self.reducers["dd"].direct_beam.m_spec + # self.reducers["dd"].direct_beam.m_spec_sd # THIS IS WHERE THE MAGIC HAPPENS # once the wavelength spectra have been corrected/overwritten then the # reflectivities need to be recalculated. # this doesn't correct the offspecular - for reducer in reducers: + for sc in reduced_successfully: + reducer = self.reducers[sc] + # TODO call something polcorr? reducer.y, reducer.y_err = EP.EPdiv( reducer.reflected_beam.m_spec, reducer.reflected_beam.m_spec_sd, @@ -601,7 +611,7 @@ def reduce(self, spin_set_reflect, **reduction_options): datasets.append(ReflectDataset(data_tup)) for i, dataset in enumerate(datasets): - fname = f"{datafilename}_{i}.dat" + fname = f"{datafilename}_{i}_POLCORR.dat" fnames.append(fname) with open(fname, "wb") as f: dataset.save(f) From 98790122488d85b6c51f1d5d043f7297c82b8f30 Mon Sep 17 00:00:00 2001 From: Andrew Nelson Date: Wed, 31 Mar 2021 16:43:58 +1100 Subject: [PATCH 6/6] BLK --- refnx/reduce/reduce.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/refnx/reduce/reduce.py b/refnx/reduce/reduce.py index fe1ac40d..e3a3ab73 100644 --- a/refnx/reduce/reduce.py +++ b/refnx/reduce/reduce.py @@ -535,13 +535,9 @@ def __init__(self, spin_set_direct): self.spin_set_direct = spin_set_direct self.reducers = {} for sc in ["dd", "du"]: - self.reducers[sc] = PlatypusReduce( - spin_set_direct.dd - ) + self.reducers[sc] = PlatypusReduce(spin_set_direct.dd) for sc in ["uu", "ud"]: - self.reducers[sc] = PlatypusReduce( - spin_set_direct.uu - ) + self.reducers[sc] = PlatypusReduce(spin_set_direct.uu) def reduce(self, spin_set_reflect, **reduction_options): # get a default set of reduction options