From b705ae7bc484c89f022a84fa4abef5c49c2cd513 Mon Sep 17 00:00:00 2001
From: ssl <sean.leavey@aei.mpg.de>
Date: Wed, 29 Jan 2014 12:19:38 +0100
Subject: [PATCH] Added cavity scan example, which is 100% pure PyKat

---
 examples/cavity_scan.py | 333 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 333 insertions(+)
 create mode 100644 examples/cavity_scan.py

diff --git a/examples/cavity_scan.py b/examples/cavity_scan.py
new file mode 100644
index 0000000..d165e54
--- /dev/null
+++ b/examples/cavity_scan.py
@@ -0,0 +1,333 @@
+# -*- coding: utf-8 -*-
+"""
+Fabry-Perot cavity scan example.
+
+         ]--------(=========================)---->
+
+      laser      ITM       10m cavity      ETM  photodiode
+
+The simulation sets up a parameter list in the form of a Python dictionary,
+then populates PyKat with the experimental setup directly (without using
+a .kat file input - 100% PyKat).
+
+The cavity is then scanned by tuning the ETM, and the results are plotted.
+
+Some terminology:
+
+ITM: initial test mass
+ETM: end test mass
+HR: highly reflective
+AR: anti-reflective
+
+Sean Leavey
+s.leavey.1@research.gla.ac.uk
+
+January 2014
+"""
+
+import pykat
+import pylab as pl
+import numpy as np
+
+#######################
+# set some parameters #
+#######################
+
+parameters = {
+	'laser': {
+		'power': 30,				# input laser power [W]
+		'frequency_offset': 0,
+		'phase': 0
+	},
+	'cavity': {
+		'length':	10.8,			# cavity length [m]
+		'itm': {				# ITM
+			'radius': 0.023225,		# [m]
+			'radius_of_curvature': {
+				'inner': {		# inner (concave) surface
+					'x': -5.7,	# [m]
+					'y': -5.7	# [m]
+				},
+				'outer': {		# outer (convex) surface
+					'x': -1.7763,	# [m]
+					'y': -1.7763	# [m]
+				}
+			},
+			'thickness': 0.027,		# [m]
+			'reflectivity': {		# power reflectivity
+				'inner': 0.995,		# inner (concave) surface
+				'outer': 0.001		# outer (convex) surface
+			},
+			'transmission': {		# power transmission
+				'inner': 0.005,
+				'outer': 0.999
+			},
+			'tuning_angle': {		# phi
+				'inner': 0,
+				'outer': 0
+			},
+			'misalignment': {		# mirror misalignment [rad]
+				'inner': {
+					'x': 0,
+					'y': 0
+				},
+				'outer': {
+					'x': 0,
+					'y': 0
+				}
+			}
+		},
+		'etm': {				# ETM
+			'radius': 0.023225,		# [m]
+			'radius_of_curvature': {
+				'inner': {		# inner (concave) surface
+					'x': 5.7,	# [m]
+					'y': 5.7	# [m]
+				},
+				'outer': {		# outer (convex) surface
+					'x': 1.7763,	# [m]
+					'y': 1.7763	# [m]
+				}
+			},
+			'thickness': 0.027,		# [m]
+			'reflectivity': {		# power reflectivity
+				'inner': 0.995,		# inner (concave) surface
+				'outer': 0.001		# outer (convex) surface
+			},
+			'transmission': {		# power transmission
+				'inner': 0.005,
+				'outer': 0.999
+			},
+			'tuning_angle': {		# phi
+				'inner': 0,
+				'outer': 0
+			},
+			'misalignment': {		# mirror misalignment [rad]
+				'inner': {
+					'x': 0,
+					'y': 0
+				},
+				'outer': {
+					'x': 0,
+					'y': 0
+				}
+			}
+		},
+	},
+	'materials': {
+		'bulk': {
+			'silica': {
+				'refractive_index': 1.45
+			}
+		}
+	}
+}
+
+###############################################
+# instantiate PyKat object and add components #
+###############################################
+
+# instantiate PyKat object
+kat = pykat.finesse.kat()
+
+# laser
+kat.add(
+	pykat.components.laser(
+		'laser',					# name
+		'n1',						# node
+		parameters['laser']['power'],
+		parameters['laser']['frequency_offset'],
+		parameters['laser']['phase']
+	)
+)
+
+# add a 1m space between laser and ITM
+kat.add(
+	pykat.components.space(
+		'space1',					# name
+		'n1',						# node 1
+		'n2',						# node 2
+		1						# length [m]
+	)
+)
+
+##################
+# ITM definition #
+##################
+# This involves three 'components':
+#	* a mirror to represent the convex AR surface;
+#	* a space representing the thickness of the mirror, with correct refractive index;
+#	* a mirror representing the concave HR surface
+
+# AR coating
+kat.add(
+	pykat.components.mirror(
+		'M_ITM_AR',
+		'n2',
+		'n3',
+		parameters['cavity']['itm']['reflectivity']['outer'],
+		parameters['cavity']['itm']['transmission']['outer'],
+		parameters['cavity']['itm']['tuning_angle']['outer'],
+		parameters['cavity']['itm']['radius_of_curvature']['outer']['x'],
+		parameters['cavity']['itm']['radius_of_curvature']['outer']['y'],
+		parameters['cavity']['itm']['misalignment']['outer']['x'],
+		parameters['cavity']['itm']['misalignment']['outer']['y'],
+		0,
+		parameters['cavity']['itm']['radius'] * 2
+	)
+)
+
+# bulk mirror material
+kat.add(
+	pykat.components.space(
+		'M_ITM_BULK',
+		'n3',
+		'n4',
+		parameters['cavity']['itm']['thickness'],
+		parameters['materials']['bulk']['silica']['refractive_index']
+	)
+)
+
+# HR coating
+kat.add(
+	pykat.components.mirror(
+		'M_ITM_HR',
+		'n4',
+		'n5',
+		parameters['cavity']['itm']['reflectivity']['inner'],
+		parameters['cavity']['itm']['transmission']['inner'],
+		parameters['cavity']['itm']['tuning_angle']['inner'],
+		parameters['cavity']['itm']['radius_of_curvature']['inner']['x'],
+		parameters['cavity']['itm']['radius_of_curvature']['inner']['y'],
+		parameters['cavity']['itm']['misalignment']['inner']['x'],
+		parameters['cavity']['itm']['misalignment']['inner']['y'],
+		0,
+		parameters['cavity']['itm']['radius'] * 2
+	)
+)
+
+##########
+# cavity #
+##########
+
+kat.add(
+	pykat.components.space(
+		'space2',
+		'n5',
+		'n6',
+		parameters['cavity']['length']
+	)
+)
+
+##################
+# ETM definition #
+##################
+# This involves three 'components', just like the ITM definition.
+
+# HR coating
+kat.add(
+	pykat.components.mirror(
+		'M_ETM_HR',
+		'n6',
+		'n7',
+		parameters['cavity']['etm']['reflectivity']['inner'],
+		parameters['cavity']['etm']['transmission']['inner'],
+		parameters['cavity']['etm']['tuning_angle']['inner'],
+		parameters['cavity']['etm']['radius_of_curvature']['inner']['x'],
+		parameters['cavity']['etm']['radius_of_curvature']['inner']['y'],
+		parameters['cavity']['etm']['misalignment']['inner']['x'],
+		parameters['cavity']['etm']['misalignment']['inner']['y'],
+		0,
+		parameters['cavity']['etm']['radius'] * 2
+	)
+)
+
+# bulk mirror material
+kat.add(
+	pykat.components.space(
+		'M_ETM_BULK',
+		'n7',
+		'n8',
+		parameters['cavity']['etm']['thickness'],
+		parameters['materials']['bulk']['silica']['refractive_index']
+	)
+)
+
+# AR coating
+kat.add(
+	pykat.components.mirror(
+		'M_ETM_AR',
+		'n8',
+		'n9',
+		parameters['cavity']['etm']['reflectivity']['outer'],
+		parameters['cavity']['etm']['transmission']['outer'],
+		parameters['cavity']['etm']['tuning_angle']['outer'],
+		parameters['cavity']['etm']['radius_of_curvature']['outer']['x'],
+		parameters['cavity']['etm']['radius_of_curvature']['outer']['y'],
+		parameters['cavity']['etm']['misalignment']['outer']['x'],
+		parameters['cavity']['etm']['misalignment']['outer']['y'],
+		0,
+		parameters['cavity']['etm']['radius'] * 2
+	)
+)
+
+##############
+# photodiode #
+##############
+
+# photodiode looking at cavity transmitted light
+kat.add(
+	pykat.detectors.photodiode(
+		'pd1',
+		'n9'
+	)
+)
+
+###########################
+# Gaussian beam parameter #
+###########################
+
+# set q value 1m from ITM, i.e. at the n1 node
+# use the utility method for this purpose
+kat.space1.n1.q = pykat.utilities.optics.gaussian_beams.gauss_param(q = 1.050412 + 24.243836j)
+# you can alternatively set w0 and z with gauss_param(w0 = #, z = #)
+
+##############################
+# define what we want to see #
+##############################
+
+# scan cavity from 0 to 360 degrees
+kat.add(pykat.commands.xaxis('lin', [0, 360], kat.M_ETM_HR, kat.M_ETM_HR.phi, 360))
+
+# set maximum TEM mode to model
+kat.maxtem = 3
+
+#######################
+# run script and plot #
+#######################
+
+# run simulation
+r = kat.run()
+
+# output the raw FINESSE file that PyKat has generated
+scriptList = kat.generateKatScript()
+print ''.join(scriptList)
+
+# calculate and print cavity finesse
+r1r2 = np.sqrt(parameters['cavity']['itm']['reflectivity']['inner']) * np.sqrt(parameters['cavity']['etm']['reflectivity']['inner'])
+
+finesse = np.pi / (2 * np.arcsin((1 - r1r2) / (2 * np.sqrt(r1r2))))
+
+print "Cavity finesse: {0:.0f}".format(finesse)
+
+# create plot
+pl.plot(r.x, r.y)
+
+# show grid
+pl.grid(True)
+
+# set plot limits
+pl.xlim((0, 360))
+
+# make plot visible
+pl.show()
-- 
GitLab