示例#1
0
def test_chi2_v03():
    n = 10
    start = 10
    offset = 1.0
    dataa   = N.arange(start, start+n, dtype='d')
    theorya = dataa+offset
    covmat  = N.diag(dataa)+2.0
    La      = N.linalg.cholesky(covmat)

    data   = C.Points(dataa, labels='Data')
    theory = C.Points(theorya, labels='Theory')
    L      = C.Points(La, labels='Stat errors')

    chi = C.Chi2(labels='Chi2')
    chi.add(theory, data, L)

    if graphviz:
        chi.print()
        from gna.graphviz import savegraph
        savegraph(data.single(), 'output/unit_chi2_v03.dot')

    res = chi.chi2.chi2.data()[0]

    diff = N.array(dataa-theorya).T
    res_expected1 = N.matmul(diff.T, N.matmul(N.linalg.inv(covmat),  diff))
    ndiff = N.matmul(N.linalg.inv(La), diff)
    res_expected2 = N.matmul(ndiff.T, ndiff)

    assert N.allclose(res, res_expected1, rtol=0, atol=1.e-15)
    assert N.allclose(res, res_expected2, rtol=0, atol=1.e-15)
示例#2
0
def test_chi2_v01():
    n = 10
    start = 10
    offset = 1.0
    dataa   = N.arange(start, start+n, dtype='d')
    theorya = dataa+offset
    stata   = dataa**0.5

    data   = C.Points(dataa, labels='Data')
    theory = C.Points(theorya, labels='Theory')
    stat   = C.Points(stata, labels='Stat errors')

    chi = C.Chi2(labels='Chi2')
    chi.add(theory, data, stat)

    if graphviz:
        chi.print()
        from gna.graphviz import savegraph
        savegraph(data.single(), 'output/unit_chi2_v01.dot')

    res = chi.chi2.chi2.data()[0]
    res_expected1 = (((dataa-theorya)/stata)**2).sum()
    res_expected2 = ((offset/stata)**2).sum()

    assert (res==res_expected1).all()
    assert (res==res_expected2).all()
示例#3
0
def test_chi2_v02():
    n = 10
    start = 10
    offset = 1.0
    dataa   = N.arange(start, start+n, dtype='d')
    theorya = dataa+offset
    covmat  = N.diag(dataa)
    La      = N.linalg.cholesky(covmat)

    data   = C.Points(dataa, labels='Data')
    theory = C.Points(theorya, labels='Theory')
    L      = C.Points(La, labels='Stat errors')

    chi = C.Chi2(labels='Chi2')
    chi.add(theory, data, L)

    if graphviz:
        chi.print()
        from gna.graphviz import savegraph
        savegraph(data.single(), 'output/unit_chi2_v02.dot')

    res = chi.chi2.chi2.data()[0]
    res_expected1 = (offset**2/dataa).sum()

    assert (res==res_expected1).all()
示例#4
0
                  debug=False),
    va=NestedDict(
        bundle=dict(name='dummyvar', version='v01'),
        variables=uncertaindict([('vara', (2, 0.1))], mode='percent'),
    ),
    vb=NestedDict(
        bundle=dict(name='dummyvar', version='v01'),
        variables=uncertaindict([('varb', (3, 0.1))], mode='percent'),
    ),
)
# Build the expression for given configuration. The output is a context, that contains the inputs and outputs.
context = ExpressionContext(cfg)
a.build(context)

from gna.bindings import OutputDescriptor
# Print inputs
print('Inputs')
print(context.inputs)

# Print outputs
print()
print('Outputs')
print(context.outputs)

if args.dot:
    from gna.graphviz import GNADot, savegraph

    savegraph(next(context.outputs.ta.values(nested=True)),
              args.dot,
              rankdir='LR')
示例#5
0
args = parser.parse_args()

indices = [('k', 'kin', ['a', 'b', 'c'])]
lib = dict(scaled_e=dict(expr='weight*evis'), )

expr = 'integral[k]'
a = Expression_v01(expr, indices)

print(a.expressions_raw)
print(a.expressions)

a.parse()
a.guessname(lib, save=True)
a.tree.dump(True)

print()
cfg = NestedDict(kinint=NestedDict(bundle=dict(name='integral_1d_v02'),
                                   variable='evis',
                                   edges=N.linspace(0.0, 12.0, 241, dtype='d'),
                                   orders=3,
                                   labels=dict(
                                       sampler='GL Sampler',
                                       integrator='Integrator {autoindex}')), )
context = ExpressionContext_v01(cfg, ns=env.globalns)
a.build(context)

for fname in args.dot:
    from gna.graphviz import savegraph
    savegraph([context.outputs.evis] + list(context.outputs.integral.values()),
              fname)
