aboutsummaryrefslogtreecommitdiffstats
path: root/utils/gf.py
blob: 6ce786359ac228568cf7ede4ec5182118234e727 (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
# 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

from functools import partial

import numpy as np

try:
    import GolemFitPy as gf
except:
    print 'Running without GolemFit'
    pass

from utils.enums import DataType, SteeringCateg
from utils.misc import enum_parse, thread_factors
from utils.param import ParamSet


def fit_flags(llh_paramset):
    default_flags = {
        # False means it's not fixed in minimization
        'astroFlavorAngle1'         : True,
        'astroFlavorAngle2'         : True,
        'convNorm'                  : True,
        'promptNorm'                : True,
        'muonNorm'                  : True,
        'astroNorm'                 : True,
        'astroParticleBalance'      : True,
        # 'astroDeltaGamma'           : True,
        'cutoffEnergy'              : True,
        'CRDeltaGamma'              : True,
        'piKRatio'                  : True,
        'NeutrinoAntineutrinoRatio' : True,
        'darkNorm'                  : True,
        'domEfficiency'             : True,
        'holeiceForward'            : True,
        'anisotropyScale'           : True,
        'astroNormSec'              : True,
        'astroDeltaGammaSec'        : True
    }
    flags = gf.FitParametersFlag()
    gf_nuisance = []
    for param in llh_paramset:
        if param.name in default_flags:
            print 'Setting param {0:<15} to float in the ' \
                'minimisation'.format(param.name)
            flags.__setattr__(param.name, False)
            gf_nuisance.append(param)
    return flags, ParamSet(gf_nuisance)


def steering_params(args):
    steering_categ = args.ast
    params = gf.SteeringParams(gf.sampleTag.MagicTau)
    params.quiet = False
    params.fastmode = True
    params.simToLoad= steering_categ.name.lower()
    params.evalThreads = args.threads
    # params.evalThreads = thread_factors(args.threads)[1]

    # For Tianlu
    # params.years = [999]

    params.minFitEnergy = args.binning[0]  # GeV
    params.maxFitEnergy = args.binning[-1] # GeV
    params.load_data_from_text_file = False

    return params


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


def setup_realisation(fitter, params, seed):
    print 'Injecting the model', params
    asimov_params = gf.FitParameters(gf.sampleTag.MagicTau)
    for parm in params:
        asimov_params.__setattr__(parm.name, float(parm.value))
    fitter.Swallow(fitter.SpitRealization(asimov_params, seed))


def setup_fitter(args, asimov_paramset):
    datapaths = gf.DataPaths()
    sparams = steering_params(args)
    npp = gf.NewPhysicsParams()
    fitter = gf.GolemFit(datapaths, sparams, npp)
    if args.data is DataType.ASIMOV:
        setup_asimov(fitter, asimov_paramset)
    elif args.data is DataType.REALISATION:
        seed = args.seed if args.seed is not None else 1
        setup_realisation(fitter, asimov_paramset, seed)
    elif args.data is DataType.REAL:
        print 'Using MagicTau DATA'
    return fitter


def get_llh(fitter, params):
    # print 'params', params
    fitparams = gf.FitParameters(gf.sampleTag.MagicTau)
    for parm in params:
        fitparams.__setattr__(parm.name, float(parm.value))
    llh = -fitter.EvalLLH(fitparams)
    return llh


def get_llh_freq(fitter, params):
    print 'setting to {0}'.format(params)
    fitparams = gf.FitParameters(gf.sampleTag.MagicTau)
    for parm in params:
        fitparams.__setattr__(parm.name, float(parm.value))
    fitter.SetFitParametersSeed(fitparams)
    llh = -fitter.MinLLH().likelihood
    return llh


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


def gf_argparse(parser):
    parser.add_argument(
        '--data', default='asimov', 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'
    )