Thanks to discussion with Virgo-ISC team, there are a few updates that need to be implemented to better match the current control scheme for the interferometer.
- The current control strategy used for Virgo should be:
"PRCL": ("B2_6", "I", None, 1e-12),
"SRCL": ("B4_56", "Q", None, 50e-11),
"DARM": ("B1p_56", "I", None, 1e-16),
"CARM": ("B4_6", "I", None, 1e-14),
"MICH": ("B4_56", "I", None, 1e-11)'
(note that the tolerances are chosen arbitrarily by me; they could probably be fine-tuned)
The updated katscript file to parse for the readouts in order to create the Virgo O4 configuration is the following. It adds the corresponding readouts to detect the new error signals :
While waiting for the new update fo the finesse_virgo package, I suggest downloading this file as well as the base kat file and putting the two files into the same folder as the one the jupyter notebook is stored in:
Then when generating the model, do something along the lines :
virgo = finesse.virgo.Virgo(files_to_parse=['00_virgo_common_file.kat','01_additional_katscript_updated_0607-1.kat'], display_plots = True,
maxtem = "off", verbose = True, parse_additional_katscript=False, add_locks = True,
control_scheme={
"PRCL": ("B2_6", "I", None, 1e-12),
"SRCL": ("B4_56", "Q", None, 50e-11),
"DARM": ("B1p_56", "I", None, 1e-16),
"CARM": ("B4_6", "I", None, 1e-14),
"MICH": ("B4_56", "I", None, 1e-11),
})
- The way the demodulation phases are optimised and the locks are ran should be slightly changed. In practice, the demodulation phase of the signal that senses MICH is chosen such that the noise coming from PRCL is minimised. In other words, if we consider the control strategy in the first point : MICH is sensed by B4_56_I so the B4_56 demodulation phase should be rotated such that the PRCL sensing matrix element on B4_56_I is 0 (thus all the PRCL cross-coupling appears on the Q quadrature of B4_56).
To to this I suggest that the ‘.make’ method should be altered to include a new lock procedure in the following way :
- Do not change anything from steps 1 to 3
- Add a step 3bis : rotate the MICH error signal demodulation phase to minimize the cross-coupling to PRCL. A possible implementation could be some function of the following sort (to be re-coded in a object-oriented fashion):
# start by defining a function that takes a virgo instance and outputs the sensing matrix in a dataframe format
def get_sensing_matrix_df(virgo_object):
B, dofs, readouts = virgo_object.get_sensing_matrix().matrix_data()
return pd.DataFrame(B, index=dofs, columns=readouts)
# Now implement it into a function which changes the demodulation phase of a readout such that a given dof is in the Q quadrature, and
# updates the sensing matrix
def minimize_coupling_demod_phase(virgo_object, dof, readout):
# get the dataframe
df = get_sensing_matrix_df(virgo_object)
I_gain = df[f'{readout}_I'][dof]
Q_gain = df[f'{readout}_Q'][dof]
# Change the demodulation phase in the virgo object
virgo_object.model.get(readout).phase.value += - np.rad2deg(np.arctan2(I_gain, Q_gain))
virgo_object.update_sensing_matrix()
# Execute these functions for the required demodulation phases. Start by finding the corresponding error signal for MICH :
minimize_coupling_demod_phase(virgo_object, 'PRCL', virgo_object.control_scheme['MICH'][0])
# Note that this code does not check the the MICH readout is indeed the I quadrature; this should certainly be checked in the final version of the code
- Do not change anything between steps 4 and 6.
To conclude on this point I would suggest to implement this new way to lock the ITF as an option that could be toggled by the user in case they want to have a realistic tuning of the error signal demodulation phases or the ideal one.
Note : I have not updated the base kat file for virgo yet, there are probably some changes that need to be done (like reducing the power, increasing the OMC losses etc.)