#####################################################################
# #
# aom.py #
# #
# Copyright 2013, Monash University #
# #
# This file is part of the labscript suite (see #
# http://labscriptsuite.org) and is licensed under the Simplified #
# BSD License. See the license.txt file in the root of the project #
# for the full license. #
# #
#####################################################################
from .UnitConversionBase import *
from .NovaTechDDS9m import NovaTechDDS9mAmpConversion
from numpy import *
[docs]class SineAom(NovaTechDDS9mAmpConversion):
"""
AOM calibration P(A) is very close to a sine for dipole trap AOM!
"""
base_unit = "Arb"
[docs] def __init__(self, calibration_parameters=None):
# These parameters are loaded from a globals.h5 type file automatically
self.parameters = calibration_parameters
self.derived_units = ["Power", "fraction"]
# P(x) = A * cos(2*pi*f * x + phase) + c
# Saturates at saturation Volts
self.parameters.setdefault('A', 1.969)
self.parameters.setdefault('f', 0.527)
self.parameters.setdefault('phase', 3.262)
self.parameters.setdefault('c', 1.901)
self.parameters['phase'] = self.parameters['phase']%(2*pi)
NovaTechDDS9mAmpConversion.__init__(self,self.parameters)
[docs] def Power_to_base(self, power):
A = self.parameters["A"]
f = self.parameters["f"]
phase = self.parameters["phase"]
c = self.parameters["c"]
if ((phase / pi) % 2) == 0:
phi = (arccos((power - c) / A) - phase) % (2*pi)
else:
phi = (2*pi - arccos((power - c) / A) - phase) % (2*pi)
return phi / (2*pi*f)
[docs] def Power_from_base(self, amp):
A = self.parameters["A"]
f = self.parameters["f"]
phase = self.parameters["phase"]
c = self.parameters["c"]
return A * cos(2*pi*f*amp + phase) + c
[docs] def fraction_to_base(self, fraction):
Pmax = self.parameters["A"] + self.parameters["c"]
Pmin = max(self.parameters["c"] - self.parameters["A"], 0)
P = (Pmax - Pmin) * fraction + Pmin
Amp = self.Power_to_base(P)
return Amp
[docs] def fraction_from_base(self, amp):
f = self.parameters["f"]
phase = self.parameters["phase"]
if 2*pi*f*amp + phase > 2*pi:
amp = (2*pi - phase) / (2*pi*f)
P = self.Power_from_base(amp)
Pmax = self.parameters["A"] + self.parameters["c"]
Pmin = max(self.parameters["c"] - self.parameters["A"], 0)
fraction = (P - Pmin) / (Pmax - Pmin)
return fraction