Source code for csky.selections

# selections.py

"""Dataset wrangling module."""

from __future__ import print_function


import copy
try:
    import cPickle as pickle
except ImportError:
    import pickle
import numpy as np
pi = np.pi
import os
import socket
import sys

import histlite as hl

from . import utils


[docs] class Repository(object): """ Data file repository. This class provides a mechanism for loading data from the UW-Madison stores. If working elsewhere, it is possible to mirror the required data on request. """ remote_root = '/data/ana/analyses'
[docs] def __init__(self, local_root=None, remote_root=None, username=None): """ Construct a Repository. Args: local_root (str): local directory in which to read/write files """ self.local_root = os.path.abspath(local_root or self.remote_root) self.username = username if remote_root is not None: if remote_root[0] == '/': self.remote_root = remote_root else: raise ValueError('specify absolute path to `remote_root`') self.transfer = (self.local_root is not None) and (self.local_root != self.remote_root) self._cache = {}
def __getstate__(self): d = copy.copy(self.__dict__) d['_cache'] = {} return d def clear_cache(self): self._cache = {} def full_path(self, path): return os.path.join(self.local_root, path)
[docs] def ensure(self, path): """ Ensure that the specified file is locally accessible. """ full_path = self.full_path(path) if os.path.exists(full_path): return full_path if not self.transfer: raise ValueError('"{}" does not exist'.format(full_path)) dirname, filename = os.path.split(full_path) remote_path = os.path.join(self.remote_root, path) utils.ensure_dir(dirname) print('Downloading {}'.format(remote_path)) print(' -> {} ...'.format(full_path)) if 'icecube.wisc.edu' in socket.gethostname(): cmd = 'ln -s {} {}'.format( remote_path, full_path) elif bool(self.username): cmd = 'rsync -PavL {}@data.icecube.wisc.edu:{} {}'.format( self.username, remote_path, full_path) else: cmd = 'wget {} http://convey.icecube.wisc.edu{} -O {}'.format( '--user=icecube --ask-password', remote_path, full_path) print(cmd) x = os.system(cmd) if x: try: os.remove(full_path) except: pass if x or not os.path.exists(full_path): raise RuntimeError('unsuccessful fetch') return full_path
[docs] def load(self, path, backend=None, target_class=utils.Arrays, quiet=False, kw=dict(convert=True), mmap=False): """ Load a file. """ try: self._cache except: self._cache = {} if path in self._cache: return self._cache[path] full_path = self.ensure(path) if not quiet: print('Reading {} ...'.format(full_path)) sys.stdout.flush() def load_pickle(s): with open(s) as f: return pickle.load(f) def load_genfromtxt(s): return np.genfromtxt(s, names=True) def load_numpy(s): try: return np.load(s, allow_pickle=True, mmap_mode='r' if mmap else None) except: return np.load(s, allow_pickle=True, encoding='latin1') fs = dict( pickle = load_pickle, np = load_numpy, txt = load_genfromtxt, ) if backend is None: backends = 'np pickle txt'.split() else: backends = [backend] for backend in backends: try: out = fs[backend](full_path) break except: continue else: raise RuntimeError('could not find a backend for loading "{}"'.format(full_path)) if target_class is not None: if isinstance(out, np.ndarray) and out.dtype == np.dtype('object'): out = out[()] out = target_class(out, **kw) self._cache[path] = out return out
def get_catalog(self, name, weight=None): c = self.load('catalogs/{}.dict.npy'.format(name)) if weight is None: if name == 'blackhole': weight = 'flux2m' elif name == 'starburst': weight = 'S60m' elif 'weight' not in c: weight = 'eq' else: weight = 'weight' if name == 'seyfert': if weight == 'flux': c['weight'] = c.flux elif weight == 'z': c['weight'] = 1 / c.redshift**2 elif weight == 'eq': c['weight'] = np.ones_like(c.dec) elif weight != 'eq': c['weight'] = c[weight] else: c['weight'] = np.ones_like(c.dec) if 'extension' not in c: c['extension'] = np.zeros_like(c.dec) c['weight_prenorm'] = c.weight c['weight'] = c.weight / np.sum(c.weight) return c def get_performance(self, name, quiet=False): return self.load('performance/{}.tuple.npy'.format(name), target_class=None, quiet=quiet) def save_performance(self, sindecs, sens_flux, name, description=' '): path=utils.ensure_dir(self.full_path('performance/')) np.save('{}/{}.tuple.npy'.format(path, name), np.array([sindecs, sens_flux, description])) def get_template(self, name, per_pixel_flux=False): if per_pixel_flux: load_key = 'templates/{}.tuple.npy'.format(name) things = self.load(load_key, target_class=None) # The way our oneweights and simulation is setup we # need the flux to be per-flavor (nu + nubar) # The template is provided in all-flavor flux, # therefore we divide by 3 assuming and equal # flux ratio at Earth. flux_nu, flux_nubar = things[1], things[2] # get flux of both nu and nubar flux = flux_nu + flux_nubar # divide by 3 to obtain per-flavor flux flux /= 3. bins_energy = things[3] return flux, bins_energy else: load_key = 'templates/{}.npy'.format(name) return self.load(load_key, target_class=None)
[docs] class Dataset(object): """ Background and signal data. These normally should not be constructed directly; see :meth:`csky.utils.get_analysis`. """
[docs] def __init__(self, key, livetime, sig, data=None, bg=None, cascades=False, grl=None, range_sindec=(-1,+1)): """ Construct a :class:`Dataset`. Args: key (str): a unique identifier for these datasets livetime (float): The livetime of this analysis. sig (mapping or object): an object containing at least the following members or keys: ``dec``, ``ra``, ``true_dec``, ``true_ra``, ``true_energy``, ``oneweight`` (OneWeight/ngen). Corresponding values should be per-event numpy arrays. bg (mapping or object, optional): like ``data``, but must include ``weight``. data (mapping or object, optional): an object containing at least the following members or keys: ``dec``, ``ra``, ``weight``. Corresponding values should be per-event numpy arrays, except for ``weight`` which may be None. cascades (bool): whether this is cascade data as opposed to tracks grl (:class:`csky.utils.Arrays`): the good run list One of ``bg`` or ``data`` must be provided. ``sig``, ``bg``, and ``data`` will generally need additional keys such as ``energy`` (for use with energy PDFs) and/or ``sigma`` (for per-event Gaussian signal space PDFs). """ self.key = key self.sig = sig if bg is None and data is None: raise ValueError('one of `bg` or `data` must be given') self.data = data if data is not None: data['ra'] = data.ra.copy() data['dec'] = data.dec.copy() if 'sigma' in data: data['sigma'] = data.sigma.copy() self.grl = grl if self.grl is not None: self.grl = grl = self.grl[np.argsort(self.grl.start)] if 'livetime' not in grl: if 'length' in grl: grl['livetime'] = grl.length else: grl['livetime'] = grl.stop - grl.start self.livetime = 86400 * np.sum(self.grl.livetime) else: self.livetime = livetime self.bg = bg self.cascades = cascades self.range_sindec = range_sindec
def __repr__(self): ss = ['Dataset(\'{}\', livetime = {:.0f}s) with '.format( self.key, self.livetime )] sdata = sbg = '' if self.data is not None: sdata = '{} data events'.format(len(self.data.dec)) if self.bg is not None: sbg = '{} expected bg events'.format(np.sum(self.bg.weight)) else: sbg = 'no background MC loaded' if self.sig is not None: ssig = 'sum(ow*E^-2) = {:.2f}'.format(np.sum(self.sig.oneweight * self.sig.true_energy**-2)) else: ssig = 'no signal MC loaded' ss += ' and '.join((sdata, sbg, ssig)) return ''.join(ss) def apply_min_sigma(self, min_sigma): self.data['sigma'] = np.maximum(self.data.sigma, min_sigma) if self.sig is not None: self.sig['sigma'] = np.maximum(self.sig.sigma, min_sigma)
[docs] class StopModifications(Exception):
[docs] def __init__(self, *a, **kw): super(StopModifications, self).__init__(*a, **kw)
class DataSpec(object): cascades = None _kw_dec = {} _kw_energy = {} _kw_angres = {} _path_sig = None _path_data = None _path_grls = None _path_bg = None _livetime = None _key = '' _keep = 'mjd true_energy oneweight run event subevent'.split() _keep32 = 'azimuth ra dec energy sigma dist true_ra true_dec xdec xra'.split() _version = '' @property def key(self): return self._key or self.__class__.__name__ @key.setter def key(self, x): self._key = x @property def livetime(self): return self._livetime @livetime.setter def livetime(self, x): self._livetime = x @property def livetime_days(self): return self._livetime / 86400. @livetime_days.setter def livetime_days(self, x): self._livetime = x / 86400. @property def path_sig(self): return self._path_sig @path_sig.setter def path_sig(self, x): self._path_sig = x @property def path_data(self): return self._path_data @path_data.setter def path_data(self, x): self._path_data = x @property def path_grls(self): return self._path_grls @path_grls.setter def path_grls(self, x): self._path_grls = x @property def path_bg(self): return self._path_bg @path_bg.setter def path_bg(self, x): self._path_bg = x @property def version(self): return self._version @version.setter def version(self, x): self._version = x if x != 'current': self.version_adjust() def version_adjust(self): return @property def bins_sindec(self): return self._bins_sindec @bins_sindec.setter def bins_sindec(self, x): self._bins_sindec = x @property def bins_logenergy(self): return self._bins_logenergy @bins_logenergy.setter def bins_logenergy(self, x): self._bins_logenergy = x @property def kw_dec(self): kw = dict(bins=self.bins_sindec) kw.update(self._kw_dec) return kw @kw_dec.setter def kw_dec(self, x): self._kw_dec = x @property def kw_energy(self): kw = dict(bins_sindec=self.bins_sindec, bins_logenergy=self.bins_logenergy) kw.update(self._kw_energy) return kw @kw_energy.setter def kw_energy(self, x): self._kw_energy = x @property def kw_angres(self): kw = dict(apr_type=None) kw.update(self._kw_angres) return kw @kw_angres.setter def kw_angres(self, x): self._kw_angres = x def __repr__(self): return '{}'.format(type(self)) def dataset_modifications(self, ds): return def load(self, repo, quiet=False, compress=True, load_sig=True, mmap=True): def load_str_or_list(path, compress, target_class=utils.Events): def load_one(p): # set version number before loading p = p.format(version=self.version) return repo.load(p, target_class=target_class, mmap=mmap) if isinstance(path, str): out = load_one(path) elif isinstance(path, list): out = load_one(path[0]) for pathi in path[1:]: outi = load_one(pathi) out += outi elif path is not None: # catchall: we must already be looking at the data itself out = target_class(path) else: out = None if compress and (out is not None): out.compress(keep=self._keep, keep32=self._keep32) return out if load_sig: s = load_str_or_list(self.path_sig, compress=compress) if s is None: raise ValueError('signal MC path or list of paths is required') else: s = None d = load_str_or_list(self.path_data, compress=compress) b = load_str_or_list(self.path_bg, compress=compress) grl = load_str_or_list(self.path_grls, target_class=utils.Arrays, compress=False) range_sindec = tuple(self.bins_sindec[[0,-1]]) ds = Dataset(self.key, self.livetime, s, data=d, bg=b, grl=grl, cascades=self.cascades, range_sindec=range_sindec) for cls in self.__class__.mro(): if hasattr(cls, 'dataset_modifications'): try: cls.dataset_modifications(self, ds) except StopModifications: break return ds class TrackSpec(DataSpec): cascades = False class CascadeSpec(DataSpec): cascades = True class DNNCascadeDataSpecs(object): class DNNCascadeDataSpec(CascadeSpec): _bins_sindec = np.linspace(-1, 1, 31) _bins_logenergy = np.linspace(2, 8.01, 15) _kw_energy = dict (bins_sindec=np.linspace (-1, 1, 10)) _livetime = 3519.685 * 86400 class DNNCascade_10yr(DNNCascadeDataSpec): _path_data = [ 'dnn_cascades/{version}/IC86_2011_exp.npy', 'dnn_cascades/{version}/IC86_2012_exp.npy', 'dnn_cascades/{version}/IC86_2013_exp.npy', 'dnn_cascades/{version}/IC86_2014_exp.npy', 'dnn_cascades/{version}/IC86_2015_exp.npy', 'dnn_cascades/{version}/IC86_2016_exp.npy', 'dnn_cascades/{version}/IC86_2017_exp.npy', 'dnn_cascades/{version}/IC86_2018_exp.npy', 'dnn_cascades/{version}/IC86_2019_exp.npy', 'dnn_cascades/{version}/IC86_2020_exp.npy'] _path_grls = [ 'dnn_cascades/{version}/GRL/IC86_2011_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2012_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2013_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2014_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2015_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2016_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2017_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2018_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2019_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2020_exp.npy'] _path_sig = 'dnn_cascades/{version}/MC_NuGen_bfrv1_2153x.npy' class DNNCascade_10yr_snowstorm_fullrange(DNNCascadeDataSpec): _path_data = [ 'dnn_cascades/{version}/IC86_2011_exp.npy', 'dnn_cascades/{version}/IC86_2012_exp.npy', 'dnn_cascades/{version}/IC86_2013_exp.npy', 'dnn_cascades/{version}/IC86_2014_exp.npy', 'dnn_cascades/{version}/IC86_2015_exp.npy', 'dnn_cascades/{version}/IC86_2016_exp.npy', 'dnn_cascades/{version}/IC86_2017_exp.npy', 'dnn_cascades/{version}/IC86_2018_exp.npy', 'dnn_cascades/{version}/IC86_2019_exp.npy', 'dnn_cascades/{version}/IC86_2020_exp.npy'] _path_grls = [ 'dnn_cascades/{version}/GRL/IC86_2011_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2012_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2013_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2014_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2015_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2016_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2017_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2018_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2019_exp.npy', 'dnn_cascades/{version}/GRL/IC86_2020_exp.npy'] _path_sig = 'dnn_cascades/{version}/systematics/SnowStorm_Spice321/MC_NuGen_snowstorm_214xx.npy' DNNC_10yr = [DNNCascade_10yr] DNNC_10yr_systematics = [DNNCascade_10yr_snowstorm_fullrange] class PSDataSpecs(object): class PSDataSpec(TrackSpec): def version_adjust(self): if self.version <= 'version-002-p01': self.path_sig = 'ps_tracks/{{version}}/IC{}_corrected_MC.npy'.format(self._old_number) self.path_data = 'ps_tracks/{{version}}/IC{}_exp.npy'.format(self._old_number) self.path_grls = 'ps_tracks/{{version}}/IC{}_GRL.npy'.format(self._old_number) class IC40 (PSDataSpec): _path_sig = 'ps_tracks/{version}/IC40_MC.npy' _path_data = 'ps_tracks/{version}/IC40_exp.npy' _path_grls = ['ps_tracks/{version}/GRL/IC40_exp.npy'] _bins_sindec = np.unique(np.concatenate([ np.linspace(-1., -0.25, 10 + 1), np.linspace(-0.25, 0.0, 10 + 1), np.linspace(0.0, 1., 10 + 1) ]) ) _bins_logenergy = np.arange(2, 9. + 0.01, 0.125) _old_number = '40' class IC59 (PSDataSpec): _path_sig = 'ps_tracks/{version}/IC59_MC.npy' _path_data = 'ps_tracks/{version}/IC59_exp.npy' _path_grls = ['ps_tracks/{version}/GRL/IC59_exp.npy'] _bins_sindec = np.unique(np.concatenate([ np.linspace(-1., -0.95, 2 + 1), np.linspace(-0.95, -0.25, 25 + 1), np.linspace(-0.25, 0.05, 15 + 1), np.linspace(0.05, 1, 10 + 1) ]) ) _bins_logenergy = np.arange(2, 9.5 + 0.01, 0.125) _old_number = '59' class IC79 (PSDataSpec): _path_sig = 'ps_tracks/{version}/IC79_MC.npy' _path_data = 'ps_tracks/{version}/IC79_exp.npy' _path_grls = ['ps_tracks/{version}/GRL/IC79_exp.npy'] _bins_sindec = np.linspace(-1, 1, 50) _bins_logenergy = np.arange(2, 9 + 0.01, 0.125) _old_number = '79b' class IC86_2011 (PSDataSpec): _version = 'version-003-p02' _path_sig = 'ps_tracks/{version}/IC86_2011_MC.npy' _path_data = 'ps_tracks/{version}/IC86_2011_exp.npy' _path_grls = ['ps_tracks/{version}/GRL/IC86_2011_exp.npy'] _bins_sindec = np.unique(np.concatenate([ np.linspace(-1, -0.2, 10 + 1), np.linspace(-0.2, np.sin(np.radians(-5)), 4 + 1), np.linspace(np.sin(np.radians(-5)), 0.2, 5 + 1), np.linspace(0.2, 1, 10) ]) ) _bins_logenergy = np.arange(1, 10 + 0.01, 0.125) _old_number = '86' class IC86_2012_2014 (PSDataSpec): _version = 'version-003-p02' _path_sig = 'ps_tracks/{version}/IC86_2012_MC.npy' _path_data = ['ps_tracks/{version}/IC86_2012_exp.npy', 'ps_tracks/{version}/IC86_2013_exp.npy', 'ps_tracks/{version}/IC86_2014_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2012_exp.npy', 'ps_tracks/{version}/GRL/IC86_2013_exp.npy', 'ps_tracks/{version}/GRL/IC86_2014_exp.npy'] _bins_sindec = np.unique(np.concatenate([ np.linspace(-1, -0.93, 4 + 1), np.linspace(-0.93, -0.3, 10 + 1), np.linspace(-0.3, 0.05, 9 + 1), np.linspace(0.05, 1, 18 + 1) ]) ) _bins_logenergy = np.arange(1, 9.5 + 0.01, 0.125) def version_adjust(self): if self.version <= 'version-002-p01': self.path_sig = 'ps_tracks/{version}/IC86-2012_corrected_MC_v2.npy' self.path_data = ['ps_tracks/{version}/IC86-2012_exp_v2.npy', 'ps_tracks/{version}/IC86-2013_exp_v2.npy', 'ps_tracks/{version}/IC86-2014_exp_v2.npy'] self.path_grls = ['ps_tracks/{version}/IC86-2012_GRL.npy', 'ps_tracks/{version}/IC86-2013_GRL.npy', 'ps_tracks/{version}/IC86-2014_GRL.npy'] class IC86v2_2012(PSDataSpec): _version = 'version-003-p02' _path_sig = 'ps_tracks/{version}/IC86_2012_MC.npy' _path_data = ['ps_tracks/{version}/IC86_2012_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2012_exp.npy'] _bins_sindec = np.unique(np.concatenate([ np.linspace(-1, -0.93, 4 + 1), np.linspace(-0.93, -0.3, 10 + 1), np.linspace(-0.3, 0.05, 9 + 1), np.linspace(0.05, 1, 18 + 1) ]) ) _bins_logenergy = np.arange(1, 9.5 + 0.01, 0.125) class IC86v2_2012(PSDataSpec): _version = 'version-003-p02' _path_sig = 'ps_tracks/{version}/IC86_2012_MC.npy' _path_data = ['ps_tracks/{version}/IC86_2012_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2012_exp.npy'] _bins_sindec = np.unique(np.concatenate([ np.linspace(-1, -0.93, 4 + 1), np.linspace(-0.93, -0.3, 10 + 1), np.linspace(-0.3, 0.05, 9 + 1), np.linspace(0.05, 1, 18 + 1) ]) ) _bins_logenergy = np.arange(1, 9.5 + 0.01, 0.125) class PSv3DataSpec(PSDataSpec): _version = 'version-003-p02' _path_sig = 'ps_tracks/{version}/IC86_2012_MC.npy' _bins_sindec = np.unique(np.concatenate([ np.linspace(-1, -0.93, 4 + 1), np.linspace(-0.93, -0.3, 10 + 1), np.linspace(-0.3, 0.05, 9 + 1), np.linspace(0.05, 1, 18 + 1) ]) ) _bins_logenergy = np.arange(1, 9.5 + 0.01, 0.125) class IC86v3_2012_2017 (PSv3DataSpec): _path_data = ['ps_tracks/{version}/IC86_2012_exp.npy', 'ps_tracks/{version}/IC86_2013_exp.npy', 'ps_tracks/{version}/IC86_2014_exp.npy', 'ps_tracks/{version}/IC86_2015_exp.npy', 'ps_tracks/{version}/IC86_2016_exp.npy', 'ps_tracks/{version}/IC86_2017_exp.npy' ] _path_grls = ['ps_tracks/{version}/GRL/IC86_2012_exp.npy', 'ps_tracks/{version}/GRL/IC86_2013_exp.npy', 'ps_tracks/{version}/GRL/IC86_2014_exp.npy', 'ps_tracks/{version}/GRL/IC86_2015_exp.npy', 'ps_tracks/{version}/GRL/IC86_2016_exp.npy', 'ps_tracks/{version}/GRL/IC86_2017_exp.npy'] class IC86v3_2012_2016(PSv3DataSpec): _path_data = ['ps_tracks/{version}/IC86_2012_exp.npy', 'ps_tracks/{version}/IC86_2013_exp.npy', 'ps_tracks/{version}/IC86_2014_exp.npy', 'ps_tracks/{version}/IC86_2015_exp.npy', 'ps_tracks/{version}/IC86_2016_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2012_exp.npy', 'ps_tracks/{version}/GRL/IC86_2013_exp.npy', 'ps_tracks/{version}/GRL/IC86_2014_exp.npy', 'ps_tracks/{version}/GRL/IC86_2015_exp.npy', 'ps_tracks/{version}/GRL/IC86_2016_exp.npy'] class IC86v3_2012 (PSv3DataSpec): _path_data = ['ps_tracks/{version}/IC86_2012_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2012_exp.npy'] class IC86v3_2013 (PSv3DataSpec): _path_data = ['ps_tracks/{version}/IC86_2013_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2013_exp.npy'] class IC86v3_2014 (PSv3DataSpec): _path_data = ['ps_tracks/{version}/IC86_2014_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2014_exp.npy'] class IC86v3_2015 (PSv3DataSpec): _path_data = ['ps_tracks/{version}/IC86_2015_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2015_exp.npy'] class IC86v3_2016 (PSv3DataSpec): _path_data = ['ps_tracks/{version}/IC86_2016_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2016_exp.npy'] class IC86v3_2017 (PSv3DataSpec): _path_data = ['ps_tracks/{version}/IC86_2017_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2017_exp.npy'] class PSMESTDataSpec(PSDataSpec): _path_sig = 'ps_tracks/{version}/MESE_corrected_MC.npy' _bins_sindec = np.linspace(-1, -0.094, 20+1) _bins_logenergy = np.arange(2, 9.5 + 0.01, .25) _kw_energy = dict(bins_sindec=np.r_[-1, -0.094]) class PS_MEST_2010_2012 (PSMESTDataSpec): _livetime = (315.506 + 332.61 + 331.358) * 86400 _path_data = 'ps_tracks/{version}/MESE_exp.npy' class PS_MEST_2013_2014 (PSMESTDataSpec): _livetime = (359.768 + 367.209) * 86400 _path_data = 'ps_tracks/{version}/MESE_exp.npy' class PS_MEST_2010_2014 (PSMESTDataSpec): _livetime = (315.506 + 332.61 + 331.358 + 359.768 + 367.209) * 86400 _path_data = 'ps_tracks/{version}/MESE_2010_2014_exp.npy' _bins_sindec = np.linspace(-1, -0.094, 40+1) class IC86v4 (PSDataSpec): _bins_sindec = np.unique(np.concatenate([ np.linspace(-1, -0.93, 4 + 1), np.linspace(-0.93, -0.3, 10 + 1), np.linspace(-0.3, 0.05, 9 + 1), np.linspace(0.05, 1, 18 + 1) ]) ) _bins_logenergy = np.arange(1, 9.5 + 0.01, 0.125) _path_sig = 'ps_tracks/{version}/IC86_2016_MC.npy' _path_data = ['ps_tracks/{version}/IC86_2011_exp.npy', 'ps_tracks/{version}/IC86_2012_exp.npy', 'ps_tracks/{version}/IC86_2013_exp.npy', 'ps_tracks/{version}/IC86_2014_exp.npy', 'ps_tracks/{version}/IC86_2015_exp.npy', 'ps_tracks/{version}/IC86_2016_exp.npy', 'ps_tracks/{version}/IC86_2017_exp.npy', 'ps_tracks/{version}/IC86_2018_exp.npy', 'ps_tracks/{version}/IC86_2019_exp.npy', 'ps_tracks/{version}/IC86_2020_exp.npy', 'ps_tracks/{version}/IC86_2021_exp.npy'] _path_grls = ['ps_tracks/{version}/GRL/IC86_2011_exp.npy', 'ps_tracks/{version}/GRL/IC86_2012_exp.npy', 'ps_tracks/{version}/GRL/IC86_2013_exp.npy', 'ps_tracks/{version}/GRL/IC86_2014_exp.npy', 'ps_tracks/{version}/GRL/IC86_2015_exp.npy', 'ps_tracks/{version}/GRL/IC86_2016_exp.npy', 'ps_tracks/{version}/GRL/IC86_2017_exp.npy', 'ps_tracks/{version}/GRL/IC86_2018_exp.npy', 'ps_tracks/{version}/GRL/IC86_2019_exp.npy', 'ps_tracks/{version}/GRL/IC86_2020_exp.npy', 'ps_tracks/{version}/GRL/IC86_2021_exp.npy'] ps_2011 = [IC86_2011] ps_3yr = [IC79, IC86_2011, IC86v2_2012] ps_4yr = [IC40, IC59, IC79, IC86_2011] ps_7yr = ps_4yr + [IC86_2012_2014] ps_v3 = [IC86v3_2012_2017] ps_v3_separate = [IC86v3_2012, IC86v3_2013, IC86v3_2014, IC86v3_2015, IC86v3_2016, IC86v3_2017] ps_v3a = [IC86v3_2012_2016] ps_v3b = [IC86v3_2017] ps_10yr = ps_4yr + ps_v3 ps_10yr_separate_2017 = ps_4yr + ps_v3a + ps_v3b ps_10yr_separate = ps_4yr + ps_v3_separate mest_3yr = [PS_MEST_2010_2012] mest_5yr = [PS_MEST_2010_2014] ps_v4 = [IC40, IC59, IC79, IC86v4] class GCDataSpecs(object): class GCDataSpec(TrackSpec): sindec_lolim, sindec_uplim = -0.6284542535027126, -0.3245146369013894 _bins_sindec = np.linspace(sindec_lolim, sindec_uplim, 11) _bins_logenergy = np.linspace(2, 10, 5) class GC_2011_2022(GCDataSpec): _version = 'version-001-p00' _path_sig = 'galactic_center/{version}/IC86_2016_20878_L5_MC.npy' _path_data = ['galactic_center/{version}/IC86_2011_L5_data.npy', 'galactic_center/{version}/IC86_2012_L5_data.npy', 'galactic_center/{version}/IC86_2013_L5_data.npy', 'galactic_center/{version}/IC86_2014_L5_data.npy', 'galactic_center/{version}/IC86_2015_L5_data.npy', 'galactic_center/{version}/IC86_2016_L5_data.npy', 'galactic_center/{version}/IC86_2017_L5_data.npy', 'galactic_center/{version}/IC86_2018_L5_data.npy', 'galactic_center/{version}/IC86_2019_L5_data.npy', 'galactic_center/{version}/IC86_2020_L5_data.npy', 'galactic_center/{version}/IC86_2021_L5_data.npy', 'galactic_center/{version}/IC86_2022_L5_data.npy'] _path_grls = ['galactic_center/{version}/GRL/IC86_2011_data.npy', 'galactic_center/{version}/GRL/IC86_2012_data.npy', 'galactic_center/{version}/GRL/IC86_2013_data.npy', 'galactic_center/{version}/GRL/IC86_2014_data.npy', 'galactic_center/{version}/GRL/IC86_2015_data.npy', 'galactic_center/{version}/GRL/IC86_2016_data.npy', 'galactic_center/{version}/GRL/IC86_2017_data.npy', 'galactic_center/{version}/GRL/IC86_2018_data.npy', 'galactic_center/{version}/GRL/IC86_2019_data.npy', 'galactic_center/{version}/GRL/IC86_2020_data.npy', 'galactic_center/{version}/GRL/IC86_2021_data.npy', 'galactic_center/{version}/GRL/IC86_2022_data.npy'] gc_12year = [GC_2011_2022] class GFUDataSpecs(object): class GFUDataSpec(TrackSpec): _bins_sindec = np.unique(np.concatenate([ np.linspace(-1, -0.93, 4 + 1), np.linspace(-0.93, -0.3, 10 + 1), np.linspace(-0.3, 0.05, 9 + 1), np.linspace(0.05, 1, 18 + 1) ])) _bins_logenergy = np.arange(1, 9.5 + 0.01, 0.125) def dataset_modifications(self, ds): max_sigma = np.radians(15) ds.data = ds.data[ds.data.sigma < max_sigma] ds.sig = ds.sig[ds.sig.sigma < max_sigma] #ds.data.sigma = np.minimum(ds.data.sigma, max_sigma) #ds.sig.sigma = np.minimum(ds.sig.sigma, max_sigma) class GFU_2015_2017 (GFUDataSpec): #_version = 'version-002-p06' _path_sig = 'gfu/{version}/IC86_2011_MC.npy' _path_data = ['gfu/{version}/IC86_2015_data.npy', 'gfu/{version}/IC86_2016_data.npy', 'gfu/{version}/IC86_2017_data.npy'] _path_grls = ['gfu/{version}/GRL/IC86_2015_data.npy', 'gfu/{version}/GRL/IC86_2016_data.npy', 'gfu/{version}/GRL/IC86_2017_data.npy'] def version_adjust(self): if self.version <= "version-002-p03": self.path_sig = 'gfu/{version}/IC86_2015_MC.npy' if self.version <= 'version-002-p02': self.path_sig = 'gfu/{version}/SplineMPEmax.MuEx.MC.npy' self.path_data = ['gfu/{version}/SplineMPEmax.MuEx.IC86-2015.npy', 'gfu/{version}/SplineMPEmax.MuEx.IC86-2016.npy', 'gfu/{version}/SplineMPEmax.MuEx.IC86-2017.npy'] self.path_grls = 'gfu/{version}/SplineMPEmax.MuEx.GRL.npy' class GFU_2015_2018 (GFUDataSpec): #_version = 'version-002-p06' _path_sig = 'gfu/{version}/IC86_2011_MC.npy' _path_data = ['gfu/{version}/IC86_2015_data.npy', 'gfu/{version}/IC86_2016_data.npy', 'gfu/{version}/IC86_2017_data.npy', 'gfu/{version}/IC86_2018_data.npy'] _path_grls = ['gfu/{version}/GRL/IC86_2015_data.npy', 'gfu/{version}/GRL/IC86_2016_data.npy', 'gfu/{version}/GRL/IC86_2017_data.npy', 'gfu/{version}/GRL/IC86_2018_data.npy'] class GFU_2015_2019 (GFUDataSpec): _path_sig = 'gfu/{version}/IC86_2011_MC.npy' _path_data = ['gfu/{version}/IC86_2015_data.npy', 'gfu/{version}/IC86_2016_data.npy', 'gfu/{version}/IC86_2017_data.npy', 'gfu/{version}/IC86_2018_data.npy', 'gfu/{version}/IC86_2019_data.npy'] _path_grls = ['gfu/{version}/GRL/IC86_2015_data.npy', 'gfu/{version}/GRL/IC86_2016_data.npy', 'gfu/{version}/GRL/IC86_2017_data.npy', 'gfu/{version}/GRL/IC86_2018_data.npy', 'gfu/{version}/GRL/IC86_2019_data.npy'] class GFU_IC86_2011_2018 (GFUDataSpec): _path_sig = 'gfu/{version}/IC86_2011_MC.npy' _path_data = ['gfu/{{version}}/IC86_201{}_data.npy'.format(i) for i in range(1,9)] _path_grls = ['gfu/{{version}}/GRL/IC86_201{}_data.npy'.format(i) for i in range(1,9)] def __init__(self, years=list(map(str, 2010 + np.arange(1, 9)))): self.path_data = ['gfu/{{version}}/IC86_{}_data.npy'.format(y) for y in years] self.path_grls = ['gfu/{{version}}/GRL/IC86_{}_data.npy'.format(y) for y in years] self._key = 'GFU_for_' + '_'.join(years) class GFU_IC86 (GFUDataSpec): _path_sig = 'gfu/{version}/IC86_2011_MC.npy' _path_data = ['gfu/{{version}}/IC86_201{}_data.npy'.format(i) for i in range(1,10)] _path_grls = ['gfu/{{version}}/GRL/IC86_201{}_data.npy'.format(i) for i in range(1,10)] def __init__(self, years=list(map(str, 2010 + np.arange(1, 10)))): self.path_data = ['gfu/{{version}}/IC86_{}_data.npy'.format(y) for y in years] self.path_grls = ['gfu/{{version}}/GRL/IC86_{}_data.npy'.format(y) for y in years] self._key = 'GFU_for_' + '_'.join(years) gfu_3yr = [GFU_2015_2017] gfu_4yr = [GFU_2015_2018] gfu_IC86 = [GFU_IC86] class MESEDataSpecs(object): class MESCDataSpec(CascadeSpec): _bins_sindec = np.linspace(-1, 1, 21) _bins_logenergy = np.arange(2, 8.01, .5) class MESC_2010_2016_DNN_NoSysInj(MESCDataSpec): def dataset_modifications(self, ds): # TODO: how'd a sigma get nan'd? good = np.isfinite(ds.data.sigma) ds.data = ds.data[good] _livetime = 86400*2428.47 _path_sig = 'mese/{version}/mese_cascades_MC_2013_dnn.npy' _path_data = 'mese/{version}/mese_cascades_2010_2016_dnn.npy' _kw_energy = dict(bins_sindec=np.linspace(-1, 1, 11)) class MESC_2010_2016_DNN(MESC_2010_2016_DNN_NoSysInj): def dataset_modifications(self, ds): from . import coord # TODO: how'd a sigma get nan'd? good = np.isfinite(ds.data.sigma) ds.data = ds.data[good] # boost injection DeltaPsi according to # HESE resim E-dependent factor ds.sig = copy.deepcopy(ds.sig) sig = ds.sig def pull_fit(E, m, b, Eb): LE = np.log10 (E) LEb = np.log10 (Eb) return m * np.log10 (np.maximum(E, Eb)) + b sys_pull_params = [4.24687993e-01, -9.57285908e-01, 2.11231642e+05] pull_corr = lambda sigma, E: sigma * pull_fit(E, *sys_pull_params) / 1.1774 xra = pull_corr(sig.xra, sig.energy) xdec = pull_corr(sig.xdec, sig.energy) sig['xra'], sig['xdec'] = xra, xdec sig['dec'], sig['ra'] = coord.rotate_xaxis_to_source( sig.true_dec, sig.true_ra, sig.xdec, sig.xra, latlon=True) class MESC_2010_2016_monopod (MESCDataSpec): _livetime = 86400*2428.47 _path_sig = 'mese/monopod/mese_cascades_MC_2013.npy' _path_data = 'mese/monopod/mese_cascades_2010_2016.npy' class MESC_2010_2016(MESCDataSpec): _version = 'version-001-p02' _path_sig = 'mese_cascades/{version}/IC86_2013_MC.npy' _path_data = [ 'mese_cascades/{version}/IC79_exp.npy', 'mese_cascades/{version}/IC86_2011_exp.npy', 'mese_cascades/{version}/IC86_2012_exp.npy', 'mese_cascades/{version}/IC86_2013_exp.npy', 'mese_cascades/{version}/IC86_2014_exp.npy', 'mese_cascades/{version}/IC86_2015_exp.npy', 'mese_cascades/{version}/IC86_2016_exp.npy', ] _path_grls = [ 'mese_cascades/{version}/GRL/IC79_exp.npy', 'mese_cascades/{version}/GRL/IC86_2011_exp.npy', 'mese_cascades/{version}/GRL/IC86_2012_exp.npy', 'mese_cascades/{version}/GRL/IC86_2013_exp.npy', 'mese_cascades/{version}/GRL/IC86_2014_exp.npy', 'mese_cascades/{version}/GRL/IC86_2015_exp.npy', 'mese_cascades/{version}/GRL/IC86_2016_exp.npy', ] _kw_energy = dict(bins_sindec=np.linspace(-1, 1, 11)) mesc_7yr_dnn = [MESC_2010_2016_DNN] mesc_7yr_dnn_noinjsys = [MESC_2010_2016_DNN_NoSysInj] mesc_7yr = [MESC_2010_2016] class NTDataSpecs(object): class NTDataSpec(TrackSpec): _bins_sindec = np.unique(np.concatenate([ np.linspace(np.sin(-np.radians(5)), 0.2, 24 + 1), np.linspace(0.2, 0.9, 24 + 1), np.linspace(0.9, 1.0, 4 + 1) ])) _bins_logenergy = np.linspace(2, 7, 40+1) def dataset_modifications(self, ds): ds.data = ds.data[np.sin(ds.data.dec) >= self.bins_sindec.min()] ds.sig = ds.sig[np.sin(ds.sig.dec) >= self.bins_sindec.min()] #min_sigma = np.radians(0.2) #ds.data['sigma'] = np.maximum(ds.data.sigma, min_sigma) #ds.sig['sigma'] = np.maximum(ds.sig.sigma, min_sigma) class NT59 (NTDataSpec): _path_sig = 'northern_tracks/{version}/dataset_8yr_fit_IC59_MC_compressed.npy' _path_data = 'northern_tracks/{version}/dataset_8yr_fit_IC59_exp_compressed.npy' _path_grls = ['northern_tracks/{version}/GRL/dataset_8yr_fit_IC59_exp_compressed.npy'] _bins_sindec = np.unique(np.concatenate([ np.linspace(0.0, 0.2, 14 + 1), np.linspace(0.2, 0.9, 24 + 1), np.linspace(0.9, 1.0, 4 + 1) ])) _bins_logenergy = np.linspace(-1.5, 2., 40 + 1) class NT79 (NTDataSpec): _path_sig = 'northern_tracks/{version}/dataset_8yr_fit_IC79_MC_compressed.npy' _path_data = 'northern_tracks/{version}/dataset_8yr_fit_IC79_exp_compressed.npy' _path_grls = ['northern_tracks/{version}/GRL/dataset_8yr_fit_IC79_exp_compressed.npy'] class NT86_2011 (NTDataSpec): _path_sig = 'northern_tracks/{version}/dataset_8yr_fit_IC86_2011_MC_compressed.npy' _path_data = 'northern_tracks/{version}/dataset_8yr_fit_IC86_2011_exp_compressed.npy' _path_grls = ['northern_tracks/{version}/GRL/dataset_8yr_fit_IC86_2011_exp_compressed.npy'] class NT86_2012_2016 (NTDataSpec): _path_sig = 'northern_tracks/{version}/dataset_8yr_fit_IC86_2012_16_MC_compressed.npy' _path_data = 'northern_tracks/{version}/dataset_8yr_fit_IC86_2012_16_exp_compressed.npy' _path_grls = ['northern_tracks/{version}/GRL/dataset_8yr_fit_IC86_2012_16_exp_compressed.npy'] class NT86v5 (NTDataSpec): _path_sig = 'northern_tracks/{version}/IC86_pass2_MC.npy' _path_data = ['northern_tracks/{version}/IC86_2011_exp.npy', 'northern_tracks/{version}/IC86_2012_exp.npy', 'northern_tracks/{version}/IC86_2013_exp.npy', 'northern_tracks/{version}/IC86_2014_exp.npy', 'northern_tracks/{version}/IC86_2015_exp.npy', 'northern_tracks/{version}/IC86_2016_exp.npy', 'northern_tracks/{version}/IC86_2017_exp.npy', 'northern_tracks/{version}/IC86_2018_exp.npy', 'northern_tracks/{version}/IC86_2019_exp.npy'] _path_grls = ['northern_tracks/{version}/GRL/IC86_2011_exp.npy', 'northern_tracks/{version}/GRL/IC86_2012_exp.npy', 'northern_tracks/{version}/GRL/IC86_2013_exp.npy', 'northern_tracks/{version}/GRL/IC86_2014_exp.npy', 'northern_tracks/{version}/GRL/IC86_2015_exp.npy', 'northern_tracks/{version}/GRL/IC86_2016_exp.npy', 'northern_tracks/{version}/GRL/IC86_2017_exp.npy', 'northern_tracks/{version}/GRL/IC86_2018_exp.npy', 'northern_tracks/{version}/GRL/IC86_2019_exp.npy'] class NT86v5p1 (NTDataSpec): _path_sig = 'northern_tracks/{version}/IC86_pass2_MC.npy' _path_data = ['northern_tracks/{version}/IC86_2011_exp.npy', 'northern_tracks/{version}/IC86_2012_exp.npy', 'northern_tracks/{version}/IC86_2013_exp.npy', 'northern_tracks/{version}/IC86_2014_exp.npy', 'northern_tracks/{version}/IC86_2015_exp.npy', 'northern_tracks/{version}/IC86_2016_exp.npy', 'northern_tracks/{version}/IC86_2017_exp.npy', 'northern_tracks/{version}/IC86_2018_exp.npy', 'northern_tracks/{version}/IC86_2019_exp.npy', 'northern_tracks/{version}/IC86_2020_exp.npy', 'northern_tracks/{version}/IC86_2021_exp.npy'] _path_grls = ['northern_tracks/{version}/GRL/IC86_2011_exp.npy', 'northern_tracks/{version}/GRL/IC86_2012_exp.npy', 'northern_tracks/{version}/GRL/IC86_2013_exp.npy', 'northern_tracks/{version}/GRL/IC86_2014_exp.npy', 'northern_tracks/{version}/GRL/IC86_2015_exp.npy', 'northern_tracks/{version}/GRL/IC86_2016_exp.npy', 'northern_tracks/{version}/GRL/IC86_2017_exp.npy', 'northern_tracks/{version}/GRL/IC86_2018_exp.npy', 'northern_tracks/{version}/GRL/IC86_2019_exp.npy', 'northern_tracks/{version}/GRL/IC86_2020_exp.npy', 'northern_tracks/{version}/GRL/IC86_2021_exp.npy'] class NT86v5_2012_2014(NTDataSpec): _path_sig = 'northern_tracks/{version}/IC86_pass2_MC.npy' # _path_sig = '/data/user/wluszczak/northern_tracks_MC/IC86_pass2_MC_lite.npy' _path_data = ['northern_tracks/{version}/IC86_2012_exp.npy', 'northern_tracks/{version}/IC86_2013_exp.npy', 'northern_tracks/{version}/IC86_2014_exp.npy'] _path_grls = ['northern_tracks/{version}/GRL/IC86_2012_exp.npy', 'northern_tracks/{version}/GRL/IC86_2013_exp.npy', 'northern_tracks/{version}/GRL/IC86_2014_exp.npy'] nt_8yr = [NT59, NT79, NT86_2011, NT86_2012_2016] nt_v5 = [NT86v5] nt_txs = [NT86v5_2012_2014] class ESTESDataSpecs(object): # Enhanced Starting Track Event Selection class ESTESDataSpec(TrackSpec): _bins_sindec = np.linspace(-1, 1, 10+1) _bins_logenergy = np.linspace(3, 7, 18+1) # Apply pull correction to sigmas (already applied to var AngErr) def dataset_modifications(self, ds): ds.data = ds.data._subsample(ds.data.energy >= 1) ds.sig = ds.sig._subsample(ds.sig.energy >= 1) d = ds.data n = ds.sig dpsi = np.sqrt(n.xdec**2 + n.xra**2) h = hl.hist((n.energy, dpsi / n.sigma), n.oneweight * n.true_energy**-2, bins=(8,40), range=((10**2.5,10**6.5), (0.5, 180)), log=True).normalize([1]) hd = hl.hist((n.energy, dpsi / n.sigma), n.oneweight * n.true_energy**-2, bins=(8,10**3), range=((10**2.5,10**6.5), (0.5, 180)), log=True) h05 = hd.contain(1, .05) h95 = hd.contain(1, .95) hmed = hd.median(1) s = hmed.spline_fit(s=0, log=True) n['uncorrected_sigma'] = np.copy(n.sigma) n['sigma'] = n.uncorrected_sigma * s(np.clip(n.energy, *hmed.range[0])) / 1.1774 d['uncorrected_sigma'] = np.copy(d.sigma) d['sigma'] = d.uncorrected_sigma * s(np.clip(d.energy, *hmed.range[0])) / 1.1774 _keep = 'mjd true_energy oneweight run event subevent astro_weight atmo_weight muon_weight bg_weight'.split() _keep32 = 'azimuth ra dec energy sigma dist true_ra true_dec xdec xra astro_weight atmo_weight muon_weight bg_weight'.split() class ESTES_2011_2021 (ESTESDataSpec): #This currently points to fake data that is a single draw from the MC _livetime = 365*10.3*86400 _path_sig = 'estes_ps/{version}/MC_All_Combined.npy' _path_data = ['estes_ps/{version}/IC86_2011_exp.npy', 'estes_ps/{version}/IC86_2012_exp.npy', 'estes_ps/{version}/IC86_2013_exp.npy', 'estes_ps/{version}/IC86_2014_exp.npy', 'estes_ps/{version}/IC86_2015_exp.npy', 'estes_ps/{version}/IC86_2016_exp.npy', 'estes_ps/{version}/IC86_2017_exp.npy', 'estes_ps/{version}/IC86_2018_exp.npy', 'estes_ps/{version}/IC86_2019_exp.npy', 'estes_ps/{version}/IC86_2020_exp.npy', 'estes_ps/{version}/IC86_2021_exp.npy'] _path_grls = ['estes_ps/{version}/GRL/IC86_2011_exp.npy', 'estes_ps/{version}/GRL/IC86_2012_exp.npy', 'estes_ps/{version}/GRL/IC86_2013_exp.npy', 'estes_ps/{version}/GRL/IC86_2014_exp.npy', 'estes_ps/{version}/GRL/IC86_2015_exp.npy', 'estes_ps/{version}/GRL/IC86_2016_exp.npy', 'estes_ps/{version}/GRL/IC86_2017_exp.npy', 'estes_ps/{version}/GRL/IC86_2018_exp.npy', 'estes_ps/{version}/GRL/IC86_2019_exp.npy', 'estes_ps/{version}/GRL/IC86_2020_exp.npy', 'estes_ps/{version}/GRL/IC86_2021_exp.npy'] estes_10yr = [ESTES_2011_2021] class GRECOOnlineDataSpecs(object): class GRECOOnlineDataSpec(CascadeSpec): _bins_sindec = np.linspace(-1, 1, 26) _bins_logenergy = np.linspace(0., 4., 26) class GRECO_IC86_2012_2019(GRECOOnlineDataSpec): _path_sig = [ 'greco_online/{version}/IC86_2012.nue_merged.npy', 'greco_online/{version}/IC86_2012.numu_merged.npy', 'greco_online/{version}/IC86_2012.nutau_merged.npy' ] _path_data = [ 'greco_online/{version}/IC86_2012.data.npy', 'greco_online/{version}/IC86_2013.data.npy', 'greco_online/{version}/IC86_2014.data.npy', 'greco_online/{version}/IC86_2015.data.npy', 'greco_online/{version}/IC86_2016.data.npy', 'greco_online/{version}/IC86_2017.data.npy', 'greco_online/{version}/IC86_2018.data.npy', 'greco_online/{version}/IC86_2019.data.npy', ] _path_grls = [ 'greco_online/{version}/GRL/IC86_2012.data.npy', 'greco_online/{version}/GRL/IC86_2013.data.npy', 'greco_online/{version}/GRL/IC86_2014.data.npy', 'greco_online/{version}/GRL/IC86_2015.data.npy', 'greco_online/{version}/GRL/IC86_2016.data.npy', 'greco_online/{version}/GRL/IC86_2017.data.npy', 'greco_online/{version}/GRL/IC86_2018.data.npy', 'greco_online/{version}/GRL/IC86_2019.data.npy', ] greco_8yr = [GRECO_IC86_2012_2019] class TransientDataSpecs(object): class TrTDataSpec(TrackSpec): min_sindec = np.sin(np.radians(-5)) _bins_sindec = np.linspace(min_sindec, 1, 15+1) _bins_logenergy = np.linspace(2, 7, 20+1) _kw_energy = dict(bins_sindec=np.linspace(min_sindec, 1, 10)) def dataset_modifications(self, ds): pass class TrT86_2011 (TrTDataSpec): _livetime = 341.936631944 * 86400 _path_sig = 'transient_tracks/{version}/IC86_2011_North_nugen.npy' _path_data = 'transient_tracks/{version}/IC86_2011_North_data.npy' class TrT86_2012 (TrTDataSpec): _livetime = 332.244606481 * 86400 _path_sig = 'transient_tracks/{version}/IC86_2012_North_nugen.npy' _path_data = 'transient_tracks/{version}/IC86_2012_North_data.npy' class TrT86_2013 (TrTDataSpec): _livetime = 362.158252315 * 86400 _path_sig = 'transient_tracks/{version}/IC86_2013_North_nugen.npy' _path_data = 'transient_tracks/{version}/IC86_2013_North_data.npy' class TrT86_2014 (TrTDataSpec): _livetime = 369.76119213 * 86400 _path_sig = 'transient_tracks/{version}/IC86_2014_North_nugen.npy' _path_data = 'transient_tracks/{version}/IC86_2014_North_data.npy' class TrT86_2015 (TrTDataSpec): _livetime = 356.771905873 * 86400 _path_sig = 'transient_tracks/{version}/IC86_2015_North_nugen.npy' _path_data = 'transient_tracks/{version}/IC86_2015_North_data.npy' trt_2011 = [TrT86_2011] trt_2012 = [TrT86_2012] trt_2013 = [TrT86_2013] trt_2014 = [TrT86_2014] trt_2015 = [TrT86_2015] trt_2011_2015 = [TrT86_2011, TrT86_2012, TrT86_2013, TrT86_2014, TrT86_2015] class CustomDataSpecs(object): class CustomDataSpec(DataSpec): def __init__(self, data, sig, livetime, sindec_bins, logenergy_bins, grl=None, key='custom', cascades=False): self.data = utils.Events(data, convert=True) self.sig = utils.Events(sig, convert=True) if grl is not None: self.grl = utils.Arrays(grl) else: self.grl = grl self.livetime = livetime self.bins_sindec = sindec_bins self.bins_logenergy = logenergy_bins self.key = key self.cascades = cascades def load(self, repo, quiet=False, compress=True, load_sig=True, mmap=True): range_sindec = tuple(self.bins_sindec[[0,-1]]) ds = Dataset(self.key, self.livetime, self.sig, data=self.data, bg=None, grl=self.grl, cascades=self.cascades, range_sindec=range_sindec) return ds class Coordinates(object): txs_0506_056_maybe_the_event = list(np.radians([77.36, 5.69])) + ['TXS 0506+056'] txs_0506_056 = list(np.radians([77.3888, 5.63927])) + ['TXS 0506+056'] gc = list(np.radians([17.75/24*360 + 40.04/60., -29+28.118/360])) + ['Sgr A*'] sgr_A_star = list(np.radians([266.42, -29.01])) + ['Sgr A*'] @staticmethod def to_sources(*coords): ra, dec, name = [], [], [] for c in coords: ra.append(c[0]) dec.append(c[1]) name.append(c[2]) return utils.Sources(ra=ra, dec=dec, name=name) _local_root = os.getenv('CSKY_DATA_ANALYSES_DIR', '/data/ana/analyses') _username = os.getenv('CSKY_REMOTE_USER', '') repo = Repository( _local_root, '/data/ana/analyses', username=_username) _mrichman_local_root = os.getenv('CSKY_DATA_ANALYSES_DIR', '/data/user/mrichman/data/analyses') mrichman_repo = Repository( _mrichman_local_root, '/data/user/mrichman/data/analyses', username=_username)