aboutsummaryrefslogtreecommitdiffstats
path: root/utils/gf.py
blob: eaa9450db8f39c67e5bfd36f890c0a20f2f5339a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# author : S. Mandalia
#          s.p.mandalia@qmul.ac.uk
#
# date   : March 17, 2018

"""
Useful GolemFit wrappers for the BSM flavour ratio analysis
"""

from __future__ import absolute_import, division

import argparse
import socket
from functools import partial

import GolemFitPy as gf

from utils.enums import *
from utils.misc import enum_parse, thread_factors


def steering_params(args):
    steering_categ = args.ast
    params = gf.SteeringParams()
    if 'cobalt0' in socket.gethostname().split('.')[0]:
        params.quiet = False
    else:
        params.quiet = True
    # TODO(shivesh): figure out right number for missid
    params.track_to_shower_missid = 0.3
    params.fastmode = True
    # params.fastmode = False
    # params.readCompact = True
    params.readCompact = False
    params.do_HESE_reshuffle = False
    params.sampleToLoad = gf.sampleTag.HESE
    params.simToLoad= steering_categ.name.lower()
    params.evalThreads = args.threads
    # params.evalThreads = thread_factors(args.threads)[1]
    params.baseline_astro_spectral_index = -2.
    params.spline_hole_ice = True
    params.spline_dom_efficiency = True
    if steering_categ == SteeringCateg.LONGLIFE:
        params.years = [999]
        params.simToLoad= 'p2_0'
    elif steering_categ == SteeringCateg.DPL:
        params.diffuse_fit_type = gf.DiffuseFitType.DoublePowerLaw
        params.simToLoad= 'p2_0'
    return params


def set_up_as(fitter, params):
    print 'Injecting the model', params
    asimov_params = gf.FitParameters()
    for parm in params:
        asimov_params.__setattr__(parm.name, parm.value)
    fitter.SetupAsimov(asimov_params)


def get_llh(fitter, params):
    fitparams = gf.FitParameters()
    for parm in params:
        fitparams.__setattr__(parm.name, parm.value)
    return fitter.EvalLLH(fitparams)


def data_distributions(fitter):
    hdat = fitter.GetDataDistribution()
    binedges = np.asarray([fitter.GetZenithBinsData(), fitter.GetEnergyBinsData()])
    return hdat, binedges


def fit_flags(fitflag_categ):
    flags = gf.FitParametersFlag()
    if fitflag_categ is FitFlagCateg.xs:
        # False means it's not fixed in minimization
        flags.NeutrinoAntineutrinoRatio = False
    return flags


def fit_params(fit_categ):
    params = gf.FitParameters()
    params.astroNorm = 7.5
    params.astroDeltaGamma = 0.9
    if fit_categ is FitCateg.hesespl:
        params.astroNormSec = 0
    elif fit_categ is FitCateg.hesedpl:
        params.astroNormSec=7.0
    elif fit_categ is FitCateg.zpspl:
        # zero prompt, single powerlaw
        params.promptNorm = 0
        params.astroNormSec = 0
    elif fit_categ is FitCateg.zpdpl:
        # zero prompt, double powerlaw
        params.promptNorm = 0
        params.astroNormSec=7.0
    elif fit_categ is FitCateg.nunubar2:
        params.NeutrinoAntineutrinoRatio = 2


def fit_priors(fitpriors_categ):
    priors = gf.Priors()
    if fitpriors_categ == FitPriorsCateg.xs:
        priors.promptNormCenter = 1
        priors.promptNormWidth = 3
        priors.astroDeltaGammaCenter = 0
        priors.astroDeltaGammaWidth = 1
    return priors


def gen_steering_params(steering_categ, quiet=False):
    params = gf.SteeringParams()
    if quiet: params.quiet = True
    params.fastmode = False
    params.do_HESE_reshuffle = False
    params.numc_tag = steering_categ.name
    params.baseline_astro_spectral_index = -2.
    if steering_categ is SteeringCateg.LONGLIFE:
        params.years = [999]
        params.numc_tag = 'std_half1'
    if steering_categ is SteeringCateg.DPL:
        params.diffuse_fit_type = gf.DiffuseFitType.DoublePowerLaw
        params.numc_tag = 'std_half1'
    return params


def gf_argparse(parser):
    parser.add_argument(
        '--data', default='real', type=partial(enum_parse, c=DataType),
        choices=DataType, help='select datatype'
    )
    parser.add_argument(
        '--ast', default='p2_0', type=partial(enum_parse, c=SteeringCateg),
        choices=SteeringCateg,
        help='use asimov/fake dataset with specific steering'
    )
    parser.add_argument(
        '--aft', default='hesespl', type=partial(enum_parse, c=FitCateg),
        choices=FitCateg,
        help='use asimov/fake dataset with specific Fit'
    )
    parser.add_argument(
        '--axs', default='nom', type=partial(enum_parse, c=XSCateg),
        choices=XSCateg,
        help='use asimov/fake dataset with xs scaling'
    )
    parser.add_argument(
        '--priors', default='uniform', type=partial(enum_parse, c=Priors),
        choices=Priors, help='Bayesian priors'
    )