Readouts
Readouts are a hybrid component in Finesse 3 which combine together both a detector and an optical component. In essence, they represent a photodetector or some other measurement device that produces an electronic signal.
Readouts have one or more optical ports that are coupled to electrical ports. This
coupling represents the calculation done in a
finesse.detectors.powerdetector.PowerDetector for the ReadoutDC and a
finesse.detectors.powerdetector.PowerDetectorDemod1 for the ReadoutRF.
These electrical ports have two main usecases:
Calculating transfer functions with the
finesse.analysis.actions.lti.FrequencyResponseaction, see Readouts for frequency domain analysisModelling closed loop systems by taking the output at the electrical node and feeding, (optionally) filtering it and feeding it back into another component’s electrical port. The loop is usually closed with Locking actions. Filters can be found in
finesse.components.electronics
Readouts can be connected to the model in two different ways:
Detector-style by using the
optical_nodeargument. This allows you to place the Readout anywhere in your model and to place multiple readouts on the same optical node.Component-style by using a
finesse.components.space.Spaceor thefinesse.model.Model.link()method to connect the optical node of the readout to another optical_node in your model. Since Finesse only allows a port to be connected to one other port, you can only connect one readout per port.
from finesse import Model
from finesse.components import Laser, ReadoutDC, ReadoutRF
# Detector style
model = Model()
l1 = model.add(Laser("l1"))
readout1 = model.add(ReadoutDC("readout1", optical_node=l1.p1))
readout2 = model.add(ReadoutDC("readout2", optical_node=l1.p1))
# readout 'borrows' nodes
print(f"{readout1.p1.i=}")
print(f"{readout1.p1.o=}")
print(f"{readout2.p1.i=}")
print(f"{readout2.p1.o=}")
readout1.p1.i=<OpticalNode l1.p1.i @ 0x7e4305a712b0>
readout1.p1.o=<OpticalNode l1.p1.o @ 0x7e4305a22fd0>
readout2.p1.i=<OpticalNode l1.p1.i @ 0x7e4305a712b0>
readout2.p1.o=<OpticalNode l1.p1.o @ 0x7e4305a22fd0>
Above you see that the readout only ‘borrows’ the nodes of the port it is connected to and this ‘borrowing’ can be done as many times as you want.
Alternatively you can connect explicitly:
# Component style
model = Model()
l1 = model.add(Laser("l1"))
readout1 = model.add(ReadoutDC("readout1"))
model.link(l1.p1, readout1.p1, verbose=True)
Connecting l1 to readout1
But this does not allow you to connect a second readout to the same port:
readout2 = model.add(ReadoutDC("readout2"))
model.link(l1.p1, readout2.p1, verbose=True)
Connecting l1 to readout2
FinesseException: (use finesse.tb() to see the full traceback)
Whilst trying to connect <Port l1.p1 Type=NodeType.OPTICAL @ 0x7e4340eadbf0> to <Port readout2.p1 Type=NodeType.OPTICAL @ 0x7e4340eac6d0>, the following exception occurred:
Port <Port l1.p1 Type=NodeType.OPTICAL @ 0x7e4340eadbf0> has already been connected to
Warning
Mixing the two styles will lead to an exception and the following should be avoided:
l l1
ReadoutDC readout l1.p1.o
link(l1.p1, readout.p1)
The output_detectors argument can be used to add relevant detectors to the solution
object:
ReadoutDC: APowerdetectorand aQuantumShotNoiseDetectorwill be added pointing toReadoutDC.p1.i
model = Model()
l1 = model.add(Laser("l1"))
readout = model.add(ReadoutDC("readout", optical_node=l1.p1, output_detectors=True))
sol = model.run()
for det in sol.detectors:
print(det, sol[det])
readout_DC 0.0
ReadoutRF: TwoPowerDetectorDemod1(IandQquadratures), aPowerDetectorand aQuantumShotNoiseDetectorDemod1
model = Model()
l1 = model.add(Laser("l1"))
readout = model.add(
ReadoutRF("readout", optical_node=l1.p1.o, output_detectors=True)
)
sol = model.run()
for det in sol.detectors:
print(det, sol[det])
readout_I 1.0000000000000002
readout_Q 6.123233995736767e-17
readout_DC 1.0000000000000002
Note that the quantum detectors will only be added if you are running a signal model (sgen or frequency response)
Note
Currently output_detectors only makes detectors appear in Solution objects, and
there will be no detectors listed in finesse.model.Model.detectors().
DC readout
Fig. 5 Nodes and ports overview
RF photodetector readout
Fig. 6 Nodes and ports overview
Fig. 7 In this control loop, the ReadoutRF represents a combination of the oscillator, mixer and photodetector.