示例#6
0
def main(opts):
    global savefig
    cfg = NestedDict(
        bundle=dict(
            name='energy_nonlinearity_birks_cherenkov',
            version='v01',
            nidx=[('r', 'reference', ['R1', 'R2'])],
            major=[],
        ),
        stopping_power='stoppingpower.txt',
        annihilation_electrons=dict(
            file='input/hgamma2e.root',
            histogram='hgamma2e_1KeV',
            scale=1.0 / 50000  # event simulated
        ),
        pars=uncertaindict(
            [
                ('birks.Kb0', (1.0, 'fixed')),
                ('birks.Kb1', (15.2e-3, 0.1776)),
                # ('birks.Kb2',           (0.0, 'fixed')),
                ("cherenkov.E_0", (0.165, 'fixed')),
                ("cherenkov.p0", (-7.26624e+00, 'fixed')),
                ("cherenkov.p1", (1.72463e+01, 'fixed')),
                ("cherenkov.p2", (-2.18044e+01, 'fixed')),
                ("cherenkov.p3", (1.44731e+01, 'fixed')),
                ("cherenkov.p4", (3.22121e-02, 'fixed')),
                ("Npescint", (1341.38, 0.0059)),
                ("kC", (0.5, 0.4737)),
                ("normalizationEnergy", (12.0, 'fixed'))
            ],
            mode='relative'),
        integration_order=2,
        correlations_pars=['birks.Kb1', 'Npescint', 'kC'],
        correlations=[1.0, 0.94, -0.97, 0.94, 1.0, -0.985, -0.97, -0.985, 1.0],
        fill_matrix=True,
        labels=dict(normalizationEnergy='Pessimistic'),
    )

    ns = env.globalns('energy')
    quench = execute_bundle(cfg, namespace=ns)
    ns.printparameters(labels=True)
    print()
    normE = ns['normalizationEnergy'].value()

    #
    # Input bins
    #
    evis_edges_full_input = N.arange(0.0, 15.0 + 1.e-6, 0.025)
    evis_edges_full_hist = C.Histogram(evis_edges_full_input,
                                       labels='Evis bin edges')
    evis_edges_full_hist >> quench.context.inputs.evis_edges_hist['00']

    #
    # Python energy model interpolation function
    #
    from scipy.interpolate import interp1d
    lsnl_x = quench.histoffset.histedges.points_truncated.data()
    lsnl_y = quench.positron_model_relative.single().data()
    lsnl_fcn = interp1d(lsnl_x, lsnl_y, kind='quadratic')

    #
    # Energy resolution
    #
    def eres_sigma_rel(edep):
        return 0.03 / edep**0.5

    def eres_sigma_abs(edep):
        return 0.03 * edep**0.5

    #
    # Energy offset
    #
    from physlib import pc
    edep_offset = pc.DeltaNP - pc.ElectronMass

    #
    # Oscprob
    #
    baselinename = 'L'
    ns = env.ns("oscprob")
    import gna.parameters.oscillation
    gna.parameters.oscillation.reqparameters(ns)
    ns.defparameter(baselinename,
                    central=52.0,
                    fixed=True,
                    label='Baseline, km')

    #
    # Define energy range
    #
    enu_input = N.arange(1.8, 15.0, 0.001)
    edep_input = enu_input - edep_offset
    edep_lsnl = edep_input * lsnl_fcn(edep_input)

    # Initialize oscillation variables
    enu = C.Points(enu_input, labels='Neutrino energy, MeV')
    component_names = C.stdvector(['comp0', 'comp12', 'comp13', 'comp23'])
    with ns:
        R.OscProbPMNSExpressions(R.Neutrino.ae(),
                                 R.Neutrino.ae(),
                                 component_names,
                                 ns=ns)

        labels = [
            'Oscillation probability|%s' % s
            for s in ('component 12', 'component 13', 'component 23', 'full',
                      'probsum')
        ]
        oscprob = R.OscProbPMNS(R.Neutrino.ae(),
                                R.Neutrino.ae(),
                                baselinename,
                                labels=labels)

    enu >> oscprob.full_osc_prob.Enu
    enu >> (oscprob.comp12.Enu, oscprob.comp13.Enu, oscprob.comp23.Enu)

    unity = C.FillLike(1, labels='Unity')
    enu >> unity.fill.inputs[0]
    with ns:
        op_sum = C.WeightedSum(component_names, [
            unity.fill.outputs[0], oscprob.comp12.comp12,
            oscprob.comp13.comp13, oscprob.comp23.comp23
        ],
                               labels='Oscillation probability sum')

    psur = op_sum.single().data()

    from scipy.signal import argrelmin, argrelmax
    psur_minima, = argrelmin(psur)
    psur_maxima, = argrelmax(psur)

    def build_extrema(x):
        data_min_x = (x[psur_minima][:-1] + x[psur_minima][1:]) * 0.5
        data_min_y = (x[psur_minima][1:] - x[psur_minima][:-1])

        data_max_x = (x[psur_maxima][:-1] + x[psur_maxima][1:]) * 0.5
        data_max_y = (x[psur_maxima][1:] - x[psur_maxima][:-1])

        data_ext_x = N.vstack([data_max_x, data_min_x]).T.ravel()
        data_ext_y = N.vstack([data_max_y, data_min_y]).T.ravel()

        return data_ext_x, data_ext_y

    psur_ext_x_enu, psur_ext_y_enu = build_extrema(enu_input)
    psur_ext_x_edep, psur_ext_y_edep = build_extrema(edep_input)
    psur_ext_x_edep_lsnl, psur_ext_y_edep_lsnl = build_extrema(edep_lsnl)

    #
    # Plots and tests
    #
    if opts.output and opts.output.endswith('.pdf'):
        pdfpages = PdfPages(opts.output)
        pdfpagesfilename = opts.output
        savefig_old = savefig
        pdf = pdfpages.__enter__()

        def savefig(*args, **kwargs):
            if opts.individual and args and args[0]:
                savefig_old(*args, **kwargs)
            pdf.savefig()
    else:
        pdf = None
        pdfpagesfilename = ''
        pdfpages = None

    fig = P.figure()
    ax = P.subplot(111)
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Edep, MeV')
    ax.set_ylabel('Evis/Edep')
    ax.set_title('Positron energy nonlineairty')
    quench.positron_model_relative.single().plot_vs(
        quench.histoffset.histedges.points_truncated, label='definition range')
    quench.positron_model_relative_full.plot_vs(
        quench.histoffset.histedges.points,
        '--',
        linewidth=1.,
        label='full range',
        zorder=0.5)
    ax.vlines(normE, 0.0, 1.0, linestyle=':')

    ax.legend(loc='lower right')
    ax.set_ylim(0.8, 1.05)
    savefig(opts.output, suffix='_total_relative')

    fig = P.figure()
    ax = P.subplot(111)
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Edep, MeV')
    ax.set_ylabel(r'$\sigma/E$')
    ax.set_title('Energy resolution')
    ax.plot(edep_input, eres_sigma_rel(edep_input), '-')

    savefig(opts.output, suffix='_eres_rel')

    fig = P.figure()
    ax = P.subplot(111)
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Edep, MeV')
    ax.set_ylabel(r'$\sigma$')
    ax.set_title('Energy resolution')
    ax.plot(edep_input, eres_sigma_abs(edep_input), '-')

    savefig(opts.output, suffix='_eres_abs')

    fig = P.figure()
    ax = P.subplot(111)
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Enu, MeV')
    ax.set_ylabel('Psur')
    ax.set_title('Survival probability')
    op_sum.single().plot_vs(enu.single(), label='full')
    ax.plot(enu_input[psur_minima],
            psur[psur_minima],
            'o',
            markerfacecolor='none',
            label='minima')
    ax.plot(enu_input[psur_maxima],
            psur[psur_maxima],
            'o',
            markerfacecolor='none',
            label='maxima')

    savefig(opts.output, suffix='_psur_enu')

    fig = P.figure()
    ax = P.subplot(111)
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Edep, MeV')
    ax.set_ylabel('Psur')
    ax.set_title('Survival probability')
    op_sum.single().plot_vs(edep_input, label='true')
    op_sum.single().plot_vs(edep_lsnl, label='with LSNL')

    ax.legend()

    savefig(opts.output, suffix='_psur_edep')

    fig = P.figure()
    ax = P.subplot(111)
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Enu, MeV')
    ax.set_ylabel('Dist, MeV')
    ax.set_title('Nearest peaks distance')

    ax.plot(psur_ext_x_enu, psur_ext_y_enu, 'o-', markerfacecolor='none')

    savefig(opts.output, suffix='_dist_enu')

    fig = P.figure()
    ax = P.subplot(111)
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Edep, MeV')
    ax.set_ylabel('Dist, MeV')
    ax.set_title('Nearest peaks distance')

    ax.plot(psur_ext_x_edep,
            psur_ext_y_edep,
            '-',
            markerfacecolor='none',
            label='true')
    ax.plot(psur_ext_x_edep_lsnl,
            psur_ext_y_edep_lsnl,
            '-',
            markerfacecolor='none',
            label='with LSNL')
    ax.plot(edep_input,
            eres_sigma_abs(edep_input),
            '-',
            markerfacecolor='none',
            label=r'$\sigma$')

    ax.legend(loc='upper left')

    savefig(opts.output, suffix='_dist')

    fig = P.figure()
    ax = P.subplot(111)
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Edep, MeV')
    ax.set_ylabel(r'Dist/$\sigma$')
    ax.set_title('Resolution ability')

    x1, y1 = psur_ext_x_edep, psur_ext_y_edep / eres_sigma_abs(psur_ext_x_edep)
    x2, y2 = psur_ext_x_edep_lsnl, psur_ext_y_edep_lsnl / eres_sigma_abs(
        psur_ext_x_edep_lsnl)

    ax.plot(x1, y1, '-', markerfacecolor='none', label='true')
    ax.plot(x2, y2, '-', markerfacecolor='none', label='with LSNL')

    ax.legend(loc='upper left')
    savefig(opts.output, suffix='_ability')

    ax.set_xlim(3, 4)
    ax.set_ylim(5, 8)
    savefig(opts.output, suffix='_ability_zoom')

    fig = P.figure()
    ax = P.subplot(111)
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Edep, MeV')
    ax.set_ylabel(r'Dist/$\sigma$')
    ax.set_title('Resolution ability difference (quenching-true)')

    y2fcn = interp1d(x2, y2)
    y2_on_x1 = y2fcn(x1)
    diff = y2_on_x1 - y1
    from scipy.signal import savgol_filter
    diff = savgol_filter(diff, 21, 3)

    ax.plot(x1, diff)

    savefig(opts.output, suffix='_ability_diff')

    if pdfpages:
        pdfpages.__exit__(None, None, None)
        print('Write output figure to', pdfpagesfilename)

    savegraph(quench.histoffset.histedges.points_truncated,
              opts.graph,
              namespace=ns)

    if opts.show:
        P.show()
