From 0f8a09c2956ddd26fad66b772d43e836339af33b Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Wed, 20 Feb 2019 11:56:18 +1100
Subject: [PATCH] use different methods for time and frequency domain

---
 bilby/gw/source.py | 40 +++++++++++++++++++---------------------
 bilby/gw/utils.py  | 29 +++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 21 deletions(-)

diff --git a/bilby/gw/source.py b/bilby/gw/source.py
index bd4c75921..6d4071776 100644
--- a/bilby/gw/source.py
+++ b/bilby/gw/source.py
@@ -3,12 +3,13 @@ from __future__ import division, print_function
 import numpy as np
 
 from ..core import utils
-from ..core.utils import logger
-from .utils import (lalsim_SimInspiralTransformPrecessingNewInitialConditions,
-                    lalsim_GetApproximantFromString,
+from ..core.utils import logger, spherical_to_cartesian
+from .utils import (lalsim_GetApproximantFromString,
                     lalsim_SimInspiralFD,
+                    lalsim_SimInspiralChooseFDWaveform,
                     lalsim_SimInspiralWaveformParamsInsertTidalLambda1,
                     lalsim_SimInspiralWaveformParamsInsertTidalLambda2)
+from .conversion import transform_precessing_spins
 
 try:
     import lal
@@ -60,7 +61,7 @@ def lal_binary_black_hole(
         waveform_approximant='IMRPhenomPv2', reference_frequency=50.0,
         minimum_frequency=20.0, maximum_frequency=frequency_array[-1])
     waveform_kwargs.update(kwargs)
-    return _base_lal_cbc_waveform(
+    return _base_lal_cbc_fd_waveform(
         frequency_array=frequency_array, mass_1=mass_1, mass_2=mass_2,
         luminosity_distance=luminosity_distance, iota=iota, phase=phase,
         a_1=a_1, a_2=a_2, tilt_1=tilt_1, tilt_2=tilt_2, phi_12=phi_12,
@@ -120,7 +121,7 @@ def lal_binary_neutron_star(
     phi_12 = 0.0
     phi_jl = 0.0
     waveform_kwargs.update(kwargs)
-    return _base_lal_cbc_waveform(
+    return _base_lal_cbc_fd_waveform(
         frequency_array=frequency_array, mass_1=mass_1, mass_2=mass_2,
         luminosity_distance=luminosity_distance, iota=iota, phase=phase,
         a_1=a_1, a_2=a_2, tilt_1=tilt_1, tilt_2=tilt_2, phi_12=phi_12,
@@ -160,13 +161,13 @@ def lal_eccentric_binary_black_hole_no_spins(
         waveform_approximant='EccentricFD', reference_frequency=10.0,
         minimum_frequency=10.0, maximum_frequency=frequency_array[-1])
     waveform_kwargs.update(kwargs)
-    return _base_lal_cbc_waveform(
+    return _base_lal_cbc_fd_waveform(
         frequency_array=frequency_array, mass_1=mass_1, mass_2=mass_2,
         luminosity_distance=luminosity_distance, iota=iota, phase=phase,
         eccentricity=eccentricity, **waveform_kwargs)
 
 
-def _base_lal_cbc_waveform(
+def _base_lal_cbc_fd_waveform(
         frequency_array, mass_1, mass_2, luminosity_distance, iota, phase,
         a_1=0.0, a_2=0.0, tilt_1=0.0, tilt_2=0.0, phi_12=0.0, phi_jl=0.0,
         lambda_1=0.0, lambda_2=0.0, eccentricity=0.0, **waveform_kwargs):
@@ -229,15 +230,11 @@ def _base_lal_cbc_waveform(
     mass_2 = mass_2 * utils.solar_mass
 
     if tilt_1 == 0 and tilt_2 == 0:
-        spin_1x = 0
-        spin_1y = 0
-        spin_1z = a_1
-        spin_2x = 0
-        spin_2y = 0
-        spin_2z = a_2
+        spin_1x, spin_1y, spin_1z = spherical_to_cartesian(a_1, 0.0, 0.0)
+        spin_2x, spin_2y, spin_2z = spherical_to_cartesian(a_2, 0.0, 0.0)
     else:
         iota, spin_1x, spin_1y, spin_1z, spin_2x, spin_2y, spin_2z = (
-            lalsim_SimInspiralTransformPrecessingNewInitialConditions(
+            transform_precessing_spins(
                 iota, phi_jl, tilt_1, tilt_2, phi_12, a_1, a_2, mass_1,
                 mass_2, reference_frequency, phase))
 
@@ -250,18 +247,19 @@ def _base_lal_cbc_waveform(
 
     approximant = lalsim_GetApproximantFromString(waveform_approximant)
 
-    hplus, hcross = lalsim_SimInspiralFD(
+    if lalsim.SimInspiralImplementedFDApproximants(approximant):
+        wf_func = lalsim_SimInspiralChooseFDWaveform
+    else:
+        wf_func = lalsim_SimInspiralFD
+    hplus, hcross = wf_func(
         mass_1, mass_2, spin_1x, spin_1y, spin_1z, spin_2x, spin_2y,
         spin_2z, luminosity_distance, iota, phase,
         longitude_ascending_nodes, eccentricity, mean_per_ano, delta_frequency,
         minimum_frequency, maximum_frequency, reference_frequency,
         waveform_dictionary, approximant)
 
-    h_plus = hplus.data.data
-    h_cross = hcross.data.data
-
-    h_plus = h_plus[:len(frequency_array)] * frequency_bounds
-    h_cross = h_cross[:len(frequency_array)] * frequency_bounds
+    h_plus = hplus.data.data[:len(frequency_array)] * frequency_bounds
+    h_cross = hcross.data.data[:len(frequency_array)] * frequency_bounds
 
     return {'plus': h_plus, 'cross': h_cross}
 
@@ -399,7 +397,7 @@ def roq(frequency_array, mass_1, mass_2, luminosity_distance, a_1, tilt_1,
         spin_2z = a_2
     else:
         iota, spin_1x, spin_1y, spin_1z, spin_2x, spin_2y, spin_2z = \
-            lalsim.SimInspiralTransformPrecessingNewInitialConditions(
+            transform_precessing_spins(
                 iota, phi_jl, tilt_1, tilt_2, phi_12, a_1, a_2, mass_1, mass_2,
                 reference_frequency, phase)
 
diff --git a/bilby/gw/utils.py b/bilby/gw/utils.py
index b903117e1..e4c200734 100644
--- a/bilby/gw/utils.py
+++ b/bilby/gw/utils.py
@@ -770,6 +770,35 @@ def lalsim_SimInspiralFD(
         waveform_dictionary, approximant)
 
 
+def lalsim_SimInspiralChooseFDWaveform(
+        mass_1, mass_2, spin_1x, spin_1y, spin_1z, spin_2x, spin_2y,
+        spin_2z, luminosity_distance, iota, phase,
+        longitude_ascending_nodes, eccentricity, mean_per_ano, delta_frequency,
+        minimum_frequency, maximum_frequency, reference_frequency,
+        waveform_dictionary, approximant):
+
+    # Convert values to floats
+    [mass_1, mass_2, spin_1x, spin_1y, spin_1z, spin_2x, spin_2y, spin_2z,
+     luminosity_distance, iota, phase, longitude_ascending_nodes,
+     eccentricity, mean_per_ano, delta_frequency, minimum_frequency,
+     maximum_frequency, reference_frequency] = convert_args_list_to_float(
+        mass_1, mass_2, spin_1x, spin_1y, spin_1z, spin_2x, spin_2y, spin_2z,
+        luminosity_distance, iota, phase, longitude_ascending_nodes,
+        eccentricity, mean_per_ano, delta_frequency, minimum_frequency,
+        maximum_frequency, reference_frequency)
+
+    # Note, this is the approximant number returns by GetApproximantFromString
+    if isinstance(approximant, int) is False:
+        raise ValueError("approximant not an int")
+
+    return lalsim.SimInspiralChooseFDWaveform(
+        mass_1, mass_2, spin_1x, spin_1y, spin_1z, spin_2x, spin_2y,
+        spin_2z, luminosity_distance, iota, phase,
+        longitude_ascending_nodes, eccentricity, mean_per_ano, delta_frequency,
+        minimum_frequency, maximum_frequency, reference_frequency,
+        waveform_dictionary, approximant)
+
+
 def lalsim_SimInspiralWaveformParamsInsertTidalLambda1(
         waveform_dictionary, lambda_1):
     try:
-- 
GitLab