From 477da537a24c3fdae18a80627b51c39aad6e8306 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bayle <j2b.bayle@gmail.com> Date: Fri, 24 Feb 2023 17:14:52 +0100 Subject: [PATCH] Fix size of clock noise covering all telemetry --- lisainstrument/instrument.py | 70 ++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/lisainstrument/instrument.py b/lisainstrument/instrument.py index 672d04b..143d3c2 100755 --- a/lisainstrument/instrument.py +++ b/lisainstrument/instrument.py @@ -231,22 +231,28 @@ class Instrument: # Telemetry sampling self.telemetry_downsampling = int(telemetry_downsampling) - self.initial_telemetry_size = int(initial_telemetry_size) - self.initial_telemetry_measurement_size = \ - self.initial_telemetry_size * self.telemetry_downsampling - self.initial_telemetry_physics_size = \ - self.initial_telemetry_measurement_size * self.physics_upsampling - self.telemetry_size = self.initial_telemetry_size \ - + math.ceil(self.size / self.telemetry_downsampling) + 1 self.telemetry_dt = self.dt * self.telemetry_downsampling self.telemetry_fs = self.fs / self.telemetry_downsampling + # Extra telemetry samples before t0 + self.initial_telemetry_size = int(initial_telemetry_size) self.telemetry_t0 = self.t0 - self.initial_telemetry_size * self.telemetry_dt + # Total telemetry size, includes initial telemetry samples + # plus telemetry samples covering the entire measurement time vector, + # hence the use of ``math.ceil`` -- the +1 is for the sample at t0 + self.telemetry_size = self.initial_telemetry_size + 1 \ + + math.ceil(self.size / self.telemetry_downsampling) logger.info("Computing telemetry time vector (size=%s, dt=%s)", self.telemetry_size, self.telemetry_dt) - self.telemetry_t = self.telemetry_t0 + np.arange(self.telemetry_size, dtype=np.float64) * self.telemetry_dt - - self.physics_et_withinitial = self.telemetry_t0 - self.t0 + \ - np.arange(self.physics_size + self.initial_telemetry_physics_size, dtype=np.float64) * self.physics_dt - self.physics_t_withinitial = self.t0 + self.physics_et_withinitial + self.telemetry_t = self.telemetry_t0 \ + + np.arange(self.telemetry_size, dtype=np.float64) * self.telemetry_dt + # Physics time vector covering telemetry samples + self.telemetry_to_physics_dt = self.telemetry_downsampling * self.physics_upsampling + self.physics_size_covering_telemetry = self.telemetry_size * self.telemetry_to_physics_dt + self.physics_et_covering_telemetry = self.telemetry_t0 - self.t0 + \ + np.arange(self.physics_size_covering_telemetry, dtype=np.float64) * self.physics_dt + self.physics_t_covering_telemetry = self.t0 + self.physics_et_covering_telemetry + # How to cut physics data covering telemetry to regular size + first_sample = self.initial_telemetry_size * self.telemetry_to_physics_dt + self.telemetry_physics_slice = slice(first_sample, first_sample + self.physics_size) # Orbits, gravitational waves, glitches self.init_orbits(orbits, orbit_dataset) @@ -654,7 +660,7 @@ class Instrument: logger.debug("Interpolating proper pseudo-range derivatives") self.d_pprs = ForEachMOSA(lambda mosa: pprs(mosa).derivative()(self.physics_t)) logger.debug("Interpolating TPSs with respect to TCB") - self.tps_wrt_tcb = ForEachSC(lambda sc: tps_wrt_tcb(sc)(self.physics_t_withinitial)) + self.tps_wrt_tcb = ForEachSC(lambda sc: tps_wrt_tcb(sc)(self.physics_t_covering_telemetry)) except ValueError as error: logger.error("Missing orbit information at \n%s", self.physics_t) raise ValueError("missing orbit information, use longer orbit file or adjust sampling") from error @@ -687,9 +693,10 @@ class Instrument: self.tps_wrt_tcb = ForEachSC(lambda sc: 0) else: dataset = orbitf['tcb/delta_tau'] - self.tps_wrt_tcb = ForEachSC(lambda sc: interpolate(dataset[:, sc_index[sc]], self.physics_t_withinitial)) + self.tps_wrt_tcb = ForEachSC(lambda sc: + interpolate(dataset[:, sc_index[sc]], self.physics_t_covering_telemetry)) except ValueError as error: - logger.error("Missing orbit information at \n%s", self.physics_t_withinitial) + logger.error("Missing orbit information at \n%s", self.physics_t_covering_telemetry) raise ValueError("missing orbit information, use longer orbit file or adjust sampling") from error def init_gws(self, gws): @@ -962,18 +969,18 @@ class Instrument: + self.integrated_clock_noise_fluctuations logger.debug("Computing THE with respect to TCB") - t = self.physics_et_withinitial + t = self.physics_et_covering_telemetry self.the_wrt_tcb_withinitial = \ self.tps_wrt_tcb \ + self.clock_offsets \ + self.clock_freqoffsets * (t + self.tps_wrt_tcb) \ + self.clock_freqlindrifts * (t + self.tps_wrt_tcb)**2 / 2 \ + self.clock_freqquaddrifts * (t + self.tps_wrt_tcb)**3 / 3 \ - + self.tps_wrt_tcb * self.clock_noise_fluctuations_withinitial \ - + self.integrated_clock_noise_fluctuations_withinitial + + self.tps_wrt_tcb * self.clock_noise_fluctuations_covering_telemetry \ + + self.integrated_clock_noise_fluctuations_covering_telemetry logger.debug("Computing MOC time correlations") - physics_to_telemetry = lambda _, x: x[::self.physics_upsampling * self.telemetry_downsampling] + physics_to_telemetry = lambda _, x: x[::self.telemetry_to_physics_dt] self.moc_time_correlations = self.moc_time_correlation_noises \ + self.the_wrt_tcb_withinitial.transformed(physics_to_telemetry) @@ -1521,35 +1528,36 @@ class Instrument: logger.debug("Generating clock noise fluctuations") # Include initial telemetry time period - self.clock_noise_fluctuations_withinitial = ForEachSC(lambda sc: + self.clock_noise_fluctuations_covering_telemetry = ForEachSC(lambda sc: noises.clock( self.physics_fs, - self.physics_size + self.initial_telemetry_physics_size, + self.physics_size_covering_telemetry, self.clock_asds[sc]), concurrent=self.concurrent ) # Slice to only select physics period - self.clock_noise_fluctuations = self.clock_noise_fluctuations_withinitial.transformed( - lambda _, x: x if np.isscalar(x) else x[self.initial_telemetry_physics_size:] - ) + self.clock_noise_fluctuations = \ + self.clock_noise_fluctuations_covering_telemetry.transformed( + lambda _, x: x if np.isscalar(x) else x[self.telemetry_physics_slice] + ) logger.debug("Integrating clock noise fluctuations") # Include initial telemetry time period - self.integrated_clock_noise_fluctuations_withinitial = \ + self.integrated_clock_noise_fluctuations_covering_telemetry = \ ForEachSC(lambda sc: cumulative_trapezoid(np.broadcast_to( - self.clock_noise_fluctuations_withinitial[sc], - self.physics_size + self.initial_telemetry_physics_size), + self.clock_noise_fluctuations_covering_telemetry[sc], + self.physics_size_covering_telemetry), dx=self.physics_dt, initial=0), concurrent=self.concurrent ) # Slice to only select physics period self.integrated_clock_noise_fluctuations = \ - self.integrated_clock_noise_fluctuations_withinitial.transformed( - lambda _, x: x if np.isscalar(x) else x[self.initial_telemetry_physics_size:] + self.integrated_clock_noise_fluctuations_covering_telemetry.transformed( + lambda _, x: x if np.isscalar(x) else x[self.telemetry_physics_slice] ) ## Modulation noise @@ -1986,9 +1994,9 @@ class Instrument: logger.debug("Writing clock noise to '%s'", output) self.clock_noise_offsets.write(hdf5, 'clock_noise_offsets') self.clock_noise_fluctuations.write(hdf5, 'clock_noise_fluctuations') - self.clock_noise_fluctuations_withinitial.write( + self.clock_noise_fluctuations_covering_telemetry.write( hdf5, 'clock_noise_fluctuations_withinitial') - self.integrated_clock_noise_fluctuations_withinitial.write( + self.integrated_clock_noise_fluctuations_covering_telemetry.write( hdf5, 'integrated_clock_noise_fluctuations_withinitial') self.integrated_clock_noise_fluctuations.write( hdf5, 'integrated_clock_noise_fluctuations') -- GitLab