예제 #1
0
    def test_run_computefstatistic_allowedMismatchFromSFTLength(self):

        long_Tsft_params = default_Writer_params.copy()
        long_Tsft_params["Tsft"] = 3600
        long_Tsft_params["duration"] = 4 * long_Tsft_params["Tsft"]
        long_Tsft_params["label"] = "long_Tsft"
        long_Tsft_params["F0"] = 1500
        long_Tsft_params["Band"] = 2.0
        long_Tsft_Writer = pyfstat.Writer(**long_Tsft_params)
        long_Tsft_Writer.run_makefakedata()

        search = pyfstat.ComputeFstat(
            tref=long_Tsft_Writer.tref,
            sftfilepattern=long_Tsft_Writer.sftfilepath,
            minCoverFreq=1499.5,
            maxCoverFreq=1500.5,
            allowedMismatchFromSFTLength=0.1,
        )
        with pytest.raises(RuntimeError):
            search.get_fullycoherent_twoF(F0=1500,
                                          F1=0,
                                          F2=0,
                                          Alpha=0,
                                          Delta=0)

        search = pyfstat.ComputeFstat(
            tref=long_Tsft_Writer.tref,
            sftfilepattern=long_Tsft_Writer.sftfilepath,
            minCoverFreq=1499.5,
            maxCoverFreq=1500.5,
            allowedMismatchFromSFTLength=0.5,
        )
        search.get_fullycoherent_twoF(F0=1500, F1=0, F2=0, Alpha=0, Delta=0)
예제 #2
0
    def test_injectSources(self):
        # This seems to be writing with a signal...
        Writer = pyfstat.Writer(
            self.label,
            outdir=self.outdir,
            add_noise=False,
            duration=86400,
            h0=1,
            sqrtSX=1,
        )
        Writer.make_cff()
        injectSources = Writer.config_file_name

        search = pyfstat.ComputeFstat(
            tref=Writer.tref,
            assumeSqrtSX=1,
            injectSources=injectSources,
            minCoverFreq=28,
            maxCoverFreq=32,
            minStartTime=Writer.tstart,
            maxStartTime=Writer.tstart + Writer.duration,
            detectors=Writer.detectors,
        )
        FS_from_file = search.get_fullycoherent_twoF(
            Writer.tstart,
            Writer.tend,
            Writer.F0,
            Writer.F1,
            Writer.F2,
            Writer.Alpha,
            Writer.Delta,
        )
        Writer.make_data()
        predicted_FS = Writer.predict_fstat()
        self.assertTrue(np.abs(predicted_FS - FS_from_file) / FS_from_file < 0.3)

        injectSourcesdict = pyfstat.core.read_par(Writer.config_file_name)
        injectSourcesdict["F0"] = injectSourcesdict["Freq"]
        injectSourcesdict["F1"] = injectSourcesdict["f1dot"]
        injectSourcesdict["F2"] = injectSourcesdict["f2dot"]
        search = pyfstat.ComputeFstat(
            tref=Writer.tref,
            assumeSqrtSX=1,
            injectSources=injectSourcesdict,
            minCoverFreq=28,
            maxCoverFreq=32,
            minStartTime=Writer.tstart,
            maxStartTime=Writer.tstart + Writer.duration,
            detectors=Writer.detectors,
        )
        FS_from_dict = search.get_fullycoherent_twoF(
            Writer.tstart,
            Writer.tend,
            Writer.F0,
            Writer.F1,
            Writer.F2,
            Writer.Alpha,
            Writer.Delta,
        )
        self.assertTrue(FS_from_dict == FS_from_file)
