Fork PyRPL on GitHub

Source code for pyrpl.software_modules.lockbox.models.interferometer

from .. import *


[docs]class InterferometerPort1(InputDirect): @property def plot_range(self): maxval = np.pi*self.lockbox._unit_in_setpoint_unit('rad') return np.linspace(-maxval, maxval, 200)
[docs] def expected_signal(self, phase): phase *= self.lockbox._setpoint_unit_in_unit('rad') return self.calibration_data.offset + self.calibration_data.amplitude * np.sin(phase)
[docs] def expected_setpoint(self, transmission): sinvalue = (transmission - self.calibration_data.offset) / self.calibration_data.amplitude if sinvalue > 1.0: sinvalue = 1.0 elif sinvalue < -1.0: sinvalue = -1.0 phase = np.arcsin(sinvalue) phase /= self.lockbox._setpoint_unit_in_unit('rad') return phase
[docs]class InterferometerPort2(InterferometerPort1):
[docs] def expected_signal(self, phase): return super(InterferometerPort2, self).expected_signal(-phase)
[docs]class Interferometer(Lockbox): wavelength = FloatProperty(max=1., min=0., default=1.064e-6, increment=1e-9) _gui_attributes = ['wavelength'] _setup_attributes = _gui_attributes # management of intput/output units # setpoint_variable = 'phase' setpoint_unit = SelectProperty(options=['deg', 'rad'], default='deg') _output_units = ['m', 'nm'] # must provide conversion from setpoint_unit into all other basic units # management of intput/output units _rad_in_deg = 180.0 / np.pi # only internally needed @property def _deg_in_m(self): # factor 2 comes from assumption that beam is reflected off a mirror, # i. e. beam gets twice the phaseshift from the displacement return self.wavelength / 360.0 / 2.0 @property def _rad_in_m(self): # factor 2 comes from assumption that beam is reflected off a mirror, # i. e. beam gets twice the phaseshift from the displacement return self._rad_in_deg * self._deg_in_m inputs = LockboxModuleDictProperty(port1=InterferometerPort1, port2=InterferometerPort2) outputs = LockboxModuleDictProperty(piezo=PiezoOutput)
#piezo2=PiezoOutput)
[docs]class PdhInterferometerPort1(InterferometerPort1, InputIq):
[docs] def expected_signal(self, phase): # proportional to the derivative of the signal # i.e. sin(phase)+const. -> cos(phase) phase *= self.lockbox._setpoint_unit_in_unit('rad') return self.calibration_data.amplitude * np.cos(phase)
[docs]class PdhInterferometerPort2(InterferometerPort2, InputIq):
[docs] def expected_signal(self, phase): # proportional to the derivative of the signal # i.e. sin(phase) -> cos(phase) = sin(phase+pi/2) phase *= self.lockbox._setpoint_unit_in_unit('rad') return - self.calibration_data.amplitude * np.cos(phase)
[docs]class PdhInterferometer(Interferometer): inputs = LockboxModuleDictProperty(port1=InterferometerPort1, pdh1=PdhInterferometerPort1)