Skip to content
Snippets Groups Projects
Commit 605bc4dd authored by Jean-Baptiste Bayle's avatar Jean-Baptiste Bayle
Browse files

Merge branch '20-add-a-first-model-for-measurement-readout-noise' into 'master'

Resolve "Add a first model for measurement/readout noise"

Closes #20

See merge request !31
parents 08c0998c 21a8b456
No related branches found
No related tags found
1 merge request!31Resolve "Add a first model for measurement/readout noise"
Pipeline #109711 passed
...@@ -45,6 +45,7 @@ class Instrument: ...@@ -45,6 +45,7 @@ class Instrument:
clock_freqquaddrifts=None, clockinv_tolerance=1E-10, clockinv_maxiter=5, clock_freqquaddrifts=None, clockinv_tolerance=1E-10, clockinv_maxiter=5,
# Optical pathlength noises # Optical pathlength noises
backlink_asds=3E-12, backlink_fknees=2E-3, testmass_asds=2.4E-15, testmass_fknees=0.4E-3, backlink_asds=3E-12, backlink_fknees=2E-3, testmass_asds=2.4E-15, testmass_fknees=0.4E-3,
oms_asds=(6.35E-12, 1.25E-11, 1.42E-12, 3.38E-12, 3.32E-12, 7.90E-12), oms_fknees=2E-3,
# Pseudo-ranging # Pseudo-ranging
ranging_biases=0, ranging_asds=3E-9, ranging_biases=0, ranging_asds=3E-9,
# Physics simulation sampling and filtering # Physics simulation sampling and filtering
...@@ -80,7 +81,10 @@ class Instrument: ...@@ -80,7 +81,10 @@ class Instrument:
backlink_asds: dictionary of amplitude spectral densities for backlink noise [m/sqrt(Hz)] backlink_asds: dictionary of amplitude spectral densities for backlink noise [m/sqrt(Hz)]
backlink_fknees: dictionary of cutoff frequencied for backlink noise [Hz] backlink_fknees: dictionary of cutoff frequencied for backlink noise [Hz]
testmass_asds: dictionary of amplitude spectral densities for test-mass noise [ms^(-2)/sqrt(Hz)] testmass_asds: dictionary of amplitude spectral densities for test-mass noise [ms^(-2)/sqrt(Hz)]
testmass_fknees: dictionary of cutoff frequencied for test-mass noise [Hz] testmass_fknees: dictionary of cutoff frequencies for test-mass noise [Hz]
oms_asds: tuple of dictionaries of amplitude spectral densities for OMS noise [m/sqrt(Hz)],
ordered as (isc_carrier, isc_usb, tm_carrier, tm_usb, ref_carrier, ref_usb)
oms_fknees: dictionary of cutoff frequencies for OMS noise
ranging_biases: dictionary of ranging noise bias [s] ranging_biases: dictionary of ranging noise bias [s]
ranging_asds: dictionary of ranging noise amplitude spectral densities [s/sqrt(Hz)] ranging_asds: dictionary of ranging noise amplitude spectral densities [s/sqrt(Hz)]
physics_upsampling: ratio of sampling frequencies for physics vs. measurement simulation physics_upsampling: ratio of sampling frequencies for physics vs. measurement simulation
...@@ -163,11 +167,18 @@ class Instrument: ...@@ -163,11 +167,18 @@ class Instrument:
self.ranging_biases = ForEachMOSA(ranging_biases) self.ranging_biases = ForEachMOSA(ranging_biases)
self.ranging_asds = ForEachMOSA(ranging_asds) self.ranging_asds = ForEachMOSA(ranging_asds)
# Backlink and test-mass acceleration noise # Backlink, OMS and test-mass acceleration noise
self.backlink_asds = ForEachMOSA(backlink_asds) self.backlink_asds = ForEachMOSA(backlink_asds)
self.backlink_fknees = ForEachMOSA(backlink_fknees) self.backlink_fknees = ForEachMOSA(backlink_fknees)
self.testmass_asds = ForEachMOSA(testmass_asds) self.testmass_asds = ForEachMOSA(testmass_asds)
self.testmass_fknees = ForEachMOSA(testmass_fknees) self.testmass_fknees = ForEachMOSA(testmass_fknees)
self.oms_isc_carrier_asds = ForEachMOSA(oms_asds[0])
self.oms_isc_usb_asds = ForEachMOSA(oms_asds[1])
self.oms_tm_carrier_asds = ForEachMOSA(oms_asds[2])
self.oms_tm_usb_asds = ForEachMOSA(oms_asds[3])
self.oms_ref_carrier_asds = ForEachMOSA(oms_asds[4])
self.oms_ref_usb_asds = ForEachMOSA(oms_asds[5])
self.oms_fknees = ForEachMOSA(oms_fknees)
# Frequency plan # Frequency plan
if offsets_freqs is not None: if offsets_freqs is not None:
...@@ -391,6 +402,12 @@ class Instrument: ...@@ -391,6 +402,12 @@ class Instrument:
"""Turn off all optical pathlength noises.""" """Turn off all optical pathlength noises."""
self.backlink_asds = ForEachMOSA(0) self.backlink_asds = ForEachMOSA(0)
self.testmass_asds = ForEachMOSA(0) self.testmass_asds = ForEachMOSA(0)
self.oms_isc_carrier_asds = ForEachMOSA(0)
self.oms_isc_usb_asds = ForEachMOSA(0)
self.oms_tm_carrier_asds = ForEachMOSA(0)
self.oms_tm_usb_asds = ForEachMOSA(0)
self.oms_ref_carrier_asds = ForEachMOSA(0)
self.oms_ref_usb_asds = ForEachMOSA(0)
def disable_ranging_noises(self): def disable_ranging_noises(self):
"""Turn off all pseudo-ranging noises.""" """Turn off all pseudo-ranging noises."""
...@@ -541,7 +558,8 @@ class Instrument: ...@@ -541,7 +558,8 @@ class Instrument:
logger.debug("Computing inter-spacecraft carrier beatnote fluctuations on TPS") logger.debug("Computing inter-spacecraft carrier beatnote fluctuations on TPS")
self.tps_isc_carrier_fluctuations = \ self.tps_isc_carrier_fluctuations = \
self.distant_isc_carrier_fluctuations - self.local_isc_carrier_fluctuations self.distant_isc_carrier_fluctuations - self.local_isc_carrier_fluctuations \
+ self.central_freq * self.oms_isc_carrier_noises
logger.debug("Computing inter-spacecraft upper sideband beatnote offsets on TPS") logger.debug("Computing inter-spacecraft upper sideband beatnote offsets on TPS")
self.tps_isc_usb_offsets = \ self.tps_isc_usb_offsets = \
...@@ -549,7 +567,8 @@ class Instrument: ...@@ -549,7 +567,8 @@ class Instrument:
logger.debug("Computing inter-spacecraft upper sideband beatnote fluctuations on TPS") logger.debug("Computing inter-spacecraft upper sideband beatnote fluctuations on TPS")
self.tps_isc_usb_fluctuations = \ self.tps_isc_usb_fluctuations = \
self.distant_isc_usb_fluctuations - self.local_isc_usb_fluctuations self.distant_isc_usb_fluctuations - self.local_isc_usb_fluctuations \
+ self.central_freq * self.oms_isc_usb_noises
## Measured pseudo-ranging on TPS grid (high-frequency) ## Measured pseudo-ranging on TPS grid (high-frequency)
...@@ -604,7 +623,8 @@ class Instrument: ...@@ -604,7 +623,8 @@ class Instrument:
logger.debug("Computing test-mass carrier beatnote fluctuations on TPS") logger.debug("Computing test-mass carrier beatnote fluctuations on TPS")
self.tps_tm_carrier_fluctuations = \ self.tps_tm_carrier_fluctuations = \
self.adjacent_tm_carrier_fluctuations - self.local_tm_carrier_fluctuations self.adjacent_tm_carrier_fluctuations - self.local_tm_carrier_fluctuations \
+ self.central_freq * self.oms_tm_carrier_noises
logger.debug("Computing test-mass upper sideband beatnote offsets on TPS") logger.debug("Computing test-mass upper sideband beatnote offsets on TPS")
self.tps_tm_usb_offsets = \ self.tps_tm_usb_offsets = \
...@@ -612,7 +632,8 @@ class Instrument: ...@@ -612,7 +632,8 @@ class Instrument:
logger.debug("Computing test-mass upper sideband beatnote fluctuations on TPS") logger.debug("Computing test-mass upper sideband beatnote fluctuations on TPS")
self.tps_tm_usb_fluctuations = \ self.tps_tm_usb_fluctuations = \
self.adjacent_tm_usb_fluctuations - self.local_tm_usb_fluctuations self.adjacent_tm_usb_fluctuations - self.local_tm_usb_fluctuations \
+ self.central_freq * self.oms_tm_usb_noises
## Reference interferometer local beams ## Reference interferometer local beams
...@@ -656,7 +677,8 @@ class Instrument: ...@@ -656,7 +677,8 @@ class Instrument:
logger.debug("Computing reference carrier beatnote fluctuations on TPS") logger.debug("Computing reference carrier beatnote fluctuations on TPS")
self.tps_ref_carrier_fluctuations = \ self.tps_ref_carrier_fluctuations = \
self.adjacent_ref_carrier_fluctuations - self.local_ref_carrier_fluctuations self.adjacent_ref_carrier_fluctuations - self.local_ref_carrier_fluctuations \
+ self.central_freq * self.oms_ref_carrier_noises
logger.debug("Computing reference upper sideband beatnote offsets on TPS") logger.debug("Computing reference upper sideband beatnote offsets on TPS")
self.tps_ref_usb_offsets = \ self.tps_ref_usb_offsets = \
...@@ -664,7 +686,8 @@ class Instrument: ...@@ -664,7 +686,8 @@ class Instrument:
logger.debug("Computing reference upper sideband beatnote fluctuations on TPS") logger.debug("Computing reference upper sideband beatnote fluctuations on TPS")
self.tps_ref_usb_fluctuations = \ self.tps_ref_usb_fluctuations = \
self.adjacent_ref_usb_fluctuations - self.local_ref_usb_fluctuations self.adjacent_ref_usb_fluctuations - self.local_ref_usb_fluctuations \
+ self.central_freq * self.oms_ref_usb_noises
## Sampling beatnotes and measured pseudo-ranges to THE grid ## Sampling beatnotes and measured pseudo-ranges to THE grid
...@@ -922,6 +945,40 @@ class Instrument: ...@@ -922,6 +945,40 @@ class Instrument:
self.physics_size, self.ranging_asds[mosa]) self.physics_size, self.ranging_asds[mosa])
) )
## OMS noise
logger.info("Generating OMS noise")
self.oms_isc_carrier_noises = ForEachMOSA(lambda mosa:
noises.oms(self.physics_fs, self.physics_size,
self.oms_isc_carrier_asds[mosa], self.oms_fknees[mosa])
)
self.oms_isc_usb_noises = ForEachMOSA(lambda mosa:
noises.oms(self.physics_fs, self.physics_size,
self.oms_isc_usb_asds[mosa], self.oms_fknees[mosa])
)
self.oms_tm_carrier_noises = ForEachMOSA(lambda mosa:
noises.oms(self.physics_fs, self.physics_size,
self.oms_tm_carrier_asds[mosa], self.oms_fknees[mosa])
)
self.oms_tm_usb_noises = ForEachMOSA(lambda mosa:
noises.oms(self.physics_fs, self.physics_size,
self.oms_tm_usb_asds[mosa], self.oms_fknees[mosa])
)
self.oms_ref_carrier_noises = ForEachMOSA(lambda mosa:
noises.oms(self.physics_fs, self.physics_size,
self.oms_ref_carrier_asds[mosa], self.oms_fknees[mosa])
)
self.oms_ref_usb_noises = ForEachMOSA(lambda mosa:
noises.oms(self.physics_fs, self.physics_size,
self.oms_ref_usb_asds[mosa], self.oms_fknees[mosa])
)
def invert_timer_deviations(self, timer_deviations, sc): def invert_timer_deviations(self, timer_deviations, sc):
"""Invert timer deviations of a given spacecraft. """Invert timer deviations of a given spacecraft.
......
...@@ -204,3 +204,27 @@ def testmass(fs, size, asd=2.4E-15, fknee=0.4E-3): ...@@ -204,3 +204,27 @@ def testmass(fs, size, asd=2.4E-15, fknee=0.4E-3):
fs, size, asd, fknee) fs, size, asd, fknee)
return red(fs, size, asd / (2 * pi * c)) \ return red(fs, size, asd / (2 * pi * c)) \
+ infrared(fs, size, asd * fknee / (2 * pi * c)) + infrared(fs, size, asd * fknee / (2 * pi * c))
def oms(fs, size, asd, fknee):
"""Generate optical metrology system (OMS) noise allocation [ffs].
The power spectral density in displacement is given by
S_oms(f) [m] = asd^2 [ 1 + (fknee / f)^4 ].
Multiplying by (2π f / c)^2 to express it as fractional frequency deviations,
S_oms(f) [ffd] = (2π asd / c)^2 [ f^2 + (fknee^4 / f^2) ]
= (2π asd / c)^2 f^2 + (2π asd fknee^2 / c)^2 f^(-2)
Note that the level of this noise depends on the interferometer and the type of beatnote.
Warning: this corresponds to the overall allocation for the OMS noise from the Performance
Model. It is a collection of different noises, some of which are duplicates of standalone
noises we already implement in the simulation (e.g., backlink noise).
"""
logger.debug("Generating OMS noise (fs=%s Hz, size=%s, asd=%s m/sqrt(Hz), fknee=%s Hz)",
fs, size, asd, fknee)
return violet(fs, size, 2 * pi * asd / c) \
+ red(fs, size, 2 * pi * asd * fknee**2 / c)
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