From eaca9430b3b5698da7defaae542c5a0417d26dd6 Mon Sep 17 00:00:00 2001
From: Junjie <junjie.zhang@eonerc.rwth-aachen.de>
Date: Fri, 30 Aug 2019 09:36:34 +0200
Subject: [PATCH] update plottools and timeseries

---
 villas/dataprocessing/plottools.py  | 21 +++++++++++-------
 villas/dataprocessing/timeseries.py | 34 ++++++++++++++++++++++++-----
 2 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/villas/dataprocessing/plottools.py b/villas/dataprocessing/plottools.py
index 768b709..06d46fe 100644
--- a/villas/dataprocessing/plottools.py
+++ b/villas/dataprocessing/plottools.py
@@ -1,9 +1,10 @@
 import matplotlib.pyplot as plt
 import numpy as np
 from .timeseries import *
+import scipy.signal as signal
 
 
-def plot_timeseries(figure_id, timeseries, plt_linestyle='-', plt_linewidth=2, plt_color=None, plt_legend_loc='lower right'):
+def plot_timeseries(figure_id, timeseries, marker='None', plt_linestyle='-', plt_linewidth=2, plt_color=None, plt_legend_loc='lower right', plt_legend=True, inlineLabel = False):
     """
     This function plots either a single timeseries or several timeseries in the figure defined by figure_id.
     Several timeseries (handed over in a list) are plotted in several subplots.
@@ -12,20 +13,24 @@ def plot_timeseries(figure_id, timeseries, plt_linestyle='-', plt_linewidth=2, p
     plt.figure(figure_id)
     if not isinstance(timeseries, list):
         if plt_color:
-            plt.plot(timeseries.time, timeseries.values, linestyle=plt_linestyle, label=timeseries.label, linewidth=plt_linewidth, color=plt_color)
+            plt.plot(timeseries.time, timeseries.values, marker=marker, linestyle=plt_linestyle, label=timeseries.label, linewidth=plt_linewidth, color=plt_color)
         else:
-            plt.plot(timeseries.time, timeseries.values, linestyle=plt_linestyle, label=timeseries.label, linewidth=plt_linewidth)
+            plt.plot(timeseries.time, timeseries.values, marker=marker, linestyle=plt_linestyle, label=timeseries.label, linewidth=plt_linewidth)
         plt.gca().autoscale(axis='x', tight=True)
-        plt.legend(loc=plt_legend_loc)
+        if(plt_legend):
+            plt.legend(loc=plt_legend_loc)
     else:
         for ts in timeseries:
             plt.subplot(len(timeseries), 1, timeseries.index(ts) + 1)
             if plt_color:
-                plt.plot(ts.time, ts.values, linestyle=plt_linestyle, label=ts.label, linewidth=plt_linewidth, color=plt_color)
+                plt.plot(ts.time, ts.values, marker=marker, linestyle=plt_linestyle, label=ts.label, linewidth=plt_linewidth, color=plt_color)
             else:
-                plt.plot(ts.time, ts.values, linestyle=plt_linestyle, label=ts.label, linewidth=plt_linewidth)
+                plt.plot(ts.time, ts.values, marker=marker, linestyle=plt_linestyle, label=ts.label, linewidth=plt_linewidth)
             plt.gca().autoscale(axis='x', tight=True)
-            plt.legend()
+            if(plt_legend):
+                plt.legend()
+    if(inlineLabel):
+        plt.text(timeseries.time[-1], timeseries.values[-1], timeseries.label)
 
 
 def set_timeseries_labels(timeseries, timeseries_labels):
@@ -37,4 +42,4 @@ def set_timeseries_labels(timeseries, timeseries_labels):
         timeseries.label = timeseries_labels
     else:
         for ts in timeseries:
-            ts.label = timeseries_labels[timeseries.index(ts)]
+            ts.label = timeseries_labels[timeseries.index(ts)]
\ No newline at end of file
diff --git a/villas/dataprocessing/timeseries.py b/villas/dataprocessing/timeseries.py
index 91583d1..3f992dc 100644
--- a/villas/dataprocessing/timeseries.py
+++ b/villas/dataprocessing/timeseries.py
@@ -1,6 +1,6 @@
 import numpy as np
 import cmath
-from scipy.signal import hilbert, chirp
+from scipy.signal import hilbert, find_peaks
 
 class TimeSeries:
     """Stores data from different simulation sources.
@@ -10,7 +10,10 @@ class TimeSeries:
         self.time = np.array(time)
         self.values = np.array(values)
         self.name = name
-        self.label = name
+        if not label:
+            self.label = name
+        else:
+            self.label = label
 
     def scale(self, factor):
         """Returns scaled timeseries.
@@ -18,13 +21,22 @@ class TimeSeries:
         ts_scaled = TimeSeries(self.name+'_scl', self.time, self.values * factor)
         return ts_scaled
 
+    def slice_ts(self, start_time, end_time):
+        time_step=self.time[1]-self.time[0]
+        start_index=int(start_time/time_step)
+        end_index=int(end_time/time_step)
+        slice_time=self.time[start_index:end_index]
+        slice_values=self.values[start_index:end_index]
+        ts_slice=TimeSeries(self.name+'_slice', slice_time, slice_values)
+        return ts_slice
+
     def abs(self):
         """ Calculate absolute value of complex time series.
         """
         abs_values = []
         for value in self.values:
             abs_values.append(np.abs(value))
-        ts_abs = TimeSeries(self.name+'_abs', self.time, abs_values)
+        ts_abs = TimeSeries(self.name+'_abs', self.time, abs_values, self.label+'_abs')
         return ts_abs
 
     def phase(self):
@@ -33,7 +45,7 @@ class TimeSeries:
         phase_values = []
         for value in self.values:
             phase_values.append(np.angle(value, deg=True))
-        ts_phase = TimeSeries(self.name+'_phase', self.time, phase_values)
+        ts_phase = TimeSeries(self.name+'_phase', self.time, phase_values, self.label+'_phase')
         return ts_phase
 
     def real(self):
@@ -239,8 +251,20 @@ class TimeSeries:
         duration = ts.time.max()
         samples = ts.time.size
         sampling_freq = samples / duration
-        analytic_signal = hilbert(ts.abs().values)
+        analytic_signal = hilbert(ts.values)
         instaneous_phase=np.unwrap(np.angle(analytic_signal))
         instantaneous_frequency = (np.diff(instaneous_phase) / (2.0 * np.pi) * sampling_freq)
         ts_instFreq=TimeSeries(str(ts.name + "instFreq"), ts.time[:-1], instantaneous_frequency)
         return ts_instFreq
+
+    @staticmethod
+    def getPeaks(ts, nom, tolerance):
+        peaks_, properties_ = find_peaks(ts.values, height=nom+tolerance)
+        ts_peaks=TimeSeries(str(ts.name+".peaks"), ts.time[peaks_], ts.values[peaks_])
+        return ts_peaks
+
+    @staticmethod
+    def getDeviation(ts, nom, tolerance):
+        dev_=np.where(np.abs(ts.abs().values-nom)>tolerance)
+        ts_dev=TimeSeries(str(ts.name+".peaks"), ts.time[dev_], ts.values[dev_])
+        return ts_dev
\ No newline at end of file
-- 
GitLab