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:

Readouts can be connected to the model in two different ways:

  • Detector-style by using the optical_node argument. 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.Space or the finesse.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 @ 0x783d745b9be0>
readout1.p1.o=<OpticalNode l1.p1.o @ 0x783d74567250>
readout2.p1.i=<OpticalNode l1.p1.i @ 0x783d745b9be0>
readout2.p1.o=<OpticalNode l1.p1.o @ 0x783d74567250>

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 @ 0x783db8103380> to <Port readout2.p1 Type=NodeType.OPTICAL @ 0x783d747877d0>, the following exception occurred:
Port <Port l1.p1 Type=NodeType.OPTICAL @ 0x783db8103380> 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: A Powerdetector and a QuantumShotNoiseDetector will be added pointing to ReadoutDC.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: Two PowerDetectorDemod1 (I and Q quadratures), a PowerDetector and a QuantumShotNoiseDetectorDemod1

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

../../_images/readoutdc.svg

Fig. 4 Nodes and ports overview

readout_dc
ReadoutDC

A Readout component which represents a photodiode measuring the intensity of some incident field. Audio band intensity signals present in the incident optical field are converted into an electrical signal and output at the self.DC port, which has a single self.DC.o node.

See Readouts for more information.

Syntax:
readout_dc name optical_node=none pdtype=none output_detectors=false
Required:

name: Name of the readout component

Optional:

optical_node: Optical node this readout should look at. Because the readout borrows the node, it can be connected anywhere in the model, like a detector. When passing None, the readout should be connected explicitly with a finesse.components.space.Space or with finesse.model.Model.link() command (and then only a single readout can be connected per port).

pdtype: A name of a pdtype definition or a dict representing a pdtype definition, by default None. See Segmented photodiodes

output_detectors: Whether to add a PowerDetector and a QuantumShotNoiseDetector to the solution object, by default False

RF photodetector readout

../../_images/readoutrf.svg

Fig. 5 Nodes and ports overview

../../_images/PDH-scheme.svg

Fig. 6 In this control loop, the ReadoutRF represents a combination of the oscillator, mixer and photodetector.

readout_rf
ReadoutRF

A readout component which represents a demodulated photodiode. The self.I and self.Q electrical ports contain the signal of the two quadratures.

See Readouts for more information.

Syntax:
readout_rf name optical_node=none f=0 phase=0 output_detectors=false pdtype=none
Required:

name: Name of the readout component

Optional:

optical_node: Optical node this readout should look at. Because the readout borrows the node, it can be connected anywhere in the model, like a detector. When passing None, the readout should be connected explicitly with a finesse.components.space.Space or with finesse.model.Model.link() command (and then only a single readout can be connected per port).

f: Demodulation frequency in Hz, by default 0

phase: Demodulation phase in degrees, by default 0

output_detectors: Whether to add a PowerDetector (DC), two PowerDetectorDemod1 ‘s (I and Q) and a QuantumShotNoiseDetectorDemod1 to the solution object, by default False

pdtype: A name of a pdtype definition or a dict representing a pdtype definition, by default None. See Segmented photodiodes