2import lalsimulation
as lalsim
4from astropy
import units
as u
5from .
import waveform
as wave
6from .
import conditioning_subroutines
as cond
15 Function to fix the reference frequency to f22_start or generator specific reference frequency
for conditioning routines.
19 parameter_dict : `dictionary`
20 Dictionary of waveform parameters
21 generator : `GravitationalWaveGenerator`
22 Generator object of the GravitationalWaveGenerator
class
24 if generator.metadata[
'implementation']==
'LALSimulation':
27 cases_by_approximant = {
28 'NRSurr' : parameter_dict[
'f22_start']
30 return cases_by_approximant[generator.metadata[
'approximant']]
36 Function to generate conditioned time-domain waveform from time domain waveform model.
40 parameter_dict : `dictionary`
41 Dictionary of intrinsic / extrinsic gravitational wave parameters
42 generator : `GravitationalWaveGenerator`
43 Generator object of the GravitationalWaveGenerator
class
47 hp, hc : GWpy Time series
48 Conditioned time domain polarizations
51 extra_time_fraction = 0.1
55 f_min = parameter_dict[
'f22_start'].value
56 f_ref = parameter_dict[
'f22_ref'].value
57 s1z = parameter_dict[
'spin1z'].value
58 s2z = parameter_dict[
'spin2z'].value
60 m1 = parameter_dict[
'mass1'].si.value
61 m2 = parameter_dict[
'mass2'].si.value
65 if np.isclose(f_ref, 0):
70 fisco = 1.0 / (np.power(9.0, 1.5) * np.pi * (m1 + m2) * lal.MTSUN_SI / lal.MSUN_SI)
76 tchirp = lalsim.SimInspiralChirpTimeBound(f_min, m1, m2, s1z, s2z)
79 s = lalsim.SimInspiralFinalBlackHoleSpinBound(s1z, s2z)
82 tmerge = lalsim.SimInspiralMergeTimeBound(m1, m2) + lalsim.SimInspiralRingdownTimeBound(m1 + m2, s)
87 textra = extra_cycles / f_min
90 fstart = lalsim.SimInspiralChirpStartFrequencyBound((1.0 + extra_time_fraction) * tchirp + tmerge + textra, m1, m2)
93 new_parameters = parameter_dict.copy()
94 new_parameters[
'f22_ref'] = f_ref*parameter_dict[
'f22_start'].unit
95 new_parameters[
'f22_start'] = fstart*parameter_dict[
'f22_start'].unit
99 new_parameters[
'condition']=0
100 hp, hc = wave.GenerateTDWaveform(new_parameters, generator)
106 hp, hc = cond.time_array_condition_stage1(hp, hc, dt, extra_time_fraction * tchirp + textra, parameter_dict[
'f22_start'].value)
108 fisco = 1.0 / (np.power(6.0, 1.5) * np.pi * (m1 + m2) * lal.MTSUN_SI / lal.MSUN_SI)
109 hp, hc = cond.time_array_condition_stage2(hp, hc, dt, f_min, fisco)
117 Function to generate conditioned time-domain waveform from frequency domain waveform model.
121 parameter_dict : dictionary
122 Dictionary of intrinsic / extrinsic gravitational wave parameters
123 generator : `GravitationalWaveGenerator`
124 Generator object of the GravitationalWaveGenerator
class
128 hp, hc : GWpy Time series
129 Conditioned time domain polarizations
132 extra_time_fraction = 0.1
135 dt = parameter_dict[
'deltaT'].value
136 original_f_min = f_min = parameter_dict[
'f22_start'].value
137 f_ref = parameter_dict[
'f22_ref'].value
139 s1z = parameter_dict[
'spin1z'].value
140 s2z = parameter_dict[
'spin2z'].value
142 m1 = parameter_dict[
'mass1'].si.value
143 m2 = parameter_dict[
'mass2'].si.value
147 if np.isclose(f_ref, 0):
151 fisco = 1.0 / (np.power(9.0, 1.5) * np.pi * (m1 + m2) * lal.MTSUN_SI / lal.MSUN_SI)
156 tchirp = lalsim.SimInspiralChirpTimeBound(f_min, m1, m2, s1z, s2z)
159 s = lalsim.SimInspiralFinalBlackHoleSpinBound(s1z, s2z)
162 tmerge = lalsim.SimInspiralMergeTimeBound(m1, m2) + lalsim.SimInspiralRingdownTimeBound(m1 + m2, s)
167 textra = extra_cycles / f_min
172 new_parameters = parameter_dict.copy()
173 new_parameters[
'f22_start'] = f_min*u.Hz
174 new_parameters[
'f22_ref'] = f_ref*u.Hz
175 new_parameters[
'f_max'] = f_max*u.Hz
176 new_parameters[
'deltaF'] = 0.*u.Hz
179 new_parameters[
'condition']=1
180 hp, hc = wave.GenerateFDWaveform(new_parameters, generator)
191 tshift = np.round(textra / dt) * dt
193 kvals = np.arange(0, len(hp))
194 phase_shift = np.exp(2*np.pi*1j*hp.df.value*tshift*kvals)
198 if hp.epoch==
None or hc.epoch==
None:
206 hpt = hp.ifft()*2*hp.df
207 hct = hc.ifft()*2*hp.df
210 hpt = cond.high_pass_time_series(hpt, dt, original_f_min, 0.99, 8.)
211 hct = cond.high_pass_time_series(hct, dt, original_f_min, 0.99, 8.)
214 fstart = lalsim.SimInspiralChirpStartFrequencyBound((1.0 + extra_time_fraction) * tchirp, m1, m2);
215 tchirp = lalsim.SimInspiralChirpTimeBound(fstart, m1, m2, s1z, s2z);
219 chirplen = round((tchirp + tmerge) /dt)
220 end = len(hpt) - np.round(tshift/dt)
223 hpt = cond.resize_gwpy_timeseries(hpt, end - chirplen, chirplen)
224 hct = cond.resize_gwpy_timeseries(hct, end - chirplen, chirplen)
227 fisco = 1.0 / (np.power(6.0, 1.5) * np.pi * (m1 + m2) * lal.MTSUN_SI / lal.MSUN_SI)
228 hpt, hct = cond.time_array_condition_stage2(hpt, hct, dt, f_min, fisco)
237 Return the next highest power of 2 given number n.
238 For eg: if n = 7; exponent will be 3 (2**3=8)
242 if (nv & (nv-1) == 0)
and n!=0:
244 mant, exponent = math.frexp(n)
250 Function to generate conditioned frequency-domain waveform from frequency domain waveform model.
254 parameter_dict : dictionary
255 Dictionary of intrinsic / extrinsic gravitational wave parameters
256 generator : `GravitationalWaveGenerator`
257 Generator object of the GravitationalWaveGenerator
class
261 hp, hc : GWpy Time series
262 Conditioned frequency domain polarizations
265 extra_time_fraction = 0.1
268 df = parameter_dict[
'deltaF'].value
269 f_min = parameter_dict[
'f22_start'].value
270 f_ref = parameter_dict[
'f22_ref'].value
271 f_max = parameter_dict[
'f_max'].value
272 s1z = parameter_dict[
'spin1z'].value
273 s2z = parameter_dict[
'spin2z'].value
275 m1 = parameter_dict[
'mass1'].si.value
276 m2 = parameter_dict[
'mass2'].si.value
280 if np.isclose(f_ref, 0):
293 n = np.round(f_max/df)
296 f_nyquist = 2**(exponent)*df
297 deltaT = 0.5/f_nyquist
300 fisco = 1.0 / (np.power(9.0, 1.5) * np.pi * (m1 + m2) * lal.MTSUN_SI / lal.MSUN_SI)
305 tchirp = lalsim.SimInspiralChirpTimeBound(f_min, m1, m2, s1z, s2z)
308 s = lalsim.SimInspiralFinalBlackHoleSpinBound(s1z, s2z)
311 tmerge = lalsim.SimInspiralMergeTimeBound(m1, m2) + lalsim.SimInspiralRingdownTimeBound(m1 + m2, s)
315 textra = extra_cycles / f_min
316 fstart = lalsim.SimInspiralChirpStartFrequencyBound((1.0 + extra_time_fraction) * tchirp, m1, m2)
319 tchirp = lalsim.SimInspiralChirpTimeBound(fstart, m1, m2, s1z, s2z)
322 chirplen = round((tchirp + tmerge + 2.0 * textra) / deltaT);
324 chirplen = 2**exponent
327 df = 1./(chirplen*deltaT)
328 elif df>1./(chirplen*deltaT):
329 warnings.warn(
"Specified frequency interval of %.2f Hz is too large for a chirp of duration %.2f s"%(df, chirplen*deltaT))
332 new_parameters = parameter_dict.copy()
333 new_parameters[
'f22_ref'] = f_ref*u.Hz
334 new_parameters[
'f22_start'] = fstart*u.Hz
335 new_parameters[
'deltaF'] = df*u.Hz
338 new_parameters[
'condition']=0
339 hp, hc = wave.GenerateFDWaveform(new_parameters, generator)
343 k0 = int(np.round(fstart/df))
344 k1 = int(np.round(f_min/df))
351 kvals = np.arange(k0, k1)
352 w = 0.5 - 0.5*np.cos(np.pi*(kvals-k0)/(k1-k0))
353 hp[k0:k1] = w*hp[k0:k1]
354 hc[k0:k1] = w*hc[k0:k1]
361 tshift = np.round(tmerge / deltaT) * deltaT
362 kvals = np.arange(0, len(hp))
363 phase_shift = np.exp(1j*2*np.pi*df*tshift*kvals)
369 hp.epoch = tshift*u.s
370 hc.epoch = tshift*u.s
378 Function to generate conditioned frequency-domain waveform from time domain waveform model.
382 parameter_dict : dictionary
383 Dictionary of intrinsic / extrinsic gravitational wave parameters
384 generator : `GravitationalWaveGenerator`
385 Generator object of the GravitationalWaveGenerator
class
389 hp, hc : GWpy Time series
390 Conditioned frequency domain polarizations
393 extra_time_fraction = 0.1
396 df = parameter_dict[
'deltaF'].value
397 f_min = parameter_dict[
'f22_start'].value
398 f_ref = parameter_dict[
'f22_ref'].value
399 f_max = parameter_dict[
'f_max'].value
401 s1z = parameter_dict[
'spin1z'].value
402 s2z = parameter_dict[
'spin2z'].value
404 m1 = parameter_dict[
'mass1'].si.value
405 m2 = parameter_dict[
'mass2'].si.value
409 if np.isclose(f_ref, 0):
421 n = np.round(f_max/df)
424 f_nyquist = 2**(exponent)*df
426 deltaT = 0.5/f_nyquist
429 new_parameters = parameter_dict.copy()
430 new_parameters[
'f22_ref'] = f_ref*u.Hz
431 new_parameters[
'deltaT'] = deltaT*u.s
434 new_parameters[
'condition']=1
435 hp, hc = wave.GenerateTDWaveform(new_parameters, generator)
440 chirplen = 2**(chirplen_exp)
441 df = 1./(chirplen*hp.dt)
443 chirplen=2*f_nyquist/df
446 hp = cond.resize_gwpy_timeseries(hp, len(hp)-chirplen,chirplen)
447 hc = cond.resize_gwpy_timeseries(hc,len(hc)-chirplen,chirplen)