示例#7
0
        extrapolation_strategy='extrapolate',
        nonlin_range=(0.5, 12.),
        expose_matrix=True,
    ))

#
# Initialize bundles
#
expr.parse()
expr.guessname(lib, save=True)
expr.tree.dump()
context = ExpressionContext_v01(cfg, ns=env.globalns)
expr.build(context)

print(context.outputs)
savegraph(context.outputs.evis_edges, opts.dot)
env.globalns.printparameters(labels=True)


#
# Plot functions
#
def plot_projections(update=False, relative=False, label=''):
    newfigure = not update
    if newfigure:
        fig = plt.figure()
        ax = plt.subplot(111, xlabel='E', ylabel='E\'', title='')
        ax.minorticks_on()
        ax.grid()
        ax.set_xlim(0.5, edges[-1])
示例#8
0
def example():
    parser = argparse.ArgumentParser()
    parser.add_argument("-e",
                        "--energy",
                        metavar=('Start', 'Final', 'Step'),
                        default=[700., 2000., 10],
                        nargs=3,
                        type=float,
                        help='Set neutrino energy range and step in MeV')
    parser.add_argument(
        '-f',
        '--flavors',
        metavar=('Initial_flavor', 'Final_flavor'),
        default=['mu', 'mu'],
        nargs=2,
        help='Set initital and final flavors for oscillation probability')
    parser.add_argument('-r',
                        '--density',
                        default=2.75,
                        type=float,
                        help='Set density of matter in g/cm^3')
    parser.add_argument('-L',
                        '--distance',
                        default=810.,
                        type=float,
                        help='Set distance of propagation in kilometers')
    parser.add_argument('--mass-ordering',
                        default='normal',
                        choices=['normal', 'inverted'],
                        help='Set neutrino mass ordering (hierarchy)')
    parser.add_argument('--print-pars',
                        action='store_true',
                        help='Print all parameters in namespace')
    parser.add_argument('--savefig', help='Path to save figure')
    parser.add_argument('--graph',
                        help='Path to save computational graph scheme')
    opts = parser.parse_args()

    # For fast usage printing load GNA specific modules only after argument
    # parsing
    import ROOT
    ROOT.PyConfig.IgnoreCommandLineOptions = True  #prevents ROOT from hijacking sys.argv

    from gna.env import env
    from gna.parameters.oscillation import reqparameters
    from gna.bindings import common
    import gna.constructors as C
    _flavors = {
        "e": ROOT.Neutrino.e(),
        "mu": ROOT.Neutrino.mu(),
        "tau": ROOT.Neutrino.tau(),
        "ae": ROOT.Neutrino.ae(),
        "amu": ROOT.Neutrino.amu(),
        "atau": ROOT.Neutrino.atau()
    }

    # Parsed arguments are put into opts object (of type argparse.Namespace) as attributes and can be accessed with a '.'
    # like in examples below.
    # Note that argparse translate dashes '-' into underscores '_' for attribute names.

    #initialize energy range
    Enu = np.arange(opts.energy[0], opts.energy[1], step=opts.energy[2])
    E_MeV = C.Points(Enu, labels='Neutrino energy')

    # initialize initial and final flavors for neutrino after propagating in media
    try:
        initial_flavor, final_flavor = tuple(_flavors[flav]
                                             for flav in opts.flavors)
    except KeyError:
        raise KeyError(
            "Invalid flavor is requested: try something from e, mu, tau")

    ns = env.ns("matter_osc")
    reqparameters(
        ns)  # initialize oscillation parameters in namespace 'matter_osc'

    ns['Delta'].set(0)  # set CP-violating phase to zero
    ns['SinSq23'].set(
        0.6
    )  # change value of sin²θ₂₃, it will cause recomputation of PMNS matrix elements that depend of it
    ns['Alpha'].set(opts.mass_ordering)  # Choose mass ordering
    ns.defparameter("L", central=opts.distance, fixed=True)  # kilometres
    ns.defparameter("rho", central=opts.density, fixed=True)  # g/cm^3

    # Print values of all parameters in namespace if asked
    if opts.print_pars:
        ns.printparameters()

    #initialize neutrino oscillation probability in matter and in vacuum for comparison.
    # All neccessary parameters such as values of mixing angles, mass splittings,
    # propagation distance and density of matter are looked up in namespace ns
    # upon creation of ROOT.OscProbMatter.
    with ns:
        oscprob_matter = ROOT.OscProbMatter(
            initial_flavor,
            final_flavor,
            labels='Oscillation probability in matter')
        oscprob_vacuum = ROOT.OscProbPMNS(
            initial_flavor,
            final_flavor,
            labels='Oscillation probability in vacuum')

        # Add output of plain array of energies as input "Enu" to oscillation
        # probabilities. It means that oscillation probabilities would be computed
        # for each energy in array and array of it would be
        # provided as output
        E_MeV.points >> oscprob_matter.oscprob.Enu
        E_MeV.points >> oscprob_vacuum.full_osc_prob
        oscprob_vacuum.full_osc_prob.setLabel(
            'Oscillation probability in vacuum')

    # Accessing the outputs of oscillation probability for plotting

    matter = oscprob_matter.oscprob.oscprob.data()
    vacuum = oscprob_vacuum.full_osc_prob.oscprob.data()

    # Make a pair of plots for both probabilities and their ratio
    # Plot probabilities
    fig, (ax, ax_ratio) = plt.subplots(nrows=2, ncols=1, sharex=True)
    ax.plot(Enu,
            matter,
            label='Matter, density={} gm/cm^3'.format(opts.density))
    ax.plot(Enu, vacuum, label='Vacuum')

    ax.set_title("Oscillation probabilities, {0} -> {1}".format(
        opts.flavors[0], opts.flavors[1]),
                 fontsize=16)
    ax.set_ylabel("Oscprob", fontsize=14)
    ax.legend(loc='best')
    ax.grid(alpha=0.5)

    # Plot ratio
    ax_ratio.plot(Enu, matter / vacuum, label='matter / vacuum')
    ax_ratio.set_xlabel("Neutrino energy, MeV", fontsize=14)
    ax_ratio.set_ylabel("Ratio", fontsize=14)
    ax_ratio.legend(loc='best')
    ax_ratio.grid(alpha=0.5)

    # Convert path to absolute path and save figure or show
    if opts.savefig:
        plt.savefig(os.path.abspath(opts.savefig))
    else:
        plt.show()

    # Save a plot of computational graph scheme
    if opts.graph:
        from gna.graphviz import savegraph
        savegraph(oscprob_matter.oscprob.oscprob, opts.graph, namespace=ns)
