40m Quantum Limited Sensitivity - PRMIΒΆ
In this example, we compute the Quantum Limited sensitivity for PRMI using real suspensions.
import finesse
import finesse.analysis.actions as fac
from finesse.detectors import PowerDetector
import finesse.components as fc
import finesse_40m
from finesse_40m.logging import setup_logger
setup_logger(context="docs") # For documentation only
# call without any arguments in your code
# or, define your own function!
from finesse_40m.actions import InitialLockPRMI
from finesse_40m.factory import FortyMeterFactory
from finesse_40m.locks import (
add_PRMI_locks, # function to add PRMI locks
plot_PRMI_error_signals # function to plot PRMI error sigs
)
# Functions for checking the IFO state
from finesse_40m.utils import (
get_PDs,
get_readouts,
fmtpower
)
import matplotlib.pyplot as plt
finesse.init_plotting()
import pprint
Next we build the model.
factory = FortyMeterFactory()
factory.reset()
# Enable detectors for LSC, this is required for locking
factory.options.LSC.add_output_detectors = True
# Enable power detectors so we can easily
# check the IFO state
factory.options.add_detectors = True
# We will using a PRMI action defined later
# so this must be false
factory.options.LSC.add_locks = False
# Enable test masses, as defined in the config file
# NB You should recieve some warnings here informing
# you that attributes such as sus_Q_pitch are not defined
# this is okay. These values will be set to reasonable
# default values corresponding to cylindrical core test masses
factory.options.suspensions.test_masses = True
factory.options.suspensions.core_optics = True
# Print out build options
print("===== Config =======")
pprint.PrettyPrinter(indent=4, sort_dicts=True).pprint(
factory.options.toDict()
)
# Build model
print("===== Building model =======")
model = factory.make()
model.modes(modes=None) # basic maxtem
print("===== Adding locks and configuring operating point =======")
add_PRMI_locks(model)
outputs = model.run(InitialLockPRMI())
print("===== Writting out data =======")
for detector in get_PDs(model):
print(f"{detector} = {fmtpower(outputs['after locks'][detector])}")
plot_PRMI_error_signals(model)
===== Config =======
{ 'BS_trans_arm': 'X',
'BS_type': 'thick',
'ETMAR': False,
'INPUT': {'add_IMC_and_IM1': False, 'set_IMC_mode': True},
'LSC': { 'add_AC_loops': False,
'add_DOFs': True,
'add_locks': False,
'add_output_detectors': True,
'add_readouts': True,
'close_AC_loops': False},
'OUTPUT': {'readout': 'AS'},
'PR2_PR3_substrates': True,
'add_11MHz': True,
'add_165MHz': False,
'add_33MHz': True,
'add_55MHz': True,
'add_detectors': True,
'add_transmon': False,
'fake_prc_gouy': False,
'fake_src_gouy': False,
'materials': { 'test_mass_substrate': <finesse.materials.Material object at 0x7f8bce5cfdb0>},
'modulation_order': 3,
'suspensions': { 'auxillary_optics': False,
'core_optics': True,
'test_masses': True},
'wedges': False}
===== Building model =======
2024-11-30 20:05:03,812 - finesse-40m - INFO - ITMX does not have attribute sus_Q_pos in config file. Assuming 5.
2024-11-30 20:05:03,813 - finesse-40m - INFO - ITMX does not have attribute sus_Q_pitch in config file. Assuming 5.
2024-11-30 20:05:03,814 - finesse-40m - INFO - ITMX does not have attribute sus_f0_pitch in config file. Assuming 0.7.
2024-11-30 20:05:03,814 - finesse-40m - INFO - ITMX does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,815 - finesse-40m - INFO - ITMX does not have attribute sus_Q_yaw in config file. Assuming 5.
2024-11-30 20:05:03,815 - finesse-40m - INFO - ITMX does not have attribute sus_f0_yaw in config file. Assuming 0.8.
2024-11-30 20:05:03,815 - finesse-40m - INFO - ITMX does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,816 - finesse-40m - INFO - ITMY does not have attribute sus_Q_pos in config file. Assuming 5.
2024-11-30 20:05:03,817 - finesse-40m - INFO - ITMY does not have attribute sus_Q_pitch in config file. Assuming 5.
2024-11-30 20:05:03,817 - finesse-40m - INFO - ITMY does not have attribute sus_f0_pitch in config file. Assuming 0.7.
2024-11-30 20:05:03,818 - finesse-40m - INFO - ITMY does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,818 - finesse-40m - INFO - ITMY does not have attribute sus_Q_yaw in config file. Assuming 5.
2024-11-30 20:05:03,819 - finesse-40m - INFO - ITMY does not have attribute sus_f0_yaw in config file. Assuming 0.8.
2024-11-30 20:05:03,819 - finesse-40m - INFO - ITMY does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,820 - finesse-40m - INFO - ETMX does not have attribute sus_Q_pitch in config file. Assuming 5.
2024-11-30 20:05:03,820 - finesse-40m - INFO - ETMX does not have attribute sus_f0_pitch in config file. Assuming 0.7.
2024-11-30 20:05:03,821 - finesse-40m - INFO - ETMX does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,823 - finesse-40m - INFO - ETMX does not have attribute sus_Q_yaw in config file. Assuming 5.
2024-11-30 20:05:03,823 - finesse-40m - INFO - ETMX does not have attribute sus_f0_yaw in config file. Assuming 0.8.
2024-11-30 20:05:03,824 - finesse-40m - INFO - ETMX does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,825 - finesse-40m - INFO - ETMY does not have attribute sus_Q_pos in config file. Assuming 5.
2024-11-30 20:05:03,825 - finesse-40m - INFO - ETMY does not have attribute sus_Q_pitch in config file. Assuming 5.
2024-11-30 20:05:03,826 - finesse-40m - INFO - ETMY does not have attribute sus_f0_pitch in config file. Assuming 0.7.
2024-11-30 20:05:03,827 - finesse-40m - INFO - ETMY does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,828 - finesse-40m - INFO - ETMY does not have attribute sus_Q_yaw in config file. Assuming 5.
2024-11-30 20:05:03,828 - finesse-40m - INFO - ETMY does not have attribute sus_f0_yaw in config file. Assuming 0.8.
2024-11-30 20:05:03,829 - finesse-40m - INFO - ETMY does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,830 - finesse-40m - INFO - BS does not have attribute sus_Q_pos in config file. Assuming 5.
2024-11-30 20:05:03,831 - finesse-40m - INFO - BS does not have attribute sus_f0_pos in config file. Assuming 0.99.
2024-11-30 20:05:03,831 - finesse-40m - INFO - BS does not have attribute mass in config file. Assuming 0.2642.
2024-11-30 20:05:03,832 - finesse-40m - INFO - BS does not have attribute sus_Q_pitch in config file. Assuming 5.
2024-11-30 20:05:03,832 - finesse-40m - INFO - BS does not have attribute sus_f0_pitch in config file. Assuming 0.7.
2024-11-30 20:05:03,833 - finesse-40m - INFO - BS does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,833 - finesse-40m - INFO - BS does not have attribute mass in config file. Assuming 0.2642.
2024-11-30 20:05:03,833 - finesse-40m - INFO - BS does not have attribute sus_Q_yaw in config file. Assuming 5.
2024-11-30 20:05:03,834 - finesse-40m - INFO - BS does not have attribute sus_f0_yaw in config file. Assuming 0.8.
2024-11-30 20:05:03,834 - finesse-40m - INFO - BS does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,834 - finesse-40m - INFO - BS does not have attribute mass in config file. Assuming 0.2642.
2024-11-30 20:05:03,835 - finesse-40m - INFO - PRM does not have attribute sus_Q_pos in config file. Assuming 5.
2024-11-30 20:05:03,835 - finesse-40m - INFO - PRM does not have attribute sus_f0_pos in config file. Assuming 0.99.
2024-11-30 20:05:03,836 - finesse-40m - INFO - PRM does not have attribute mass in config file. Assuming 0.2642.
2024-11-30 20:05:03,836 - finesse-40m - INFO - PRM does not have attribute sus_Q_pitch in config file. Assuming 5.
2024-11-30 20:05:03,837 - finesse-40m - INFO - PRM does not have attribute sus_f0_pitch in config file. Assuming 0.7.
2024-11-30 20:05:03,837 - finesse-40m - INFO - PRM does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,837 - finesse-40m - INFO - PRM does not have attribute mass in config file. Assuming 0.2642.
2024-11-30 20:05:03,838 - finesse-40m - INFO - PRM does not have attribute sus_Q_yaw in config file. Assuming 5.
2024-11-30 20:05:03,838 - finesse-40m - INFO - PRM does not have attribute sus_f0_yaw in config file. Assuming 0.8.
2024-11-30 20:05:03,838 - finesse-40m - INFO - PRM does not have attribute radius in config file. Assuming 0.0375.
2024-11-30 20:05:03,839 - finesse-40m - INFO - PRM does not have attribute mass in config file. Assuming 0.2642.
===== Adding locks and configuring operating point =======
===== Writting out data =======
PowerDetector('Px') = 0.0 W
PowerDetector('Pinx') = 15.1 W
PowerDetector('Py') = 0.0 W
PowerDetector('Piny') = 15.1 W
PowerDetector('Pprc') = 30.2 W
PowerDetector('Psrc') = 1.5e-11 W
PowerDetector('Pin') = 799.6 mW
PowerDetector('PreflPRM') = 246.0 mW
PowerDetector('Prefl') = 246.0 mW
PowerDetector('Ppop') = 28.9 mW
PowerDetector('Pas') = 2.0e-07 W
Check that the error signals and powers are reasonable.
Next we compute the sensitivity for three different input powers
model3 = model.deepcopy()
model3.parse("""
# Differentially modulate the arm lengths
fsig(1)
sgen darmx ITMX.mech.z
sgen darmy ITMY.mech.z phase=180
# Output the full quantum noise limited sensitivity
qnoised1 NSR_with_RP AS_port.p1 f2 0 nsr=True
# We could also display the quantum noise and the signal
# separately by uncommenting these two lines.
# qnoised noise srm.p2.o
# pd1 signal srm.p2.o f=fsig
""")
x = 10
y = 100
ax = fac.Xaxis(model3.darmx.f, 'log', 0.3, 100e3, 100, name='LF')
out = model3.run(
fac.Series(
ax,
fac.Change({model3.L0.P: x*model.L0.P}),
ax,
fac.Change({model3.L0.P: y*model.L0.P}),
ax
),progress_bar=True
)
fig, ax1 = plt.subplots(ncols=1,sharey=True,figsize=(7,3))
ax1.loglog(out[0].x0,2*out[0]['NSR_with_RP'], c='r', ls='--', label=f"Pin = {model.L0.P}")
ax1.loglog(out[1].x0,2*out[1]['NSR_with_RP'], c='b', ls='--', label=f"Pin = {x*model.L0.P} W")
ax1.loglog(out[2].x0,2*out[2]['NSR_with_RP'], c='g', ls='--', label=f"Pin = {y*model.L0.P} W")
ax1.legend()
ax1.set_ylabel('Sensitivity [m/sqrt(Hz)]')
Text(0, 0.5, 'Sensitivity [m/sqrt(Hz)]')
Here we can see that for the default input power of 800 mW we expect to see no radiation pressure effects. Instead, our idealised interferometer is limited by shot noise everywhere. However, after increasing the input power by 10 and 100 times, we can see a significant radiation pressure effects.
Of course, we have not modelled the angular effects since we have set maxtem to None. We have also not modelled seismic noise or other key noise sources.