Skip to content
Snippets Groups Projects
Select Git revision
  • 72ae2ba87792e4d9159d633de6915e36deef684b
  • master default protected
2 results

test_aperture.py

Blame
  • helper_functions.py 3.88 KiB
    """
    Provides helpful functions to facilitate ease-of-use of pyfstat
    """
    
    import os
    import sys
    import argparse
    import logging
    import inspect
    from functools import wraps
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    
    def set_up_optional_tqdm():
        try:
            from tqdm import tqdm
        except ImportError:
            def tqdm(x, *args, **kwargs):
                return x
        return tqdm
    
    
    def set_up_matplotlib_defaults():
        plt.switch_backend('Agg')
        plt.rcParams['text.usetex'] = True
        plt.rcParams['axes.formatter.useoffset'] = False
    
    
    def set_up_command_line_arguments():
        parser = argparse.ArgumentParser()
        parser.add_argument("-q", "--quite", help="Decrease output verbosity",
                            action="store_true")
        parser.add_argument("-v", "--verbose", help="Increase output verbosity",
                            action="store_true")
        parser.add_argument("--no-interactive", help="Don't use interactive",
                            action="store_true")
        parser.add_argument("-c", "--clean", help="Don't use cached data",
                            action="store_true")
        parser.add_argument("-u", "--use-old-data", action="store_true")
        parser.add_argument('-s', "--setup-only", action="store_true")
        parser.add_argument('-n', "--no-template-counting", action="store_true")
        parser.add_argument('unittest_args', nargs='*')
        args, unknown = parser.parse_known_args()
        sys.argv[1:] = args.unittest_args
        if args.quite or args.no_interactive:
            def tqdm(x, *args, **kwargs):
                return x
        else:
            tqdm = set_up_optional_tqdm()
        logger = logging.getLogger()
        logger.setLevel(logging.INFO)
        stream_handler = logging.StreamHandler()
        if args.quite:
            stream_handler.setLevel(logging.WARNING)
        elif args.verbose:
            stream_handler.setLevel(logging.DEBUG)
        else:
            stream_handler.setLevel(logging.INFO)
        stream_handler.setFormatter(logging.Formatter(
            '%(asctime)s %(levelname)-8s: %(message)s', datefmt='%H:%M'))
        logger.addHandler(stream_handler)
        return args, tqdm
    
    
    def set_up_ephemeris_configuration():
        """ Returns the earth_ephem and sun_ephem """
        config_file = os.path.expanduser('~')+'/.pyfstat.conf'
        if os.path.isfile(config_file):
            d = {}
            with open(config_file, 'r') as f:
                for line in f:
                    k, v = line.split('=')
                    k = k.replace(' ', '')
                    for item in [' ', "'", '"', '\n']:
                        v = v.replace(item, '')
                    d[k] = v
            earth_ephem = d['earth_ephem']
            sun_ephem = d['sun_ephem']
        else:
            logging.warning('No ~/.pyfstat.conf file found please provide the '
                            'paths when initialising searches')
            earth_ephem = None
            sun_ephem = None
        return earth_ephem, sun_ephem
    
    
    def round_to_n(x, n):
        if not x:
            return 0
        power = -int(np.floor(np.log10(abs(x)))) + (n - 1)
        factor = (10 ** power)
        return round(x * factor) / factor
    
    
    def texify_float(x, d=2):
        if x == 0:
            return 0
        if type(x) == str:
            return x
        x = round_to_n(x, d)
        if 0.01 < abs(x) < 100:
            return str(x)
        else:
            power = int(np.floor(np.log10(abs(x))))
            stem = np.round(x / 10**power, d)
            if d == 1:
                stem = int(stem)
            return r'${}{{\times}}10^{{{}}}$'.format(stem, power)
    
    
    def initializer(func):
        """ Decorator function to automatically assign the parameters to self """
        names, varargs, keywords, defaults = inspect.getargspec(func)
    
        @wraps(func)
        def wrapper(self, *args, **kargs):
            for name, arg in list(zip(names[1:], args)) + list(kargs.items()):
                setattr(self, name, arg)
    
            for name, default in zip(reversed(names), reversed(defaults)):
                if not hasattr(self, name):
                    setattr(self, name, default)
    
            func(self, *args, **kargs)
    
        return wrapper