예제 #3
0
    def test_run_computefstatistic_single_point_injectSources(self):

        predicted_FS = self.Writer.predict_fstat()

        injectSources = self.Writer.config_file_name
        search = pyfstat.ComputeFstat(
            tref=self.Writer.tref,
            assumeSqrtSX=1,
            injectSources=injectSources,
            minCoverFreq=28,
            maxCoverFreq=32,
            minStartTime=self.Writer.tstart,
            maxStartTime=self.Writer.tend,
            detectors=self.Writer.detectors,
        )
        FS_from_file = search.get_fullycoherent_twoF(
            F0=self.Writer.F0,
            F1=self.Writer.F1,
            F2=self.Writer.F2,
            Alpha=self.Writer.Alpha,
            Delta=self.Writer.Delta,
        )
        self.assertTrue(
            np.abs(predicted_FS - FS_from_file) / FS_from_file < 0.3)

        injectSourcesdict = search.read_par(filename=injectSources)
        injectSourcesdict["F0"] = injectSourcesdict.pop("Freq")
        injectSourcesdict["F1"] = injectSourcesdict.pop("f1dot")
        injectSourcesdict["F2"] = injectSourcesdict.pop("f2dot")
        injectSourcesdict["phi"] = injectSourcesdict.pop("phi0")
        search = pyfstat.ComputeFstat(
            tref=self.Writer.tref,
            assumeSqrtSX=1,
            injectSources=injectSourcesdict,
            minCoverFreq=28,
            maxCoverFreq=32,
            minStartTime=self.Writer.tstart,
            maxStartTime=self.Writer.tend,
            detectors=self.Writer.detectors,
        )
        FS_from_dict = search.get_fullycoherent_twoF(
            F0=self.Writer.F0,
            F1=self.Writer.F1,
            F2=self.Writer.F2,
            Alpha=self.Writer.Alpha,
            Delta=self.Writer.Delta,
        )
        self.assertTrue(FS_from_dict == FS_from_file)
예제 #4
0
    def test_run_computefstatistic_single_point_no_noise_manual_ephem(self):

        predicted_FS = self.Writer.predict_fstat(assumeSqrtSX=1)

        # let's get the default ephemeris files (to be sure their paths exist)
        # and then pretend we pass them manually, to test those class options
        (
            earth_ephem_default,
            sun_ephem_default,
        ) = pyfstat.helper_functions.get_ephemeris_files()

        search = pyfstat.ComputeFstat(
            tref=self.Writer.tref,
            assumeSqrtSX=1,
            sftfilepattern=self.Writer.sftfilepath,
            earth_ephem=earth_ephem_default,
            sun_ephem=sun_ephem_default,
            search_ranges=self.search_ranges,
        )
        FS = search.get_fullycoherent_twoF(
            F0=self.Writer.F0,
            F1=self.Writer.F1,
            F2=self.Writer.F2,
            Alpha=self.Writer.Alpha,
            Delta=self.Writer.Delta,
        )
        self.assertTrue(np.abs(predicted_FS - FS) / FS < 0.3)
예제 #5
0
    def run_computefstatistic_single_point_no_noise(self):
        Writer = pyfstat.Writer(
            self.label,
            outdir=self.outdir,
            add_noise=False,
            duration=86400,
            h0=1,
            sqrtSX=1,
        )
        Writer.make_data()
        predicted_FS = Writer.predict_fstat()

        search = pyfstat.ComputeFstat(
            tref=Writer.tref,
            assumeSqrtSX=1,
            sftfilepattern="{}/*{}*sft".format(Writer.outdir, Writer.label),
        )
        FS = search.get_fullycoherent_twoF(
            Writer.tstart,
            Writer.tend,
            Writer.F0,
            Writer.F1,
            Writer.F2,
            Writer.Alpha,
            Writer.Delta,
        )
        self.assertTrue(np.abs(predicted_FS - FS) / FS < 0.3)
