From d47cff168858e8432e7a86270b0dcfd1bce8d77e Mon Sep 17 00:00:00 2001
From: Yngve Inntjore Levinsen <Yngve.Levinsen@esss.se>
Date: Tue, 14 Jun 2016 10:27:08 +0200
Subject: [PATCH] adding changes from example.zip of Ryoichi

---
 ess/lib_tw.py      |  68 +++++---
 ess/lib_tw_elem.py | 421 +++++++++++++++++++++++++++++++++++----------
 2 files changed, 378 insertions(+), 111 deletions(-)

diff --git a/ess/lib_tw.py b/ess/lib_tw.py
index 7628b46..e70da71 100644
--- a/ess/lib_tw.py
+++ b/ess/lib_tw.py
@@ -47,12 +47,32 @@ class LATTICE:
         if isinstance(file_name_fmap,basestring): file_name_fmap=[file_name_fmap]
 
         # Elem/comm class dict
-        dic_cls={'DRIFT':DRIFT,
-                 'QUAD':QUAD,'BEND':BEND,'EDGE':EDGE,'THIN_STEERING':THIN_STEERING,
-                 'GAP':GAP,'DTL_CEL':DTL_CEL,
-                 'APERTURE':APERTURE,'DIAG_POSITION':DIAG_POSITION,
-                 'STEERER':STEERER,'CHOPPER':CHOPPER,
-                 'FREQ':FREQ,'MARKER':MARKER,'ADJUST':ADJUST}
+        dic_cls={'DRIFT'               : DRIFT               ,
+                 'QUAD'                : QUAD                ,
+                 'THIN_STEERING'       : THIN_STEERING       ,
+                 'GAP'                 : GAP                 ,
+                 'DTL_CEL'             : DTL_CEL             ,
+                 #
+                 'BEND'                : BEND                ,
+                 'EDGE'                : EDGE                ,
+                 'APERTURE'            : APERTURE            ,
+                 'DIAG_POSITION'       : DIAG_POSITION       ,
+                 #
+                 'STEERER'             : STEERER             ,
+                 'CHOPPER'             : CHOPPER             ,
+                 #
+                 'FREQ'                : FREQ                ,
+                 'MARKER'              : MARKER              ,
+                 'ADJUST'              : ADJUST              ,
+                 #
+                 'ERROR_BEAM_STAT'     : ERROR_BEAM_STAT     ,
+                 'ERROR_BEAM_DYN'      : ERROR_BEAM_DYN      ,
+                 'ERROR_QUAD_NCPL_STAT': ERROR_QUAD_NCPL_STAT,
+                 'ERROR_QUAD_CPL_STAT' : ERROR_QUAD_CPL_STAT ,
+                 'ERROR_CAV_NCPL_STAT' : ERROR_CAV_NCPL_STAT ,
+                 'ERROR_CAV_NCPL_DYN'  : ERROR_CAV_NCPL_DYN  ,
+                 'ERROR_CAV_CPL_STAT'  : ERROR_CAV_CPL_STAT  ,
+                 'ERROR_CAV_CPL_DYN'   : ERROR_CAV_CPL_DYN   }
 
         # Field map dict
         dic_fmap={}
@@ -76,10 +96,10 @@ class LATTICE:
                         typ =lin.split()[0 ].upper()
                         para=lin.split()[1:]
                     # Map to a class
-                    if   typ == 'FIELD_MAP'      : lst.append(   FIELD_MAP(name,typ,para,dic_fmap))
-                    elif typ in dic_cls.keys()   : lst.append(dic_cls[typ](name,typ,para)         )
-                    elif 'DIAG' in typ           : lst.append(        DIAG(name,typ,para)         )
-                    else                         : lst.append(        COMM(name,typ,para)         )
+                    if   typ == 'FIELD_MAP'    : lst.append(   FIELD_MAP(name,typ,para,dic_fmap))
+                    elif typ in dic_cls.keys() : lst.append(dic_cls[typ](name,typ,para)         )
+                    elif 'DIAG' in typ         : lst.append(        DIAG(name,typ,para)         )
+                    else                       : lst.append(        COMM(name,typ,para)         )
 
                     # in case of field map path, update dictionary with new path
                     if typ == 'FIELD_MAP_PATH' : _update_field_map_dict(dic_fmap,para[0])
