Note
Go to the end to download the full example code.
Cumulative coherent 2F
Compute the cumulative coherent F-statistic of a signal candidate.
8 import os
9
10 import numpy as np
11
12 import pyfstat
13 from pyfstat.utils import get_predict_fstat_parameters_from_dict
14
15 label = "PyFstatExampleTwoFCumulative"
16 outdir = os.path.join("PyFstat_example_data", label)
17 logger = pyfstat.set_up_logger(label=label, outdir=outdir)
18
19 # Properties of the GW data
20 gw_data = {
21 "sqrtSX": 1e-23,
22 "tstart": 1000000000,
23 "duration": 10 * 86400,
24 "detectors": "H1,L1",
25 "Band": 4,
26 "Tsft": 1800,
27 }
28
29 # Properties of the signal
30 depth = 30
31 phase_parameters = {
32 "F0": 30.0,
33 "F1": -1e-10,
34 "F2": 0,
35 "Alpha": np.radians(83.6292),
36 "Delta": np.radians(22.0144),
37 "tref": gw_data["tstart"],
38 "asini": 10,
39 "period": 10 * 3600 * 24,
40 "tp": gw_data["tstart"] + gw_data["duration"] / 2.0,
41 "ecc": 0,
42 "argp": 0,
43 }
44 amplitude_parameters = {
45 "h0": gw_data["sqrtSX"] / depth,
46 "cosi": 1,
47 "phi": np.pi,
48 "psi": np.pi / 8,
49 }
50
51 PFS_input = get_predict_fstat_parameters_from_dict(
52 {**phase_parameters, **amplitude_parameters}
53 )
54
55 # Let me grab tref here, since it won't really be needed in phase_parameters
56 tref = phase_parameters.pop("tref")
57 data = pyfstat.BinaryModulatedWriter(
58 label=label,
59 outdir=outdir,
60 tref=tref,
61 **gw_data,
62 **phase_parameters,
63 **amplitude_parameters,
64 )
65 data.make_data()
66
67 # The predicted twoF (expectation over noise realizations) can be accessed by
68 twoF = data.predict_fstat()
69 logger.info("Predicted twoF value: {}\n".format(twoF))
70
71 # Create a search object for each of the possible SFT combinations
72 # (H1 only, L1 only, H1 + L1).
73 ifo_constraints = ["L1", "H1", None]
74 compute_fstat_per_ifo = [
75 pyfstat.ComputeFstat(
76 sftfilepattern=os.path.join(
77 data.outdir,
78 (f"{ifo_constraint[0]}*.sft" if ifo_constraint is not None else "*.sft"),
79 ),
80 tref=data.tref,
81 binary=phase_parameters.get("asini", 0),
82 minCoverFreq=-0.5,
83 maxCoverFreq=-0.5,
84 )
85 for ifo_constraint in ifo_constraints
86 ]
87
88 for ind, compute_f_stat in enumerate(compute_fstat_per_ifo):
89 compute_f_stat.plot_twoF_cumulative(
90 label=label + (f"_{ifo_constraints[ind]}" if ind < 2 else "_H1L1"),
91 outdir=outdir,
92 savefig=True,
93 CFS_input=phase_parameters,
94 PFS_input=PFS_input,
95 custom_ax_kwargs={
96 "title": "How does 2F accumulate over time?",
97 "label": "Cumulative 2F"
98 + (f" {ifo_constraints[ind]}" if ind < 2 else " H1 + L1"),
99 },
100 )