diff --git a/pyfstat/__init__.py b/pyfstat/__init__.py index 06b11f76006177e75d34485af8b65f8e3771369a..fe0419954138cc5cc2525b4d635c83b7e92242ec 100644 --- a/pyfstat/__init__.py +++ b/pyfstat/__init__.py @@ -2,4 +2,4 @@ from __future__ import division as _division from .core import BaseSearchClass, ComputeFstat, Writer, SemiCoherentSearch, SemiCoherentGlitchSearch from .mcmc_based_searches import MCMCSearch, MCMCGlitchSearch, MCMCSemiCoherentSearch, MCMCFollowUpSearch, MCMCTransientSearch -from .grid_based_searches import GridSearch, GridUniformPriorSearch, GridGlitchSearch, FrequencySlidingWindow +from .grid_based_searches import GridSearch, GridUniformPriorSearch, GridGlitchSearch, FrequencySlidingWindow, DMoff_NO_SPIN diff --git a/pyfstat/grid_based_searches.py b/pyfstat/grid_based_searches.py index 62267a786632c508d38c0d6f5e47d5e0214a2818..d4164ca7624d2f1975cd74602777dd43d4003468 100644 --- a/pyfstat/grid_based_searches.py +++ b/pyfstat/grid_based_searches.py @@ -11,7 +11,7 @@ import matplotlib.pyplot as plt import helper_functions from core import BaseSearchClass, ComputeFstat, SemiCoherentGlitchSearch, SemiCoherentSearch -from core import tqdm, args, earth_ephem, sun_ephem +from core import tqdm, args, earth_ephem, sun_ephem, read_par class GridSearch(BaseSearchClass): @@ -449,3 +449,87 @@ class FrequencySlidingWindow(GridSearch): '{}/{}_sliding_window.png'.format(self.outdir, self.label)) else: return ax + + +class DMoff_NO_SPIN(GridSearch): + """ DMoff test using SSBPREC_NO_SPIN """ + @helper_functions.initializer + def __init__(self, par_file, label, outdir, sftfilepath, minStartTime=None, + maxStartTime=None, minCoverFreq=None, maxCoverFreq=None, + earth_ephem=None, sun_ephem=None, detectors=None, + injectSources=None, assumeSqrtSX=None): + """ + Parameters + ---------- + par_file: str + Path to a .par file to read in the F0, F1 etc + label, outdir: str + A label and directory to read/write data from/to + sftfilepath: str + File patern to match SFTs + minStartTime, maxStartTime: int + GPS seconds of the start time and end time + + For all other parameters, see `pyfstat.ComputeFStat` for details + """ + + if earth_ephem is None: + self.earth_ephem = self.earth_ephem_default + if sun_ephem is None: + self.sun_ephem = self.sun_ephem_default + + if os.path.isdir(outdir) is False: + os.mkdir(outdir) + + if os.path.isfile(par_file): + self.par = read_par(filename=par_file) + else: + raise ValueError('The .par file does not exist') + + self.nsegs = 1 + self.BSGL = False + + self.tref = self.par['tref'] + self.F1s = [self.par.get('F1', 0)] + self.F2s = [self.par.get('F2', 0)] + self.Alphas = [self.par['Alpha']] + self.Deltas = [self.par['Delta']] + self.Re = 6.371e6 + self.c = 2.998e8 + self.SIDEREAL_DAY = 23*60*60 + 56*60 + 4.0916 + self.TERRESTRIAL_DAY = 86400. + a0 = self.Re/self.c*np.cos(self.par['Delta']) + self.m0 = np.max([4, int(np.ceil(2*np.pi*self.par['F0']*a0))]) + logging.info('m0 = {}'.format(self.m0)) + + def get_results(self): + """ Compute the three summed detection statistics + + Returns + ------- + m0, twoF_SUM, twoFstar_SUM_SIDEREAL, twoFstar_SUM_TERRESTRIAL + + """ + self.SSBprec = 2 + self.out_file = '{}/{}_gridFS_SSBPREC2.txt'.format( + self.outdir, self.label) + self.F0s = [self.par['F0']+j/self.SIDEREAL_DAY for j in range(-4, 5)] + self.run() + twoF_SUM = np.sum(self.data[:, -1]) + + self.SSBprec = 4 + self.out_file = '{}/{}_gridFS_SSBPREC4_SIDEREAL.txt'.format( + self.outdir, self.label) + self.F0s = [self.par['F0']+j/self.SIDEREAL_DAY + for j in range(-self.m0, self.m0+1)] + self.run() + twoFstar_SUM = np.sum(self.data[:, -1]) + + self.out_file = '{}/{}_gridFS_SSBPREC4_TERRESTIAL.txt'.format( + self.outdir, self.label) + self.F0s = [self.par['F0']+j/self.TERRESTRIAL_DAY + for j in range(-self.m0, self.m0+1)] + self.run() + twoFstar_SUM_terrestrial = np.sum(self.data[:, -1]) + + return self.m0, twoF_SUM, twoFstar_SUM, twoFstar_SUM_terrestrial