Skip to content
Snippets Groups Projects
Commit 9671524f authored by Wout De Nolf's avatar Wout De Nolf
Browse files

concatenated XAS spectra: skip N spectra and N start/end points

parent dd58d72d
No related branches found
No related tags found
1 merge request!172Multi xas with nans2
...@@ -64,6 +64,8 @@ def read_from_url( ...@@ -64,6 +64,8 @@ def read_from_url(
I2_url: DataUrl | None = None, I2_url: DataUrl | None = None,
mu_ref_url: DataUrl | None = None, mu_ref_url: DataUrl | None = None,
is_concatenated: bool = False, is_concatenated: bool = False,
skip_concatenated_n_points: int = 0,
skip_concatenated_n_spectra: int = 0,
timeout: float = settings.DEFAULT_READ_TIMEOUT, timeout: float = settings.DEFAULT_READ_TIMEOUT,
) -> XASObject: ) -> XASObject:
""" """
...@@ -89,6 +91,8 @@ def read_from_url( ...@@ -89,6 +91,8 @@ def read_from_url(
I2_url=I2_url, I2_url=I2_url,
mu_ref_url=mu_ref_url, mu_ref_url=mu_ref_url,
is_concatenated=is_concatenated, is_concatenated=is_concatenated,
skip_concatenated_n_points=skip_concatenated_n_points,
skip_concatenated_n_spectra=skip_concatenated_n_spectra,
) )
return read_from_input_information(input_information, timeout=timeout) return read_from_input_information(input_information, timeout=timeout)
......
...@@ -196,6 +196,8 @@ class XASObjectDialog(qt.QWidget): ...@@ -196,6 +196,8 @@ class XASObjectDialog(qt.QWidget):
I2_url=advanceHDF5Info.getI2Url(), I2_url=advanceHDF5Info.getI2Url(),
mu_ref_url=advanceHDF5Info.getMuRefUrl(), mu_ref_url=advanceHDF5Info.getMuRefUrl(),
is_concatenated=self._h5Dialog.isSpectraConcatenated(), is_concatenated=self._h5Dialog.isSpectraConcatenated(),
skip_concatenated_n_points=self._h5Dialog.getSkipConcatenatedNPoints(),
skip_concatenated_n_spectra=self._h5Dialog.getSkipConcatenatedNSpectra(),
) )
def getChannelUrl(self): def getChannelUrl(self):
...@@ -210,3 +212,9 @@ class XASObjectDialog(qt.QWidget): ...@@ -210,3 +212,9 @@ class XASObjectDialog(qt.QWidget):
def setConcatenatedSpectra(self, value: bool): def setConcatenatedSpectra(self, value: bool):
self._h5Dialog.setConcatenatedSpectra(value) self._h5Dialog.setConcatenatedSpectra(value)
def setSkipConcatenatedNPoints(self, value: int):
self._h5Dialog.setSkipConcatenatedNPoints(value)
def setSkipConcatenatedNSpectra(self, value: int):
self._h5Dialog.setSkipConcatenatedNSpectra(value)
...@@ -72,6 +72,18 @@ class XASObjectFromH5(qt.QTabWidget): ...@@ -72,6 +72,18 @@ class XASObjectFromH5(qt.QTabWidget):
def setConcatenatedSpectra(self, value: bool): def setConcatenatedSpectra(self, value: bool):
self._basicInformation._concatenatedCheckbox.setChecked(value) self._basicInformation._concatenatedCheckbox.setChecked(value)
def getSkipConcatenatedNPoints(self):
return self._basicInformation._skipConcatenatedNPoints.value()
def setSkipConcatenatedNPoints(self, value: int):
self._basicInformation._skipConcatenatedNPoints.setValue(value)
def getSkipConcatenatedNSpectra(self):
return self._basicInformation._skipConcatenatedNSpectra.value()
def setSkipConcatenatedNSpectra(self, value: int):
self._basicInformation._skipConcatenatedNSpectra.setValue(value)
class _MandatoryXASObjectInfo(qt.QWidget): class _MandatoryXASObjectInfo(qt.QWidget):
"""Widget containing mandatory information""" """Widget containing mandatory information"""
...@@ -89,15 +101,42 @@ class _MandatoryXASObjectInfo(qt.QWidget): ...@@ -89,15 +101,42 @@ class _MandatoryXASObjectInfo(qt.QWidget):
self._bufWidget = qt.QWidget(parent=self) self._bufWidget = qt.QWidget(parent=self)
self._bufWidget.setLayout(qt.QHBoxLayout()) self._bufWidget.setLayout(qt.QHBoxLayout())
# Spacer to push elements
spacer = qt.QWidget(parent=self) spacer = qt.QWidget(parent=self)
spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum) spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum)
self._bufWidget.layout().addWidget(spacer) self._bufWidget.layout().addWidget(spacer)
# Dimension selection widget
self._dimensionSelection = _SpectraDimensions(parent=self._bufWidget) self._dimensionSelection = _SpectraDimensions(parent=self._bufWidget)
self._bufWidget.layout().addWidget(self._dimensionSelection) self._bufWidget.layout().addWidget(self._dimensionSelection)
# Concatenated checkbox
self._concatenatedCheckbox = qt.QCheckBox( self._concatenatedCheckbox = qt.QCheckBox(
"Concatenated spectra", parent=self._bufWidget "Concatenated spectra", parent=self._bufWidget
) )
self._bufWidget.layout().addWidget(self._concatenatedCheckbox) self._bufWidget.layout().addWidget(self._concatenatedCheckbox)
# Labels and spin boxes
self._concatenatedWidget = qt.QWidget(parent=self)
self._concatenatedWidget.setLayout(qt.QVBoxLayout())
label1 = qt.QLabel("Skip first N concatenated spectra", parent=self._bufWidget)
self._skipConcatenatedNSpectra = qt.QSpinBox(parent=self._bufWidget)
self._concatenatedWidget.layout().addWidget(label1)
self._concatenatedWidget.layout().addWidget(self._skipConcatenatedNSpectra)
label2 = qt.QLabel(
"Skip N first and last points of concatenated spectra",
parent=self._bufWidget,
)
self._skipConcatenatedNPoints = qt.QSpinBox(parent=self._bufWidget)
self._concatenatedWidget.layout().addWidget(label2)
self._concatenatedWidget.layout().addWidget(self._skipConcatenatedNPoints)
self._bufWidget.layout().addWidget(self._concatenatedWidget)
# Add buffer widget to main layout
self.layout().addWidget(self._bufWidget, 1, 1) self.layout().addWidget(self._bufWidget, 1, 1)
# channel/energy url # channel/energy url
...@@ -122,19 +161,29 @@ class _MandatoryXASObjectInfo(qt.QWidget): ...@@ -122,19 +161,29 @@ class _MandatoryXASObjectInfo(qt.QWidget):
self._configSelector._qLineEdit.editingFinished.connect(self._editingIsFinished) self._configSelector._qLineEdit.editingFinished.connect(self._editingIsFinished)
self._dimensionSelection.sigDimensionChanged.connect(self._editingIsFinished) self._dimensionSelection.sigDimensionChanged.connect(self._editingIsFinished)
self._energyUnit.currentIndexChanged.connect(self._editingIsFinished) self._energyUnit.currentIndexChanged.connect(self._editingIsFinished)
self._concatenatedCheckbox.clicked.connect(self._onBidimensionalCheckboxChange) self._concatenatedCheckbox.stateChanged.connect(
self._onConcatenatedCheckboxChange
)
self._skipConcatenatedNPoints.valueChanged.connect(self._editingIsFinished)
self._skipConcatenatedNSpectra.valueChanged.connect(self._editingIsFinished)
# expose API # expose API
self.setDimensions = self._dimensionSelection.setDimensions self.setDimensions = self._dimensionSelection.setDimensions
self.getDimensions = self._dimensionSelection.getDimensions self.getDimensions = self._dimensionSelection.getDimensions
def _onBidimensionalCheckboxChange(self): self._syncConcatenatedCheckbox()
self._dimensionSelection.setDisabled(self._concatenatedCheckbox.isChecked())
def _syncConcatenatedCheckbox(self):
concatenated = self._concatenatedCheckbox.isChecked()
self._concatenatedWidget.setEnabled(concatenated)
self._dimensionSelection.setDisabled(concatenated)
def _onConcatenatedCheckboxChange(self):
self._syncConcatenatedCheckbox()
self._editingIsFinished() self._editingIsFinished()
def getSpectraUrl(self): def getSpectraUrl(self):
""" """
:return: the DataUrl of the spectra :return: the DataUrl of the spectra
:rtype: DataUrl :rtype: DataUrl
""" """
...@@ -142,7 +191,6 @@ class _MandatoryXASObjectInfo(qt.QWidget): ...@@ -142,7 +191,6 @@ class _MandatoryXASObjectInfo(qt.QWidget):
def getEnergyUrl(self): def getEnergyUrl(self):
""" """
:return: the DataUrl of energy / channel :return: the DataUrl of energy / channel
:rtype: DataUrl :rtype: DataUrl
""" """
......
from __future__ import annotations from __future__ import annotations
from typing import Tuple, Dict, Any
import pint
import numpy import numpy
from est import settings from est import settings
...@@ -10,14 +14,14 @@ from est.core.monotonic import piecewise_monotonic_interpolation_values ...@@ -10,14 +14,14 @@ from est.core.monotonic import piecewise_monotonic_interpolation_values
def read_concatenated_xas( def read_concatenated_xas(
information: InputInformation, timeout: float = settings.DEFAULT_READ_TIMEOUT information: InputInformation, timeout: float = settings.DEFAULT_READ_TIMEOUT
): ) -> Tuple[numpy.ndarray, pint.Quantity, Dict[str, Any]]:
""" """
Method to read spectra acquired with the energy ramping up and down, with any number of repetitions. Method to read spectra acquired with the energy ramping up and down, with any number of repetitions.
When the scan is uni-directional, the ramp is always up. When the scan is concatenated the ramp is When the scan is uni-directional, the ramp is always up. When the scan is bi-directional the ramp is
alternating up and down. alternating up and down.
The spectra are then interpolated to produce a 3D spectra (nb_energy_pts, nb_of_ramps, 1) The spectra are then interpolated to produce a 3D data aray (nb_energy_pts, nb_of_ramps, 1).
Limitations: the original spectra and energy datasets must be 1D. Limitations: the original spectra and energy datasets must be 1D.
""" """
...@@ -30,16 +34,25 @@ def read_concatenated_xas( ...@@ -30,16 +34,25 @@ def read_concatenated_xas(
config = None config = None
ramp_slices = split_piecewise_monotonic(raw_energy) ramp_slices = split_piecewise_monotonic(raw_energy)
energy = piecewise_monotonic_interpolation_values(raw_energy, ramp_slices) energy = piecewise_monotonic_interpolation_values(raw_energy, ramp_slices)
if information.skip_concatenated_n_spectra:
ramp_slices = ramp_slices[information.skip_concatenated_n_spectra :]
interpolated_spectra = numpy.zeros( interpolated_spectra = numpy.zeros(
(len(energy), len(ramp_slices), 1), dtype=raw_spectra.dtype (len(energy), len(ramp_slices), 1), dtype=raw_spectra.dtype
) )
for i, ramp_slice in enumerate(ramp_slices): for i, ramp_slice in enumerate(ramp_slices):
raw_energy_i = raw_energy[ramp_slice]
raw_spectrum_i = raw_spectra[ramp_slice]
if information.skip_concatenated_n_points:
raw_spectrum_i[: information.skip_concatenated_n_points] = numpy.nan
raw_spectrum_i[-information.skip_concatenated_n_points :] = numpy.nan
interpolated_spectra[:, i, 0] = numpy.interp( interpolated_spectra[:, i, 0] = numpy.interp(
energy, energy,
raw_energy[ramp_slice], raw_energy_i,
raw_spectra[ramp_slice], raw_spectrum_i,
left=numpy.nan, left=numpy.nan,
right=numpy.nan, right=numpy.nan,
) )
......
...@@ -23,6 +23,8 @@ class InputInformation: ...@@ -23,6 +23,8 @@ class InputInformation:
I2_url: DataUrl | None = None, I2_url: DataUrl | None = None,
mu_ref_url: DataUrl | None = None, mu_ref_url: DataUrl | None = None,
is_concatenated: bool = False, is_concatenated: bool = False,
skip_concatenated_n_points: int = 0,
skip_concatenated_n_spectra: int = 0,
): ):
# main information # main information
self.spectra_url = spectra_url self.spectra_url = spectra_url
...@@ -31,6 +33,8 @@ class InputInformation: ...@@ -31,6 +33,8 @@ class InputInformation:
self.dimensions = dimensions_mod.parse_dimensions(dimensions) self.dimensions = dimensions_mod.parse_dimensions(dimensions)
self.energy_unit = energy_unit self.energy_unit = energy_unit
self.is_concatenated = is_concatenated self.is_concatenated = is_concatenated
self.skip_concatenated_n_points = skip_concatenated_n_points
self.skip_concatenated_n_spectra = skip_concatenated_n_spectra
# "fancy information" # "fancy information"
self.I0_url = I0_url self.I0_url = I0_url
...@@ -56,6 +60,8 @@ class InputInformation: ...@@ -56,6 +60,8 @@ class InputInformation:
"I2_url": dump_url(self.I2_url), "I2_url": dump_url(self.I2_url),
"mu_ref_url": dump_url(self.mu_ref_url), "mu_ref_url": dump_url(self.mu_ref_url),
"is_concatenated": self.is_concatenated, "is_concatenated": self.is_concatenated,
"skip_concatenated_n_points": self.skip_concatenated_n_points,
"skip_concatenated_n_spectra": self.skip_concatenated_n_spectra,
} }
@staticmethod @staticmethod
...@@ -79,4 +85,6 @@ class InputInformation: ...@@ -79,4 +85,6 @@ class InputInformation:
I2_url=load_url("I2_url"), I2_url=load_url("I2_url"),
mu_ref_url=load_url("mu_ref_url"), mu_ref_url=load_url("mu_ref_url"),
is_concatenated=ddict.get("is_concatenated", False), is_concatenated=ddict.get("is_concatenated", False),
skip_concatenated_n_points=ddict.get("skip_concatenated_n_points", 0),
skip_concatenated_n_spectra=ddict.get("skip_concatenated_n_spectra", 0),
) )
...@@ -80,10 +80,15 @@ class XASInputOW(OWEwoksWidgetNoThread, ewokstaskclass=ReadXasObject): ...@@ -80,10 +80,15 @@ class XASInputOW(OWEwoksWidgetNoThread, ewokstaskclass=ReadXasObject):
self._inputDialog.setEnergyUrl(input_information.channel_url) self._inputDialog.setEnergyUrl(input_information.channel_url)
if input_information.mu_ref_url is not None: if input_information.mu_ref_url is not None:
advanceHDF5Info.setMuRefUrl(input_information.mu_ref_url) advanceHDF5Info.setMuRefUrl(input_information.mu_ref_url)
if input_information.is_concatenated is not None: self._inputDialog.getMainWindow().setSkipConcatenatedNPoints(
self._inputDialog.getMainWindow().setConcatenatedSpectra( input_information.skip_concatenated_n_points
input_information.is_concatenated )
) self._inputDialog.getMainWindow().setSkipConcatenatedNSpectra(
input_information.skip_concatenated_n_spectra
)
self._inputDialog.getMainWindow().setConcatenatedSpectra(
input_information.is_concatenated
)
else: else:
input_type = est.io.InputType.ascii_spectrum input_type = est.io.InputType.ascii_spectrum
self._inputDialog.setAsciiFile(input_information.spectra_url.file_path()) self._inputDialog.setAsciiFile(input_information.spectra_url.file_path())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment