From 04dcdf4f470de04f1f63606201de73c9ee4585b1 Mon Sep 17 00:00:00 2001
From: Daniel Brown <ddb@star.sr.bham.ac.uk>
Date: Fri, 5 Dec 2014 15:22:41 +0000
Subject: [PATCH] fixing fsig removal

---
 bin/test_fsig.py |  4 ++--
 pykat/finesse.py | 37 +++++++++++++++++++++----------------
 2 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/bin/test_fsig.py b/bin/test_fsig.py
index 2e5b318..f55e828 100644
--- a/bin/test_fsig.py
+++ b/bin/test_fsig.py
@@ -31,7 +31,7 @@ yaxis log re:im
 
 kat = finesse.kat(kat_code=code)
 
-kat.signals.apply(kat.l1.power, 1, 0)
+kat.signals.apply(kat.l1.P, 1, 0)
 kat.signals.apply(kat.m1.phi, 1, 90)
 
 kat.add(xaxis('log', [1, 1000], kat.signals.f, 100))
@@ -47,4 +47,4 @@ pl.loglog(out.x, np.abs(a_up + a_lo), out.x, np.abs((a_up - a_lo) / (1j)))
 pl.xlabel(out.xlabel)
 pl.title("Reflection quadratures with no relative carrier phase")
 pl.legend(["Amplitude","Phase"])
-pl.show()
\ No newline at end of file
+#pl.show()
diff --git a/pykat/finesse.py b/pykat/finesse.py
index d7c23cd..1483c25 100644
--- a/pykat/finesse.py
+++ b/pykat/finesse.py
@@ -237,16 +237,17 @@ class katRun2D(object):
         
 class Signals(object):
     class fsig(object):
-        def __init__(self, param, name, amplitude, phase):
+        def __init__(self, param, name, amplitude, phase, signal):
             self._params = []
             self.__target = param
             self.__name = name
             self.__amplitude = Param("amp", self, SIfloat(amplitude))
             self.__phase = Param("phase", self, SIfloat(phase))
             self.__removed = False
-            
+            self.__signal = signal
+			
             # unfortunatenly the target names for fsig are not the same as the
-            # various parameter names of the components, e.g. mirror xbeta is x 
+            # various parameter names of the c	omponents, e.g. mirror xbeta is x 
             # for fsig. So we need to check here what type of component we are targetting
             # and then based on the parameter specfied get the name
             if not param.canFsig:
@@ -262,7 +263,8 @@ class Signals(object):
             if self.__removed:
                 raise pkex.BasePyKatException("Signal {0} has already been marked as removed".format(self.name))
             else:
-                self._kat.remove(self)
+                self.__signal.targets.remove(self)
+                self.__remove = True
         
         @property
         def name(self): return self.__name
@@ -304,23 +306,23 @@ class Signals(object):
             return self.targets[0].name
             
     @property
-    def removed(self): return False # we can never remove the Signal object altogethr just the
-                                    # individual fsig targets
+    def removed(self): return False # we can never remove the Signal object altogethr just the individual fsig targets
 
     def remove(self):
         for t in self.targets:
-            self._kat.remove(self)
+            t.remove()
             
     @property
     def f(self): return self.__f
     @f.setter
     def f(self,value): self.__f.value = SIfloat(value)
     
-    def __init__(self):
-
+    def __init__(self, kat):
+        if kat == None:
+            raise  pkex.BasePyKatException("kat object must be specified")
         self.targets = []
         self._params = []
-        
+        self.__kat = kat
         self.__f = Param("f", self, 1)
     
     def _register_param(self, param):
@@ -334,7 +336,7 @@ class Signals(object):
         if name == None:
             name = "sig_" + target._owner().name + "_" + target.name
         
-        self.targets.append(Signals.fsig(target, name, amplitude, phase))
+        self.targets.append(Signals.fsig(target, name, amplitude, phase, self))
         
     def getFinesseText(self):
         rtn = []
@@ -348,7 +350,6 @@ class Signals(object):
         
         return rtn
         
-        
 class Block:
     def __init__(self, name):
         self.__name = name
@@ -380,7 +381,7 @@ class kat(object):
         self.__tempdir = tempdir
         self.__tempname = tempname
         self.pykatgui = None
-        self.__signals = Signals()
+        self.__signals = Signals(self)
         self.constants = {}
         self.vacuum = []
         self.__prevrunfilename = None
@@ -1047,9 +1048,9 @@ class kat(object):
             if self.verbose: print "Finished in " + str(datetime.datetime.now()-start)
             
     def remove(self, obj):
-        if not (obj.name in self.__components or obj.name in self.__detectors or obj.name in self.__commands):
+        if not isinstance(obj, pykat.finesse.Signals) and not (obj.name in self.__components  or obj.name in self.__detectors or obj.name in self.__commands or obj in self.signals.targets):
             raise pkex.BasePyKatException("{0} is not currently in the simulation".format(obj.name))
-        
+            
         if obj.removed:
             raise pkex.BasePyKatException("{0} has already been removed".format(obj.name))        
 
@@ -1069,7 +1070,11 @@ class kat(object):
         elif isinstance(obj, Detector):    
             del self.__detectors[obj.name]
             self.__del_detector(obj)
-        
+        elif isinstance(obj, pykat.finesse.Signals):
+            obj.remove()
+        elif isinstance(obj, pykat.finesse.Signals.fsig):
+            obj.remove()
+            
         for b in self.__blocks:
             if obj in self.__blocks[b].contents:
                 self.__blocks[b].contents.remove(obj)
-- 
GitLab