Reports until 18:46, Wednesday 13 March 2019
H1 ISC
jonathan.richardson@LIGO.ORG - posted 18:46, Wednesday 13 March 2019 - last comment - 16:58, Friday 15 March 2019(47501)
A Python-based live noise budgeting tool

[Jon, Jamie, Chris, Craig]

Summary

We've developed and installed a new Python tool for budgeting IFO noise: aligoNB. At its core, this package contains Python translations of the Matlab scripts used to generate H1 noise budgets. However, it also significantly extends our noise-budgeting abilities:

Several examples illustrating the different ways this tool can be used are shown below.

Using the code

In general, the code is executed from the command line with a budget argument (either "H1" or "L1") and one or more option flags configuring properties of the budget. The full usage can be printed to the terminal by executing the help command:  $ aligonb -h

Examples

1. Generate a live-updating noise budget

$ aligonb H1 --online

launches a window displaying the online (current) noise budget. By default, the traces auto-update every 3 seconds. The update interval can be changed by providing a numerical argument in seconds immediately after the --online flag.

2. Generate a static budget from a specific time

$ aligonb H1 --time 1235813418 --span 60

similarly generates a static budget for data in the GPS time range 1235813418 to 1235813418+60 seconds. If no time arguments are provided, the time range defaults to that of the last H1 noise budget.

3. Include only specific noise terms in the budget

$ aligonb H1 DARMMeasured Quantum ASC

generates a budget consisting of only the Quantum and ASC noise terms. The noise terms are separated by spaces and can be arbitrarily many.

4. List all available noise terms

$ aligonb H1 -l

prints the full list of available H1 noises to the terminal:

H1
H1.ClosedLoopSensing
H1.Dark
H1.Quantum
H1.Quantum.ClosedLoopSensing
H1.Quantum.Shot
H1.Quantum.RadiationPressure
H1.OMCLength
H1.DAC
H1.OSEM
H1.ASC
H1.ASC.CHARDPit
H1.ASC.CHARDYaw
H1.ASC.DHARDPit
H1.ASC.DHARDYaw
H1.ASC.MICHPit
H1.ASC.MICHYaw
H1.ASC.PRC2Pit
H1.ASC.PRC2Yaw
H1.ASC.CSOFTPit
H1.ASC.DSOFTPit
H1.ASC.SRC2Pit
H1.ASC.SRC2Yaw
H1.Intensity
H1.MICH
H1.SRCL
H1.InputJitter
H1.InputJitter.InputJitterPit
H1.InputJitter.InputJitterYaw
H1.ResidualGas
H1.Thermal
H1.Thermal.SuspensionThermal
H1.Thermal.CoatingBrownian
H1.Seismic
H1.Newtonian
H1.OMCASC
H1.OMCASC.OMCPosX
H1.OMCASC.OMCPosY
H1.OMCASC.OMCAngX
H1.OMCASC.OMCAngY
H1.Frequency
H1.CalLines
H1.CalLines.PCALY
H1.CalLines.PCALX
*H1.DARMMeasuredRef0
*H1.DARMMeasured

Noise terms beginning with an asterisk are reference traces, and are not included in the calculated noise total. Noise terms containing sub-components (e.g., H1.InputJitter.InputJitterPit and H1.InputJitter.InputJitterYaw) can be sub-budgeted as described below.

5. Generate a noise sub-budget

$ aligonb H1.ASC

generates the budget of sub-terms which make up the ASC noise. In this case, the sub-terms are the contributions from each angular degree of freedom. Sub-budgets can be generated for any noise term which has sub-components defined (these can be identified using the  $ aligonb H1 -l  command described above).

Developing the code

Location and organization

Anyone working with the noise budget is welcome to edit the code as necessary. The code base is located at /ligo/gitcommon/Noisebudget/aligonb.

Relative to this directory, the file ./aligoNB/H1/budget.py contains the noise and budget class definitions. New noise terms can be defined here following the convention of the existing terms, and the new class name should be added to the list of noises inside the H1 class. Existing noise terms can also be modified as needed.

When a budget is generated, each noise class has three methods that are executed sequentially:

The most common workflow is to load a measured coupling from file using load(), pull NDS witness-channel data using update(), and finally apply the coupling to the data using calc(). The methods are broken up this way to prevent static data from having to be reloaded every time a live budget updates. The load() method is called only once initially, while update() and calc() are called at every update.

The code is under git version control (https://git.ligo.org/NoiseBudget/aligoNB). We ask that any changes be pushed back to this central repository so that a master copy can be maintained. The issue tracker can be used to report bugs and to request new functionality.

Work in progress

Jamie is continuing to develop an improved user interface which will enhance the appearance of the plotting. He is also adding binary NS inspiral range information to the plots. Craig is working with Gabriele to implement an estimator of the total scatter noise, which will be a new addition to the H1 budget. Jon will work on producing an analogous Python translation of the LLO budget.

Images attached to this report
Comments related to this report
rich.abbott@LIGO.ORG - 20:34, Wednesday 13 March 2019 (47513)
That is an unbelievably cool tool.  Just beautiful.
jameson.rollins@LIGO.ORG - 22:29, Wednesday 13 March 2019 (47516)

Couple of additional notes:

  • I've added a script that will synchronize the measured couplings from the legacy location in simple-noise-budget into the new aligoNB location:
$ /ligo/gitcommon/NoiseBudget/aligoNB/aligoNB/H1/sync-couplings

Be sure to git commit and push the updated couplings after synching.

  • Users should never need to override the update() method for our usage here.  The included plotter handles fetching the NDS data running the base update method to make the data available to the calc() method in the self.nds_data attribute.
  • Please report issues to the issue tracker:
  • The current online plotter puts a bit of a heavy load on the NDS server, so we probably don't want to run too many of them simultaneously.  I'm working on a more efficient version that will be available soon.
jameson.rollins@LIGO.ORG - 16:58, Friday 15 March 2019 (47568)

The --online plotting option has been disabled until further notice.

The prototype online plotting method was implemented in a crude and inefficient way, and seemed to be triggering instability in the NDS1 server.  I've disabled it until I can implement a more efficient method.