finesse.analysis.actions.pseudolock module

class finesse.analysis.actions.pseudolock.PseudoLockCavity(cavity, *, mode=None, lowest_loss=False, feedback=None, name='pseudo_lock_cavity')[source]

Bases: Action

An action that locks a cavity defined by a Cavity element to a specific mode without using any radio-frequency sensing scheme. This will only work on simple cavities that are not coupled in any way. You can specify whether to try and lock to a particular HG mode with the mode=[n,m] keyword argument, or just pick the lowest loss mode, lowest_loss=True.

Parameters

cavityCavity

Cavity element describing some Fabry-Perot like optical cavity

mode(n, m), optional

HG mode to try and lock to, default is [0,0]

lowest_lossbool, optional

Select the eigenmode which has the lowest loss, most likely the fundamental mode of the cavity. Using lowest loss will override the mode selection.

feedbackParameter optional

If None the required cavity tuning to lock to the calculated mode will be determined from the cavity objects source node element, and the relevant phi parameter will be used. Alternatively you can specify which tuning parameter is used instead. Which should be a phi of some mirror in the cavity or a DegreeOfFreedom which controls the cavity length.

namestr, optional

Name of the solution generated by this action

Examples

A Fabry-Perot based on aLIGO cavities:

>>> import finesse
>>> model = finesse.Model()
>>> model.parse('''
... l l1 P=1
... m ITM T=0.014 L=0 Rc=-1945
... s sARM ITM.p2 ETM.p1 L=3994
... m ETM R=1 L=0 Rc=2145
... link(l1, ITM)
... cav arm ETM.p1.o
... modes(maxtem=1)
... ''')

The cavity source node is on the ETM so the pseudo-lock will use that node and component phi parameter to feedback to. In this case the ETM.phi will be corrected to match the ITM.phi which will make the HG00 resonant.

>>> model.ITM.phi = 0
>>> model.ETM.phi = 10
>>> model.run("pseudo_lock_cavity(arm)")
>>> print(model.ITM.phi, model.ETM.phi)
0.0 degrees 0.0 degrees
>>> model.ITM.phi = 10
>>> model.ETM.phi = 0
>>> model.run("pseudo_lock_cavity(arm)")
>>> print(model.ITM.phi, model.ETM.phi)
10.0 degrees 10.0 degrees

This lock will also handle any misalignments, mismatches, or maps applied to the cavity.

>>> model.ITM.xbeta = 5e-8
>>> model.ITM.phi = 11
>>> model.ETM.phi = 0
>>> model.run("pseudo_lock_cavity(arm)")
>>> print(model.ITM.phi, model.ETM.phi)
11.0 degrees 10.984168676865762 degrees

We can also lock to other HG modes:

>>> sol = model.run("series(pseudo_lock_cavity(arm, mode=[1,0]), noxaxis())")
>>> print(model.ITM.phi, model.ETM.phi)
>>> print(model.homs)
>>> print(sol['noxaxis']['Ecirc'])
11.0 degrees 28.663091273523214 degrees
[[0 0]
[1 0]
[0 1]]
[-0.16465261-0.11468501j  0.41262682-0.27112167j  0.        +0.j        ]
class finesse.analysis.actions.pseudolock.PseudoLockCavitySolution[source]

Bases: BaseSolution

Solution to the PseudoLockCavity action.

Attributes

operatorOperatorSolution

Solution of the operator action that is used to compute the roundtrip operator in the cavity

warray_like

2D Eigenvector array

varray_like

1D Eigenvalue array

v_idxint

Index of the eigenmode being locked to

phasefloat

Phase in degrees of the eigenmode that is being locked to. This is what is used to set the operating point of the cavity

cavitystr

Which cavity is being locked

lowest_lossbool

If False, the target mode attribute is used. Otherwise

modearray_like

[n, m] target mode to try and lock to

class finesse.analysis.actions.pseudolock.PseudoLockDRFPMI(frequency=0, *, apply_tunings=True, name='operator_lock')[source]

Bases: Action

Pseudo-locking is attempting to find an operating point for a LIGO like model without needing to use RF sidebands and readouts. Although it is not physically accurate it does provide a useful tool for analysing detectors from a more theoretical basis. This generates a PseudoLockDRFPMISolution solution containing various operators and results.

This action is hardcoded to work with a LIGO like model. Mirrors should be named with ITMX, ETMX, PRM, etc.

This currently action only really works for finding the lock points for the PRC, SRC, XARM, and YARM – which all have defined cavity roundtrips which allow eigendecomposition of roundtrip operators. The eigenvectors describe the HOM mix for each resonant mode in a cavity and the eigenvalues the roundtrip phase and loss of the mode. This code looks for eigenvectors with the largest HG00 content and then uses the eigenvalues to compute what cavity tunings need to make this mode resonant.

The corner is the most complicated here as the PRC and SRC are coupled via the beamsplitter. The eigendecomposition is performed on the 2x2 operator matrix for the PRC, SRC, and the coupling matrices between them. When the coupling is small the results are the same as performing the decomposition on each SRC and PRC separately.

Note that the only degree of freedom that this does not handle currently is MICH. MICH is awkward because it is not a cavity. It is essentially the beamsplitter position that makes the anti-symmetric port dark.

Parameters

frequencyfloat, optional

Frequency to use for calculating the operators

apply_tuningsbool, optional

When True the action will modify the model tunings

namestr, optional

Name of the solution generated by this action

class finesse.analysis.actions.pseudolock.PseudoLockDRFPMISolution[source]

Bases: BaseSolution

TODO: needs updating for all the various attributes this stores.

plot_PRC_SRC_eigenvectors()[source]