# 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)