pygwinc architecture
I guess there's a plan for how pygwinc will eventually look, but I thought I'd ask this now rather than later in development.
Is there a reason you avoid using objects to represent the various aspects of the noise budget (the noise calculations, interferometers, plotting tools, etc.)? This seems to me to be the clearest way to define an API for others to write their own noise budgets. Right now some of the code seems to resemble MATLAB GWINC in its structure, which, while making it easy to change parameters and noises that are already supported, makes it difficult to add new noise sources or change the way existing noise sources are calculated.
I would really like to be able to subclass a base interferometer noise model, add the noises that I want to calculate, maybe change a few things (e.g. a different interferometer configuration's quantum noise calculation) but otherwise use everything else (including e.g. plotting tools) as-is. As an example, an in-air experiment wouldn't care to plot residual gas noise - right now as far as I can tell I'd have to either remove this with a monkey hack or open up my copy of gwinc.py
and hard-code it. The latter is probably what most people would do, leading to the prospect that unofficial implementations start getting spread around (I've seen this happen with GWINC!).
Maybe another cool thing to do would be to have stuff like the squeezer as "mixins" to the base interferometer class, which then provides tools to e.g. calculate filter cavity parameters, instead of having these calculations -- which might be confusing for those modelling completely different setups -- available whether you need them or not. With a mixin it would even be possible for someone to implement their own squeezer model, itself perhaps a subclass of the base squeezer model, to model different squeezer designs.
I guess all of this depends on the intended use case!