Exemple #1
0
 def __fit_zero_loss_peak(self, spectrum_xdata: DataAndMetadata.DataAndMetadata) -> DataAndMetadata.DataAndMetadata:
     reference_frame = Calibration.ReferenceFrameAxis(spectrum_xdata.datum_dimensional_calibrations[0], spectrum_xdata.datum_dimension_shape[0])
     z = reference_frame.convert_to_pixel(Calibration.Coordinate(Calibration.CoordinateType.CALIBRATED, 0)).int_value
     calibration = copy.deepcopy(spectrum_xdata.datum_dimensional_calibrations[0])
     ys = spectrum_xdata.data
     if spectrum_xdata.is_navigable:
         calibrations = list(copy.deepcopy(spectrum_xdata.navigation_dimensional_calibrations)) + [calibration]
         yss = numpy.reshape(ys, (numpy.product(ys.shape[:-1]),) + (ys.shape[-1],))
         fit_data = self._perform_fits(yss, z)
         data_descriptor = DataAndMetadata.DataDescriptor(False, spectrum_xdata.navigation_dimension_count,
                                                          spectrum_xdata.datum_dimension_count)
         model_xdata = DataAndMetadata.new_data_and_metadata(
             numpy.reshape(fit_data, ys.shape[:-1] + (ys.shape[-1],)),
             data_descriptor=data_descriptor,
             dimensional_calibrations=calibrations,
             intensity_calibration=spectrum_xdata.intensity_calibration)
     else:
         poly_data = self._perform_fit(ys, z)
         model_xdata = DataAndMetadata.new_data_and_metadata(poly_data, dimensional_calibrations=[calibration],
                                                             intensity_calibration=spectrum_xdata.intensity_calibration)
     return model_xdata
