From 7cb7b01e26f46441bf6bdf99b68dc53ec7640331 Mon Sep 17 00:00:00 2001 From: Gregory Ashton <gregory.ashton@ligo.org> Date: Wed, 21 Sep 2016 11:23:59 +0200 Subject: [PATCH] Remove old methods Removes the fully-coherent search which was just a wrapper to CFS_v2 and all of the `slow' methods which used command line arguments rather than the python interface. --- pyfstat.py | 320 ------------------------------------------------- tests/tests.py | 87 -------------- 2 files changed, 407 deletions(-) diff --git a/pyfstat.py b/pyfstat.py index 048ef55..130846b 100755 --- a/pyfstat.py +++ b/pyfstat.py @@ -141,272 +141,6 @@ class BaseSearchClass(object): return thetas -class FullyCoherentNarrowBandSearch(BaseSearchClass): - """ Search over a narrow band of F0, F1, and F2 """ - - @initializer - def __init__(self, label, outdir, sftlabel=None, sftdir=None, - tglitch=None, tref=None, tstart=None, Alpha=None, Delta=None, - duration=None, Writer=None): - """ - Parameters - ---------- - label, outdir: str - A label and directory to read/write data from/to - sftlabel, sftdir: str - A label and directory in which to find the relevant sft file. If - None use label and outdir - """ - if self.sftlabel is None: - self.sftlabel = self.label - if self.sftdir is None: - self.sftdir = self.outdir - self.tend = self.tstart + self.duration - self.calculate_best_fit_F0_and_F1(Writer) - self.fs_file_name = "{}/{}_FS.dat".format(self.outdir, self.label) - - def calculate_best_fit_F0_and_F1(self, writer): - R = (writer.tglitch - writer.tstart) / float(writer.duration) - self.F0_min = (writer.F0 + writer.delta_F0*(1-R)**2*(2*R+1) + - 3*writer.delta_phi*R*(1-R)/np.pi/writer.duration + - # .5*writer.duration*writer.F1*(1-R) + - .5*writer.duration*writer.delta_F1*(1-R)**3*(1+R)) - - self.F1_min = (writer.F1 + writer.delta_F1*(1-R)**3*(6*R**2+3*R+1) + - 30*writer.delta_F0*R**2*(1-R)**2/writer.duration + - 30*writer.delta_phi*R*(1-R)*(2*R-1)/np.pi/writer.duration**2 - ) - - def get_grid_setup(self, m, n, searchF2=False): - """ Calc. the grid parameters of bands given the metric-mismatch - - Parameters - ---------- - m: float in [0, 1] - The mismatch spacing between adjacent grid points - n: int - Number of grid points to search - - """ - DeltaF0 = np.sqrt(12 * m) / (np.pi * self.duration) - DeltaF1 = np.sqrt(720 * m) / (np.pi * self.duration**2.0) - DeltaF2 = np.sqrt(100800 * m) / (np.pi * self.duration**3.0) - - # Calculate the width of bands given n - F0Band = n * DeltaF0 - F1Band = n * DeltaF1 - F2Band = n * DeltaF2 - - # Search takes the lowest frequency in the band - F0_bottom = self.F0_min - .5 * F0Band - F1_bottom = self.F1_min - .5 * F1Band - if searchF2: - F2_bottom = self.F2_min-.5*self.F2Band # Not yet implemented - else: - F2_bottom = 0 # Broken functionality - F2Band = 0 - - Messg = ["Automated search for {}:".format(self.label), - "Grid parameters : m={}, n={}".format(m, n), - "Reference time: {}".format(self.tref), - "Analytic best-fit values : {}, {}".format( - self.F0_min, self.F1_min), - "F0Band : {} -- {}".format(F0_bottom, - F0_bottom + F0Band), - "F1Band : {} -- {}".format(F1_bottom, - F1_bottom + F1Band), - "F2Band : {} -- {}".format(F2_bottom, - F2_bottom + F2Band), - ] - logging.info("\n ".join(Messg)) - - return (F0_bottom, DeltaF0, F0Band, - F1_bottom, DeltaF1, F1Band, - F2_bottom, DeltaF2, F2Band) - - def run_computefstatistic_slow(self, m, n, search_F2=False): - """ Compute the f statistic fully-coherently over a grid """ - - (F0_bottom, DeltaF0, F0Band, - F1_bottom, DeltaF1, F1Band, - F2_bottom, DeltaF2, F2Band) = self.get_grid_setup(m, n) - - c_l = [] - c_l.append("lalapps_ComputeFstatistic_v2") - c_l.append("--Freq={}".format(F0_bottom)) - c_l.append("--dFreq={}".format(DeltaF0)) - c_l.append("--FreqBand={}".format(F0Band)) - - c_l.append("--f1dot={}".format(F1_bottom)) - c_l.append("--df1dot={}".format(DeltaF1)) - c_l.append("--f1dotBand={}".format(F1Band)) - - if search_F2: - c_l.append("--f2dot={}".format(F2_bottom)) - c_l.append("--df2dot={}".format(DeltaF2)) - c_l.append("--f2dotBand={}".format(F2Band)) - else: - c_l.append("--f2dot={}".format(F2_bottom)) - - c_l.append("--DataFiles='{}'".format( - self.outdir+"/*SFT_"+self.label+"*sft")) - - c_l.append("--refTime={:10.6f}".format(self.tref)) - c_l.append("--outputFstat='{}'".format(self.fs_file_name)) - - c_l.append("--Alpha={}".format(self.Alpha)) - c_l.append("--Delta={}".format(self.Delta)) - - c_l.append("--minStartTime={}".format(self.tstart)) - c_l.append("--maxStartTime={}".format(self.tend)) - - logging.info("Executing: " + " ".join(c_l) + "\n") - os.system(" ".join(c_l)) - - self.read_in_fstat() - - def run_computefstatistic(self, dFreq=0, numFreqBins=1): - """ Compute the f statistic fully-coherently over a grid """ - - constraints = lalpulsar.SFTConstraints() - FstatOptionalArgs = lalpulsar.FstatOptionalArgsDefaults - minCoverFreq = 29 - maxCoverFreq = 31 - - SFTCatalog = lalpulsar.SFTdataFind( - self.sftdir+'/*_'+self.sftlabel+"*sft", constraints) - - ephemerides = lalpulsar.InitBarycenter( - '~/lalsuite-install/share/lalpulsar/earth00-19-DE421.dat.gz', - '~/lalsuite-install/share/lalpulsar/sun00-19-DE421.dat.gz') - - whatToCompute = lalpulsar.FSTATQ_2F - FstatInput = lalpulsar.CreateFstatInput(SFTCatalog, - minCoverFreq, - maxCoverFreq, - dFreq, - ephemerides, - FstatOptionalArgs - ) - - PulsarDopplerParams = lalpulsar.PulsarDopplerParams() - PulsarDopplerParams.refTime = self.tref - PulsarDopplerParams.Alpha = self.Alpha - PulsarDopplerParams.Delta = self.Delta - PulsarDopplerParams.fkdot = np.array([self.F0_min-dFreq*numFreqBins/2., - self.F1_min, 0, 0, 0, 0, 0]) - - FstatResults = lalpulsar.FstatResults() - lalpulsar.ComputeFstat(FstatResults, - FstatInput, - PulsarDopplerParams, - numFreqBins, - whatToCompute - ) - self.search_F0 = (np.linspace(0, dFreq * numFreqBins, numFreqBins) - + FstatResults.doppler.fkdot[0]) - self.search_F1 = np.zeros(numFreqBins) + self.F1_min - self.search_F2 = np.zeros(numFreqBins) + 0 - self.search_FS = FstatResults.twoF - - def read_in_fstat(self): - """ - Read in data from *_FS.dat file as produced by ComputeFStatistic_v2 - """ - - data = np.genfromtxt(self.fs_file_name, comments="%") - - # If none of the components are varying: - if data.ndim == 1: - self.search_F0 = data[0] - self.search_F1 = data[3] - self.search_F2 = data[4] - self.search_FS = data[6] - return - - search_F0 = data[:, 0] - search_F1 = data[:, 3] - search_F2 = data[:, 4] - search_FS = data[:, 6] - - NF0 = len(np.unique(search_F0)) - NF1 = len(np.unique(search_F1)) - NF2 = len(np.unique(search_F2)) - - shape = (NF2, NF1, NF0) - self.data_shape = shape - self.search_F0 = np.squeeze(np.reshape(search_F0, - newshape=shape).transpose()) - self.search_F1 = np.squeeze(np.reshape(search_F1, - newshape=shape).transpose()) - self.search_F2 = np.squeeze(np.reshape(search_F2, - newshape=shape).transpose()) - self.search_FS = np.squeeze(np.reshape(search_FS, - newshape=shape).transpose()) - - def get_FS_max(self): - """ Returns the maximum FS and the corresponding F0, F1, and F2 """ - - if np.shape(self.search_FS) == (): - return self.search_F0, self.search_F1, self.search_F2, self.search_FS - else: - max_idx = np.unravel_index(self.search_FS.argmax(), self.search_FS.shape) - return (self.search_F0[max_idx], self.search_F1[max_idx], - self.search_F2[max_idx], self.search_FS[max_idx]) - - def plot_output(self, output_type='FS', perfectlymatched_FS=None, - fig=None, ax=None, savefig=False, title=None): - """ - Plot the output of the *_FS.dat file as a contour plot - - Parameters - ---------- - output_type: str - one of 'FS', 'rho', or 'mismatch' - perfectlymatched_FS: float - the 2F of a perfectly matched signal against which to - compute the mismatch - - """ - - resF0 = self.search_F0 - self.F0_min - resF1 = self.search_F1 - self.F1_min - - if output_type == 'FS': - Z = self.search_FS - zlabel = r'$2\bar{\mathcal{F}}$' - elif output_type == 'rho': - Z = self.search_FS - 4 - zlabel = r'\rho^{2}' - elif output_type == 'mismatch': - rho2 = self.search_FS - 4 - perfectlymatched_rho2 = perfectlymatched_FS - 4 - if perfectlymatched_FS: - Z = 1 - (rho2) / (perfectlymatched_rho2) - else: - raise ValueError('Plotting the mismatch requires a value for' - ' the parameter perfectlymatched_rho2') - zlabel = 'mismatch' - - if ax is None: - fig, ax = plt.subplots() - plt.rcParams['font.size'] = 12 - - pax = ax.pcolormesh(resF0, resF1, Z, cmap=plt.cm.viridis, - vmin=0, vmax=1) - fig.colorbar(pax, label=zlabel, ax=ax) - ax.set_xlim(np.min(resF0), np.max(resF0)) - ax.set_ylim(np.min(resF1), np.max(resF1)) - - ax.set_xlabel(r'$f_0 - f_\textrm{min}$') - ax.set_ylabel(r'$\dot{f}_0 - \dot{f}_\textrm{min}$') - ax.set_title(self.label) - - plt.tight_layout() - if savefig: - fig.savefig('output_{}.png'.format(self.label)) - - class SemiCoherentGlitchSearch(BaseSearchClass): """ A semi-coherent glitch search @@ -415,8 +149,6 @@ class SemiCoherentGlitchSearch(BaseSearchClass): fully-coherent F-stat in each segment is averaged to give the semi-coherent F-stat """ - # Copy methods - read_in_fstat = FullyCoherentNarrowBandSearch.__dict__['read_in_fstat'] @initializer def __init__(self, label, outdir, tref, tstart, tend, sftlabel=None, @@ -591,58 +323,6 @@ class SemiCoherentGlitchSearch(BaseSearchClass): useFReg) return 2*FS.F_mn.data[0][0] - def compute_glitch_fstat_slow(self, F0, F1, F2, Alpha, Delta, delta_F0, - delta_F1, tglitch): - """ Compute the semi-coherent F-stat """ - - theta = [F0, F1, F2] - delta_theta = [delta_F0, delta_F1, 0] - tref = self.tref - - theta_at_glitch = self.shift_coefficients(theta, tglitch - tref) - theta_post_glitch_at_glitch = theta_at_glitch + delta_theta - theta_post_glitch = self.shift_coefficients( - theta_post_glitch_at_glitch, tref - tglitch) - - FsegA = self.run_computefstatistic_single_point_slow( - tref, self.tstart, tglitch, theta[0], theta[1], theta[2], Alpha, - Delta) - FsegB = self.run_computefstatistic_single_point_slow( - tref, tglitch, self.tend, theta_post_glitch[0], - theta_post_glitch[1], theta_post_glitch[2], Alpha, - Delta) - - return (FsegA + FsegB) / 2. - - def run_computefstatistic_single_point_slow(self, tref, tstart, tend, F0, - F1, F2, Alpha, Delta): - """ Compute the f statistic fully-coherently at a single point """ - - c_l = [] - c_l.append("lalapps_ComputeFstatistic_v2") - c_l.append("--Freq={}".format(F0)) - c_l.append("--f1dot={}".format(F1)) - c_l.append("--f2dot={}".format(F2)) - - c_l.append("--DataFiles='{}'".format( - self.outdir+"/*SFT_"+self.label+"*sft")) - - c_l.append("--refTime={:10.6f}".format(tref)) - c_l.append("--outputFstat='{}'".format(self.fs_file_name)) - - c_l.append("--Alpha={}".format(Alpha)) - c_l.append("--Delta={}".format(Delta)) - - c_l.append("--minStartTime={}".format(tstart)) - c_l.append("--maxStartTime={}".format(tend)) - - logging.info("Executing: " + " ".join(c_l) + "\n") - os.system(" ".join(c_l)) - - self.read_in_fstat() - - return self.search_FS - class MCMCGlitchSearch(BaseSearchClass): """ MCMC search using the SemiCoherentGlitchSearch """ diff --git a/tests/tests.py b/tests/tests.py index 7f90a7d..852eb92 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -75,41 +75,6 @@ class TestBaseSearchClass(unittest.TestCase): rtol=1e-9, atol=1e-9)) -class TestFullyCoherentNarrowBandSearch(unittest.TestCase): - label = "Test" - outdir = 'TestData' - - def test_compute_fstat(self): - Writer = glitch_tools.Writer(self.label, outdir=self.outdir) - Writer.make_data() - - search = glitch_searches.FullyCoherentNarrowBandSearch( - self.label, self.outdir, tref=Writer.tref, Alpha=Writer.Alpha, - Delta=Writer.Delta, duration=Writer.duration, tstart=Writer.tstart, - Writer=Writer) - search.run_computefstatistic_slow(m=1e-3, n=0) - _, _, _, FS_max_slow = search.get_FS_max() - - search.run_computefstatistic(dFreq=0, numFreqBins=1) - _, _, _, FS_max = search.get_FS_max() - self.assertTrue( - np.abs(FS_max-FS_max_slow)/FS_max_slow < 0.1) - - def test_compute_fstat_against_predict_fstat(self): - Writer = glitch_tools.Writer(self.label, outdir=self.outdir) - Writer.make_data() - Writer.run_makefakedata() - predicted_FS = Writer.predict_fstat() - - search = glitch_searches.FullyCoherentNarrowBandSearch( - self.label, self.outdir, tref=Writer.tref, Alpha=Writer.Alpha, - Delta=Writer.Delta, duration=Writer.duration, tstart=Writer.tstart, - Writer=Writer) - search.run_computefstatistic(dFreq=0, numFreqBins=1) - _, _, _, FS_max = search.get_FS_max() - self.assertTrue(np.abs(predicted_FS-FS_max)/FS_max < 0.5) - - class TestSemiCoherentGlitchSearch(unittest.TestCase): label = "Test" outdir = 'TestData' @@ -133,58 +98,6 @@ class TestSemiCoherentGlitchSearch(unittest.TestCase): print predicted_FS, FS self.assertTrue(np.abs(predicted_FS-FS)/FS < 0.1) - def test_run_computefstatistic_single_point_slow(self): - Writer = pyfstat.Writer(self.label, outdir=self.outdir) - Writer.make_data() - predicted_FS = Writer.predict_fstat() - - search = pyfstat.SemiCoherentGlitchSearch( - label=Writer.label, outdir=Writer.outdir, tref=Writer.tref, - tstart=Writer.tstart, tend=Writer.tend) - FS = search.run_computefstatistic_single_point_slow(search.tref, - search.tstart, - search.tend, - Writer.F0, - Writer.F1, - Writer.F2, - Writer.Alpha, - Writer.Delta) - self.assertTrue(np.abs(predicted_FS-FS)/FS < 0.1) - - def test_compute_glitch_fstat_slow(self): - duration = 100*86400 - dtglitch = 100*43200 - delta_F0 = 0 - Writer = pyfstat.Writer(self.label, outdir=self.outdir, - duration=duration, dtglitch=dtglitch, - delta_F0=delta_F0) - Writer.make_data() - - search = pyfstat.SemiCoherentGlitchSearch( - label=Writer.label, outdir=Writer.outdir, tref=Writer.tref, - tstart=Writer.tstart, tend=Writer.tend) - - FS = search.compute_glitch_fstat_slow(Writer.F0, Writer.F1, Writer.F2, - Writer.Alpha, Writer.Delta, - Writer.delta_F0, Writer.delta_F1, - Writer.tglitch) - - # Compute the predicted semi-coherent glitch Fstat - tstart = Writer.tstart - tend = Writer.tend - - Writer.tend = tstart + dtglitch - FSA = Writer.predict_fstat() - - Writer.tstart = tstart + dtglitch - Writer.tend = tend - FSB = Writer.predict_fstat() - - predicted_FS = .5*(FSA + FSB) - - print(predicted_FS, FS) - self.assertTrue(np.abs((FS - predicted_FS))/predicted_FS < 0.1) - def test_compute_nglitch_fstat(self): duration = 100*86400 dtglitch = 100*43200 -- GitLab