@@ -105,7 +125,7 @@ class LATTICE:
         found=False
         correctors=[]
         for element in self.lst:
-            if found: 
+            if found:
                 #WARNING I worry that there could be an inactive comment/element between the ADJUST and actual corrector
                 logging.debug("Found element {} for corrector family {}".format(element.typ,i))
                 correctors.append(element)
@@ -143,6 +163,9 @@ class LATTICE:
         # Assign/update idx, idx_elem, s, freq
         for i in range(len(self.lst)):
             if i==0:
+                self.lst[0].idx     =-1
+                self.lst[0].idx_elem=-1
+                self.lst[0].s       = 0.0
                 self.lst[0].freq=self.freq
             if i!=0:
                 self.lst[i].idx     =self.lst[i-1].idx
@@ -150,6 +173,7 @@ class LATTICE:
                 self.lst[i].s       =self.lst[i-1].s
                 self.lst[i].freq    =self.lst[i-1].freq
             self.lst[i].update_idx()
+
         # Assign apt (using apt of the previous elem for diag elem)
         for i in range(len(self.lst)):
             try:
@@ -342,14 +366,14 @@ class PROJECT:
 class PARTRAN:
     '''
         Note:
-        
+
         - The list not complete. Add parameters as needed.
-        
+
         History:
-        
+
         - 2016.02.17: Changed how to identify the line of indices.
         - 2016.02.17: Added a logic to avoid #/0 for LEBT.
-                
+
     '''
     def __init__(self,file_name):
 
@@ -362,7 +386,7 @@ class PARTRAN:
         with open(file_name) as file:
             for lin in file.readlines():
                 lin=lin.split()
-                if '##' in lin[0]:                    
+                if '##' in lin[0]:
                     idx_s    =lin.index("z(m)"   ); idx_gamma=lin.index("gama-1" )
                     idx_x    =lin.index("x0"     ); idx_y    =lin.index("y0"     );                              idx_phs =lin.index("p0"   )
                     idx_sigx =lin.index("SizeX"  ); idx_sigy =lin.index("SizeY"  ); idx_sigz=lin.index("SizeZ"); idx_sigp=lin.index("SizeP")
@@ -393,7 +417,7 @@ class PARTRAN:
         for i in range(len(self.s)):
             if self.epsz[i]==0.0: self.epsz[i]=inf
             if self.epsp[i]==0.0: self.epsp[i]=inf
-        
+
         # Additional instances
         self.gamma= data[idx_gamma]+1.0
         self.beta = sqrt(1.0-1.0/self.gamma**2)
@@ -411,7 +435,7 @@ class PARTRAN:
         for i in range(len(self.s)):
             if self.epsz[i]==inf: self.epsz[i]=0.0
             if self.epsp[i]==inf: self.epsp[i]=0.0
-        
+
         # Convert to list (not necessary?)
         self.s    =self.s.tolist()    ; self.gamma=self.gamma.tolist(); self.beta=self.beta.tolist()
         self.x    =self.x.tolist()    ; self.y    =self.y.tolist()    ; self.z   =self.z.tolist()   ; self.phs =self.phs.tolist()
@@ -483,11 +507,11 @@ class DENSITY:
           Nelem       : loss_num_(..), loss_pow_(..)
 
           Nelem x Nstep: den
-          
+
         - History:
- 
+
           * 2015.11.12: Baseline ver
-          * 2016.03.29: Adapted to ver 9 (apt includes shifts) 
+          * 2016.03.29: Adapted to ver 9 (apt includes shifts)
     '''
     def __init__(self,file_name):
 
@@ -520,7 +544,7 @@ class DENSITY:
                     Ibeam.append(fromfile(file,dtype=float32,count=1)[0])
                     s.append(    fromfile(file,dtype=float32,count=1)[0])
                     if ver>=9: apt.append(fromfile(file,dtype=float32,count=4))
-                    else     : apt.append(fromfile(file,dtype=float32,count=2))   
+                    else     : apt.append(fromfile(file,dtype=float32,count=2))
                     Nstep=fromfile(file,dtype=uint32,count=1)[0]
                     cent_ave.append(fromfile(file,dtype=float32,count=7))
                     cent_rms.append(fromfile(file,dtype=float32,count=7))
diff --git a/ess/lib_tw_elem.py b/ess/lib_tw_elem.py
index a9da63b..95a0837 100644
--- a/ess/lib_tw_elem.py
+++ b/ess/lib_tw_elem.py
@@ -64,7 +64,16 @@
 
         PLOT_DST
 
-    2016.01.19
+    - History
+
+      * 2016.01.19
+
+        - Initial ver.
+
+      * 2016.05.07
+
+        - ADJUST activated.
+        - max added to THIN_STEERING.
 '''
 
 #---- Libs