Exemple #2
0
 def execute(self, eels_spectrum_data_item, background_model,
             fit_interval_graphics, **kwargs) -> None:
     try:
         spectrum_xdata = eels_spectrum_data_item.xdata
         assert spectrum_xdata.is_datum_1d
         assert spectrum_xdata.datum_dimensional_calibrations[
             0].units == "eV"
         eels_spectrum_xdata = spectrum_xdata
         # fit_interval_graphics.interval returns normalized coordinates. create calibrated intervals.
         fit_intervals = list()
         for fit_interval_graphic in fit_interval_graphics:
             fit_interval = Calibration.CalibratedInterval(
                 Calibration.Coordinate(
                     Calibration.CoordinateType.NORMALIZED,
                     fit_interval_graphic.interval[0]),
                 Calibration.Coordinate(
                     Calibration.CoordinateType.NORMALIZED,
                     fit_interval_graphic.interval[1]))
             fit_intervals.append(fit_interval)
         fit_minimum = min(
             [fit_interval.start.value for fit_interval in fit_intervals])
         signal_interval = Calibration.CalibratedInterval(
             Calibration.Coordinate(Calibration.CoordinateType.NORMALIZED,
                                    fit_minimum),
             Calibration.Coordinate(Calibration.CoordinateType.NORMALIZED,
                                    1.0))
         reference_frame = Calibration.ReferenceFrameAxis(
             eels_spectrum_xdata.datum_dimensional_calibrations[0],
             eels_spectrum_xdata.datum_dimension_shape[0])
         signal_xdata = Core.get_calibrated_interval_slice(
             eels_spectrum_xdata, reference_frame, signal_interval)
         background_xdata = None
         subtracted_xdata = None
         if background_model._data_structure.entity:
             entity_id = background_model._data_structure.entity.entity_type.entity_id
             for component in Registry.get_components_by_type(
                     "background-model"):
                 if entity_id == component.background_model_id:
                     fit_result = component.fit_background(
                         spectrum_xdata=spectrum_xdata,
                         fit_intervals=fit_intervals,
                         background_interval=signal_interval)
                     background_xdata = fit_result["background_model"]
                     # use 'or' to avoid doing subtraction if subtracted_spectrum already present
                     subtracted_xdata = fit_result.get(
                         "subtracted_spectrum",
                         None) or Core.calibrated_subtract_spectrum(
                             spectrum_xdata, background_xdata)
         if background_xdata is None:
             background_xdata = DataAndMetadata.new_data_and_metadata(
                 numpy.zeros_like(signal_xdata.data),
                 intensity_calibration=signal_xdata.intensity_calibration,
                 dimensional_calibrations=signal_xdata.
                 dimensional_calibrations)
         if subtracted_xdata is None:
             subtracted_xdata = DataAndMetadata.new_data_and_metadata(
                 signal_xdata.data,
                 intensity_calibration=signal_xdata.intensity_calibration,
                 dimensional_calibrations=signal_xdata.
                 dimensional_calibrations)
         self.__background_xdata = background_xdata
         self.__subtracted_xdata = subtracted_xdata
     except Exception as e:
         import traceback
         print(traceback.format_exc())
         print(e)
         raise
 def __fit_background(
     self, spectrum_xdata: DataAndMetadata.DataAndMetadata,
     fit_intervals: typing.Sequence[Calibration.CalibratedInterval],
     background_interval: Calibration.CalibratedInterval
 ) -> DataAndMetadata.DataAndMetadata:
     reference_frame = Calibration.ReferenceFrameAxis(
         spectrum_xdata.datum_dimensional_calibrations[0],
         spectrum_xdata.datum_dimension_shape[0])
     # fit polynomial to the data
     xs = numpy.concatenate([
         Core.get_calibrated_interval_domain(reference_frame, fit_interval)
         for fit_interval in fit_intervals
     ])
     if len(fit_intervals) > 1:
         ys = numpy.concatenate([
             Core.get_calibrated_interval_slice(spectrum_xdata,
                                                reference_frame,
                                                fit_interval).data
             for fit_interval in fit_intervals
         ])
     else:
         ys = Core.get_calibrated_interval_slice(spectrum_xdata,
                                                 reference_frame,
                                                 fit_intervals[0]).data
     # generate background model data from the series
     n = reference_frame.convert_to_pixel(
         background_interval.end
     ).int_value - reference_frame.convert_to_pixel(
         background_interval.start).int_value
     interval_start = reference_frame.convert_to_calibrated(
         background_interval.start).value
     interval_end = reference_frame.convert_to_calibrated(
         background_interval.end).value
     interval_end -= (interval_end - interval_start
                      ) / n  # n samples at the left edges of each pixel
     calibration = copy.deepcopy(
         spectrum_xdata.datum_dimensional_calibrations[0])
     calibration.offset = reference_frame.convert_to_calibrated(
         background_interval.start).value
     fs = numpy.linspace(interval_start, interval_end, n)
     if spectrum_xdata.is_navigable:
         calibrations = list(
             copy.deepcopy(
                 spectrum_xdata.navigation_dimensional_calibrations)) + [
                     calibration
                 ]
         yss = numpy.reshape(ys, (numpy.product(ys.shape[:-1]), ) +
                             (ys.shape[-1], ))
         fit_data = self._perform_fits(xs, yss, fs)
         data_descriptor = DataAndMetadata.DataDescriptor(
             False, spectrum_xdata.navigation_dimension_count,
             spectrum_xdata.datum_dimension_count)
         background_xdata = DataAndMetadata.new_data_and_metadata(
             numpy.reshape(fit_data, ys.shape[:-1] + (n, )),
             data_descriptor=data_descriptor,
             dimensional_calibrations=calibrations,
             intensity_calibration=spectrum_xdata.intensity_calibration)
     else:
         poly_data = self._perform_fit(xs, ys, fs)
         background_xdata = DataAndMetadata.new_data_and_metadata(
             poly_data,
             dimensional_calibrations=[calibration],
             intensity_calibration=spectrum_xdata.intensity_calibration)
     return background_xdata