Source code for correction.GenMatrix_chromcouple

r"""
.. module: PythonClasses4MAD.GenMatrix_chromcouple

Created on ??

TODO: description


.. moduleauthor:: Unknown
"""

import os
import datetime
import time

from numpy.linalg import pinv as generalized_inverse
from numpy import dot as matrixmultiply
import numpy as np


[docs]def make_list(x, m, modelcut, errorcut, CorD): """Makes list in coupling correction """ if x == []: return [] result_names_list = [] count = 0 for i in range(len(x.NAME)): bn = x.NAME[i].upper() if bn in m.indx: i_x = x.indx[bn] i_m = m.indx[bn] if ((abs(x.Cf1001r[i_x]-m.Cf1001r[i_m]) < modelcut) and (abs(x.Cf1001i[i_x]-m.Cf1001i[i_m]) < modelcut) and (x.Cf1001iERR[i_x] < errorcut) and (x.Cf1001rERR[i_x] < errorcut)): result_names_list.append(x.NAME[i]) else: print "Not in Response:", bn count += 1 if count > 0: print "Warning: ", count, "BPMs removed from data for not beeing in the model" return result_names_list
def write_params(deltafamilie, variables, app=0, path="./"): if (app == 0): mode ='w' if (app == 1): mode = 'a' timestamp = datetime.datetime.fromtimestamp(time.time()) knobs_file = open(os.path.join(path, "changeparameters_chromcouple"), mode) tfs_file = open(os.path.join(path, "changeparameters_chromcouple.tfs"), mode) print >>tfs_file, "@", "APP", "%le", app print >>tfs_file, "@", "PATH", "%s", path print >>tfs_file, "@", "DATE", "%s", timestamp.ctime() print >>tfs_file, "*", "NAME", "DELTA" print >>tfs_file, "$", "%s", "%le" for i, var in enumerate(variables): knobs_file.write(var+' = '+ var+' + ( '+str(deltafamilie[i])+' );\n') tfs_file.write(var+' '+str(deltafamilie[i])+'\n') knobs_file.close() tfs_file.close() def correctcouple(a, chromcouple_input, cut=0.01, app=0, path="./"): R = np.transpose(chromcouple_input.sensitivity_matrix) vector = chromcouple_input.compute_vector(a) wg = chromcouple_input.wg len_couplelist = len(chromcouple_input.couplelist) weisvec = np.array(np.concatenate( [np.sqrt(wg[0])*np.ones(len_couplelist), np.sqrt(wg[1])*np.ones(len_couplelist), np.sqrt(wg[2])*np.ones(len_couplelist), np.sqrt(wg[3])*np.ones(len_couplelist)] ) ) Rnew = np.transpose(np.transpose(R)*weisvec) delta = -matrixmultiply(generalized_inverse(Rnew,cut), (vector-chromcouple_input.zerovector)/chromcouple_input.normvector) write_params(delta, chromcouple_input.varslist, app, path=path) return [delta, chromcouple_input.varslist] class ChromCoupleInput: def __init__(self, varslist, couplelist=[], wg=[1,1,1,1,1]): self.varslist = varslist self.couplelist = couplelist self.wg = wg self.sensitivity_matrix = [] self.zerovector = [] def compute_vector(self,a): Cf1001r = [] Cf1001i = [] Cf1010r = [] Cf1010i = [] for bpm_name in self.couplelist: Cf1001r.append(a.Cf1001r[a.indx[bpm_name]]) Cf1001i.append(a.Cf1001i[a.indx[bpm_name]]) Cf1010r.append(a.Cf1010r[a.indx[bpm_name]]) Cf1010i.append(a.Cf1010i[a.indx[bpm_name]]) return np.array(np.concatenate([Cf1001r,Cf1001i,Cf1010r,Cf1010i])) def computeSensitivityMatrix(self,x): #global zerovector, normvector self.zerovector = self.compute_vector(x['0']) incr=x['incr'][0] # BUG! need to read it from FullResponse! self.normvector = np.ones(4*len(self.couplelist)) for var in self.varslist: vector=self.compute_vector(x[var]) self.sensitivity_matrix.append((vector-self.zerovector)/self.normvector/incr) self.sensitivity_matrix=np.array(self.sensitivity_matrix) return self.sensitivity_matrix