示例#9
0
b = execute_bundle(cfg)

print('Inputs')
print(b.context.inputs)
print()

print('Outputs')
print(b.context.outputs)
print()

print('Parameters')
b.namespace.printparameters(labels=True)
print()

if opts.graph:
    savegraph(b.context.outputs.hist0, opts.graph)

if opts.show or opts.output:
    fig = plt.figure(figsize=(12, 12))

    for i, det in enumerate(['D1', 'D2', 'D3']):
        ax = plt.subplot(221 + i,
                         xlabel='E, MeV',
                         ylabel='',
                         title='Energy smearing in ' + det)
        ax.minorticks_on()
        ax.grid()

        hists[i].hist.hist.plot_hist(label='Original histogram')
        for i, out in enumerate(
                b.context.outputs.eres[det].values(nested=True)):
示例#10
0
def test_oscprob():
    baselinename = 'L'
    ns = env.ns("testoscprob")
    gna.parameters.oscillation.reqparameters(ns)
    ns.defparameter(baselinename,
                    central=2.0,
                    fixed=True,
                    label='Baseline, km')

    # Define energy range
    enu_input = np.arange(1.0, 10.0, 0.01)
    enu = C.Points(enu_input, labels='Neutrino energy, MeV')

    # Initialize oscillation variables
    component_names = C.stdvector(['comp0', 'comp12', 'comp13', 'comp23'])
    with ns:
        R.OscProbPMNSExpressions(R.Neutrino.ae(),
                                 R.Neutrino.ae(),
                                 component_names,
                                 ns=ns)

    # Initialize neutrino oscillations
    with ns:
        labels = [
            'Oscillation probability|%s' % s
            for s in ('component 12', 'component 13', 'component 23', 'full',
                      'probsum')
        ]
        oscprob = C.OscProbPMNS(R.Neutrino.ae(),
                                R.Neutrino.ae(),
                                baselinename,
                                labels=labels)

    enu >> oscprob.full_osc_prob.Enu
    enu >> (oscprob.comp12.Enu, oscprob.comp13.Enu, oscprob.comp23.Enu)

    # Oscillation probability as single transformation
    op_full = oscprob.full_osc_prob.oscprob

    # Oscillation probability as weighted sum
    unity = C.FillLike(1, labels='Unity')
    enu >> unity.fill.inputs[0]
    with ns:
        op_sum = C.WeightedSum(component_names, [
            unity.fill.outputs[0], oscprob.comp12.comp12,
            oscprob.comp13.comp13, oscprob.comp23.comp23
        ],
                               labels='Oscillation probability sum')

    # Print some information
    oscprob.print()
    print()

    ns.printparameters(labels=True)

    # Print extended information
    oscprob.print(data=True, slice=slice(None, 5))

    assert np.allclose(op_full.data(), op_sum.data())

    if "pytest" not in sys.modules:
        fig = plt.figure()
        ax = plt.subplot(111)
        ax.minorticks_on()
        ax.grid()
        ax.set_xlabel('E nu, MeV')
        ax.set_ylabel('P')
        ax.set_title('Oscillation probability')

        op_full.plot_vs(enu.single(), '-', label='full oscprob')
        op_sum.plot_vs(enu.single(), '--', label='oscprob (sum)')

        ax.legend(loc='lower right')

        savefig('output/test_oscprob.pdf')
        savegraph(enu, 'output/test_oscprob_graph.dot', namespace=ns)
        savegraph(enu, 'output/test_oscprob_graph.pdf', namespace=ns)

        plt.show()
