From 9959db4f24ac11cc82e656292846396b358a27b1 Mon Sep 17 00:00:00 2001
From: Yngve Levinsen <yngve.levinsen@ess.eu>
Date: Mon, 27 Apr 2020 17:03:42 +0200
Subject: [PATCH] new class ess.TraceWin.envelope

---
 ess/TraceWin.py | 93 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 93 insertions(+)

diff --git a/ess/TraceWin.py b/ess/TraceWin.py
index 49a301a..2460c50 100644
--- a/ess/TraceWin.py
+++ b/ess/TraceWin.py
@@ -1265,6 +1265,99 @@ class envDiag:
         return ret
 
 
+class envelope:
+    """
+    Read an envelope file
+    Create one by saving envelope data plot
+    to ascii
+
+    Example::
+        from ess import TraceWin
+        from matplotlib import pyplot as plt
+        data = TraceWin.envelope('envelope.txt')
+        print(data.keys())
+        for key in data:
+            print(key, data.unit(key))
+            if 'rms_' in key:
+                plt.plot(data['position'], data[key]/max(data[key]), label=f"{key} [{data.unit(key)}]")
+        plt.legend()
+        plt.xlabel(f"Position [{data.unit('position')}]")
+        plt.show()
+
+    """
+
+    def __init__(self, filename):
+        self.filename = filename
+        self.headers = ()
+        self._units = []
+        self._raw_data = None
+        self._readAsciiFile()
+
+    def _readAsciiFile(self):
+
+        import numpy
+
+        self._raw_data = numpy.loadtxt(self.filename, skiprows=1)
+        with open(self.filename, "r") as fin:
+            header = fin.readline()
+            print(header)
+            headers = []
+            for h in header.split():
+                if "centroid" == h:
+                    continue
+                elif "(" not in h:
+                    headers.append(h)
+                elif "unit(" in h:
+                    self._units = tuple(h.split("(")[1][:-1].split(","))
+                else:
+                    base, main = h.split("(")
+                    if base:
+                        for k in main[:-1].split(","):
+                            headers.append(f"{base}_{k}")
+                    else:
+                        headers.extend(main[:-1].split(","))
+            self.headers = tuple(headers)
+
+    def __iter__(self):
+        return iter(self.keys())
+
+    def keys(self):
+        return self.headers
+
+    def where(self, column):
+        if column not in self.keys():
+            raise ValueError(f"Wrong column name {column}")
+        for i in range(len(self.keys())):
+            if self.keys()[i] == column:
+                return i
+
+    def __getitem__(self, column):
+        """
+        Get the data of the column specified
+
+        """
+        index = self.where(column)
+        return self._raw_data[:, index]
+
+    def unit(self, column):
+        """
+        TODO gam-1
+        """
+        if "'" in column:
+            return self._units[1]
+        elif "/" in column:
+            return ""
+        elif column in ["time"]:
+            return self._units[3]
+        elif "phase" in column:
+            return self._units[2]
+        elif "energy" in column:
+            return self._units[4]
+        elif "gam-1" == column:
+            return "GeV"
+        return self._units[0]
+
+
 class partran(dict):
     """
     Read partran1.out files..
-- 
GitLab