From ed93addae751bb8eb2fd9fd0c14ca0bd101ad8dc Mon Sep 17 00:00:00 2001
From: Yngve Inntjore Levinsen <Yngve.Levinsen@esss.se>
Date: Fri, 22 Jan 2016 11:36:28 +0100
Subject: [PATCH] added get_elem_idx() which gets the element with tracewin
 index given added update_adj() which updates the lattice based on
 Adjusted_Values.txt

---
 ess/lib_tw.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 93 insertions(+), 2 deletions(-)

diff --git a/ess/lib_tw.py b/ess/lib_tw.py
index 7e760be..24cfd77 100644
--- a/ess/lib_tw.py
+++ b/ess/lib_tw.py
@@ -36,7 +36,7 @@ class LATTICE:
     def __init__(self,file_name_lat,file_name_fmap,freq=352.21,gamma=1.0):
 
         # In case file_name_fmap is str
-        if isinstance(file_name_fmap,basestring)==True: file_name_fmap=[file_name_fmap]
+        if isinstance(file_name_fmap,basestring): file_name_fmap=[file_name_fmap]
 
         # Elem/comm class dict
         dic_cls={'DRIFT':DRIFT,
@@ -84,6 +84,28 @@ class LATTICE:
         # Assign idx, idx_elem, s, freq, apt
         self.update_idx()
 
+    def get_elem_idx(self,i):
+        '''
+        Get a TraceWin index number
+
+        Note: We start counting from 0, TW starts from 1
+        '''
+        for element in self.lst:
+            if element.idx_elem==i-1:
+                return element
+
+    def get_steerer_for(self,idx_elem):
+        '''
+        Returns the steerer object for an element (e.g. quad)
+        '''
+        previous=None
+        for element in self.lst:
+            if element.idx_elem+1==idx_elem:
+                if previous.typ=='STEERER':
+                    return previous
+                return None
+            previous=element
+
     def update_idx(self):
 
         # Assign/update idx, idx_elem, s, freq
@@ -136,7 +158,7 @@ class LATTICE:
 
         # Assign/update steerers
         for i in range(len(self.lst)):
-            if self.lst[i].idx_elem in BLx.keys():
+            if self.lst[i].idx_elem in BLx:
                 idx_elem=self.lst[i].idx_elem
                 if self.lst[i].typ=='THIN_STEERING':
                     self.lst[i].BLx=BLx[idx_elem]
@@ -148,6 +170,75 @@ class LATTICE:
                             self.lst[k].By=BLy[idx_elem]/self.lst[i].L
                             break
 
+    def update_adj(self,file_name="Adjusted_Values.txt"):
+        '''
+            Assign/update correction values from "Adjusted_Values.txt".
+
+            WARNING: many corner cases, what happens if multiple adjust
+                     commands have corrected same element for example?
+                     Use with care!
+        '''
+        with open(file_name,'r') as file:
+            # First we read in all corrections into dictionaries
+            values={}
+            counts={}
+            for lin in file:
+                lin=lin.split()
+                i=int(lin[1][1:-1])
+                if i=='ERROR' and lin[0]=='BEAM':
+                    continue
+                settings={}
+                for j in xrange(len(lin[2:])/3):
+                    k=int(lin[2+3*j])
+                    val=float(lin[4+3*j])
+                    if k in settings:
+                        settings[k].append(val)
+                    else:
+                        settings[k]=[val]
+                values[i]=settings
+                for j in settings:
+                    counts[j]=0
+
+        # now we will do all the ADJUST_STEERER ones
+        corr_next=False
+        for el in self.lst:
+            if isinstance(el,COMM) and el.typ=='ADJUST_STEERER':
+                i=int(el.para[0])
+                if i  in values:
+                    corr_next=values[i]
+            elif corr_next:
+                if isinstance(el,STEERER):
+                    # Bx and By are corrected..
+                    vals=corr_next.values()[0]
+                    el.Bx=vals[0]
+                    el.By=vals[1]
+                corr_next=False
+
+        # now we will do all the ADJUST ones
+        corr_next=False
+        # The TraceWin index number of the current element:
+        current=-1
+        for el in self.lst:
+            if el.idx_elem!=-1:
+                current=el.idx_elem+1
+            if isinstance(el,COMM) and el.typ=='ADJUST':
+                # The index of the corrector scheme
+                i = int(el.para[0])
+                # the parameter column to vary:
+                j = int(el.para[1])-1
+                # The TraceWin element index of the element we will vary:
+                k = current+1
+                # This corrector might not be used:
+                if i in values:
+                    # We will correct the next active element in lattice:
+                    value = values[i][k][counts[k]]
+                    # We have now used one value of the total in the current corrector:
+                    counts[k]+=1
+                    # the element to vary:
+                    vary=self.get_elem_idx(current+1)
+                    vary.para[j]=value
+                    vary.update()
+
     def get_tw(self,file_name):
 
         with open(file_name,'w') as file:
-- 
GitLab