From fc4b9be4d63fd7ac65a9a3e5774c16e984d405a8 Mon Sep 17 00:00:00 2001
From: Daniel Brown <ddb@star.sr.bham.ac.uk>
Date: Mon, 1 Dec 2014 11:13:35 +0000
Subject: [PATCH] forgot zernike file...

---
 pykat/utilities/zernike.py | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 pykat/utilities/zernike.py

diff --git a/pykat/utilities/zernike.py b/pykat/utilities/zernike.py
new file mode 100644
index 0000000..4adf65e
--- /dev/null
+++ b/pykat/utilities/zernike.py
@@ -0,0 +1,38 @@
+import numpy as np
+from scipy.misc import factorial as fac
+
+def zernike_R(m, n, rho):
+	
+	if ((n-m) % 2):
+		return rho*0.0
+	
+	nnm = (n-m)/2.0
+	npm = (n+m)/2.0
+	
+	R = 0
+	
+	return sum(rho**(n-2.0*k) * (-1.0)**k * fac(n-k) / ( fac(k) * fac(npm - k) * fac(nnm - k)) for k in xrange(int(nnm) + 1))
+	
+def zernike(m, n, rho, phi):
+	"""
+	Computes the zernike polynomial in radial coordinates:
+		
+		Z_{n}^{m}(rho, phi) = R_{n}^{m}(rho) cos(m * phi) (even)
+		                      R_{n}^{m}(rho) sin(m * phi) (odd)
+	
+	Must satisfy n >= m.
+	"""
+	
+	if (n < 0):
+		raise ValueError("n must be larger than 0")
+	
+	if (abs(m) > n):
+		raise ValueError("Must use m <= n")
+			
+	if m > 0:
+		return zernike_R(m, n, rho) * np.cos(m * phi)
+	elif m < 0:
+		return zernike_R(-m, n, rho) * np.sin(-m * phi)
+	else:
+		return zernike_R(0, n, rho)
+
-- 
GitLab