From ec16c34eb7cc3a977a22d10dd9eef039886be7a7 Mon Sep 17 00:00:00 2001
From: Daniel Brown <ddb@star.sr.bham.ac.uk>
Date: Mon, 1 Dec 2014 10:01:21 +0000
Subject: [PATCH] adding zernike maps

---
 pykat/detectors.py      |  2 +-
 pykat/finesse.py        |  2 +-
 pykat/utilities/maps.py | 39 +++++++++++++++++++++++++++++++++++----
 3 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/pykat/detectors.py b/pykat/detectors.py
index 5929d26..1f2d1b7 100644
--- a/pykat/detectors.py
+++ b/pykat/detectors.py
@@ -5,7 +5,7 @@ Created on Fri Feb 01 0split()9:09:10 2013
 @author: Daniel
 """
 import exceptions
-from pykat.utils import *
+import abc
 from pykat.node_network import *
 from pykat.param import Param
 
diff --git a/pykat/finesse.py b/pykat/finesse.py
index 2036863..d7c23cd 100644
--- a/pykat/finesse.py
+++ b/pykat/finesse.py
@@ -181,7 +181,7 @@ class katRun(object):
     
     def __getitem__(self, value):
         idx = [i for i in range(len(self.ylabels)) if self.ylabels[i].split()[0] == str(value)]
-        
+
         if len(idx) > 0:
             out = self.y[:, idx]
             
diff --git a/pykat/utilities/maps.py b/pykat/utilities/maps.py
index 6b52951..757260c 100644
--- a/pykat/utilities/maps.py
+++ b/pykat/utilities/maps.py
@@ -2,8 +2,8 @@ from pykat.utilities.romhom import makeReducedBasis, makeEmpiricalInterpolant, m
 from scipy.interpolate import interp2d
 import numpy as np
 import math
-        
-        
+from pykat.utilities.zernike import *        
+		   
 class surfacemap(object):
     def __init__(self, name, maptype, size, center, step_size, scaling, data=None):
         
@@ -291,8 +291,39 @@ class tiltmap(surfacemap):
         
         self.data = (xx * self.tilt[1] + yy * self.tilt[0])/self.scaling
         
-        
-        
+
+class zernikemap(surfacemap):
+	def __init__(self, name, size, step_size, radius, scaling=1e-9):
+		surfacemap.__init__(self, name, "phase", size, (np.array(size)+1)/2.0, step_size, scaling)
+		self.__zernikes = {}
+		self.radius = radius
+		
+	@property
+	def radius(self): return self.__radius
+
+	@radius.setter
+	def radius(self, value, update=True):
+		self.__radius = float(value)
+		if update: self.update_data()
+
+	def setZernike(self, m, n, amplitude, update=True):
+		self.__zernikes["%i%i" % (m, n)] = (m,n,amplitude)
+		if update: self.update_data()
+
+	def update_data(self):
+		X,Y = np.meshgrid(self.x, self.y)
+		R = np.sqrt(X**2 + Y**2)
+		PHI = np.arctan2(Y, X)
+
+		data = np.zeros(np.shape(R))
+
+		for i in self.__zernikes.items():
+			data += i[1][2] * zernike(i[1][0], i[1][1], R/self.radius, PHI)
+
+		self.data = data
+	
+			
+	
 def read_map(filename):
     with open(filename, 'r') as f:
         
-- 
GitLab