diff --git a/pykat/components.py b/pykat/components.py index 5ab8a2632266a8246d2cec9b6175045c01e57880..52f32aa05d0a49d6d32921b1cfa1b4174b533bc9 100644 --- a/pykat/components.py +++ b/pykat/components.py @@ -321,6 +321,11 @@ class AbstractMirrorComponent(Component): self.__Frx = Param("Frx", self, None, canFsig=True, isPutable=False, isPutter=False, isTunable=False, fsig_name="Frx") self.__Fry = Param("Fry", self, None, canFsig=True, isPutable=False, isPutter=False, isTunable=False, fsig_name="Fry") + self.__Fs0 = Param("Fs0", self, None, canFsig=True, isPutable=False, isPutter=False, isTunable=False, fsig_name="Fs0") + self.__Fs1 = Param("Fs1", self, None, canFsig=True, isPutable=False, isPutter=False, isTunable=False, fsig_name="Fs1") + self.__Fs0 = Param("s0", self, None, canFsig=True, isPutable=False, isPutter=False, isTunable=False, fsig_name="s0") + self.__Fs1 = Param("s1", self, None, canFsig=True, isPutable=False, isPutter=False, isTunable=False, fsig_name="s1") + self._default_fsig_param = self.__phi @property diff --git a/pykat/finesse.py b/pykat/finesse.py index 0a7d3994f9da40cd86580e2ea7598db2ed258d4c..0e7e2a3af2b5a683bcf1b0134504252b642c0b0d 100644 --- a/pykat/finesse.py +++ b/pykat/finesse.py @@ -382,6 +382,7 @@ class Signals(object): return rtn + @property def name(self): # if we don't have any signals yet then use a dummy name @@ -389,7 +390,7 @@ class Signals(object): # so need to get the name of at least one of them # as if you tune one you tune them all if len(self.targets) == 0: - return "fsignal" + return self._default_name else: return self.targets[0].name @@ -408,6 +409,7 @@ class Signals(object): def f(self,value): self.__f.value = SIfloat(value) def __init__(self, kat): + self._default_name = "fsignal" self.targets = [] self._params = [] self.__f = Param("f", self, 1) @@ -429,16 +431,21 @@ class Signals(object): def getFinesseText(self): rtn = [] - for t in self.targets: - rtn.extend(t.getFinesseText()) + if len(self.targets) == 0 and self.f != 0: + rtn.append("fsig {name} {frequency}" + .format(name = self.name, + frequency=str(self.f))) + else: + for t in self.targets: + rtn.extend(t.getFinesseText()) - rtn.append("fsig {name} {comp} {target} {frequency} {phase} {amplitude}" - .format(name = t.name, - comp=t.owner, - target=t.target, - frequency=str(self.f), - phase=str(t.phase), - amplitude=str(t.amplitude if t.amplitude != None else ""))) + rtn.append("fsig {name} {comp} {target} {frequency} {phase} {amplitude}" + .format(name = t.name, + comp=t.owner, + target=t.target, + frequency=str(self.f), + phase=str(t.phase), + amplitude=str(t.amplitude if t.amplitude != None else ""))) for p in self._params: rtn.extend(p.getFinesseText()) @@ -1003,61 +1010,69 @@ class kat(object): name = str(v[1]) - if v[2] not in self.__components: - raise pkex.BasePyKatException("Could not find the component '{0}'. Line: '{1}'".format(v[2], line)) + if len(v) == 3: + self.signals._default_name = name + self.signals.f = SIfloat(v[2]) + else: + if v[2] not in self.__components: + raise pkex.BasePyKatException("Could not find the component '{0}'. Line: '{1}'".format(v[2], line)) - comp = self.__components[v[2]] + comp = self.__components[v[2]] - if comp._default_fsig() is None: - raise pkex.BasePyKatException("Component '{0}' cannot be fsig'd. Line: '{1}'".format(comp.name, line)) + if comp._default_fsig() is None: + raise pkex.BasePyKatException("Component '{0}' cannot be fsig'd. Line: '{1}'".format(comp.name, line)) - param_name = None - amp = None + param_name = None + amp = None - if len(v) == 5: - #param is None - freq = SIfloat(v[3]) - phase = SIfloat(v[4]) - elif len(v) == 6: - - try: - SIfloat(v[3]) - isFloat = True - except: - isFloat = False - - if isFloat: + if len(v) == 3: + self.signals._default_name = name + freq = SIfloat(v[3]) + elif len(v) == 5: + #param is None freq = SIfloat(v[3]) phase = SIfloat(v[4]) - amp = SIfloat(v[5]) - else: + elif len(v) == 6: + + try: + SIfloat(v[3]) + isFloat = True + except: + isFloat = False + + if isFloat: + freq = SIfloat(v[3]) + phase = SIfloat(v[4]) + amp = SIfloat(v[5]) + else: + param_name = v[3] + freq = SIfloat(v[4]) + phase = SIfloat(v[5]) + + elif len(v) == 7: param_name = v[3] freq = SIfloat(v[4]) phase = SIfloat(v[5]) - - elif len(v) == 7: - param_name = v[3] - freq = SIfloat(v[4]) - phase = SIfloat(v[5]) - amp = SIfloat(v[6]) - else: - raise pkex.BasePyKatException("'{0}' isnot a valid fsig command".format(line)) + amp = SIfloat(v[6]) + else: + raise pkex.BasePyKatException("'{0}' isnot a valid fsig command".format(line)) - self.signals.f = freq - param = None + self.signals.f = freq - if param_name is None: - param = comp._default_fsig() - else: - for p in comp._params: - if p.canFsig and p.fsigName == param_name: - param = p - break + param = None + + if param_name is None: + param = comp._default_fsig() + else: + for p in comp._params: + if p.canFsig and p.fsigName == param_name: + param = p + break + + if param is None: + raise pkex.BasePyKatException("Line: '{0}': {1} is not a valid fsig target for {2}".format(line, param_name, comp.name)) - if param is None: - raise pkex.BasePyKatException("Line: '{0}': {1} is not a valid fsig target for {2}".format(line, param_name, comp.name)) - - self.signals.apply(param, amp, phase, name) + self.signals.apply(param, amp, phase, name) else: raise pkex.BasePyKatException("Haven't handled parsing of '{0}'".format(line)) diff --git a/pykat/optics/maps.py b/pykat/optics/maps.py index c792d0a29574f9ac42aa9e1fa67e2c36fe77fc8c..5eec843dc3ec8352605bc235a5ec4e01e877e722 100644 --- a/pykat/optics/maps.py +++ b/pykat/optics/maps.py @@ -16,6 +16,7 @@ from __future__ import print_function from pykat.optics.romhom import makeWeightsNew from scipy.interpolate import interp2d, interp1d from pykat.maths.zernike import * +from pykat.exceptions import BasePyKatException import numpy as np import math @@ -108,11 +109,11 @@ class surfacemap(object): @property def x(self): - return self.step_size[0] * (np.array(range(1, self.data.shape[0]+1)) - self.center[0]) + return self.step_size[0] * (np.array(range(0, self.data.shape[0])) - self.center[0]) @property def y(self): - return self.step_size[1] * (np.array(range(1, self.data.shape[1]+1))- self.center[1]) + return self.step_size[1] * (np.array(range(0, self.data.shape[1]))- self.center[1]) @property def size(self): @@ -120,7 +121,7 @@ class surfacemap(object): @property def offset(self): - return np.array(self.step_size)*(np.array(self.center) - 1/2. - np.array(self.size)/2.0) + return np.array(self.step_size)*(np.array(self.center) - (np.array(self.size)-1)/2.0) @property def ROMWeights(self): @@ -176,6 +177,11 @@ class surfacemap(object): return np.sqrt(1.0 - data) else: return np.sqrt(1.0 - data[:, ::-1]) + elif "surface_motion" in self.type: + if direction == "reflection_front": + return data + else: + return data[:, ::-1] else: raise BasePyKatException("Map type needs handling") @@ -193,6 +199,9 @@ class surfacemap(object): return np.sqrt(1.0 - data) else: return np.sqrt(1.0 - data[:, ::-1]) + + elif "surface_motion" in self.type: + return np.ones(data.shape) else: raise BasePyKatException("Map type needs handling") @@ -274,10 +283,10 @@ class surfacemap(object): D = interp2d(self.x, self.y, self.data, **kwargs) - data = D(nx-self.offset[0], ny-self.offset[0]) + data = D(nx-self.offset[0], ny-self.offset[1]) - Dx = interp1d(nx, np.arange(1,len(nx)+1)) - Dy = interp1d(ny, np.arange(1,len(ny)+1)) + Dx = interp1d(nx, np.arange(0,len(nx))) + Dy = interp1d(ny, np.arange(0,len(ny))) self.center = (Dx(0), Dy(0)) self.step_size = (nx[1]-nx[0], ny[1]-ny[0]) @@ -313,7 +322,7 @@ class surfacemap(object): yrange = 100*self.y fig = pylab.figure() - axes = pylab.pcolormesh(xrange, yrange, self.data, vmin=zmin, vmax=zmax) + axes = pylab.pcolormesh(xrange, yrange, self.data*self.scaling, vmin=zmin, vmax=zmax) pylab.xlabel('x [cm]') pylab.ylabel('y [cm]') @@ -406,11 +415,11 @@ class mergedmap: @property def x(self): - return self.step_size[0] * (np.array(range(1, self.size[0]+1)) - self.center[0]) + return self.step_size[0] * (np.array(range(0, self.size[0])) - self.center[0]) @property def y(self): - return self.step_size[1] * (np.array(range(1, self.size[1]+1))- self.center[1]) + return self.step_size[1] * (np.array(range(0, self.size[1])) - self.center[1]) @property def size(self): @@ -418,7 +427,7 @@ class mergedmap: @property def offset(self): - return np.array(self.step_size)*(np.array(self.center) - 1/2. - np.array(self.size)/2.0) + return np.array(self.step_size)*(np.array(self.center) - (np.array(self.size)-1)/2.0) @property def ROMWeights(self): diff --git a/pykat/optics/romhom.py b/pykat/optics/romhom.py index 67e81716ee9d046aedb1544cddd3fc48dd9031fa..0d3590de8f4317e322e13efeca0afe523412bb20 100644 --- a/pykat/optics/romhom.py +++ b/pykat/optics/romhom.py @@ -481,6 +481,7 @@ def MakeROMFromHDF5(hdf5Filename, greedyFilename=None, EIFilename=None, tol=1e-1 V[m][l] = RB_matrix[l][EI_indices[m]] # Part of (5) of Algorithm 2: making V_{ij} invV = inv(V[0:len(EI_indices), 0:len(EI_indices)]) + B = B_matrix(invV, np.array(RB_matrix)) _TS = TS[str(next_RB_index)] @@ -546,7 +547,7 @@ def makeWeightsNew(smap, EIxFilename, EIyFilename=None, verbose=True, newtonCote A_xy_Q2 = A_xy[Q2xy] A_xy_Q3 = A_xy[Q3xy] A_xy_Q4 = A_xy[Q4xy] - + full_x = smap.x full_y = smap.y