Source code for ana.signalanalyzer

# SPDX-FileCopyrightText: 2020/2021 Jonathan Pieper <ody55eus@mailbox.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later

"""
================
SA
================

Evaluate data from signal analyzer.
"""

from .single import SingleM

import logging
import numpy as np
import pandas as pd
import scipy.stats

import matplotlib.pyplot as plt


[docs]class SA(SingleM): """Loads and analyzes datafiles from :instrument:`SR785`""" def __init__(self, *args, **kwargs): """ Args: *args: **kwargs: Returns: None Raises: * ValueError """ super().__init__() self.logger = logging.getLogger('SA') self.name = 'SA' try: self.data = kwargs.get('data', args[0]) except Exception: error_message = "Not Able to find DataFrame. Please use SA_measurement(data)." self.logger.critical(error_message) raise ValueError(error_message) if isinstance(self.data, dict): self.df = self.data.get('data') self.info = self.data.get('info') else: self.df = self.data # Convert data to numeric values try: self.df.f = pd.to_numeric(self.df.f, errors='coerce') self.df.Vx = pd.to_numeric(self.df.Vx, errors='coerce') self.df.Vy = pd.to_numeric(self.df.Vy, errors='coerce') except Exception: error_message = "Unable to convert data to numeric." self.logger.critical(error_message) raise ValueError(error_message) # Redirect functions self._draw_oneoverf = self.style.draw_oneoverf self._set_plot_settings = self.style.set_plot_settings self._calc_log = self.calc_log def __repr__(self): ret = 'SA Measurement (Nr. %s)\n' % self.info.get('Nr', 0) for key, val in self.info.items(): ret += '%s:\t%s\n' % (key, val) return ret
[docs] def plot(self, **kwargs): """Plotting the Data on given Axis or creating a new Plot for plotting. .. code-block:: python :linenos: :caption: Signature plot(ax, label=None, color=None, linestyle=None, plot_x='f', plot_y='Vx', dont_set_plot_settings=False, xscale='log', yscale='log', xlim=(None, None), ylim=(None, None), legend_location='best', grid=None, title=None, xlabel='f [Hz]', ylabel='S_VH [V2/Hz]', ) Args: **kwargs: Note: If **dont_set_plot_settings** is True, all kwargs below are not used. """ ax = kwargs.get('ax') if not ax: fig, ax = plt.subplots() plotargs = {} if 'label' in kwargs: plotargs['label'] = kwargs.get('label') if 'color' in kwargs: plotargs['color'] = kwargs.get('color') if 'linestyle' in kwargs: plotargs['linestyle'] = kwargs.get('linestyle') ax.plot(self.df[kwargs.get('plot_x', 'f')], self.df[kwargs.get('plot_y', 'Vx')], **plotargs) if not (kwargs.get('dont_set_plot_settings', False)): self._set_plot_settings(**kwargs)
[docs] def fit(self, fit_range=(1e-2, 7e-1)): """Fits a linear regression Args: fit_range (tuple, optional, default: (1e-2, 1e0).): """ self.calc_log(self.df, ['f', 'Vx', 'Vy']) xmin, xmax = fit_range fit_area = self.df[self.df['f'] < xmax] fit_area = fit_area[fit_area.f > xmin] f = scipy.stats.linregress(fit_area.lnf, fit_area.lnVx) self.info['Slope'] = f.slope self.info['Intercept'] = f.intercept return f.intercept, f.slope