Skip to content
Snippets Groups Projects
Commit b618c57e authored by Kevin Kuns's avatar Kevin Kuns Committed by Jameson Rollins
Browse files

make quantum noise sub-budgets

Quantum noise now broken up into:
* AS Port Vacuum
* Arm Loss
* SRC Loss
* Filter Cavity Loss
* Injection Loss
* Readout Loss
parent 814668ef
No related branches found
No related tags found
No related merge requests found
...@@ -2,6 +2,26 @@ from gwinc.ifo.noises import * ...@@ -2,6 +2,26 @@ from gwinc.ifo.noises import *
from gwinc.ifo import PLOT_STYLE from gwinc.ifo import PLOT_STYLE
class QuantumVacuum(nb.Budget):
"""Quantum Vacuum
"""
style = dict(
label='Quantum Vacuum',
color='#ad03de',
)
noises = [
QuantumVacuumAS,
QuantumVacuumArm,
QuantumVacuumSEC,
QuantumVacuumFilterCavity,
QuantumVacuumInjection,
QuantumVacuumReadout,
QuantumVacuumQuadraturePhase,
]
class Aplus(nb.Budget): class Aplus(nb.Budget):
name = 'A+' name = 'A+'
......
...@@ -2,6 +2,26 @@ from gwinc.ifo.noises import * ...@@ -2,6 +2,26 @@ from gwinc.ifo.noises import *
from gwinc.ifo import PLOT_STYLE from gwinc.ifo import PLOT_STYLE
class QuantumVacuum(nb.Budget):
"""Quantum Vacuum
"""
style = dict(
label='Quantum Vacuum',
color='#ad03de',
)
noises = [
QuantumVacuumAS,
QuantumVacuumArm,
QuantumVacuumSEC,
QuantumVacuumFilterCavity,
QuantumVacuumInjection,
QuantumVacuumReadout,
QuantumVacuumQuadraturePhase,
]
class Newtonian(nb.Budget): class Newtonian(nb.Budget):
"""Newtonian Gravity """Newtonian Gravity
......
...@@ -2,6 +2,26 @@ from gwinc.ifo.noises import * ...@@ -2,6 +2,26 @@ from gwinc.ifo.noises import *
from gwinc.ifo import PLOT_STYLE from gwinc.ifo import PLOT_STYLE
class QuantumVacuum(nb.Budget):
"""Quantum Vacuum
"""
style = dict(
label='Quantum Vacuum',
color='#ad03de',
)
noises = [
QuantumVacuumAS,
QuantumVacuumArm,
QuantumVacuumSEC,
QuantumVacuumFilterCavity,
QuantumVacuumInjection,
QuantumVacuumReadout,
QuantumVacuumQuadraturePhase,
]
class Newtonian(nb.Budget): class Newtonian(nb.Budget):
"""Newtonian Gravity """Newtonian Gravity
......
...@@ -321,6 +321,7 @@ Squeezer: ...@@ -321,6 +321,7 @@ Squeezer:
AmplitudedB: 15 # SQZ amplitude [dB] AmplitudedB: 15 # SQZ amplitude [dB]
InjectionLoss: 0.02 # power loss to sqz InjectionLoss: 0.02 # power loss to sqz
SQZAngle: 0 # SQZ phase [radians] SQZAngle: 0 # SQZ phase [radians]
LOAngleRMS: 10e-3 # quadrature noise [radians]
# Parameters for frequency dependent squeezing # Parameters for frequency dependent squeezing
FilterCavity: FilterCavity:
......
...@@ -2,6 +2,25 @@ from gwinc.ifo.noises import * ...@@ -2,6 +2,25 @@ from gwinc.ifo.noises import *
from gwinc.ifo import PLOT_STYLE from gwinc.ifo import PLOT_STYLE
class QuantumVacuum(nb.Budget):
"""Quantum Vacuum
"""
style = dict(
label='Quantum Vacuum',
color='#ad03de',
)
noises = [
QuantumVacuumAS,
QuantumVacuumArm,
QuantumVacuumSEC,
QuantumVacuumFilterCavity,
QuantumVacuumInjection,
QuantumVacuumReadout,
]
class Voyager(nb.Budget): class Voyager(nb.Budget):
name = 'Voyager' name = 'Voyager'
......
...@@ -2,6 +2,23 @@ from gwinc.ifo.noises import * ...@@ -2,6 +2,23 @@ from gwinc.ifo.noises import *
from gwinc.ifo import PLOT_STYLE from gwinc.ifo import PLOT_STYLE
class QuantumVacuum(nb.Budget):
"""Quantum Vacuum
"""
style = dict(
label='Quantum Vacuum',
color='#ad03de',
)
noises = [
QuantumVacuumAS,
QuantumVacuumArm,
QuantumVacuumSEC,
QuantumVacuumReadout,
]
class aLIGO(nb.Budget): class aLIGO(nb.Budget):
name = 'Advanced LIGO' name = 'Advanced LIGO'
......
...@@ -9,7 +9,10 @@ from .. import nb ...@@ -9,7 +9,10 @@ from .. import nb
from .. import noise from .. import noise
from .. import suspension from .. import suspension
##################################################
############################################################
# helper functions
############################################################
def mirror_struct(ifo, tm): def mirror_struct(ifo, tm):
...@@ -164,14 +167,80 @@ def precomp_suspension(f, ifo): ...@@ -164,14 +167,80 @@ def precomp_suspension(f, ifo):
return pc return pc
##################################################
def precomp_quantum(f, ifo):
pc = Struct()
mirror_mass = mirror_struct(ifo, 'ETM').MirrorMass
power = ifo_power(ifo)
noise_dict = noise.quantum.shotrad(f, ifo, mirror_mass, power)
pc.ASvac = noise_dict['ASvac']
pc.SEC = noise_dict['SEC']
pc.Arm = noise_dict['arm']
pc.Injection = noise_dict['injection']
pc.PD = noise_dict['pd']
# FC0 are the noises from the filter cavity losses and FC0_unsqzd_back
# are noises from the unsqueezed vacuum injected at the back mirror
# Right now there are at most one filter cavity in all the models;
# if there were two, there would also be FC1 and FC1_unsqzd_back, etc.
# keys = list(noise_dict.keys())
fc_keys = [key for key in noise_dict.keys() if 'FC' in key]
if fc_keys:
pc.FC = np.zeros_like(pc.ASvac)
for key in fc_keys:
pc.FC += noise_dict[key]
if 'phase' in noise_dict.keys():
pc.Phase = noise_dict['phase']
if 'ofc' in noise_dict.keys():
pc.OFC = noise_dict['OFC']
return pc
############################################################
# calibration
############################################################
def dhdl(f, armlen):
"""Strain to length conversion for noise power spetra
This takes into account the GW wavelength and is only important
when this is comparable to the detector arm length.
From R. Schilling, CQG 14 (1997) 1513-1519, equation 5,
with n = 1, nu = 0.05, ignoring overall phase and cos(nu)^2.
A small value of nu is used instead of zero to avoid infinities.
Returns the square of the dh/dL function, and the same divided by
the arm length squared.
"""
c = const.c
nu_small = 15*pi/180
omega_arm = pi * f * armlen / c
omega_arm_f = (1 - sin(nu_small)) * pi * f * armlen / c
omega_arm_b = (1 + sin(nu_small)) * pi * f * armlen / c
sinc_sqr = 4 / abs(sin(omega_arm_f) * exp(-1j * omega_arm) / omega_arm_f
+ sin(omega_arm_b) * exp(1j * omega_arm) / omega_arm_b)**2
dhdl_sqr = sinc_sqr / armlen**2
return dhdl_sqr, sinc_sqr
class Strain(nb.Calibration): class Strain(nb.Calibration):
def calc(self): def calc(self):
dhdl_sqr, sinc_sqr = dhdl(self.freq, self.ifo.Infrastructure.Length) dhdl_sqr, sinc_sqr = dhdl(self.freq, self.ifo.Infrastructure.Length)
return dhdl_sqr return dhdl_sqr
##################################################
############################################################
# noise sources
############################################################
#########################
# quantum
#########################
class QuantumVacuum(nb.Noise): class QuantumVacuum(nb.Noise):
"""Quantum Vacuum """Quantum Vacuum
...@@ -182,10 +251,109 @@ class QuantumVacuum(nb.Noise): ...@@ -182,10 +251,109 @@ class QuantumVacuum(nb.Noise):
color='#ad03de', color='#ad03de',
) )
def calc(self): @nb.precomp(quantum=precomp_quantum)
ETM = mirror_struct(self.ifo, 'ETM') def calc(self, quantum):
power = ifo_power(self.ifo) total = np.zeros_like(quantum.ASvac)
return noise.quantum.shotrad(self.freq, self.ifo, ETM.MirrorMass, power) for nn in quantum.values():
total += nn
return total
class QuantumVacuumAS(nb.Noise):
"""Quantum vacuum from the AS port
"""
style = dict(
label='AS Port Vacuum',
color='xkcd:emerald green'
)
@nb.precomp(quantum=precomp_quantum)
def calc(self, quantum):
return quantum.ASvac
class QuantumVacuumArm(nb.Noise):
"""Quantum vacuum due to arm cavity loss
"""
style = dict(
label='Arm Loss',
color='xkcd:orange brown'
)
@nb.precomp(quantum=precomp_quantum)
def calc(self, quantum):
return quantum.Arm
class QuantumVacuumSEC(nb.Noise):
"""Quantum vacuum due to SEC loss
"""
style = dict(
label='SEC Loss',
color='xkcd:cerulean'
)
@nb.precomp(quantum=precomp_quantum)
def calc(self, quantum):
return quantum.SEC
class QuantumVacuumFilterCavity(nb.Noise):
"""Quantum vacuum due to filter cavity loss
"""
style = dict(
label='Filter Cavity Loss',
color='xkcd:goldenrod'
)
@nb.precomp(quantum=precomp_quantum)
def calc(self, quantum):
return quantum.FC
class QuantumVacuumInjection(nb.Noise):
"""Quantum vacuum due to injection loss
"""
style = dict(
label='Injection Loss',
color='xkcd:fuchsia'
)
@nb.precomp(quantum=precomp_quantum)
def calc(self, quantum):
return quantum.Injection
class QuantumVacuumReadout(nb.Noise):
"""Quantum vacuum due to readout loss
"""
style = dict(
label='Readout Loss',
color='xkcd:mahogany'
)
@nb.precomp(quantum=precomp_quantum)
def calc(self, quantum):
return quantum.PD
class QuantumVacuumQuadraturePhase(nb.Noise):
"""Quantum vacuum noise due to quadrature phase noise
"""
style = dict(
label='Quadrature Phase',
color='xkcd:slate'
)
@nb.precomp(quantum=precomp_quantum)
def calc(self, quantum):
return quantum.Phase
class StandardQuantumLimit(nb.Noise): class StandardQuantumLimit(nb.Noise):
...@@ -202,6 +370,9 @@ class StandardQuantumLimit(nb.Noise): ...@@ -202,6 +370,9 @@ class StandardQuantumLimit(nb.Noise):
ETM = mirror_struct(self.ifo, 'ETM') ETM = mirror_struct(self.ifo, 'ETM')
return 8 * const.hbar / (ETM.MirrorMass * (2 * np.pi * self.freq) ** 2) return 8 * const.hbar / (ETM.MirrorMass * (2 * np.pi * self.freq) ** 2)
#########################
# seismic
#########################
class Seismic(nb.Noise): class Seismic(nb.Noise):
"""Seismic """Seismic
...@@ -228,6 +399,10 @@ class Seismic(nb.Noise): ...@@ -228,6 +399,10 @@ class Seismic(nb.Noise):
return n * 4 return n * 4
#########################
# Newtonian
#########################
class Newtonian(nb.Noise): class Newtonian(nb.Noise):
"""Newtonian Gravity """Newtonian Gravity
...@@ -285,6 +460,10 @@ class NewtonianInfrasound(nb.Noise): ...@@ -285,6 +460,10 @@ class NewtonianInfrasound(nb.Noise):
return n * 2 return n * 2
#########################
# suspension thermal
#########################
class SuspensionThermal(nb.Noise): class SuspensionThermal(nb.Noise):
"""Suspension Thermal """Suspension Thermal
...@@ -301,6 +480,10 @@ class SuspensionThermal(nb.Noise): ...@@ -301,6 +480,10 @@ class SuspensionThermal(nb.Noise):
return n * 4 return n * 4
#########################
# coating thermal
#########################
class CoatingBrownian(nb.Noise): class CoatingBrownian(nb.Noise):
"""Coating Brownian """Coating Brownian
...@@ -349,6 +532,10 @@ class CoatingThermoOptic(nb.Noise): ...@@ -349,6 +532,10 @@ class CoatingThermoOptic(nb.Noise):
return (nITM + nETM) * 2 return (nITM + nETM) * 2
#########################
# substrate thermal
#########################
class ITMThermoRefractive(nb.Noise): class ITMThermoRefractive(nb.Noise):
"""ITM Thermo-Refractive """ITM Thermo-Refractive
...@@ -406,6 +593,11 @@ class SubstrateThermoElastic(nb.Noise): ...@@ -406,6 +593,11 @@ class SubstrateThermoElastic(nb.Noise):
return (nITM + nETM) * 2 return (nITM + nETM) * 2
#########################
# residual gas
#########################
class ExcessGas(nb.Noise): class ExcessGas(nb.Noise):
"""Excess Gas """Excess Gas
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment