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)
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()
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()
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')
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)
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()
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])
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)
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)):
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()
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)
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()
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])
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')
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()