From 4b348a0a78771c813a0d9bfe8a755ff9d6088a33 Mon Sep 17 00:00:00 2001
From: Yngve Inntjore Levinsen <Yngve.Levinsen@esss.se>
Date: Tue, 10 Mar 2015 16:45:38 +0100
Subject: [PATCH] more functionality in the plt class

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

diff --git a/ess/TraceWin.py b/ess/TraceWin.py
index df33483..2b34e42 100644
--- a/ess/TraceWin.py
+++ b/ess/TraceWin.py
@@ -155,6 +155,106 @@ class plt:
         else:
             print "No data to plot at element",key
 
+    def calc_s(self):
+        '''
+        Generates self.s which holds
+        the position of each element
+        in metres
+        '''
+        import numpy
+
+        self.s=[]
+        for i in self.Nelp:
+            self.s.append(self[i]['Zgen']/100.0)
+        self.s=numpy.array(self.s)
+
+    def calc_rel(self):
+        '''
+        Calculates relativistic gamma/beta
+        at each position, based on 
+        AVERAGE beam energy
+        (NOT necessarily reference)
+        '''
+        import numpy
+
+        if not hasattr(self,'avg'):
+            self.calc_avg()
+        self.gamma=[]
+        self.beta=[]
+        for i,j in zip(self.Nelp,xrange(len(self.Nelp))):
+            Eavg=self.avg['E'][j]
+            self.gamma.append((self.mc2+Eavg)/self.mc2)
+            self.beta.append(numpy.sqrt(1.-1./self.gamma[-1]**2))
+
+    def calc_avg(self):
+        '''
+        Calculates averages of 6D coordinates at each
+        element, such that e.g.
+        self.avg["x"] gives average X at each location.
+
+        Units: cm
+        '''
+        import numpy
+
+
+        self.avg=dict(x=[], xp=[], y=[], yp=[], E=[], phi=[])
+
+        vals=['x', 'xp', 'y', 'yp', 'E', 'phi']
+
+        for i in self.Nelp:
+            data=self[i]
+            for v in vals:
+                self.avg[v].append(numpy.average(data[v]))
+
+        for v in vals:
+            self.avg[v]=numpy.array(self.avg[v])
+
+    def calc_minmax(self,pmin=5,pmax=95):
+        '''
+        Calculates min/max values of beam coordinates
+        in percentile, pmin is lower and pmax upper.
+
+        Units: cm
+        '''
+        import numpy
+
+
+        self.min=dict(x=[], xp=[], y=[], yp=[], E=[])
+        self.max=dict(x=[], xp=[], y=[], yp=[], E=[])
+
+        for i in self.Nelp:
+            data=self[i]
+            for v in self.min.keys():
+                self.min[v].append(numpy.percentile(data[v],pmin))
+                self.max[v].append(numpy.percentile(data[v],pmax))
+
+        for v in self.min.keys():
+            self.min[v]=numpy.array(self.min[v])
+            self.max[v]=numpy.array(self.max[v])
+
+    def calc_std(self):
+        '''
+        Calculates the sigma of each coordinate
+        such that e.g. self.sigma['x'] is the sigma_x
+
+        Note: SigmaX etc from partran1.out are in mm, not cm
+
+        Units: cm
+        '''
+        import numpy
+
+
+        self.sigma=dict(x=[], xp=[], y=[], yp=[])
+
+        for i in self.Nelp:
+            data=self[i]
+            for key in self.sigma.keys():
+                self.sigma[key].append(data[key].std())
+
+        for key in self.sigma.keys():
+            self.sigma[key]=numpy.array(self.sigma[key])
+
+
 class density_file:
     '''
     Simple class to read a TraceWin density file
-- 
GitLab