예제 #6
0
    def test_run_computefstatistic_single_point_with_SFTs(self):

        twoF_predicted = self.Writer.predict_fstat()

        search = pyfstat.ComputeFstat(
            tref=self.Writer.tref,
            sftfilepattern=self.Writer.sftfilepath,
            search_ranges=self.search_ranges,
        )
        twoF = search.get_fullycoherent_twoF(
            F0=self.Writer.F0,
            F1=self.Writer.F1,
            F2=self.Writer.F2,
            Alpha=self.Writer.Alpha,
            Delta=self.Writer.Delta,
        )
        diff = np.abs(twoF - twoF_predicted) / twoF_predicted
        print(("Predicted twoF is {}"
               " while recovered value is {},"
               " relative difference: {}".format(twoF_predicted, twoF, diff)))
        self.assertTrue(diff < 0.3)

        # the following seems to be a leftover from when this test case was
        # doing separate H1 vs H1,L1 searches, but now only really tests the
        # SSBprec. But well, it still does add a tiny bit of coverage, can still
        # be replaced by something more systematic later.
        search = pyfstat.ComputeFstat(
            tref=self.Writer.tref,
            detectors=self.Writer.detectors,
            sftfilepattern=self.Writer.sftfilepath,
            SSBprec=lalpulsar.SSBPREC_RELATIVISTIC,
            search_ranges=self.search_ranges,
        )
        twoF2 = search.get_fullycoherent_twoF(
            F0=self.Writer.F0,
            F1=self.Writer.F1,
            F2=self.Writer.F2,
            Alpha=self.Writer.Alpha,
            Delta=self.Writer.Delta,
        )
        diff = np.abs(twoF2 - twoF_predicted) / twoF_predicted
        print(("Predicted twoF is {}"
               " while recovered value is {},"
               " relative difference: {}".format(twoF_predicted, twoF2, diff)))
        self.assertTrue(diff < 0.3)
        diff = np.abs(twoF2 - twoF) / twoF
        self.assertTrue(diff < 0.001)
예제 #7
0
    def test_run_computefstatistic_single_point(self):
        Writer = pyfstat.Writer(
            self.label,
            outdir=self.outdir,
            duration=86400,
            h0=1,
            sqrtSX=1,
            detectors="H1",
        )
        Writer.make_data()
        predicted_FS = Writer.predict_fstat()

        search_H1L1 = pyfstat.ComputeFstat(
            tref=Writer.tref,
            sftfilepattern="{}/*{}*sft".format(Writer.outdir, Writer.label),
        )
        FS = search_H1L1.get_fullycoherent_twoF(
            Writer.tstart,
            Writer.tend,
            Writer.F0,
            Writer.F1,
            Writer.F2,
            Writer.Alpha,
            Writer.Delta,
        )
        self.assertTrue(np.abs(predicted_FS - FS) / FS < 0.3)

        Writer.detectors = "H1"
        predicted_FS = Writer.predict_fstat()
        search_H1 = pyfstat.ComputeFstat(
            tref=Writer.tref,
            detectors="H1",
            sftfilepattern="{}/*{}*sft".format(Writer.outdir, Writer.label),
            SSBprec=lalpulsar.SSBPREC_RELATIVISTIC,
        )
        FS = search_H1.get_fullycoherent_twoF(
            Writer.tstart,
            Writer.tend,
            Writer.F0,
            Writer.F1,
            Writer.F2,
            Writer.Alpha,
            Writer.Delta,
        )
        self.assertTrue(np.abs(predicted_FS - FS) / FS < 0.3)
예제 #8
0
    def test_run_computefstatistic_single_point_no_noise(self):

        predicted_FS = self.Writer.predict_fstat(assumeSqrtSX=1)
        search = pyfstat.ComputeFstat(
            tref=self.Writer.tref,
            assumeSqrtSX=1,
            sftfilepattern=self.Writer.sftfilepath,
            search_ranges=self.search_ranges,
        )
        FS = search.get_fullycoherent_twoF(
            F0=self.Writer.F0,
            F1=self.Writer.F1,
            F2=self.Writer.F2,
            Alpha=self.Writer.Alpha,
            Delta=self.Writer.Delta,
        )
        self.assertTrue(np.abs(predicted_FS - FS) / FS < 0.3)
