Loading [MathJax]/extensions/TeX/AMSsymbols.js
LALSimulation 6.2.0.1-b246709
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
pyseobnr_model.py
Go to the documentation of this file.
1try:
2 import pyseobnr.generate_waveform as pyseob_wf
3except ImportError:
4 print("The pyseobnr package has failed to load, you will not be able to employ SEOBNRv5 approximants.")
5
6from numpy import arange
7from astropy.units import Mpc
8from gwpy.timeseries import TimeSeries
9from gwpy.frequencyseries import FrequencySeries
10from lal import LIGOTimeGPS
11
12from ..core.waveform import CompactBinaryCoalescenceGenerator
13
14
16
17 """
18 Implements a wrapper for SEOBNRv5EHM in the pyseob package
19
20 Parameters
21 ----------
22
23 No parameters required for initialization.
25 """
26
27 # _domain = 'time'
28 def __init__(self, **kwargs):
29
30 super().__init__()
31
32 self.seobnr = pyseob_wf
33 self._domain = "time"
35 self._generation_domain = None
36
37 @property
38 def metadata(self):
39 metadata = {
40 "type": "aligned_spin",
41 "f_ref_spin": True,
42 "modes": True,
43 "polarizations": True,
44 "implemented_domain": "time",
45 "approximant": "SEOBNRv5EHM",
46 "implementation": "",
47 "conditioning_routines": "",
48 }
49 return metadata
50
51 def _strip_units(self, waveform_dict):
52 new_dc = {}
53 for key in waveform_dict.keys():
54 new_dc[key] = waveform_dict[key].value
55 return new_dc
56
57 def _generate_waveform_class(self, **parameters):
58
59 parameters_extra = {}
60
61 # Get the optional parameters for this approximant, if any
62 optional_params = [
63 "ModeArray",
64 "condition",
65 "lmax_nyquist",
66 "lmax",
67 "secular_bwd_int",
68 "warning_secular_bwd_int",
69 "t_backwards",
70 "warning_bwd_int",
71 ]
72
73 for key in optional_params:
74 val = parameters.pop(key, None)
75 if val is not None:
76 parameters_extra[key] = val
77
78 # indicates we are running pyseobnr through GWSignal. Emits proper
79 # warnings on non-reviewed model calls.
80 parameters_extra["gwsignal_environment"] = True
81
82 self.parameter_check(units_sys="Cosmo", **parameters)
83 self.waveform_dictwaveform_dict["distance"] = self.waveform_dictwaveform_dict["distance"].to(Mpc)
85 self.waveform_dictwaveform_dict["approximant"] = self.metadatametadata["approximant"]
86 self.waveform_dictwaveform_dict["f_ref"] = self.waveform_dictwaveform_dict["f22_ref"]
87 self.waveform_dictwaveform_dict["rel_anomaly"] = self.waveform_dictwaveform_dict["meanPerAno"]
88
89 # Make sure to update the waveform dictionary with extra parameters
90 self.waveform_dictwaveform_dict.update(**parameters_extra)
91
92 #print(f"waveform_dict = {self.waveform_dict}")
93 return self.seobnr.GenerateWaveform(self.waveform_dictwaveform_dict)
94
95 def _generate_modes(self, **parameters):
96
97 gen_wf = self._generate_waveform_class(**parameters)
98 times, hlm = gen_wf.generate_td_modes()
99 epoch = LIGOTimeGPS(times[0])
100 dt = self.waveform_dictwaveform_dict["deltaT"]
101
102 hlm_dict = {}
103 for k, v in hlm.items():
104 hlm_lal = TimeSeries(v, times=times, name=k)
105 hlm_dict[k] = hlm_lal
106
107 return hlm_dict
108
109 def _generate_td_polarizations(self, **parameters):
110
111 gen_wf = self._generate_waveform_class(**parameters)
112 if self.waveform_dictwaveform_dict.get("condition"):
113 hp, hc = gen_wf.generate_td_polarizations_conditioned_1()
114 else:
115 hp, hc = gen_wf.generate_td_polarizations()
116 epoch = hp.epoch.gpsSeconds + hp.epoch.gpsNanoSeconds / 1e9
117 times = hp.deltaT * arange(hp.data.length) + epoch
118 return (
119 TimeSeries(hp.data.data, times=times, name="hp"),
120 TimeSeries(hc.data.data, times=times, name="hc"),
121 )
122
123 def _generate_fd_polarizations_from_td(self, **parameters):
124
125 gen_wf = self._generate_waveform_class(**parameters)
126 hptilde, hctilde = gen_wf.generate_fd_polarizations()
127 frequencies = hptilde.deltaF * arange(hptilde.data.length)
128 epoch = hptilde.epoch.gpsSeconds + hptilde.epoch.gpsNanoSeconds / 1e9
129 return (
130 FrequencySeries(
131 hptilde.data.data, frequencies=frequencies, epoch=epoch, name="hp"
132 ),
133 FrequencySeries(
134 hctilde.data.data, frequencies=frequencies, epoch=epoch, name="hc"
135 ),
136 )
137
138 def _generate_polarizations(self, **parameters):
139
140 if self._generation_domain == "time":
141 return self._generate_td_polarizations(**parameters)
142 elif self._generation_domain == "freq":
143 return self._generate_fd_polarizations_from_td(**parameters)
144 else:
145 raise ValueError("Generation domain must be 'time' or 'freq'.")
146
147 def generate_fd_waveform(self, **parameters):
148 return self._generate_fd_polarizations_from_td(**parameters)
149
150 def generate_td_waveform(self, **parameters):
151 return self._generate_td_polarizations(**parameters)
152
153 def generate_td_modes(self, **parameters):
154 return self._generate_modes(**parameters)
155
156
158
159 """
160 Implements a wrapper for SEOBNRv5 in the pyseob package
161
162 Parameters
163 ----------
164
165 No parameters required for initialization.
167 """
168
169 # _domain = 'time'
170 def __init__(self, **kwargs):
171
172 # super().__init__()
173
174 self.seobnr = pyseob_wf
175 self._domain = "time"
177 self._generation_domain = None
178
179 @property
180 def metadata(self):
181 metadata = {
182 "type": "aligned_spin",
183 "f_ref_spin": True,
184 "modes": True,
185 "polarizations": True,
186 "implemented_domain": "time",
187 "approximant": "SEOBNRv5HM",
188 "implementation": "",
189 "conditioning_routines": "",
190 }
191 return metadata
192
193 def _strip_units(self, waveform_dict):
194 new_dc = {}
195 for key in waveform_dict.keys():
196 new_dc[key] = waveform_dict[key].value
197 return new_dc
198
199 def _generate_waveform_class(self, **parameters):
200
201 parameters_extra = {}
202
203 # Get the optional parameters for this approximant, if any
204 optional_params = [
205 "ModeArray",
206 "postadiabatic",
207 "postadiabatic_type",
208 "condition",
209 "lmax_nyquist",
210 "lmax",
211 "dA_dict",
212 "dw_dict",
213 "dTpeak",
214 "domega_dict",
215 "dtau_dict",
216 "da6",
217 "ddSO",
218 "tol_PA",
219 "rtol_ode",
220 "atol_ode",
221 "deltaT_sampling",
222 ]
223 for key in optional_params:
224 val = parameters.pop(key, None)
225 if val is not None:
226 parameters_extra[key] = val
227
228 # indicates we are running pyseobnr through GWSignal. Emits proper
229 # warnings on non-reviewed model calls.
230 parameters_extra["gwsignal_environment"] = True
231
232 self.parameter_check(units_sys="Cosmo", **parameters)
233 self.waveform_dictwaveform_dict["distance"] = self.waveform_dictwaveform_dict["distance"].to(Mpc)
235 self.waveform_dictwaveform_dict["approximant"] = self.metadatametadata["approximant"]
236 self.waveform_dictwaveform_dict["f_ref"] = self.waveform_dictwaveform_dict["f22_ref"]
237
238 # Make sure to update the waveform dictionary with extra parameters
239 self.waveform_dictwaveform_dict.update(**parameters_extra)
240
241 return self.seobnr.GenerateWaveform(self.waveform_dictwaveform_dict)
242
243 def _generate_modes(self, **parameters):
244
245 gen_wf = self._generate_waveform_class(**parameters)
246 times, hlm = gen_wf.generate_td_modes()
247 epoch = LIGOTimeGPS(times[0])
248 dt = self.waveform_dictwaveform_dict["deltaT"]
249
250 hlm_dict = {}
251 for k, v in hlm.items():
252 hlm_lal = TimeSeries(v, times=times, name=k)
253 hlm_dict[k] = hlm_lal
254
255 return hlm_dict
256
257 def _generate_td_polarizations(self, **parameters):
258
259 gen_wf = self._generate_waveform_class(**parameters)
260 if self.waveform_dictwaveform_dict.get("condition"):
261 hp, hc = gen_wf.generate_td_polarizations_conditioned_2()
262 else:
263 hp, hc = gen_wf.generate_td_polarizations()
264 epoch = hp.epoch.gpsSeconds + hp.epoch.gpsNanoSeconds / 1e9
265 times = hp.deltaT * arange(hp.data.length) + epoch
266 return (
267 TimeSeries(hp.data.data, times=times, name="hp"),
268 TimeSeries(hc.data.data, times=times, name="hc"),
269 )
270
271 def _generate_fd_polarizations_from_td(self, **parameters):
272
273 gen_wf = self._generate_waveform_class(**parameters)
274 hptilde, hctilde = gen_wf.generate_fd_polarizations()
275 frequencies = hptilde.deltaF * arange(hptilde.data.length)
276 epoch = hptilde.epoch.gpsSeconds + hptilde.epoch.gpsNanoSeconds / 1e9
277 return (
278 FrequencySeries(
279 hptilde.data.data, frequencies=frequencies, epoch=epoch, name="hp"
280 ),
281 FrequencySeries(
282 hctilde.data.data, frequencies=frequencies, epoch=epoch, name="hc"
283 ),
284 )
285
286 def _generate_polarizations(self, **parameters):
287
288 if self._generation_domain == "time":
289 return self._generate_td_polarizations(**parameters)
290 elif self._generation_domain == "freq":
291 return self._generate_fd_polarizations_from_td(**parameters)
292 else:
293 raise ValueError("Generation domain must be 'time' or 'freq'.")
294
295 def generate_fd_waveform(self, **parameters):
296 return self._generate_fd_polarizations_from_td(**parameters)
297
298 def generate_td_waveform(self, **parameters):
299 return self._generate_td_polarizations(**parameters)
300
301 def generate_td_modes(self, **parameters):
302 return self._generate_modes(**parameters)
303
304
306
307 """
308 Implements a wrapper for SEOBNRv5 in the pyseob package
309
310 Parameters
311 ----------
312
313 No parameters required for initialization.
315 """
316
317 # _domain = 'time'
318 def __init__(self, **kwargs):
319
320 # super().__init__()
321
322 self.seobnr = pyseob_wf
323 self._domain = "time"
325 self._generation_domain = None
326
327 @property
328 def metadata(self):
329 metadata = {
330 "type": "precessing_spin",
331 "f_ref_spin": True,
332 "modes": True,
333 "polarizations": True,
334 "implemented_domain": "time",
335 "approximant": "SEOBNRv5PHM",
336 "implementation": "",
337 "conditioning_routines": "",
338 }
339 return metadata
340
341 def _strip_units(self, waveform_dict):
342 new_dc = {}
343 for key in waveform_dict.keys():
344 new_dc[key] = waveform_dict[key].value
345 return new_dc
346
347 def _generate_waveform_class(self, **parameters):
348
349 parameters_extra = {}
350
351 # Get the optional parameters for this approximant, if any
352 optional_params = [
353 "ModeArray",
354 "polarizations_from_coprec",
355 "postadiabatic",
356 "postadiabatic_type",
357 "condition",
358 "lmax_nyquist",
359 "lmax",
360 "dA_dict",
361 "dw_dict",
362 "dTpeak",
363 "domega_dict",
364 "dtau_dict",
365 "da6",
366 "ddSO",
367 "deltaT_sampling",
368 "omega_prec_deviation",
369 "enable_antisymmetric_modes",
370 "antisymmetric_modes_hm",
371 "antisymmetric_modes",
372 ]
373 for key in optional_params:
374 val = parameters.pop(key, None)
375 if val is not None:
376 parameters_extra[key] = val
377
378 # indicates we are running pyseobnr through GWSignal. Emits proper
379 # warnings on non-reviewed model calls.
380 parameters_extra["gwsignal_environment"] = True
381
382 self.parameter_check(units_sys="Cosmo", **parameters)
383 self.waveform_dictwaveform_dict["distance"] = self.waveform_dictwaveform_dict["distance"].to(Mpc)
385 self.waveform_dictwaveform_dict["approximant"] = self.metadatametadata["approximant"]
386 self.waveform_dictwaveform_dict["f_ref"] = self.waveform_dictwaveform_dict["f22_ref"]
387
388 # Make sure to update the waveform dictionary with extra parameters
389 self.waveform_dictwaveform_dict.update(**parameters_extra)
390
391 return self.seobnr.GenerateWaveform(self.waveform_dictwaveform_dict)
392
393 def _generate_modes(self, **parameters):
394
395 gen_wf = self._generate_waveform_class(**parameters)
396 times, hlm = gen_wf.generate_td_modes()
397 epoch = LIGOTimeGPS(times[0])
398 dt = self.waveform_dictwaveform_dict["deltaT"]
399
400 hlm_dict = {}
401 for k, v in hlm.items():
402 hlm_lal = TimeSeries(v, times=times, name=k)
403 hlm_dict[k] = hlm_lal
404
405 return hlm_dict
406
407 def _generate_td_polarizations(self, **parameters):
408
409 gen_wf = self._generate_waveform_class(**parameters)
410 if self.waveform_dictwaveform_dict.get("condition"):
411 hp, hc = gen_wf.generate_td_polarizations_conditioned_2()
412 else:
413 hp, hc = gen_wf.generate_td_polarizations()
414 epoch = hp.epoch.gpsSeconds + hp.epoch.gpsNanoSeconds / 1e9
415 times = hp.deltaT * arange(hp.data.length) + epoch
416 return (
417 TimeSeries(hp.data.data, times=times, name="hp"),
418 TimeSeries(hc.data.data, times=times, name="hc"),
419 )
420
421 def _generate_fd_polarizations_from_td(self, **parameters):
422
423 gen_wf = self._generate_waveform_class(**parameters)
424 hptilde, hctilde = gen_wf.generate_fd_polarizations()
425 frequencies = hptilde.deltaF * arange(hptilde.data.length)
426 epoch = hptilde.epoch.gpsSeconds + hptilde.epoch.gpsNanoSeconds / 1e9
427 return (
428 FrequencySeries(
429 hptilde.data.data, frequencies=frequencies, epoch=epoch, name="hp"
430 ),
431 FrequencySeries(
432 hctilde.data.data, frequencies=frequencies, epoch=epoch, name="hc"
433 ),
434 )
435
436 def _generate_polarizations(self, **parameters):
437
438 if self._generation_domain == "time":
439 return self._generate_td_polarizations(**parameters)
440 elif self._generation_domain == "freq":
441 return self._generate_fd_polarizations_from_td(**parameters)
442 else:
443 raise ValueError("Generation domain must be 'time' or 'freq'.")
444
445 def generate_fd_waveform(self, **parameters):
446 return self._generate_fd_polarizations_from_td(**parameters)
447
448 def generate_td_waveform(self, **parameters):
449 return self._generate_td_polarizations(**parameters)
450
451 def generate_td_modes(self, **parameters):
452 return self._generate_modes(**parameters)
This is the parent generator class for compact binary coalescence waveforms (BBH, BNS,...
Definition: waveform.py:143
def parameter_check(self, units_sys='S.I.', extra_parameters=dict(), **parameters)
Perform checks on the various parameters and populate the different parameters not passed in the kwar...
Definition: waveform.py:173
Implements a wrapper for SEOBNRv5EHM in the pyseob package.
def generate_td_modes(self, **parameters)
Generate time domain modes given kwargs.
def generate_fd_waveform(self, **parameters)
Generate frequency domain polarizations given kwargs.
def __init__(self, **kwargs)
Initialize class.
def generate_td_waveform(self, **parameters)
Generate time domain polarizations given kwargs.
Implements a wrapper for SEOBNRv5 in the pyseob package.
def generate_td_waveform(self, **parameters)
Generate time domain polarizations given kwargs.
def generate_fd_waveform(self, **parameters)
Generate frequency domain polarizations given kwargs.
def generate_td_modes(self, **parameters)
Generate time domain modes given kwargs.
def __init__(self, **kwargs)
Initialize class.
Implements a wrapper for SEOBNRv5 in the pyseob package.
def generate_fd_waveform(self, **parameters)
Generate frequency domain polarizations given kwargs.
def generate_td_modes(self, **parameters)
Generate time domain modes given kwargs.
def generate_td_waveform(self, **parameters)
Generate time domain polarizations given kwargs.