示例#11
0
from gna.bindings import OutputDescriptor
env.globalns.printparameters(labels=True)
print('outputs:')
print(context.outputs)

fig = P.figure()
ax = P.subplot(111)
ax.minorticks_on()
ax.grid()
ax.set_xlabel('E')
ax.set_ylabel('int f(E)')
ax.set_title('Linear function f(E)=E integrated')

edges = cfg.kinint.edges
centers = (edges[1:] + edges[:-1]) * 0.5
widths = (edges[1:] - edges[:-1])
ints = centers * widths
for i, (par, out) in enumerate(zip(pars, context.outputs.kinint.values())):
    out.plot_hist(label='GL quad ' + str(i))
    ax.plot(centers, ints * par.value(), '--', label='calc ' + str(i))

ax.legend(loc='upper left')

if args.show:
    P.show()

if args.dot:
    from gna.graphviz import savegraph
    savegraph(context.outputs.evis, args.dot)
示例#12
0
hist_output.plot_bar(label='histogram (sum=%g)' % hist.sum(), **baropts)
# plot histogram manually
plot_bar(edges, hist / widths, label='histogram/binwidth', **baropts)

# add legend
ax.legend(loc=opts.legend)

# Our function of interest is a guassian and should give 1 when integrated
# Test it by summing the histogram bins
diff = hist.sum() - integral
print('Integral (analytic)', integral)
print('Integral (analytic, sum)', integrals.sum())
print('Diff (Integral - %g):' % integral, diff)
# print('Integrals (analytic)', integrals)
# print('Integrals (calc)', hist)
adiff = N.fabs(integrals - hist).sum()
print('Diffs (abssum):', adiff)
print(
    N.fabs(diff) < 1.e-8 and adiff < 1.e-8 and '\033[32mIntegration is OK!'
    or '\033[31mIntegration FAILED!', '\033[0m')

if opts.dot:
    try:
        from gna.graphviz import savegraph
        savegraph(integrator.hist, opts.dot)
    except Exception as e:
        print('\033[31mFailed to plot dot\033[0m')
        raise

P.show()
示例#13
0
                    instances={
                        'integral_eq': 'Quenched energy integral',
                        'integral_evis': 'Visible energy integral',
                    }))

#
# Initialize bundles
#
expr.parse()
expr.guessname(lib, save=True)
expr.tree.dump()
context = ExpressionContext_v01(cfg, ns=env.globalns)
expr.build(context)

