diff --git a/gstlal-calibration/bin/gstlal_compute_strain b/gstlal-calibration/bin/gstlal_compute_strain index 49e780c5e2762398f5f1dd3dae9b31887e7c366a..16ce38209e80580a5b3ae3dbca424613de36342b 100644 --- a/gstlal-calibration/bin/gstlal_compute_strain +++ b/gstlal-calibration/bin/gstlal_compute_strain @@ -311,6 +311,12 @@ compute_calib_factors_complex_caps = "audio/x-raw, format=Z128LE, rate=%d, chann integration_samples = int(options.demodulation_filter_time) * options.compute_factors_sr factors_average_samples = int(options.factors_averaging_time) * options.compute_factors_sr median_smoothing_samples = int(options.median_smoothing_time) * options.compute_factors_sr +if options.factors_from_filters_file: + # With factors_from_filters_file, the pipeline will hang and not produce output unless this latency is applied to the firbank + demodulation_filter_latency = integration_samples +else: + # In this case, the pipeline will run fine without the latency, and we want minimal latency when running online + demodulation_filter_latency = 0 # Set up string for the channels suffix and prefix as provided by the user if options.chan_suffix is not None: @@ -596,14 +602,14 @@ if not options.no_kappac or not options.no_fcc or not options.no_kappatst or not derrtee = pipeparts.mktee(pipeline, darm_err) # demodulate the PCAL channel at the DARM actuation line frequency - pcal_at_darm_act_freq_nocorr = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, pcaltee), darm_act_line_freq, td, compute_calib_factors_caps, integration_samples) + pcal_at_darm_act_freq_nocorr = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, pcaltee), darm_act_line_freq, td, compute_calib_factors_caps, integration_samples, demodulation_filter_latency) # apply the PCAL correction factor at the DARM actuation line frequency pcal_at_darm_act_freq = calibration_parts.complex_audioamplify(pipeline, pcal_at_darm_act_freq_nocorr, pcal_corr_at_darm_act_freq_real, pcal_corr_at_darm_act_freq_imag) if not options.no_kappapu or not options.no_kappac or not options.no_fcc: pcal_at_darm_act_freq = pipeparts.mktee(pipeline, pcal_at_darm_act_freq) # demodulate DARM_ERR at the DARM actuation line frequency - derr_at_darm_act_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, derrtee), darm_act_line_freq, td, compute_calib_factors_caps, integration_samples) + derr_at_darm_act_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, derrtee), darm_act_line_freq, td, compute_calib_factors_caps, integration_samples, demodulation_filter_latency) if options.dewhitening: # dewhiten DARM_ERR at the DARM actuation line frequency derr_at_darm_act_freq = calibration_parts.complex_audioamplify(pipeline, derr_at_darm_act_freq, derr_dewhiten_at_darm_act_freq_real, derr_dewhiten_at_darm_act_freq_imag) @@ -612,10 +618,10 @@ if not options.no_kappac or not options.no_fcc or not options.no_kappatst or not # resample and demodulate the TST excitation channel at the ESD actuation line frequency tstexc = calibration_parts.mkresample(pipeline, tstexc, hoft_caps) - tstexc_at_esd_act_freq = calibration_parts.demodulate(pipeline, tstexc, esd_act_line_freq, td, compute_calib_factors_caps, integration_samples) + tstexc_at_esd_act_freq = calibration_parts.demodulate(pipeline, tstexc, esd_act_line_freq, td, compute_calib_factors_caps, integration_samples, demodulation_filter_latency) # demodulate DARM_ERR at the ESD actuation line frequency - derr_at_esd_act_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, derrtee), esd_act_line_freq, td, compute_calib_factors_caps, integration_samples) + derr_at_esd_act_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, derrtee), esd_act_line_freq, td, compute_calib_factors_caps, integration_samples, demodulation_filter_latency) if options.dewhitening: # dewhiten DARM_ERR at the ESD actuation line frequency derr_at_esd_act_freq = calibration_parts.complex_audioamplify(pipeline, derr_at_esd_act_freq, derr_dewhiten_at_esd_act_freq_real, derr_dewhiten_at_esd_act_freq_imag) @@ -669,10 +675,10 @@ if not options.no_kappac or not options.no_fcc or not options.no_kappatst or not # If we're also computing \kappa_c, f_cc, or \kappa_pu, keep going if not options.no_kappac or not options.no_fcc or not options.no_kappapu: # demodulate excitation channel at PU actuation line frequency - exc_at_pu_act_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, exc), pu_act_esd_line_freq, td,compute_calib_factors_caps, integration_samples) + exc_at_pu_act_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, exc), pu_act_esd_line_freq, td,compute_calib_factors_caps, integration_samples, demodulation_filter_latency) # demodulate DARM_ERR at PU actuation line frequency - derr_at_pu_act_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, derrtee), pu_act_esd_line_freq, td, compute_calib_factors_caps, integration_samples) + derr_at_pu_act_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, derrtee), pu_act_esd_line_freq, td, compute_calib_factors_caps, integration_samples, demodulation_filter_latency) if options.dewhitening: # dewhiten DARM_ERR at the PU actuation line frequency derr_at_pu_act_freq = calibration_parts.complex_audioamplify(pipeline, derr_at_pu_act_freq, derr_dewhiten_at_pu_act_freq_real, derr_dewhiten_at_pu_act_freq_imag) @@ -726,12 +732,12 @@ if not options.no_kappac or not options.no_fcc or not options.no_kappapu: # Finally, compute \kappa_c and f_cc if not options.no_kappac or not options.no_fcc: # demodulate PCAL channel at optical gain and f_cc line frequency - pcal_at_opt_gain_freq_nocorr = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, pcaltee), opt_gain_fcc_line_freq, td, compute_calib_factors_caps, integration_samples) + pcal_at_opt_gain_freq_nocorr = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, pcaltee), opt_gain_fcc_line_freq, td, compute_calib_factors_caps, integration_samples, demodulation_filter_latency) # apply the PCAL correction factor at optical gain and f_cc line frequency pcal_at_opt_gain_freq = calibration_parts.complex_audioamplify(pipeline, pcal_at_opt_gain_freq_nocorr, pcal_corr_at_opt_gain_fcc_freq_real, pcal_corr_at_opt_gain_fcc_freq_imag) # demodulate DARM_ERR at optical gain and f_cc line frequency - derr_at_opt_gain_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, derrtee), opt_gain_fcc_line_freq, td, compute_calib_factors_caps, integration_samples) + derr_at_opt_gain_freq = calibration_parts.demodulate(pipeline, calibration_parts.mkqueue(pipeline, derrtee), opt_gain_fcc_line_freq, td, compute_calib_factors_caps, integration_samples, demodulation_filter_latency) if options.dewhitening: # dewhiten DARM_ERR at optical gain and f_cc line frequency derr_at_opt_gain_freq = calibration_parts.complex_audioamplify(pipeline, derr_at_opt_gain_freq, derr_dewhiten_at_opt_gain_fcc_freq_real, derr_dewhiten_at_opt_gain_fcc_freq_imag) diff --git a/gstlal-calibration/python/calibration_parts.py b/gstlal-calibration/python/calibration_parts.py index dd2c1302baff462549b3eeb357718d6e15b0567e..dee7ce6ad0b154b61d45f92b1c40fbb5d49a7d4c 100644 --- a/gstlal-calibration/python/calibration_parts.py +++ b/gstlal-calibration/python/calibration_parts.py @@ -260,17 +260,17 @@ def split_into_real(pipeline, complex_chan): pipeparts.src_deferred_link(elem, "src_1", imag.get_static_pad("sink")) return real, imag -def demodulate(pipeline, head, freq, td, caps, integration_samples): +def demodulate(pipeline, head, freq, td, caps, integration_samples, latency): # demodulate input at a given frequency freq head = pipeparts.mkgeneric(pipeline, head, "lal_demodulate", line_frequency = freq) headR, headI = split_into_real(pipeline, head) headR = pipeparts.mkresample(pipeline, headR) headR = pipeparts.mkcapsfilter(pipeline, headR, caps) - headR = pipeparts.mkfirbank(pipeline, headR, fir_matrix=[numpy.hanning(integration_samples + 1)], time_domain = td) + headR = pipeparts.mkfirbank(pipeline, headR, fir_matrix=[numpy.hanning(integration_samples + 1)], time_domain = td, latency = latency) headI = pipeparts.mkresample(pipeline, headI) headI = pipeparts.mkcapsfilter(pipeline, headI, caps) - headI = pipeparts.mkfirbank(pipeline, headI, fir_matrix=[numpy.hanning(integration_samples + 1)], time_domain = td) + headI = pipeparts.mkfirbank(pipeline, headI, fir_matrix=[numpy.hanning(integration_samples + 1)], time_domain = td, latency = latency) head = merge_into_complex(pipeline, headR, headI) # headR, headI = split_into_real(pipeline, headtee)