@@ -90,9 +99,6 @@ class FIELD_MAP_DATA:
     '''
     def __init__(self,file_name):
 
-        if file_name.split('.')[-1]!='edz':
-            raise ValueError('Only 1D field maps (Ez) is supported for now')
-
         # Read file
         with open(file_name) as file: lin=file.readlines()
 
@@ -121,12 +127,6 @@ class ELEM:
         self.gamma   = 1.0
         self.freq    = 352.21
 
-    def update(self):
-        '''
-          Updates element based on para
-        '''
-        pass
-
     def update_idx(self):
 
         # Update idx, idx_elem, s
@@ -168,13 +168,6 @@ class COMM:
         self.gamma   = 1.0
         self.freq    = 352.21
 
-    def __repr__(self):
-        S="lib_tw_elem.COMM: " + self.name + ", type: " + self.typ + ", para: " + str(self.para)
-        S+="\n  idx: " + str(self.idx) + ", idx_elem: " + str(self.idx_elem)
-        S+="\n  s: " + str(self.s) + ", gamma:" + str(self.gamma)
-        S+="\n  freq: " + str(self.freq)
-        return S
-
     def update_idx(self):
 
         # Update idx
@@ -196,16 +189,17 @@ class FIELD_MAP(ELEM):
     def __init__(self,name,typ,para,dic_fmap):
 
         ELEM.__init__(self,name,typ,para)
+
         # TW instances
-        self.name_fmap=      para[8]
-        self.typ_fmap =      para[0]
-        self.L        =float(para[1])*1e-3      # mm => m
+        self.name_fmap=  str(para[8])
+        self.typ_fmap =  str(para[0])
+        self.L        =float(para[1])*1e-3      #  mm =>   m
         self.phs_rf   =float(para[2])*pi/180.0  # deg => rad
         self.apt      =float(para[3])
         self.Bnom     =float(para[4])
         self.Enom     =float(para[5])
         self.sc_comp  =float(para[6])
-        self.flag_apt =      para[7]
+        self.flag_apt =  str(para[7])
 
         # Option instances
         self.data=dic_fmap[self.name_fmap]
@@ -241,15 +235,15 @@ class FIELD_MAP(ELEM):
 
         if self.name!='': lin=self.name+': '+self.typ+' '
         if self.name=='': lin=               self.typ+' '
-        lin+=    self.typ_fmap        +' '
+        lin+=str(self.typ_fmap       ) +' '
         lin+=str(self.L*1e3          )+' '
         lin+=str(self.phs_rf*180.0/pi)+' '
         lin+=str(self.apt            )+' '
         lin+=str(self.Bnom           )+' '
         lin+=str(self.Enom           )+' '
         lin+=str(self.sc_comp        )+' '
-        lin+=    self.flag_apt        +' '
-        lin+=    self.name_fmap
+        lin+=str(self.flag_apt       )+' '
+        lin+=str(self.name_fmap      )
 
         return lin
 
@@ -300,7 +294,7 @@ class DRIFT(ELEM):
 
         # TW option instances
         try   : self.apty=float(para[2])
-        except: self.apty=0.0
+        except: self.apty=          0.0
 
     def get_tw(self):
 
@@ -350,28 +344,22 @@ class QUAD(ELEM):
         ELEM.__init__(self,name,typ,para)
 
         # TW instances
-        self.update()
-        self.tilt=0.0
+        self.L   =float(para[0])*1e-3  # mm => m
+        self.G   =float(para[1])
+        self.apt =float(para[2])
+        self.tilt=          0.0
 
         # TW option instances
         try   : self.b3    =float(para[4])
-        except: self.b3    =0.0
+        except: self.b3    =          0.0
         try   : self.b4    =float(para[5])
-        except: self.b4    =0.0
+        except: self.b4    =          0.0
         try   : self.b5    =float(para[6])
-        except: self.b5    =0.0
+        except: self.b5    =          0.0
         try   : self.b6    =float(para[7])
-        except: self.b6    =0.0
+        except: self.b6    =          0.0
         try   : self.r_good=float(para[8])
-        except: self.r_good=0.0
-
-    def update(self):
-        '''
-          Updates element based on para
-        '''
-        self.L   =float(self.para[0])*1e-3  # mm => m
-        self.G   =float(self.para[1])
-        self.apt =float(self.para[2])
+        except: self.r_good=          0.0
 
     def get_tw(self):
 
@@ -429,16 +417,13 @@ class THIN_STEERING(ELEM):
         ELEM.__init__(self,name,typ,para)
 
         # TW instances
-        self.update()
-        self.typ_EM='0'
-
-    def update(self):
-        '''
-          Updates element based on para
-        '''
         self.BLx   =float(self.para[0])
         self.BLy   =float(self.para[1])
         self.apt   =float(self.para[2])
+        self.typ_EM='0'
+
+        # Option instances
+        self.max  =0.0
 
     def get_tw(self):
 
@@ -447,7 +432,7 @@ class THIN_STEERING(ELEM):
         lin+=str(self.BLx   )+' '
         lin+=str(self.BLy   )+' '
         lin+=str(self.apt   )+' '
-        lin+=    self.typ_EM
+        lin+=str(self.typ_EM)
 
         return lin
 
@@ -497,13 +482,13 @@ class GAP(ELEM):
 
         # TW option instances
         try   : self.beta_s=float(para[4])
-        except: self.beta_s=0.0
+        except: self.beta_s=          0.0
         try   : self.T0    =float(para[5])
-        except: self.T0    =0.0
+        except: self.T0    =          0.0
         try   : self.T1    =float(para[6])
-        except: self.T1    =0.0
+        except: self.T1    =          0.0
         try   : self.T2    =float(para[7])
-        except: self.T2    =0.0
+        except: self.T2    =          0.0
 
         # Option instances
         self.E0TL=self.E0T0L
@@ -586,13 +571,13 @@ class DTL_CEL(ELEM):
 
         # TW option instances
         try   : self.beta_s=float(para[10])
-        except: self.beta_s=0.0
+        except: self.beta_s=           0.0
         try   : self.T0    =float(para[11])
-        except: self.T0    =0.0
+        except: self.T0    =           0.0
         try   : self.T1    =float(para[12])
-        except: self.T1    =0.0
+        except: self.T1    =           0.0
         try   : self.T2    =float(para[13])
-        except: self.T2    =0.0
+        except: self.T2    =           0.0
 
         # Option instances
         self.E0TL=self.E0T0L
@@ -749,7 +734,7 @@ class BEND(ELEM):
         self.angle=float(para[0])*pi/180.0  # deg => rad
         self.rho  =float(para[1])*1e-3      # mm => m
         self.apt  =float(para[3])
-        self.plane=      para[4]
+        self.plane=  str(para[4])
 
         # Option instances
         if self.plane=='0': self.tilt=0.0
@@ -816,7 +801,7 @@ class EDGE(ELEM):
         self.ff_coef1=float(para[3])
         self.ff_coef2=float(para[4])
         self.apt     =float(para[5])
-        self.plane   =      para[6]
+        self.plane   =  str(para[6])
 
         # Option instances
         if self.plane=='0': self.tilt=0.0
@@ -848,7 +833,7 @@ class APERTURE(ELEM):
         # TW instances
         self.apt    =float(para[0])
         self.apty   =float(para[1])
-        self.typ_apt=      para[2]
+        self.typ_apt=  str(para[2])
 
     def get_madx(self):
 
@@ -973,9 +958,9 @@ class STEERER(COMM):
 
         # TW option instances
         try   : self.max   =float(para[2])
-        except: self.max   =0.0
+        except: self.max   =          0.0
         try   : self.nonlin=float(para[5])
-        except: self.nonlin=0.0
+        except: self.nonlin=          0.0
 
     def get_tw(self):
 
@@ -998,21 +983,21 @@ class CHOPPER(COMM):
         COMM.__init__(self,name,typ,para)
 
         # TW instances
-        self.Nelem=  int(para[0])
-        self.volt =float(para[1])
-        self.gap  =float(para[2])*2.0
-        self.d_pos=float(para[3])
-        self.plane=      para[4]
+        self.Nelem   =  int(para[0])
+        self.volt    =float(para[1])
+        self.gap     =float(para[2])*2.0
+        self.gap_cent=float(para[3])
+        self.plane   =  str(para[4])
 
     def get_tw(self):
 
         if self.name!='': lin=self.name+': '+self.typ+' '
         if self.name=='': lin=               self.typ+' '
-        lin+=str(self.Nelem  )+' '
-        lin+=str(self.volt   )+' '
-        lin+=str(self.gap*0.5)+' '
-        lin+=str(self.d_pos  )+' '
-        lin+=    self.plane
+        lin+=str(self.Nelem   )+' '
+        lin+=str(self.volt    )+' '
+        lin+=str(self.gap*0.5 )+' '
+        lin+=str(self.gap_cent)+' '
+        lin+=str(self.plane   )
 
         return lin
 
@@ -1062,25 +1047,283 @@ class MARKER(COMM):
 
     ##     return lin
 
-#---- No longer needed ??
+class ADJUST(COMM):
+    '''
+        - Uncommented for THIN_STEERING.
+    '''
+    def __init__(self,name,typ,para):
+
+        COMM.__init__(self,name,typ,para)
+
+        # TW instances
+        self.fam=str(para[0])
+        self.var=int(para[1])
+
+        # TW option instances
+        try   : self.link=  str(self.para[2])
+        except: self.link=               '0'
+        try   : self.min =float(self.para[3])
+        except: self.min =               0.0
+        try   : self.max =float(self.para[4])
+        except: self.max =               0.0
+        try   : self.ini =float(self.para[5])
+        except: self.ini =               0.0
+
+#---- Error commands (active)
+
+#--
+
+class ERROR_BEAM(COMM):
+    '''
+    '''
+    def __init__(self,name,typ,para):
+
+        COMM.__init__(self,name,typ,para)
+
+        # TW instances
+        self.typ_dist=str(para[0])
+
+        # TW option instances
+        try   : self.x       =float(para[ 1])
+        except: self.x       =           0.0
+        try   : self.y       =float(para[ 2])
+        except: self.y       =           0.0
+        try   : self.phs     =float(para[ 3])*pi/180.0  # deg => rad
+        except: self.phs     =           0.0
+        try   : self.xp      =float(para[ 4])
+        except: self.xp      =           0.0
+        try   : self.yp      =float(para[ 5])
+        except: self.yp      =           0.0
+        try   : self.ken     =float(para[ 6])
+        except: self.ken     =           0.0
+        try   : self.epsx    =float(para[ 7])*1e-2  # % => 1
+        except: self.epsx    =           0.0
+        try   : self.epsy    =float(para[ 8])*1e-2  # % => 1
+        except: self.epsy    =           0.0
+        try   : self.epsz    =float(para[ 9])*1e-2  # % => 1
+        except: self.epsz    =           0.0
+        try   : self.mx      =float(para[10])*1e-2  # % => 1
+        except: self.mx      =           0.0
+        try   : self.my      =float(para[11])*1e-2  # % => 1
+        except: self.my      =           0.0
+        try   : self.mz      =float(para[12])*1e-2  # % => 1
+        except: self.mz      =           0.0
+        try   : self.Ibeam   =float(para[13])
+        except: self.Ibeam   =           0.0
+        try   : self.alfx_min=float(para[14])
+        except: self.alfx_min=           0.0
+        try   : self.alfx_max=float(para[15])
+        except: self.alfx_max=           0.0
+        try   : self.betx_min=float(para[16])
+        except: self.betx_min=           0.0
+        try   : self.betx_max=float(para[17])
+        except: self.betx_max=           0.0
+        try   : self.alfy_min=float(para[18])
+        except: self.alfy_min=           0.0
+        try   : self.alfy_max=float(para[19])
+        except: self.alfy_max=           0.0
+        try   : self.bety_min=float(para[20])
+        except: self.bety_min=           0.0
+        try   : self.bety_max=float(para[21])
+        except: self.bety_max=           0.0
+        try   : self.alfz_min=float(para[22])
+        except: self.alfz_min=           0.0
+        try   : self.alfz_max=float(para[23])
+        except: self.alfz_max=           0.0
+        try   : self.betz_min=float(para[24])
+        except: self.betz_min=           0.0
+        try   : self.betz_max=float(para[25])
+        except: self.betz_max=           0.0
+
+    def get_tw(self):
+
+        if self.name!='': lin=self.name+': '+self.typ+' '
+        if self.name=='': lin=               self.typ+' '
+        lin+=str(self.typ_dist    )+' '
+        lin+=str(self.x           )+' '
+        lin+=str(self.y           )+' '
+        lin+=str(self.phs*180.0/pi)+' '
+        lin+=str(self.xp          )+' '
+        lin+=str(self.yp          )+' '
+        lin+=str(self.ken         )+' '
+        lin+=str(self.epsx*1e2    )+' '
+        lin+=str(self.epsy*1e2    )+' '
+        lin+=str(self.epsz*1e2    )+' '
+        lin+=str(self.mx  *1e2    )+' '
+        lin+=str(self.my  *1e2    )+' '
+        lin+=str(self.mz  *1e2    )+' '
+        lin+=str(self.Ibeam       )+' '
+        lin+=str(self.alfx_min    )+' '
+        lin+=str(self.alfx_max    )+' '
+        lin+=str(self.betx_min    )+' '
+        lin+=str(self.betx_max    )+' '
+        lin+=str(self.alfy_min    )+' '
+        lin+=str(self.alfy_max    )+' '
+        lin+=str(self.bety_min    )+' '
+        lin+=str(self.bety_max    )+' '
+        lin+=str(self.alfz_min    )+' '
+        lin+=str(self.alfz_max    )+' '
+        lin+=str(self.betz_min    )+' '
+        lin+=str(self.betz_max    )
+
+        return lin
+
+class ERROR_BEAM_STAT(ERROR_BEAM):
+    '''
+    '''
+    def __init__(self,name,typ,para):
+
+        ERROR_BEAM.__init__(self,name,typ,para)
+
+class ERROR_BEAM_DYN(ERROR_BEAM):
+    '''
+    '''
+    def __init__(self,name,typ,para):
+
+        ERROR_BEAM.__init__(self,name,typ,para)
+
+#--
+
+class ERROR_QUAD(COMM):
+    '''
+    '''
+    def __init__(self,name,typ,para):
+
+        COMM.__init__(self,name,typ,para)
+
+        # TW instances
+        self.Nelem   =int(para[0])
+        self.typ_dist=str(para[1])
+
+        # TW option instances
+        try   : self.x   =float(para[ 2])
+        except: self.x   =           0.0
+        try   : self.y   =float(para[ 3])
+        except: self.y   =           0.0
+        try   : self.rotx=float(para[ 4])*pi/180.0  # deg => rad
+        except: self.rotx=           0.0
+        try   : self.roty=float(para[ 5])*pi/180.0  # deg => rad
+        except: self.roty=           0.0
+        try   : self.rotz=float(para[ 6])*pi/180.0  # deg => rad
+        except: self.rotz=           0.0
+        try   : self.G   =float(para[ 7])*1e-2  # % => 1
+        except: self.G   =           0.0
+        try   : self.z   =float(para[ 8])
+        except: self.z   =           0.0
+        try   : self.b3  =float(para[ 9])*1e-2  # % => 1
+        except: self.b3  =           0.0
+        try   : self.b4  =float(para[10])*1e-2  # % => 1
+        except: self.b4  =           0.0
+        try   : self.b5  =float(para[11])*1e-2  # % => 1
+        except: self.b5  =           0.0
+        try   : self.b6  =float(para[12])*1e-2  # % => 1
+        except: self.b6  =           0.0
+
+    def get_tw(self):
+
+        if self.name!='': lin=self.name+': '+self.typ+' '
+        if self.name=='': lin=               self.typ+' '
+        lin+=str(self.Nelem          )+' '
+        lin+=str(self.typ_dist       )+' '
+        lin+=str(self.x              )+' '
+        lin+=str(self.y              )+' '
+        lin+=str(self.rotx*180.0/pi  )+' '
+        lin+=str(self.roty*180.0/pi  )+' '
+        lin+=str(self.rotz*180.0/pi  )+' '
+        lin+=str(self.G*1e2          )+' '
+        lin+=str(self.z              )+' '
+        lin+=str(self.b3*1e2         )+' '
+        lin+=str(self.b4*1e2         )+' '
+        lin+=str(self.b5*1e2         )+' '
+        lin+=str(self.b6*1e2         )
+
+        return lin
+
+class ERROR_QUAD_NCPL_STAT(ERROR_QUAD):
+    '''
+    '''
+    def __init__(self,name,typ,para):
+
+        ERROR_QUAD.__init__(self,name,typ,para)
+
+class ERROR_QUAD_CPL_STAT(ERROR_QUAD):
+    '''
+    '''
+    def __init__(self,name,typ,para):
+
+        ERROR_QUAD.__init__(self,name,typ,para)
+
+#--
+
+class ERROR_CAV(COMM):
+    '''
+    '''
+    def __init__(self,name,typ,para):
+
+        COMM.__init__(self,name,typ,para)
 
-## class ADJUST(COMM):
-##     '''
-##     '''
-##     def __init__(self,name,typ,para):
+        # TW instances
+        self.Nelem   =int(para[0])
+        self.typ_dist=str(para[1])
+
+        # TW option instances
+        try   : self.x     =float(para[2])
+        except: self.x     =          0.0
+        try   : self.y     =float(para[3])
+        except: self.y     =          0.0
+        try   : self.rotx  =float(para[4])*pi/180.0  # deg => rad
+        except: self.rotx  =          0.0
+        try   : self.roty  =float(para[5])*pi/180.0  # deg => rad
+        except: self.roty  =          0.0
+        try   : self.E     =float(para[6])*1e-2      #   % =>   1
+        except: self.E     =          0.0
+        try   : self.phs_rf=float(para[7])*pi/180.0  # deg => rad
+        except: self.phs_rf=          0.0
+        try   : self.z     =float(para[8])
+        except: self.z     =          0.0
+
+    def get_tw(self):
+
+        if self.name!='': lin=self.name+': '+self.typ+' '
+        if self.name=='': lin=               self.typ+' '
+        lin+=str(self.Nelem          )+' '
+        lin+=str(self.typ_dist       )+' '
+        lin+=str(self.x              )+' '
+        lin+=str(self.y              )+' '
+        lin+=str(self.rotx*180.0/pi  )+' '
+        lin+=str(self.roty*180.0/pi  )+' '
+        lin+=str(self.E*1e2          )+' '
+        lin+=str(self.phs_rf*180.0/pi)+' '
+        lin+=str(self.z              )
+
+        return lin
+
+class ERROR_CAV_NCPL_STAT(ERROR_CAV):
+    '''
+    '''
+    def __init__(self,name,typ,para):
 
-##         COMM.__init__(self,name,typ,para)
+        ERROR_CAV.__init__(self,name,typ,para)
+
+class ERROR_CAV_CPL_STAT(ERROR_CAV):
+    '''
+    '''
+    def __init__(self,name,typ,para):
+
+        ERROR_CAV.__init__(self,name,typ,para)
+
+class ERROR_CAV_NCPL_DYN(ERROR_CAV):
+    '''
+    '''
+    def __init__(self,name,typ,para):
+
+        ERROR_CAV.__init__(self,name,typ,para)
+
+class ERROR_CAV_CPL_DYN(ERROR_CAV):
+    '''
+    '''
+    def __init__(self,name,typ,para):
 
-##         # TW instances
-##         self.fam=    para[0]
-##         self.var=int(para[1])
+        ERROR_CAV.__init__(self,name,typ,para)
 
-##         # TW option instances
-##         try   : self.link=self.para[2]
-##         except: self.link='0'
-##         try   : self.min =float(self.para[3])
-##         except: self.min =0.0
-##         try   : self.max =float(self.para[4])
-##         except: self.max =0.0
-##         try   : self.ini =float(self.para[5])
-##         except: self.ini =0.0
+#----
-- 
GitLab