예제 #9
0
 def test_run_computefstatistic_single_point_injectSqrtSX(self):
     # not using any SFTs
     search = pyfstat.ComputeFstat(
         tref=self.tref,
         minStartTime=self.tstart,
         maxStartTime=self.tstart + self.duration,
         detectors=self.detectors,
         injectSqrtSX=self.sqrtSX,
         minCoverFreq=self.F0 - 0.1,
         maxCoverFreq=self.F0 + 0.1,
     )
     FS = search.get_fullycoherent_twoF(
         F0=self.F0,
         F1=self.F1,
         F2=self.F2,
         Alpha=self.Alpha,
         Delta=self.Delta,
     )
     self.assertTrue(FS > 0.0)
예제 #10
0
data.make_data()

# The predicted twoF, given by lalapps_predictFstat can be accessed by
twoF = data.predict_fstat()
print("Predicted twoF value: {}\n".format(twoF))

# Create a search object for each of the possible SFT combinations
# (H1 only, L1 only, H1 + L1).
ifo_constraints = ["L1", "H1", None]
compute_fstat_per_ifo = [
    pyfstat.ComputeFstat(
        sftfilepattern=os.path.join(
            data.outdir,
            (f"{ifo_constraint[0]}*.sft"
             if ifo_constraint is not None else "*.sft"),
        ),
        tref=data.tref,
        binary=phase_parameters.get("asini", 0),
        minCoverFreq=-0.5,
        maxCoverFreq=-0.5,
    ) for ifo_constraint in ifo_constraints
]