print(context.outputs)
savegraph(context.outputs.energy_edges, opts.dot)
env.globalns.printparameters(labels=True)


#
# Plot functions
#
def plot_projections(update=False, relative=False, label=''):
    newfigure = not update
    if newfigure:
        fig = plt.figure('proj')
        fig.clf()
        ax = plt.subplot(111, xlabel='E', ylabel='E\'', title='')
        ax.minorticks_on()
        ax.grid()
        ax.set_xlim(0.5, edges[-1])
示例#14
0
        E >> (unity.fill, oscprob.comp12, oscprob.comp13, oscprob.comp23)

        ws = C.WeightedSum(weights, labels, labels='OscProb')
        unity          >> ws.sum.comp0
        oscprob.comp12 >> ws.sum.item12
        oscprob.comp13 >> ws.sum.item13
        oscprob.comp23 >> ws.sum.item23

        ns.materializeexpressions()
        pars = tuple(par.getVariable() for (name,par) in ns.walknames())
        manager.setVariables(C.stdvector(pars))

if args.graph:
    from gna.graphviz import savegraph
    savegraph(ws.sum, args.graph)

    name, ext = args.graph.rsplit('.', 1)
    savegraph(ws.sum, name+'_vars.'+ext, namespace=ns)

out = ws.sum.sum

