20 from numpy.testing
import assert_allclose
26 earth_ephem_file = os.path.join(
27 os.environ[
"LAL_TEST_PKGDATADIR"],
"earth00-40-DE405.dat.gz"
29 sun_ephem_file = os.path.join(
30 os.environ[
"LAL_TEST_PKGDATADIR"],
"sun00-40-DE405.dat.gz"
32 ephemerides = lalpulsar.InitBarycenter(earth_ephem_file, sun_ephem_file)
44 dataParams = lalpulsar.CWMFDataParams()
45 dataParams.fMin = f_min
46 dataParams.Band = f_max - f_min
47 lalpulsar.ParseMultiLALDetector(dataParams.multiIFO, IFOs)
48 lalpulsar.ParseMultiNoiseFloor(dataParams.multiNoiseFloor, sqrtSX, numDet)
49 multiTS = lalpulsar.MakeMultiTimestamps(T0, Tspan, Tsft, Toverlap, numDet)
50 dataParams.multiTimestamps = multiTS
51 dataParams.randSeed = 42
52 dataParams.inputMultiTS =
None
54 lalpulsar.PulsarParamsVector()
59 print(
"Generating SFTs with CWMakeFakeMultiData...")
60 multiSFTs, _ = lalpulsar.CWMakeFakeMultiData(
63 injectionSources=injectionSources,
64 dataParams=dataParams,
67 assert multiSFTs.length == numDet
68 numSFTs = lal.CreateUINT4Vector(numDet)
69 numSFTs.data = [sft.length
for sft
in multiSFTs.data]
70 f0 = multiSFTs.data[0].data[0].f0
71 deltaF = multiSFTs.data[0].data[0].deltaF
72 numBins = multiSFTs.data[0].data[0].data.length
73 print(
"numIFOs:", numDet)
74 print(
"numSFTs per IFO:", numSFTs.data)
75 print(
"numBins per SFT:", numBins)
79 print(
"Copying SFTs...")
80 multiSFTs_copy = lalpulsar.CreateEmptyMultiSFTVector(numSFTs)
81 for X, sftvec
in enumerate(multiSFTs.data):
82 for k, sft
in enumerate(sftvec.data):
83 lalpulsar.CopySFT(multiSFTs_copy.data[X].data[k], sft)
89 print(
"Calling ComputePSDandNormSFTPower() with normalizeSFTsInPlace=False...")
90 psd, multiPSDVector, normSFT = lalpulsar.ComputePSDandNormSFTPower(
92 returnMultiPSDVector=
True,
99 normalizeByTotalNumSFTs=
False,
101 FreqBand=f_max - f_min,
102 normalizeSFTsInPlace=
False,
105 "PSD from ComputePSDandNormSFTPower() with normalizeSFTsInPlace=False:",
108 assert psd.length == numBins
109 print(
"normSFT:", normSFT.data)
110 assert normSFT.length == numBins
111 assert multiPSDVector.length == numDet
112 summed_average_IFO_PSD_vector = np.zeros_like(psd.data)
113 for X
in range(numDet):
114 assert multiPSDVector.data[X].length == numSFTs.data[X]
115 assert multiPSDVector.data[X].data[0].data.length == psd.length
116 assert multiPSDVector.data[X].data[0].f0 == f0
117 assert multiPSDVector.data[X].data[0].deltaF == deltaF
118 average_IFO_PSD_vector = np.array(
122 multiPSDVector.data[X].data[n].data.data[k]
123 for n
in range(numSFTs.data[X])
126 for k
in range(numBins)
129 print(
"multiPSDVector[{:d}] averaged: {}".format(X, average_IFO_PSD_vector))
130 summed_average_IFO_PSD_vector += average_IFO_PSD_vector
132 "sum of per-IFO averaged multiPSDVector entries:", summed_average_IFO_PSD_vector
134 assert_allclose(summed_average_IFO_PSD_vector, psd.data, rtol=rtol)
135 print(
"Relative agreement to within {:e}.".format(rtol))
138 "Calling ComputePSDandNormSFTPower() again, with normalizeSFTsInPlace=True..."
140 psd2, multiPSDVector, normSFT2 = lalpulsar.ComputePSDandNormSFTPower(
142 returnMultiPSDVector=
True,
149 normalizeByTotalNumSFTs=
False,
151 FreqBand=f_max - f_min,
152 normalizeSFTsInPlace=
True,
155 "PSD from ComputePSDandNormSFTPower() with normalizeSFTsInPlace=True:",
158 assert psd2.length == numBins
159 assert_allclose(psd2.data, psd.data, rtol=rtol)
160 print(
"Relative PSD agreement to within {:e}.".format(rtol))
161 print(
"normSFT:", normSFT2.data)
162 assert normSFT2.length == numBins
163 assert_allclose(normSFT2.data, normSFT.data, rtol=rtol)
164 print(
"Relative normSFT agreement to within {:e}.".format(rtol))
166 print(
"Calling ComputePSDfromSFTs() on original (now normalized) SFTs...")
167 psd3 = lalpulsar.ComputePSDfromSFTs(
172 normalizeByTotalNumSFTs=
False,
174 FreqBand=f_max - f_min,
176 print(
"PSD from ComputePSDfromSFTs() on normalized SFTs:", psd3.data)
177 assert psd3.length == numBins
180 print(
"Calling ComputePSDfromSFTs() on copied SFTs...")
181 psd4 = lalpulsar.ComputePSDfromSFTs(
182 inputSFTs=multiSFTs_copy,
186 normalizeByTotalNumSFTs=
False,
188 FreqBand=f_max - f_min,
190 print(
"PSD from ComputePSDfromSFTs() on copied SFTs:", psd4.data)
191 assert psd4.length == numBins
192 assert_allclose(psd4.data, psd.data, rtol=rtol)
193 print(
"Relative agreement to within {:e}.".format(rtol))
196 if __name__ ==
"__main__":
197 args = sys.argv[1:]
or [
"-v",
"-rs",
"--junit-xml=junit-computePSD.xml"]
198 sys.exit(pytest.main(args=[__file__] + args))
def test_ComputePSDandNormSFTPower()