for ind, compute_f_stat in enumerate(compute_fstat_per_ifo):
    compute_f_stat.plot_twoF_cumulative(
        label=label + (f"_{ifo_constraints[ind]}" if ind < 2 else "_H1L1"),
        outdir=outdir,
        savefig=True,
        CFS_input=phase_parameters,
        PFS_input=PFS_input,
        custom_ax_kwargs={
예제 #11
0
 def test_cumulative_twoF(self):
     Nsft = 100
     # not using any SFTs on disk
     search = pyfstat.ComputeFstat(
         tref=self.tref,
         minStartTime=self.tstart,
         maxStartTime=self.tstart + Nsft * self.Tsft,
         detectors=self.detectors,
         injectSqrtSX=self.sqrtSX,
         injectSources=default_signal_params,
         minCoverFreq=self.F0 - 0.1,
         maxCoverFreq=self.F0 + 0.1,
     )
     start_time, taus, twoF_cumulative = search.calculate_twoF_cumulative(
         self.Writer.F0,
         self.Writer.F1,
         self.Writer.F2,
         self.Writer.Alpha,
         self.Writer.Delta,
         num_segments=Nsft + 1,
     )
     twoF = search.get_fullycoherent_detstat(
         F0=self.Writer.F0,
         F1=self.Writer.F1,
         F2=self.Writer.F2,
         Alpha=self.Writer.Alpha,
         Delta=self.Writer.Delta,
         tstart=self.Writer.tstart,
         tend=self.Writer.tstart + taus[-1],
     )
     reldiff = np.abs(twoF_cumulative[-1] - twoF) / twoF
     print("2F from get_fullycoherent_detstat() is {:.4f}"
           " while last value from calculate_twoF_cumulative() is {:.4f};"
           " relative difference: {:.2f}".format(twoF, twoF_cumulative[-1],
                                                 100 * reldiff))
     self.assertTrue(reldiff < 0.1)
     idx = int(Nsft / 2)
     partial_2F_expected = (taus[idx] / taus[-1]) * twoF
     reldiff = (np.abs(twoF_cumulative[idx] - partial_2F_expected) /
                partial_2F_expected)
     print("Middle 2F value from calculate_twoF_cumulative() is {:.4f}"
           " while from duration ratio we'd expect {:.4f}*{:.4f}={:.4f};"
           " relative difference: {:.2f}%".format(
               twoF_cumulative[idx],
               taus[idx] / taus[-1],
               twoF,
               partial_2F_expected,
               100 * reldiff,
           ))
     self.assertTrue(reldiff < 0.1)
     _, _, pfs, pfs_sigma = search.predict_twoF_cumulative(
         F0=self.Writer.F0,
         Alpha=self.Writer.Alpha,
         Delta=self.Writer.Delta,
         h0=self.Writer.h0,
         cosi=self.Writer.cosi,
         psi=self.Writer.psi,
         tstart=self.tstart,
         tend=self.tstart + Nsft * self.Tsft,
         IFOs=self.detectors,
         assumeSqrtSX=self.sqrtSX,
         num_segments=3,  # this is slow, so only do start,mid,end
     )
     reldiffmid = 100 * (twoF_cumulative[idx] - pfs[1]) / pfs[1]
     reldiffend = 100 * (twoF_cumulative[-1] - pfs[2]) / pfs[2]
     print("Predicted 2F values from predict_twoF_cumulative() are"
           " {:.4f}+-{:.4f}(+-{:.2f}%) at midpoint of data"
           " and {:.4f}+-{:.4f}(+-{:.2f}%) after full data,"
           " , relative differences: {:.2f}% and {:.2f}%".format(
               pfs[1],
               pfs_sigma[1],
               100 * pfs_sigma[1] / pfs[1],
               pfs[2],
               pfs_sigma[2],
               100 * pfs_sigma[2] / pfs[2],
               reldiffmid,
               reldiffend,
           ))
     self.assertTrue(reldiffmid < 0.25)
     self.assertTrue(reldiffend < 0.25)
예제 #12
0
 def test_get_fully_coherent_BSGL(self):
     # first pure noise, expect log10BSGL<0
     search_H1L1_noBSGL = pyfstat.ComputeFstat(
         tref=self.tref,
         minStartTime=self.tstart,
         maxStartTime=self.tstart + self.duration,
         detectors="H1,L1",
         injectSqrtSX=np.repeat(self.sqrtSX, 2),
         minCoverFreq=self.F0 - 0.1,
         maxCoverFreq=self.F0 + 0.1,
         BSGL=False,
         singleFstats=True,
         randSeed=self.randSeed,
     )
     twoF = search_H1L1_noBSGL.get_fullycoherent_detstat(
         F0=self.F0,
         F1=self.F1,
         F2=self.F2,
         Alpha=self.Alpha,
         Delta=self.Delta,
     )
     twoFX = search_H1L1_noBSGL.get_fullycoherent_single_IFO_twoFs()
     search_H1L1_BSGL = pyfstat.ComputeFstat(
         tref=self.tref,
         minStartTime=self.tstart,
         maxStartTime=self.tstart + self.duration,
         detectors="H1,L1",
         injectSqrtSX=np.repeat(self.sqrtSX, 2),
         minCoverFreq=self.F0 - 0.1,
         maxCoverFreq=self.F0 + 0.1,
         BSGL=True,
         randSeed=self.randSeed,
     )
     log10BSGL = search_H1L1_BSGL.get_fullycoherent_detstat(
         F0=self.F0,
         F1=self.F1,
         F2=self.F2,
         Alpha=self.Alpha,
         Delta=self.Delta,
     )
     self.assertTrue(log10BSGL < 0)
     self.assertTrue(log10BSGL == lalpulsar.ComputeBSGL(
         twoF, twoFX, search_H1L1_BSGL.BSGLSetup))
     # now with an added signal, expect log10BSGL>0
     search_H1L1_noBSGL = pyfstat.ComputeFstat(
         tref=self.tref,
         minStartTime=self.tstart,
         maxStartTime=self.tstart + self.duration,
         detectors="H1,L1",
         injectSqrtSX=np.repeat(self.sqrtSX, 2),
         injectSources=
         "{{Alpha={:g}; Delta={:g}; h0={:g}; cosi={:g}; Freq={:g}; f1dot={:g}; f2dot={:g}; refTime={:d};}}"
         .format(
             self.Alpha,
             self.Delta,
             self.h0,
             self.cosi,
             self.F0,
             self.F1,
             self.F2,
             self.tref,
         ),
         minCoverFreq=self.F0 - 0.1,
         maxCoverFreq=self.F0 + 0.1,
         BSGL=False,
         singleFstats=True,
         randSeed=self.randSeed,
     )
     twoF = search_H1L1_noBSGL.get_fullycoherent_detstat(
         F0=self.F0,
         F1=self.F1,
         F2=self.F2,
         Alpha=self.Alpha,
         Delta=self.Delta,
     )
     twoFX = search_H1L1_noBSGL.get_fullycoherent_single_IFO_twoFs()
     search_H1L1_BSGL = pyfstat.ComputeFstat(
         tref=self.tref,
         minStartTime=self.tstart,
         maxStartTime=self.tstart + self.duration,
         detectors="H1,L1",
         injectSqrtSX=np.repeat(self.sqrtSX, 2),
         injectSources=
         "{{Alpha={:g}; Delta={:g}; h0={:g}; cosi={:g}; Freq={:g}; f1dot={:g}; f2dot={:g}; refTime={:d};}}"
         .format(
             self.Alpha,
             self.Delta,
             self.h0,
             self.cosi,
             self.F0,
             self.F1,
             self.F2,
             self.tref,
         ),
         minCoverFreq=self.F0 - 0.1,
         maxCoverFreq=self.F0 + 0.1,
         BSGL=True,
         randSeed=self.randSeed,
     )
     log10BSGL = search_H1L1_BSGL.get_fullycoherent_detstat(
         F0=self.F0,
         F1=self.F1,
         F2=self.F2,
         Alpha=self.Alpha,
         Delta=self.Delta,
     )
     self.assertTrue(log10BSGL > 0)
     self.assertTrue(log10BSGL == lalpulsar.ComputeBSGL(
         twoF, twoFX, search_H1L1_BSGL.BSGLSetup))
    detectors=IFO,
    randSeed=randSeed,
    SFTWindowType="tukey",
    SFTWindowBeta=0.001,
)
sftfilepattern = os.path.join(
    noise_and_signal_writer.outdir,
    "*{}*{}*sft".format(duration_Tsft, noise_and_signal_writer.label),
)

noise_and_signal_writer.make_data()

# compute Fstat
coherent_search = pyfstat.ComputeFstat(
    tref=noise_and_signal_writer.tref,
    sftfilepattern=sftfilepattern,
    minCoverFreq=-0.5,
    maxCoverFreq=-0.5,
)
FS_1 = coherent_search.get_fullycoherent_twoF(
    noise_and_signal_writer.F0,
    noise_and_signal_writer.F1,
    noise_and_signal_writer.F2,
    noise_and_signal_writer.Alpha,
    noise_and_signal_writer.Delta,
)

# create noise sfts
# window options are again optional for this step
noise_writer = pyfstat.Writer(
    label="test_noiseSFTs_only_noise",
    outdir=outdir,
예제 #14
0
    r"$e$",
]

grid_arrays = np.meshgrid(*[
    signal_parameters[key] *
    (1 + 0.01 *
     np.arange(-half_points_per_dimension, half_points_per_dimension + 1, 1))
    for key in search_keys
])
grid_points = np.hstack(
    [grid_arrays[i].reshape(-1, 1) for i in range(len(grid_arrays))])

compute_f_stat = pyfstat.ComputeFstat(
    sftfilepattern=os.path.join(outdir, "*simulated_signal*sft"),
    tref=signal_parameters["tref"],
    binary=True,
    minCoverFreq=-0.5,
    maxCoverFreq=-0.5,
)
twoF_values = np.zeros(grid_points.shape[0])
for ind in range(grid_points.shape[0]):
    point = grid_points[ind]
    twoF_values[ind] = compute_f_stat.get_fullycoherent_twoF(
        F0=signal_parameters["F0"],
        F1=signal_parameters["F1"],
        F2=signal_parameters["F2"],
        Alpha=signal_parameters["Alpha"],
        Delta=signal_parameters["Delta"],
        period=point[0],
        asini=point[1],
        tp=point[2],