from gna.bindings import common
fig = plt.figure()
ax = plt.subplot( 111 )
ax.minorticks_on()
ax.grid()
ax.set_title(r'$\overline{\nu}_e$ survival probability at 52 km')
ax.set_xlabel(r'$E_{\nu}$, MeV')
ax.set_ylabel(u'$P_{ee}$')
out.plot_vs(E_arr, label='Full')
示例#15
0
文件: quenching.py 项目: gnafit/gna
def main(opts):
    global savefig
    cfg = NestedDict(
        bundle = dict(
            name='energy_nonlinearity_birks_cherenkov',
            version='v01',
            nidx=[ ('r', 'reference', ['R1', 'R2']) ],
            major=[],
            ),
        stopping_power='stoppingpower.txt',
        annihilation_electrons=dict(
            file='input/hgamma2e.root',
            histogram='hgamma2e_1KeV',
            scale=1.0/50000 # event simulated
            ),
        pars = uncertaindict(
            [
                ('birks.Kb0',               (1.0, 'fixed')),
                ('birks.Kb1',           (15.2e-3, 0.1776)),
                # ('birks.Kb2',           (0.0, 'fixed')),
                ("cherenkov.E_0",         (0.165, 'fixed')),
                ("cherenkov.p0",  ( -7.26624e+00, 'fixed')),
                ("cherenkov.p1",   ( 1.72463e+01, 'fixed')),
                ("cherenkov.p2",  ( -2.18044e+01, 'fixed')),
                ("cherenkov.p3",   ( 1.44731e+01, 'fixed')),
                ("cherenkov.p4",   ( 3.22121e-02, 'fixed')),
                ("Npescint",            (1341.38, 0.0059)),
                ("kC",                      (0.5, 0.4737)),
                ("normalizationEnergy",   (2.505, 'fixed'))
                # ("normalizationEnergy",   (12.0, 'fixed'))
             ],
            mode='relative'
            ),
        integration_order = 2,
        correlations_pars = [ 'birks.Kb1', 'Npescint', 'kC' ],
        correlations = [ 1.0,   0.94, -0.97,
                         0.94,  1.0,  -0.985,
                        -0.97, -0.985, 1.0   ],
        fill_matrix=True,
        labels = dict(
            normalizationEnergy = '60Co total gamma energy, MeV'
            # normalizationEnergy = 'Pessimistic norm point'
            ),
        )

    ns = env.globalns('energy')
    quench = execute_bundle(cfg, namespace=ns)
    ns.printparameters(labels=True)
    print()
    normE = ns['normalizationEnergy'].value()

    #
    # Input bins
    #
    evis_edges_full_input = N.arange(0.0, 12.0+1.e-6, 0.025)
    evis_edges_full_hist = C.Histogram(evis_edges_full_input, labels='Evis bin edges')
    evis_edges_full_hist >> quench.context.inputs.evis_edges_hist['00']

    #
    # HistNonLinearity transformation
    #
    reference_histogram1_input = N.zeros(evis_edges_full_input.size-1)
    reference_histogram2_input = reference_histogram1_input.copy()
    reference_histogram1_input+=1.0
    # reference_histogram2_input[[10, 20, 50, 100, 200, 300, 400]]=1.0
    reference_histogram2_input[[10, 20]]=1.0
    reference_histogram1 = C.Histogram(evis_edges_full_input, reference_histogram1_input, labels='Reference hist 1')
    reference_histogram2 = C.Histogram(evis_edges_full_input, reference_histogram2_input, labels='Reference hist 2')

    reference_histogram1 >> quench.context.inputs.lsnl.R1.values()
    reference_histogram2 >> quench.context.inputs.lsnl.R2.values()
    reference_smeared1 = quench.context.outputs.lsnl.R1
    reference_smeared2 = quench.context.outputs.lsnl.R2

    #
    # Plots and tests
    #
    if opts.output and opts.output.endswith('.pdf'):
        pdfpages = PdfPages(opts.output)
        pdfpagesfilename=opts.output
        savefig_old=savefig
        pdf=pdfpages.__enter__()
        def savefig(*args, **kwargs):
            if opts.individual and args and args[0]:
                savefig_old(*args, **kwargs)
            pdf.savefig()
    else:
        pdf = None
        pdfpagesfilename = ''

    #
    # Plots and tests
    #
    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'Edep, MeV' )
    ax.set_ylabel( 'dE/dx' )
    ax.set_title( 'Stopping power' )

    quench.birks_quenching_p.points.points.plot_vs(quench.birks_e_p.points.points, '-', markerfacecolor='none', markersize=2.0, label='input')
    ax.legend(loc='upper right')
    savefig(opts.output, suffix='_spower')

    ax.set_xlim(left=0.001)
    ax.set_xscale('log')
    savefig(opts.output, suffix='_spower_log')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'Edep, MeV' )
    ax.set_ylabel( '' )
    ax.set_title( "Birk's integrand" )

    quench.birks_integrand_raw.polyratio.ratio.plot_vs(quench.birks_e_p.points.points, '-o', alpha=0.5, markerfacecolor='none', markersize=2.0, label='raw')
    # birks_integrand_interpolated.plot_vs(integrator_ekin.points.x,   '-', alpha=0.5, markerfacecolor='none', markersize=2.0, label='interpolated')
    lines=quench.birks_integrand_interpolated.plot_vs(quench.integrator_ekin.points.x,   '-', alpha=0.5, markerfacecolor='none', markersize=2.0, label='interpolated')
    quench.birks_integrand_interpolated.plot_vs(quench.integrator_ekin.points.x, 'o', alpha=0.5, color='black', markersize=0.6)
    ax.legend(loc='lower right')

    savefig()

    ax.set_xlim(left=0.0001)
    ax.set_ylim(bottom=0.3)
    # ax.set_yscale('log')
    ax.set_xscale('log')
    savefig(opts.output, suffix='_spower_int')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'Edep, MeV' )
    ax.set_ylabel( '' )
    ax.set_title( "Birk's integral (bin by bin)" )

    quench.birks_integral.plot_hist()

    savefig()

    ax.set_xlim(left=0.0001)
    ax.set_ylim(bottom=0.0)
    # ax.set_yscale('log')
    ax.set_xscale('log')
    ax.set_ylim(auto=True)
    savefig(opts.output, suffix='_spower_intc')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'Edep, MeV' )
    ax.set_ylabel( 'Evis, MeV' )
    ax.set_title( 'Electron energy (Birks)' )
    #  birks_accumulator.reduction.out.plot_vs(integrator_evis.transformations.hist, '-', markerfacecolor='none', markersize=2.0, label='partial sum')
    quench.birks_accumulator.reduction.plot_vs(quench.histoffset.histedges.points_offset)
    ax.plot([0.0, 12.0], [0.0, 12.0], '--', alpha=0.5)

    savefig(opts.output, suffix='_birks_evis')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'Edep, MeV' )
    ax.set_ylabel( 'Evis/Edep' )
    ax.set_title( 'Electron energy (Birks)' )
    #  birks_accumulator.reduction.out.plot_vs(integrator_evis.transformations.hist, '-', markerfacecolor='none', markersize=2.0, label='partial sum')
    quench.histoffset.histedges.points_offset.vs_plot(quench.birks_accumulator.reduction.data()/quench.histoffset.histedges.points_offset.data())
    ax.set_ylim(0.40, 1.0)

    savefig(opts.output, suffix='_birks_evis_rel')

    ax.set_xlim(1.e-3, 2.0)
    ax.set_xscale('log')
    savefig()

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'E, MeV' )
    ax.set_ylabel( 'Npe' )
    ax.set_title( 'Cherenkov photons' )
    quench.cherenkov.cherenkov.ch_npe.plot_vs(quench.histoffset.histedges.points_offset)

    savefig(opts.output, suffix='_cherenkov_npe')

    ax.set_ylim(bottom=0.1)
    ax.set_yscale('log')
    savefig()

    ax.set_xlim(0.0, 2.0)
    # ax.set_ylim(0.0, 200.0)
    savefig()

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'E, MeV' )
    ax.set_ylabel( 'Npe' )
    ax.set_title( 'Electron model' )
    quench.electron_model.single().plot_vs(quench.histoffset.histedges.points_offset)

    savefig(opts.output, suffix='_electron')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'E, MeV' )
    ax.set_ylabel( 'Npe' )
    ax.set_title( 'Electron model (low energy view)' )
    annihilation_gamma_evis = quench.npe_positron_offset.normconvolution.result.data()[0]
    label = 'Annihilation contribution=%.2f Npe'%annihilation_gamma_evis
    quench.electron_model_lowe.plot_vs(quench.ekin_edges_lowe, 'o', markerfacecolor='none', label='data')
    quench.electron_model_lowe_interpolated.single().plot_vs(quench.annihilation_electrons_centers.single(), '-', label='interpolation\n%s'%label)

    ax.legend(loc='upper left')

    savefig(opts.output, suffix='_electron_lowe')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'E, MeV' )
    ax.set_ylabel( 'Npe' )
    ax.set_title( 'Total Npe' )
    quench.positron_model.sum.outputs[0].plot_vs(quench.histoffset.histedges.points_truncated)

    savefig(opts.output, suffix='_total_npe')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'Edep, MeV' )
    ax.set_ylabel( 'Evis, MeV' )
    ax.set_title( 'Positron energy model' )
    quench.positron_model_scaled.plot_vs(quench.histoffset.histedges.points_truncated, label='definition range')
    quench.positron_model_scaled_full.plot_vs(quench.histoffset.histedges.points, '--', linewidth=1., label='full range', zorder=0.5)
    ax.vlines(normE, 0.0, normE, linestyle=':')
    ax.hlines(normE, 0.0, normE, linestyle=':')
    ax.legend(loc='upper left')

    savefig(opts.output, suffix='_total')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'Edep, MeV' )
    ax.set_ylabel( 'Evis/Edep' )
    ax.set_title( 'Positron energy nonlineairty' )
    quench.positron_model_relative.single().plot_vs(quench.histoffset.histedges.points_truncated, label='definition range')
    quench.positron_model_relative_full.plot_vs(quench.histoffset.histedges.points, '--', linewidth=1., label='full range', zorder=0.5)
    ax.vlines(normE, 0.0, 1.0, linestyle=':')

    ax.legend(loc='lower right')
    ax.set_ylim(0.85, 1.1)

    savefig(opts.output, suffix='_total_relative')

    ax.set_xlim(0.75, 3)
    savefig(opts.output, suffix='_total_relative1')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel('Etrue, MeV')
    ax.set_ylabel('Edep, MeV')
    ax.set_title( 'Smearing matrix' )

    quench.pm_histsmear.matrix.FakeMatrix.plot_matshow(mask=0.0, extent=[evis_edges_full_input.min(), evis_edges_full_input.max(), evis_edges_full_input.max(), evis_edges_full_input.min()], colorbar=True)
    ax.plot([0.0, 12.0], [0.0, 12.0], '--', alpha=0.5, linewidth=1.0, color='magenta')
    ax.vlines(normE, 0.0, normE, linestyle=':')
    ax.hlines(normE, 0.0, normE, linestyle=':')

    savefig(opts.output, suffix='_matrix')

    ax.set_xlim(0.8, 3.0)
    ax.set_ylim(3.0, 0.8)
    savefig(opts.output, suffix='_matrix_zoom')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'E, MeV' )
    ax.set_ylabel( '' )
    ax.set_title( 'Reference histogram 1' )

    reference_histogram1.single().plot_hist(linewidth=0.5, alpha=1.0, label='original')
    reference_smeared1.single().plot_hist(  linewidth=0.5, alpha=1.0, label='smeared')

    ax.legend(loc='upper right')

    savefig(opts.output, suffix='_refsmear1')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'E, MeV' )
    ax.set_ylabel( '' )
    ax.set_title( 'Matrix projections' )

    mat = quench.pm_histsmear.matrix.FakeMatrix.data()
    proj0 = mat.sum(axis=0)
    proj1 = mat.sum(axis=1)

    plot_hist(evis_edges_full_input, proj0, alpha=0.7, linewidth=1.0, label='Projection 0: Edep view')
    plot_hist(evis_edges_full_input, proj1, alpha=0.7, linewidth=1.0, label='Projection 1: Evis')

    ax.legend(loc='upper right')

    savefig(opts.output, suffix='_matrix_projections')

    if opts.mapping:
        fig = P.figure()
        ax = P.subplot( 111 )
        ax.minorticks_on()
        ax.grid()
        ax.set_xlabel( 'E, MeV' )
        ax.set_ylabel( '' )
        ax.set_title( 'Mapping' )

        positron_model_scaled_data = quench.positron_model_scaled.single().data()
        for e1, e2 in zip(quench.histoffset.histedges.points_truncated.data(), positron_model_scaled_data):
            if e2>12.0 or e2<1.022:
                alpha = 0.05
            else:
                alpha = 0.7
            ax.plot( [e1, e2], [1.0, 0.0], '-', linewidth=2.0, alpha=alpha )
        ax.axvline(1.022, linestyle='--', linewidth=1.0)
        ax.axvline(12.0, linestyle='--', linewidth=1.0)

        fig = P.figure()
        ax = P.subplot( 111 )
        ax.minorticks_on()
        # ax.grid()
        ax.set_xlabel( 'E, MeV' )
        ax.set_ylabel( '' )
        ax.set_title( 'Mapping' )

        positron_model_scaled_data = quench.positron_model_scaled.single().data()
        for e1, e2 in zip(quench.histoffset.histedges.points_truncated.data(), positron_model_scaled_data):
            if e2>12.0 or e2<1.022:
                alpha = 0.05
            else:
                alpha = 0.7
            ax.plot( [e1, e2], [1.1, 0.9], '-', linewidth=2.0, alpha=alpha )

        for e1 in quench.histoffset.histedges.points.data():
            ax.axvline(e1, linestyle=':', linewidth=1.0, color='black')

        ax.axvline(1.022, linestyle='--', linewidth=1.0)
        ax.axvline(12.0, linestyle='--', linewidth=1.0)

        # ax.legend(loc='upper right')

        savefig(opts.output, suffix='_mapping_bins')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'E, MeV' )
    ax.set_ylabel( '' )
    ax.set_title( 'Reference histogram 2' )

    reference_histogram2.single().plot_hist(linewidth=0.5, alpha=1.0, label='original')
    reference_smeared2.single().plot_hist(  linewidth=0.5, alpha=1.0, label='smeared')
    ax.vlines(normE, 0.0, 1.0, linestyle=':')

    ax.legend(loc='upper right')

    savefig(opts.output, suffix='_refsmear2')

    fig = P.figure()
    ax = P.subplot( 111 )
    ax.minorticks_on()
    ax.grid()
    ax.set_xlabel( 'E, MeV' )
    ax.set_ylabel( 'Entries' )
    ax.set_title( 'Annihilation gamma electrons' )

    plot_hist(quench.annihilation_electrons_edges_input, quench.annihilation_electrons_p_input)
    ax.set_yscale('log')
    savefig(opts.output, suffix='_annihilation_electrons')

    ax.set_yscale('linear')
    ax.set_xlim(0.0, 0.1)
    savefig(opts.output, suffix='_annihilation_electrons_lin')

    if pdfpages:
        pdfpages.__exit__(None,None,None)
        print('Write output figure to', pdfpagesfilename)

    savegraph(quench.histoffset.histedges.points_truncated, opts.graph, namespace=ns)

    if opts.show:
        P.show()