def test_snf_spectrum_expression(tmp_path): """Test for new version of Daya Bay fast neutron background bundle, updated for new integrators""" indices = [ ('s', 'site', ['EH1', 'EH2', 'EH3']), ('d', 'detector', ['AD11', 'AD12', 'AD21', 'AD22', 'AD31', 'AD32', 'AD33', 'AD34'], dict(short='s', name='site', map=OrderedDict([('EH1', ('AD11', 'AD12')), ('EH2', ('AD21', 'AD22')), ('EH3', ('AD31', 'AD32', 'AD33', 'AD34'))]))), ] expr = ['evis_edges()', 'fastn_shape[s]', 'bkg_spectrum_fastn[s]()' ] a = Expression_v01(expr, indices = NIndex.fromlist(indices)) a.parse() lib = dict() a.guessname(lib, save=True) ns = env.globalns('fastn') cfg = NestedDict( integral = NestedDict( bundle = dict(name='integral_2d1d', version='v03'), variables = ('evis', 'ctheta'), edges = np.linspace(0.0, 12.0, 241, dtype='d'), xorders = 4, yorder = 2, ), bkg_spectrum_fastn=NestedDict( bundle=dict(name='dayabay_fastn_power', version='v02', major='s'), parameter='fastn_shape', name='bkg_spectrum_fastn', normalize=(0.7, 12.0), bins='evis_edges', order=2, ), fastn_shape=NestedDict( bundle = dict(name="parameters", version = "v01"), parameter='fastn_shape', label='Fast neutron shape parameter for {site}', pars=uncertaindict( [ ('EH1', (67.79, 0.1132)), ('EH2', (58.30, 0.0817)), ('EH3', (68.02, 0.0997)) ], mode='relative', ), ), ) context = ExpressionContext_v01(cfg, ns=ns) a.build(context)
]) ) bkg = cfg('bkg') bkg.bundle = 'bundlesum_v01' bkg.bundlesum_list = [ 'bkg1', 'bkg2', 'bkgw' ] #, 'bkg_fn' bkg.observable = 'bkg_total' bkg.bkg1 = NestedDict( bundle = 'bkg_weighted_hist_v01', formula = [ '{det}.bkg1_num', ('bkg1_norm.{det}', '{det}.bkg1_rate', '{det}.livetime') ], groups = cfg.groups, variants = cfg.detectors, bkg1_norm = uncertaindict([ (det, (1.0, 1.0, 'percent')) \ for det in cfg.detectors ]), bkg1_rate = uncertaindict( [ ('D1', 8), ('D2', 7), ('D3', 4), ('D4', 3) ], mode = 'fixed', ), spectra = NestedDict( bundle = 'root_histograms_v01', filename = cfg.filename, format = 'hist_{self}', variants = OrderedDict([
def init_configuration(self): if self.opts.eres_npe: self.opts.eres_sigma = self.opts.eres_npe**-0.5 else: self.opts.eres_npe = self.opts.eres_sigma**-2 print('Energy resolution at 1 MeV: {}% ({} pe)'.format( self.opts.eres_sigma * 100, self.opts.eres_npe)) edges = np.arange(0.0, 12.001, 0.01) #FIXME edges_final = np.concatenate(([0.7], np.arange(1, 6.0, self.opts.estep), np.arange(6, 7.0, 0.1), [7.0, 7.5, 12.0])) if self.opts.final_emin is not None: print('Truncate final binning E>={}'.format(self.opts.final_emin)) edges_final = edges_final[edges_final >= self.opts.final_emin] if self.opts.final_emax is not None: print('Truncate final binning E<={}'.format(self.opts.final_emax)) edges_final = edges_final[edges_final <= self.opts.final_emax] if self.opts.final_emin is not None or self.opts.final_emax is not None: print('Final binning:', edges_final) self.cfg = NestedDict( kinint2 = NestedDict( bundle = dict(name='integral_2d1d', version='v03', names=dict(integral='kinint2')), variables = ('evis', 'ctheta'), edges = edges, # edges = np.linspace(0.0, 12.001, 601), xorders = 4, yorder = 5, ), rebin = NestedDict( bundle = dict(name='rebin', version='v04', major=''), rounding = 5, edges = edges_final, instances={ 'rebin': 'Final histogram {detector}', } ), rebin_bkg = NestedDict( bundle = dict(name='rebin', version='v04', major=''), rounding = 5, edges = edges_final, instances={ 'rebin_acc': 'Accidentals {autoindex}', 'rebin_li': '9Li {autoindex}', 'rebin_he': '8He {autoindex}', 'rebin_fastn': 'Fast neutrons {autoindex}', 'rebin_alphan': 'C(alpha,n)O {autoindex}' } ), ibd_xsec = NestedDict( bundle = dict(name='xsec_ibd', version='v02'), order = 1, ), oscprob = NestedDict( bundle = dict(name='oscprob', version='v04', major='rdc', inactive=self.opts.oscprob=='matter'), pdgyear = self.opts.pdgyear, dm = self.opts.dm ), oscprob_matter = NestedDict( bundle = dict(name='oscprob_matter', version='v01', major='rd', inactive=self.opts.oscprob=='vacuum', names=dict(oscprob='oscprob_matter')), density = 2.6, # g/cm3 pdgyear = self.opts.pdgyear, dm = self.opts.dm ), anuspec_hm = NestedDict( bundle = dict(name='reactor_anu_spectra', version='v04', inactive=self.opts.flux!='huber-mueller'), name = 'anuspec', filename = ['data/reactor_anu_spectra/Huber/Huber_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat', 'data/reactor_anu_spectra/Mueller/Mueller_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat'], free_params=False, # enable free spectral model varmode='log', varname='anue_weight_{index:02d}', ns_name='spectral_weights', debug = True, edges = np.concatenate( ( np.arange( 1.8, 8.7, 0.025 ), [ 12.3 ] ) ), ), anuspec_ill = NestedDict( bundle = dict(name='reactor_anu_spectra', version='v04', inactive=self.opts.flux!='ill-vogel'), name = 'anuspec', filename = ['data/reactor_anu_spectra/ILL/ILL_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat', 'data/reactor_anu_spectra/Vogel/Vogel_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat'], free_params=False, # enable free spectral model varmode='log', varname='anue_weight_{index:02d}', ns_name='spectral_weights', debug = True, edges = np.concatenate( ( np.arange( 1.8, 8.7, 0.025 ), [ 12.3 ] ) ), ), offeq_correction = NestedDict( bundle = dict(name='reactor_offeq_spectra', version='v03', major='ir'), offeq_data = 'data/reactor_anu_spectra/Mueller/offeq/mueller_offequilibrium_corr_{isotope}.dat', ), geonu = NestedDict( bundle = dict(name='geoneutrino_spectrum', version='v01'), data = 'data/data-common/geo-neutrino/2006-sanshiro/geoneutrino-luminosity_{isotope}_truncated.knt' ), eff = NestedDict( bundle = dict( name='parameters', version='v01'), parameter="eff", label='Detection efficiency', pars = uncertain(0.8, 'fixed') ), global_norm = NestedDict( bundle = dict( name='parameters', version='v01'), parameter="global_norm", label='Global normalization', pars = uncertain(1, 'free'), ), fission_fractions = NestedDict( bundle = dict(name="parameters_yaml_v01", major = 'i'), parameter = 'fission_fractions_nominal', separate_uncertainty = "fission_fractions_scale", label = 'Fission fraction of {isotope} in reactor {reactor}', objectize=True, data = 'data/data_juno/fission_fractions/2013.12.05_xubo.yaml' ), snf_correction = NestedDict( bundle = dict(name='reactor_snf_spectra', version='v04', major='r'), snf_average_spectra = './data/data-common/snf/2004.12-kopeikin/kopeikin_0412.044_spent_fuel_spectrum_smooth.dat', ), livetime = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "livetime", label = 'Livetime of {detector} in seconds', pars = uncertaindict( [('AD1', (6*365*seconds_per_day, 'fixed'))], ), ), baselines = NestedDict( bundle = dict(name='reactor_baselines', version='v01', major = 'rd'), reactors = 'near-equal' in self.opts.reactors \ and 'data/juno_nominal/coordinates_reactors_equal.py' \ or 'data/juno_nominal/coordinates_reactors.py', detectors = 'data/juno_nominal/coordinates_det.py', unit = 'km' ), norm = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "norm", label = 'Reactor power/detection efficiency correlated normalization', pars = uncertain(1.0, (2**2+1**2)**0.5, 'percent') ), thermal_power = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "thermal_power_nominal", label = 'Thermal power of {reactor} in GWt', pars = uncertaindict([ ('TS1', 4.6), ('TS2', 4.6), ('TS3', 4.6), ('TS4', 4.6), ('YJ1', 2.9), ('YJ2', 2.9), ('YJ3', 2.9), ('YJ4', 2.9), ('YJ5', 2.9), ('YJ6', 2.9), ('DYB', 17.4), ('HZ', 17.4), ], uncertainty=0.8, mode='percent' ), separate_uncertainty = 'thermal_power_scale' ), target_protons = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "target_protons", label = 'Number of protons in {detector}', pars = uncertaindict( [('AD1', (1.42e33, 'fixed'))], ), ), conversion_factor = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter='conversion_factor', label='Conversion factor from GWt to MeV', #taken from transformations/neutrino/ReactorNorm.cc pars = uncertain(R.NeutrinoUnits.reactorPowerConversion, 'fixed'), ), days_in_second = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter='days_in_second', label='Number of days in a second', pars = uncertain(1.0/(24.0*60.0*60.0), 'fixed'), ), eper_fission = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = 'eper_fission_nominal', label = 'Energy per fission for {isotope} in MeV', pars = uncertaindict( [ ('U235', (201.92, 0.46)), ('U238', (205.52, 0.96)), ('Pu239', (209.99, 0.60)), ('Pu241', (213.60, 0.65)) ], mode='absolute' ), separate_uncertainty = 'eper_fission_scale' ), lsnl = NestedDict( bundle = dict( name='energy_nonlinearity_birks_cherenkov', version='v01', major=''), stopping_power='data/data_juno/energy_model/2019_birks_cherenkov_v01/stoppingpower.txt', annihilation_electrons=dict( file='data/data_juno/energy_model/2019_birks_cherenkov_v01/hgamma2e.root', histogram='hgamma2e_1KeV', scale=1.0/50000 # events 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", (11.99, '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 = 'Conservative normalization point at 12 MeV' ), ), shape_uncertainty = NestedDict( unc = uncertain(1.0, 1.0, 'percent'), nbins = 200 # number of bins, the uncertainty is defined to ), snf_norm = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = 'snf_norm', label='SNF norm', pars = uncertain(1.0, 'fixed'), ), reactor_active_norm = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = 'reactor_active_norm', label='Reactor nu (active norm)', pars = uncertain(1.0, 'fixed'), ), # # Backgrounds # acc_spectrum_db = NestedDict( bundle = dict(name='root_histograms_v04', inactive=True), filename = 'data/data_juno/bkg/acc/2016_acc_dayabay_p15a/dayabay_acc_spectrum_p15a.root', format = 'accidentals', name = 'acc_spectrum', label = 'Accidentals|norm spectrum', normalize = True ), acc_spectrum = NestedDict( bundle = dict(name='root_histograms_v04'), filename = 'data/data_juno/bkg/acc/2019_acc_malyshkin/acc_bckg_FVcut.root', format = 'hAcc', name = 'acc_spectrum', label = 'Accidentals|norm spectrum', normalize = slice(200,-1), xscale = 1.e-3, ), fastn_spectrum=NestedDict( bundle=dict(name='histogram_flat_v01'), name='fastn_spectrum', edges=edges, label='Fast neutron|norm spectrum', normalize=(0.7, 12.0), ), li_spectrum=NestedDict( bundle = dict(name='root_histograms_v03'), filename = 'data/data_juno/bkg/lihe/2014_lihe_ochoa/toyli9spec_BCWmodel_v1_2400.root', format = 'h_eVisAllSmeared', name = 'li_spectrum', label = '9Li spectrum|norm', normalize = True, ), he_spectrum= NestedDict( bundle = dict(name='root_histograms_v03'), filename = 'data/data_juno/bkg/lihe/2014_lihe_ochoa/toyhe8spec_BCWmodel_v1_2400.root', format = 'h_eVisAllSmeared', name = 'he_spectrum', label = '8He spectrum|norm', normalize = True, ), alphan_spectrum = NestedDict( bundle = dict(name='root_histograms_v03'), filename = 'data/data_juno/bkg/alphan/2012_dayabay_alphan/P12B_alphan_2400.root', format = 'AD1', name = 'alphan_spectrum', label = 'C(alpha,n) spectrum|(norm)', normalize = True, ), lihe_fractions=NestedDict( bundle = dict(name='var_fractions_v02'), names = [ 'li', 'he' ], format = 'frac_{component}', fractions = uncertaindict( li = ( 0.95, 0.05, 'relative' ) ), ), # bkg_spectra = NestedDict( # bundle = dict(name='root_histograms_v05'), # filename = 'data/data_juno/bkg/group/2020-05-JUNO-YB/JunoBkg_evis_2400.root', # formats = ['AccBkgHistogramAD', 'Li9BkgHistogramAD', 'FnBkgHistogramAD', 'AlphaNBkgHistogramAD', 'GeoNuHistogramAD'], # names = ['acc_spectrum', 'lihe_spectrum', 'fn_spectrum', 'alphan_spectrum', 'geonu_spectrum'], # labels = ['Accidentals|(norm spectrum)', '9Li|(norm spectrum)', 'Fast n|(norm spectrum)', 'AlphaN|(norm spectrum)', 'GeoNu combined|(norm spectrum)'], # normalize = True, # ), acc_rate = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = 'acc_rate', label='Acc rate', pars = uncertain(0.9, 1, 'percent'), separate_uncertainty='acc_norm', ), fastn_rate = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = 'fastn_rate', label='Fast n rate', pars = uncertain(0.1, 100, 'percent'), separate_uncertainty='fastn_norm', ), lihe_rate = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = 'lihe_rate', label='9Li/8He rate', pars = uncertain(1.6, 20, 'percent'), separate_uncertainty='lihe_norm', ), alphan_rate = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = 'alphan_rate', label='C(alpha,n)O rate', pars = uncertain(0.05, 50, 'percent'), separate_uncertainty='alphan_norm', ), ) if 'eres' in self.opts.energy_model: bconf = self.opts.eres_b_relsigma and (self.opts.eres_b_relsigma, 'relative') or ('fixed', ) self.cfg.eres = NestedDict( bundle=dict(name='detector_eres_normal', version='v01', major=''), # pars: sigma_e/e = sqrt( a^2 + b^2/E + c^2/E^2 ), parameter='eres', pars=uncertaindict([('a', (0.000, 'fixed')), ('b', (self.opts.eres_sigma, ) + bconf), ('c', (0.000, 'fixed'))]), expose_matrix=False) elif 'multieres' in self.opts.energy_model: self.cfg.subdetector_fraction = NestedDict( bundle=dict(name="parameters", version="v03"), parameter="subdetector_fraction", label='Subdetector fraction weight for {subdetector}', pars=uncertaindict( [(subdet_name, (0.2, 0.04, 'relative')) for subdet_name in self.subdetectors_names], ), covariance= 'data/data_juno/energy_resolution/2019_subdetector_eres_n200_proper/subdetector5_cov.txt' ) self.cfg.multieres = NestedDict( bundle=dict(name='detector_multieres_stats', version='v01', major='s'), # pars: sigma_e/e = sqrt(b^2/E), parameter='eres', relsigma=self.opts.eres_b_relsigma, nph= 'data/data_juno/energy_resolution/2019_subdetector_eres_n200_proper/subdetector5_nph.txt', rescale_nph=self.opts.eres_npe, expose_matrix=False) if not 'lsnl' in self.opts.correlation: self.cfg.lsnl.correlations = None self.cfg.lsnl.correlations_pars = None if not 'subdetectors' in self.opts.correlation: self.cfg.subdetector_fraction.correlations = None self.cfg.eff.pars = uncertain(0.73, 'fixed') self.cfg.livetime.pars['AD1'] = uncertain(6 * 330 * seconds_per_day, 'fixed')
) cfg.detector.iav = NestedDict( bundle = 'detector_iav_db_root_v01', parname = 'OffdiagScale.{}', scale = uncertain(1.0, 4, 'percent'), ndiag = 1, filename = 'data/dayabay/tmp/detector_iavMatrix_P14A_LS.root', matrixname = 'iav_matrix' ) cfg.detector.eres = NestedDict( bundle = 'detector_eres_common3', # pars: sigma_e/e = sqrt( a^2 + b^2/E + c^2/E^2 ), pars = uncertaindict( [('Eres_a', 0.014764) , ('Eres_b', 0.0869) , ('Eres_c', 0.0271)], mode='percent', uncertainty=30 ) ) cfg.detector.rebin = NestedDict( bundle = 'rebin', rounding = 3, edges = [ 0.0, 5.0, 10.0 ] ) # # Define namespaces # namespaces = cfg.detector.detectors
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()
nidx=[ ('s', 'source', ['SA', 'SB']), 'name', ('d', 'detector', ['D1', 'D2', 'D3']), ], ), parameter='rate0', label='Flux normalization {source}->{detector}', separate_uncertainty='norm0', pars=uncertaindict( [ ('SA.D1', 1.0), ('SB.D1', 2.0), ('SA.D2', 3.0), ('SB.D2', 4.0), ('SA.D3', 5.0), ('SB.D3', 6.0), ('SA.D4', 7.0), ('SB.D4', 8.0), ], uncertainty=1.0, mode='percent', ), ) cfg2 = NestedDict( bundle=dict(name='parameters', version='v01', nidx=[('s', 'source', ['SA', 'SB']), ('d', 'detector', ['D1', 'D2', 'D3']), ('e', 'element', ['e0', 'e1'])], major=('s', 'd')),
print() # Provide the configuration. The configuration tells the Expression on how to build each variable/output. cfg = NestedDict( ta=NestedDict(bundle=dict(name='dummy', version='v01'), name='ta', input=False, size=10, debug=False), tb=NestedDict(bundle=dict(name='dummy', version='v01'), name='tb', input=False, size=10, 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)
debug=False), offset=NestedDict(bundle='dummy', name='offset', input=False, size=10, debug=False), function=NestedDict( bundle='dummy', name='function', label='function\ni={index_i}, j={index_j}, k={index_k}', input=1, size=10, debug=False), scale=NestedDict(bundle='dummyvar', variables=uncertaindict([ ('scale', (2, 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)
bundle='dayabay_reactor_burning_info_v01', reactor_info='data/dayabay/reactor/power/WeeklyAvg_P15A_v1.txt.npz', fission_uncertainty_info= 'data/dayabay/reactor/fission_fraction/2013.12.05_xubo.py', provides=['thermal_power', 'fission_fractions']), iav=NestedDict(bundle='detector_iav_db_root_v02', parname='OffdiagScale', scale=uncertain(1.0, 4, 'percent'), ndiag=1, filename='data/dayabay/tmp/detector_iavMatrix_P14A_LS.root', matrixname='iav_matrix'), eres=NestedDict( bundle='detector_eres_common3_v02', # pars: sigma_e/e = sqrt( a^2 + b^2/E + c^2/E^2 ), pars=uncertaindict([('eres.a', 0.014764), ('eres.b', 0.0869), ('eres.c', 0.0271)], mode='percent', uncertainty=30), provides=['eres', 'eres_matrix'], expose_matrix=True), lsnl=NestedDict( bundle='detector_nonlinearity_db_root_v02', names=['nominal', 'pull0', 'pull1', 'pull2', 'pull3'], filename='data/dayabay/tmp/detector_nl_consModel_450itr.root', parnames=dict(lsnl='lsnl_weight', escale='escale'), par=uncertain(1.0, 0.2, 'percent'), edges='evis_edges', provides=[ 'lsnl', 'lsnl_component', 'escale', 'lsnl_weight', 'lsnl_edges' ]), rebin=NestedDict(bundle='rebin_v02', rounding=3,
def init_configuration(self): mode_yb = self.opts.mode == 'yb' self.cfg = NestedDict( kinint2 = NestedDict( bundle = dict(name='integral_2d1d', version='v03', names=dict(integral='kinint2'), inactive=mode_yb), variables = ('evis', 'ctheta'), edges = np.arange(0.6, 12.001, 0.01), # edges = np.linspace(0.0, 12.001, 601), xorders = 4, yorder = 5, ), rebin = NestedDict( bundle = dict(name='rebin', version='v03', major='', inactive=mode_yb), rounding = 3, edges = np.concatenate(( [0.7], np.arange(1, 8.001, 0.02), [9.0, 12.0] )), name = 'rebin', label = 'Final histogram {detector}' ), kinint2_enu = NestedDict( bundle = dict(name='integral_2d1d', version='v03', names=dict(integral='kinint2'), inactive=not mode_yb), variables = ('enu_in', 'ctheta'), edges = np.linspace(1.8, 8.0, 601), xorders = 4, yorder = 5, ), rebin_yb = NestedDict( bundle = dict(name='rebin', version='v03', major='', inactive=not mode_yb), rounding = 3, edges = np.linspace(1.8, 8.0, 201), name = 'rebin', label = 'Final histogram {detector}' ), ibd_xsec = NestedDict( bundle = dict(name='xsec_ibd', version='v02'), order = 1, ), oscprob = NestedDict( bundle = dict(name='oscprob', version='v03', major='rdc'), pdgyear = self.opts.pdgyear ), anuspec = NestedDict( bundle = dict(name='reactor_anu_spectra', version='v03'), name = 'anuspec', filename = ['data/reactor_anu_spectra/Huber/Huber_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat', 'data/reactor_anu_spectra/Mueller/Mueller_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat'], # strategy = dict( underflow='constant', overflow='extrapolate' ), edges = np.concatenate( ( np.arange( 1.8, 8.7, 0.025 ), [ 12.3 ] ) ), ), anuspec_1 = NestedDict( bundle = dict(name='reactor_anu_spectra', version='v03'), name = 'anuspec', filename = ['data/reactor_anu_spectra/Huber/Huber_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat', 'data/reactor_anu_spectra/Mueller/Mueller_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat'], # strategy = dict( underflow='constant', overflow='extrapolate' ), edges = np.concatenate( ( np.arange( 1.8, 8.7, 0.05 ), [ 12.3 ] ) ), ), eff = NestedDict( bundle = dict( name='parameters', version='v01'), parameter="eff", label='Detection efficiency', pars = uncertain(0.8, 'fixed') ), global_norm = NestedDict( bundle = dict( name='parameters', version='v01'), parameter="global_norm", label='Global normalization', pars = uncertain(1, 'free'), ), fission_fractions = NestedDict( bundle = dict(name="parameters", version = "v01", major = 'i' ), parameter = "fission_fractions", label = 'Fission fraction of {isotope} in reactor {reactor}', objectize=True, pars = uncertaindict([ ('U235', 0.60), ('Pu239', 0.27), ('U238', 0.07), ('Pu241', 0.06) ], # uncertainty = 30.0, # mode = 'percent', mode = 'fixed', ), ), livetime = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "livetime", label = 'Livetime of {detector} in seconds', pars = uncertaindict( [('AD1', (6*365*seconds_per_day, 'fixed'))], ), ), baselines = NestedDict( bundle = dict(name='reactor_baselines', version='v01', major = 'rd'), reactors = 'near-equal' in self.opts.reactors \ and 'data/juno_nominal/coordinates_reactors_equal.py' \ or 'data/juno_nominal/coordinates_reactors.py', detectors = 'data/juno_nominal/coordinates_det.py', unit = 'km' ), norm = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "norm", label = 'Reactor power/detection efficiency correlated normalization', pars = uncertain(1.0, (2**2+1**2)**0.5, 'percent') ), thermal_power = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "thermal_power", label = 'Thermal power of {reactor} in GWt', pars = uncertaindict([ ('TS1', 4.6), ('TS2', 4.6), ('TS3', 4.6), ('TS4', 4.6), ('YJ1', 2.9), ('YJ2', 2.9), ('YJ3', 2.9), ('YJ4', 2.9), ('YJ5', 2.9), ('YJ6', 2.9), ('DYB', 17.4), ('HZ', 17.4), ], uncertainty=0.8, mode='percent' ), ), target_protons = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "target_protons", label = 'Number of protons in {detector}', pars = uncertaindict( [('AD1', (1.42e33, 'fixed'))], ), ), conversion_factor = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter='conversion_factor', label='Conversion factor from GWt to MeV', #taken from transformations/neutrino/ReactorNorm.cc pars = uncertain(R.NeutrinoUnits.reactorPowerConversion, 'fixed'), ), eper_fission = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "eper_fission", label = 'Energy per fission for {isotope} in MeV', pars = uncertaindict( [ # ('U235', (201.92, 0.46)), # ('U238', (205.52, 0.96)), # ('Pu239', (209.99, 0.60)), # ('Pu241', (213.60, 0.65)) ('U235', 201.92), ('U238', 205.52), ('Pu239', 209.99), ('Pu241', 213.60) ], # mode='absolute' mode='fixed' ), ), lsnl = NestedDict( bundle = dict( name='energy_nonlinearity_birks_cherenkov', version='v01', major=''), stopping_power='data/data_juno/energy_model/2019_birks_cherenkov_v01/stoppingpower.txt', annihilation_electrons=dict( file='data/data_juno/energy_model/2019_birks_cherenkov_v01/hgamma2e.root', histogram='hgamma2e_1KeV', scale=1.0/50000 # events 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 = 'Conservative normalization point at 12 MeV' ), ), eres = NestedDict( bundle = dict(name='detector_eres_normal', version='v01', major='', inactive='multieres' in self.opts.energy_model), # pars: sigma_e/e = sqrt( a^2 + b^2/E + c^2/E^2 ), parameter = 'eres', pars = uncertaindict([ ('a', (0.000, 'fixed')), ('b', (0.03, 'fixed')), ('c', (0.000, 'fixed')) ]), expose_matrix = False ), subdetector_fraction = NestedDict( bundle = dict(name="parameters", version = "v02"), parameter = "subdetector_fraction", label = 'Subdetector fraction weight for {subdetector}', pars = uncertaindict( [(subdet_name, (1.0/self.subdetectors_number, 0.04, 'relative')) for subdet_name in self.subdetectors_names], ), correlations = 'data/data_juno/energy_resolution/2019_subdetector_eres_n200/corrmap_xuyu.txt' ), multieres = NestedDict( bundle = dict(name='detector_multieres_stats', version='v01', major='s', inactive='multieres' not in self.opts.energy_model), # pars: sigma_e/e = sqrt(b^2/E), parameter = 'eres', nph = 'data/data_juno/energy_resolution/2019_subdetector_eres_n200/subdetector200_nph.txt', expose_matrix = False ), shape_uncertainty = NestedDict( unc = uncertain(1.0, 1.0, 'percent'), nbins = 200 # number of bins, the uncertainty is defined to ) ) if mode_yb: from physlib import PhysicsConstants pc = PhysicsConstants(2016) shift = pc.DeltaNP - pc.ElectronMass histshift = R.HistEdgesLinear(1.0, -shift) self.cfg.enuToEvis0 = NestedDict( bundle=dict(name='predefined', version='v01'), name='enuToEvis0', inputs=(histshift.histedges.hist_in, ), outputs=histshift.histedges.hist, object=histshift) if not 'lsnl' in self.opts.correlation: self.cfg.lsnl.correlations = None self.cfg.lsnl.correlations_pars = None if not 'subdetectors' in self.opts.correlation: self.cfg.subdetector_fraction.correlations = None if self.opts.parameters in ['yb', 'yb-noosc']: self.cfg.eff.pars = uncertain(0.73, 'fixed') self.cfg.livetime.pars['AD1'] = uncertain( 6 * 330 * seconds_per_day, 'fixed')
import load from gna.bundle import execute_bundle from gna.configurator import NestedDict, uncertaindict, uncertain from gna.env import env # # Bundle configuration # cfg = NestedDict( bundle=dict( name='parameters', version='ex01', ), pars=uncertaindict([('par_a', (1.0, 1.0, 'percent')), ('par_b', (2.0, 0.01, 'relative')), ('par_c', (3.0, 0.5, 'absolute')), ('group.a', (1.0, 'free')), ('group.b', (1.0, 'fixed', 'Labeled fixed parameter'))], ), ) # # Execute bundle configuration # b1 = execute_bundle(cfg) # # Print the parameters # env.globalns.printparameters(labels=True)
from gna.env import env from gna.bindings import common from gna import constructors as C import numpy as np from matplotlib import pyplot as plt cfg = NestedDict( bundle=dict( name='detector_eres', version='ex01', ), parameter='eres', pars=uncertaindict([ ('a', 0.01), ('b', 0.09), ('c', 0.03), ], mode='percent', uncertainty=30.0), ) b = execute_bundle(cfg) env.globalns.printparameters(labels=True) print() # # Prepare inputs # emin, emax = 0.0, 12.0 nbins = 240 edges = np.linspace(emin, emax, nbins + 1, dtype='d') data = np.zeros(nbins, dtype='d')
'name', ('d', 'detector', ['D1', 'D2', 'D3']), ], ), # Parameter name to be defined parameter='rate0', # Label format label='Flux normalization {source}->{detector}', # Dictionary with parameter values and uncertainties pars=uncertaindict( [ ('SA.D1', 1.0), ('SB.D1', 2.0), ('SA.D2', 3.0), ('SB.D2', 4.0), ('SA.D3', 5.0), ('SB.D3', 6.0), ('SA.D4', 7.0), ('SB.D4', 8.0), ], uncertainty=1.0, mode='percent', ), ) b1 = execute_bundle(cfg1, namespace=env.globalns('bundle1')) env.globalns('bundle1').printparameters(labels=True) print() # # List of parameters 2 # cfg2 = NestedDict(
provides = [ 'eff', 'effunc_corr', 'effunc_uncorr', 'global_norm' ], efficiencies = 'data/dayabay/efficiency/P15A_efficiency.py' ), fission_fractions = NestedDict( bundle = dict(name="parameters", version = "v01", nidx = [indices[1], indices[2]], major = 'i' ), parameter = "fission_fractions", label = 'Fission fraction of {isotope} in reactor {reactor}', pars = uncertaindict([ ('U235', 0.60), ('Pu239', 0.27), ('U238', 0.07), ('Pu241', 0.06) ], uncertainty = 30.0, mode = 'percent', ), provides=['fission_fractions'] ), livetime = NestedDict( bundle = dict(name="parameters", version = "v01", nidx = [indices[0]]), parameter = "livetime", label = 'Livetime of {detector} in seconds', pars = uncertaindict( [('AD1', (6*365*seconds_per_day, 'fixed'))], ),
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()
def build_and_plot(expr, obj, suffix): # Initialize the expression and indices a = Expression(expr, indices) # Dump the information print(a.expressions_raw) print(a.expressions) # Parse the expression a.parse() # The next step is needed to name all the intermediate variables. a.guessname(lib, save=True) # Dump the tree. a.tree.dump(True) cfg = NestedDict( kinint2=NestedDict( bundle='integral_2d1d_v01', variables=('evis', 'ctheta'), edges=N.linspace(0.0, 12.0, 241, dtype='d'), xorders=3, yorder=5, provides=['evis', 'ctheta', 'evis_edges'], ), ibd_xsec=NestedDict(bundle='xsec_ibd_v01', order=1, provides=['ibd_xsec', 'ee', 'enu', 'jacobian']), oscprob=NestedDict(bundle='oscprob_v01', name='oscprob', provides=['oscprob', 'pmns']), anuspec=NestedDict( bundle='reactor_anu_spectra_v02', name='anuspec', filename=[ 'data/reactor_anu_spectra/Huber/Huber_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat', 'data/reactor_anu_spectra/Mueller/Mueller_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat' ], # strategy = dict( underflow='constant', overflow='extrapolate' ), edges=N.concatenate((N.arange(1.8, 8.7, 0.5), [12.3])), ), eff=NestedDict( bundle='efficiencies_v01', correlated=False, uncorrelated=True, norm=True, names=dict(norm='global_norm'), provides=['eff', 'effunc_corr', 'effunc_uncorr', 'global_norm'], efficiencies='data/dayabay/efficiency/P15A_efficiency.py'), livetime=NestedDict( bundle='dayabay_livetime_hdf_v01', file= 'data/dayabay/data/P15A/dubna/dayabay_data_dubna_v15_bcw_adsimple.hdf5', provides=['livetime_daily', 'efflivetime_daily']), baselines=NestedDict( bundle='baselines_v01', reactors= 'data/dayabay/reactor/coordinates/coordinates_docDB_9757.py', detectors='data/dayabay/ad/coordinates/coordinates_docDB_9757.py', provides=['baseline', 'baselineweight'], units="meters"), thermal_power=NestedDict( bundle='dayabay_reactor_burning_info_v01', reactor_info='data/dayabay/reactor/power/WeeklyAvg_P15A_v1.txt.npz', provides=['thermal_power', 'fission_fractions']), iav=NestedDict( bundle='detector_iav_db_root_v02', parname='OffdiagScale', scale=uncertain(1.0, 4, 'percent'), ndiag=1, filename='data/dayabay/tmp/detector_iavMatrix_P14A_LS.root', matrixname='iav_matrix'), eres=NestedDict( bundle='detector_eres_common3_v02', # pars: sigma_e/e = sqrt( a^2 + b^2/E + c^2/E^2 ), pars=uncertaindict([('Eres_a', 0.014764), ('Eres_b', 0.0869), ('Eres_c', 0.0271)], mode='percent', uncertainty=30), provides=['eres', 'eres_matrix'], expose_matrix=True), lsnl=NestedDict( bundle='detector_nonlinearity_db_root_v02', names=['nominal', 'pull0', 'pull1', 'pull2', 'pull3'], filename='data/dayabay/tmp/detector_nl_consModel_450itr.root', parnames=dict(lsnl='lsnl_weight', escale='escale'), par=uncertain(1.0, 0.2, 'percent'), edges='evis_edges', provides=[ 'lsnl', 'lsnl_component', 'escale', 'lsnl_weight', 'lsnl_edges' ]), rebin=NestedDict(bundle='rebin_v02', rounding=3, edges=N.concatenate(([0.7], N.arange(1.2, 8.1, 0.2), [12.0])))) # # Put the expression into context context = ExpressionContext(cfg, ns=env.globalns) a.build(context) # # Print the list of outputs, stored for the expression # from gna.bindings import OutputDescriptor # env.globalns.materializeexpressions(True) # env.globalns.printparameters( labels=True ) # print( 'outputs:' ) # print( context.outputs ) try: from gna.graphviz import GNADot obj = context.outputs[obj] if isinstance(obj, NestedDict): obj = obj.values() if len(expr) < 4: label = expr[0] if label == 'evis()': label = expr[1] else: label = '' graph = GNADot(obj, joints=False, label=label) name = args.dot.replace('.dot', '_' + suffix + '.dot') graph.write(name) print('Write output to:', name) except Exception as e: print('\033[31mFailed to plot dot\033[0m') raise
from matplotlib import pyplot as plt from gna.bindings import common cfg = NestedDict(bundle=dict(name='detector_eres', version='ex02', nidx=[('d', 'detector', ['D1', 'D2', 'D3']), ('z', 'zone', ['z1', 'z2'])], major=['z'], names=dict(eres_matrix='smearing_matrix', )), parameter='eres', pars=uncertaindict([ ('z1.a', (0.0, 'fixed')), ('z1.b', (0.05, 30, 'percent')), ('z1.c', (0.0, 'fixed')), ('z2.a', (0.0, 'fixed')), ('z2.b', (0.10, 30, 'percent')), ('z2.c', (0.0, 'fixed')), ('z3.a', (0.0, 'fixed')), ('z3.b', (0.15, 30, 'percent')), ('z3.c', (0.0, 'fixed')), ]), labels=dict(matrix='Smearing\nmatrix\n{autoindex}', smear='Energy\nresolution\n{autoindex}', parameter='{description} (zone {autoindex})'), split_transformations=True) b = execute_bundle(cfg) env.globalns.printparameters(labels=True) print() # # Prepare inputs
def main(opts): global savefig 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): close = kwargs.pop('close', False) if opts.individual and args and args[0]: savefig_old(*args, **kwargs) pdf.savefig() if close: P.close() else: pdf = None pdfpagesfilename = '' pdfpages = None cfg = NestedDict( bundle = dict( name='energy_nonlinearity_birks_cherenkov', version='v01', nidx=[ ('r', 'reference', ['R1', 'R2']) ], major=[], ), stopping_power='data/data_juno/energy_model/2019_birks_cherenkov_v01/stoppingpower.txt', annihilation_electrons=dict( file='data/data_juno/energy_model/2019_birks_cherenkov_v01/hgamma2e.root', histogram='hgamma2e_1KeV', scale=1.0/50000 # events 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", (11.9999999, '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) print() normE = ns['normalizationEnergy'].value() # # Input bins # evis_edges_full_input = N.arange(0.0, 15.0+1.e-6, 0.001) 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 # 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', bounds_error=False, fill_value='extrapolate') # # Energy resolution # def eres_sigma_rel(edep): return 0.03/edep**0.5 def eres_sigma_abs(edep): return 0.03*edep**0.5 # # 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 # data = Data(N.arange(1.8, 15.0, 0.001), lsnl_fcn=lsnl_fcn, eres_fcn=eres_sigma_abs) # Initialize oscillation variables enu = C.Points(data.enu, 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') oscprob.printtransformations() env.globalns.printparameters(labels=True) ns = env.globalns('oscprob') data.set_dm_par(ns['DeltaMSqEE']) data.set_nmo_par(ns['Alpha']) data.set_psur_fcn(op_sum.single().data) data.build() # # Plotting # xmax = 12.0 # # Positron non-linearity # fig = P.figure() ax = P.subplot(111, xlabel='Edep, MeV', ylabel='Evis/Edep', title='Positron energy nonlineairty') ax.minorticks_on(); ax.grid() 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) ax.set_xlim(0.0, xmax) savefig(opts.output, suffix='_total_relative', close=not opts.show_all) # # Positron non-linearity derivative # fig = P.figure() ax = P.subplot(111, xlabel='Edep, MeV', ylabel='dEvis/dEdep', title='Positron energy nonlineairty derivative') ax.minorticks_on(); ax.grid() e = quench.histoffset.histedges.points_truncated.single().data() f = quench.positron_model_relative.single().data()*e ec = (e[1:] + e[:-1])*0.5 df = (f[1:] - f[:-1]) dedf = (e[1:] - e[:-1])/df ax.plot(ec, dedf) ax.legend(loc='lower right') ax.set_ylim(0.975, 1.01) ax.set_xlim(0.0, xmax) savefig(opts.output, suffix='_total_derivative', close=not opts.show_all) # # Positron non-linearity effect # fig = P.figure() ax = P.subplot(111, xlabel='Edep, MeV', ylabel='Evis/Edep', title='Positron energy nonlineairty') ax.minorticks_on(); ax.grid() es = N.arange(1.0, 3.1, 0.5) esmod = es*lsnl_fcn(es) esmod_shifted = esmod*(es[-1]/esmod[-1]) ax.vlines(es, 0.0, 1.0, linestyle='--', linewidth=2, alpha=0.5, color='green', label='Edep') ax.vlines(esmod, 0.0, 1.0, linestyle='-', color='red', label='Edep quenched') ax.legend() savefig(opts.output, suffix='_quenching_effect_0') ax.vlines(esmod_shifted, 0.0, 1.0, linestyle=':', color='blue', label='Edep quenched, scaled') ax.legend() savefig(opts.output, suffix='_quenching_effect_1', close=not opts.show_all) # # Energy resolution # fig = P.figure() ax = P.subplot(111, xlabel='Edep, MeV', ylabel=r'$\sigma/E$', title='Energy resolution') ax.minorticks_on(); ax.grid() ax.plot(data.edep, eres_sigma_rel(data.edep), '-') ax.set_xlim(0.0, xmax) savefig(opts.output, suffix='_eres_rel', close=not opts.show_all) # # Energy resolution # fig = P.figure() ax = P.subplot(111, xlabel= 'Edep, MeV', ylabel= r'$\sigma$', title='Energy resolution') ax.minorticks_on(); ax.grid() ax.plot(data.edep, eres_sigma_abs(data.edep), '-') ax.set_xlim(0.0, xmax) savefig(opts.output, suffix='_eres_abs', close=not opts.show_all) # # Survival probability vs Enu # fig = P.figure() ax = P.subplot(111, xlabel='Enu, MeV', ylabel='Psur', title='Survival probability') ax.minorticks_on(); ax.grid() ax.plot(data.enu, data.data_no.psur[data.dmmid_idx], label=r'full NO') ax.plot(data.enu, data.data_io.psur[data.dmmid_idx], label=r'full IO') ax.plot(data.data_no.data_enu.psur_e[data.dmmid_idx], data.data_no.data_enu.psur[data.dmmid_idx], '^', markerfacecolor='none') ax.legend() ax.set_xlim(0.0, xmax) savefig(opts.output, suffix='_psur_enu') ax.set_xlim(2.0, 4.5) savefig(opts.output, suffix='_psur_enu_zoom', close=not opts.show_all) # # Survival probability vs Edep # fig = P.figure() ax = P.subplot(111, xlabel='Edep, MeV', ylabel='Psur', title='Survival probability') ax.minorticks_on(); ax.grid() ax.plot(data.edep, data.data_no.psur[data.dmmid_idx], label=r'full NO') ax.plot(data.edep, data.data_io.psur[data.dmmid_idx], label=r'full IO') ax.plot(data.data_no.data_edep.psur_e[data.dmmid_idx], data.data_no.data_edep.psur[data.dmmid_idx], '^', markerfacecolor='none') ax.legend() ax.set_xlim(0.0, xmax) savefig(opts.output, suffix='_psur_edep') ax.set_xlim(1.2, 3.7) savefig(opts.output, suffix='_psur_edep_zoom', close=not opts.show_all) # # Survival probability vs Edep_lsnl # fig = P.figure() ax = P.subplot(111, xlabel='Edep quenched, MeV', ylabel='Psur', title='Survival probability') ax.minorticks_on(); ax.grid() ax.plot(data.edep_lsnl, data.data_no.psur[data.dmmid_idx], label=r'full NO') ax.plot(data.edep_lsnl, data.data_io.psur[data.dmmid_idx], label=r'full IO') ax.plot(data.data_no.data_edep_lsnl.psur_e[data.dmmid_idx], data.data_no.data_edep_lsnl.psur[data.dmmid_idx], '^', markerfacecolor='none') ax.legend() ax.set_xlim(0.0, xmax) savefig(opts.output, suffix='_psur_edep_lsnl') ax.set_xlim(1.2, 3.7) savefig(opts.output, suffix='_psur_edep_lsnl_zoom', close=not opts.show_all) # # Distance between nearest peaks vs Enu, single # fig = P.figure() ax = P.subplot(111, xlabel='Enu, MeV', ylabel='Dist, MeV', title='Nearest peaks distance') ax.minorticks_on(); ax.grid() ax.plot(data.data_no.data_enu.diff_x[data.dmmid_idx], data.data_no.data_enu.diff[data.dmmid_idx], label=r'NO') ax.plot(data.data_io.data_enu.diff_x[data.dmmid_idx], data.data_io.data_enu.diff[data.dmmid_idx], label=r'IO') ax.legend() ax.set_xlim(0.0, xmax) ax.set_ylim(bottom=0.0) savefig(opts.output, suffix='_dist_enu') ax.set_xlim(2.0, 5.0) ax.set_ylim(top=0.5) savefig(opts.output, suffix='_dist_enu_zoom', close=not opts.show_all) # # Distance between nearest peaks vs Edep, single # fig = P.figure() ax = P.subplot(111, xlabel='Edep, MeV', ylabel='Dist, MeV', title='Nearest peaks distance') ax.minorticks_on(); ax.grid() ax.plot(data.data_no.data_edep.diff_x[data.dmmid_idx], data.data_no.data_edep.diff[data.dmmid_idx], label=r'NO') ax.plot(data.data_io.data_edep.diff_x[data.dmmid_idx], data.data_io.data_edep.diff[data.dmmid_idx], label=r'IO') ax.legend() ax.set_xlim(0.0, xmax) ax.set_ylim(bottom=0.0) savefig(opts.output, suffix='_dist_edep') ax.set_xlim(1.2, 4.2) ax.set_ylim(top=0.5) savefig(opts.output, suffix='_dist_edep_zoom', close=not opts.show_all) # # Distance between nearest peaks vs Edep, single # fig = P.figure() ax = P.subplot(111, xlabel='Edep quenched, MeV', ylabel='Dist, MeV', title='Nearest peaks distance') ax.minorticks_on(); ax.grid() ax.plot(data.data_no.data_edep_lsnl.diff_x[data.dmmid_idx], data.data_no.data_edep_lsnl.diff[data.dmmid_idx], label=r'NO') ax.plot(data.data_io.data_edep_lsnl.diff_x[data.dmmid_idx], data.data_io.data_edep_lsnl.diff[data.dmmid_idx], label=r'IO') ax.legend() ax.set_xlim(0.0, xmax) ax.set_ylim(bottom=0.0) savefig(opts.output, suffix='_dist_edep_lsnl') ax.set_xlim(1.2, 4.2) ax.set_ylim(top=0.5) savefig(opts.output, suffix='_dist_edep_lsnl_zoom') poly = N.polynomial.polynomial.Polynomial([0, 1, 0]) x = data.data_no.data_edep_lsnl.diff_x[data.dmmid_idx] pf = poly.fit(x, data.data_no.data_edep_lsnl.diff[data.dmmid_idx], 2) print(pf) ax.plot(x, pf(x), label=r'NO fit') ax.legend() savefig(opts.output, suffix='_dist_edep_lsnl_fit', close=not opts.show_all) # # Distance between nearest peaks vs Edep, multiple # fig = P.figure() ax = P.subplot(111, xlabel='Edep quenched, MeV', ylabel='Dist, MeV', title='Nearest peaks distance') ax.minorticks_on(); ax.grid() ax.plot(data.data_no.data_edep_lsnl.diff_x[data.dmmid_idx], data.data_no.data_edep_lsnl.diff[data.dmmid_idx], label=r'NO') ax.plot(data.data_io.data_edep_lsnl.diff_x[data.dmmid_idx], data.data_io.data_edep_lsnl.diff[data.dmmid_idx], '--', label=r'IO') for idx in (0, 5, 15, 20): ax.plot(data.data_io.data_edep_lsnl.diff_x[idx], data.data_io.data_edep_lsnl.diff[idx], '--') ax.legend() ax.set_xlim(0.0, xmax) savefig(opts.output, suffix='_dist_edep_lsnl_multi', close=not opts.show_all) # # Distance between nearest peaks difference # fig = P.figure() ax = P.subplot(111, xlabel='Edep, MeV', ylabel='Dist(IO) - Dist(NO), MeV', title='Nearest peaks distance diff: IO-NO') ax.minorticks_on(); ax.grid() ax.plot(data.e, data.diffs.edep[data.dmmid_idx], '-', markerfacecolor='none', label='Edep') ax.plot(data.e, data.diffs.edep_lsnl[data.dmmid_idx], '-', markerfacecolor='none', label='Edep quenched') ax.plot(data.e, data.diffs.enu[data.dmmid_idx], '-', markerfacecolor='none', label='Enu') ax.legend() savefig(opts.output, suffix='_dist_diff') ax.plot(data.e, data.eres, '-', markerfacecolor='none', label='Resolution $\\sigma$') ax.legend() savefig(opts.output, suffix='_dist_diff_1') # # Distance between nearest peaks difference relative to sigma # fig = P.figure() ax = P.subplot(111, xlabel='Edep, MeV', ylabel='(Dist(IO) - Dist(NO))/$\\sigma$', title='Nearest peaks distance diff: IO-NO') ax.minorticks_on(); ax.grid() ax.plot(data.e, data.diffs_rel.edep[data.dmmid_idx], '-', markerfacecolor='none', label='Edep') ax.plot(data.e, data.diffs_rel.edep_lsnl[data.dmmid_idx], '-', markerfacecolor='none', label='Edep quenched') i_edep=N.argmax(data.diffs_rel.edep[data.dmmid_idx]) i_edep_lsnl=N.argmax(data.diffs_rel.edep_lsnl[data.dmmid_idx]) ediff = data.e[i_edep] - data.e[i_edep_lsnl] ax.axvline(data.e[i_edep], linestyle='dashed', label='Max location: %.3f MeV'%(data.e[i_edep])) ax.axvline(data.e[i_edep_lsnl], linestyle='dashed', label='Max location: %.3f MeV'%(data.e[i_edep_lsnl])) ax.axvspan(data.e[i_edep], data.e[i_edep_lsnl], alpha=0.2, label='Max location diff: %.3f MeV'%(ediff)) ax.legend() savefig(opts.output, suffix='_dist_diff_rel') # # Distance between nearest peaks difference relative to sigma # fig = P.figure() ax = P.subplot(111, xlabel='Edep, MeV', ylabel='(Dist(IO) - Dist(NO))/$\\sigma$', title='Nearest peaks distance diff: IO-NO') ax.minorticks_on(); ax.grid() ledep = ax.plot(data.e, data.diffs_rel.edep[data.dmmid_idx], '--', markerfacecolor='none', label='Edep')[0] lquench = ax.plot(data.e, data.diffs_rel.edep_lsnl[data.dmmid_idx], '-', color=ledep.get_color(), markerfacecolor='none', label='Edep quenched')[0] kwargs=dict(alpha=0.8, linewidth=1.5, markerfacecolor='none') for idx in (0, 5, 15, 20): l = ax.plot(data.e, data.diffs_rel.edep[idx], '--', **kwargs)[0] ax.plot(data.e, data.diffs_rel.edep_lsnl[idx], '-', color=l.get_color(), **kwargs) ax.legend() savefig(opts.output, suffix='_dist_diff_rel_multi', close=not opts.show_all) # # Distance between nearest peaks difference relative to sigma # fig = P.figure() ax = P.subplot(111, ylabel=r'$\Delta m^2_\mathrm{ee}$', xlabel='Edep quenched, MeV', title='Nearest peaks distance diff: IO-NO/$\\sigma$') ax.minorticks_on(); ax.grid() formatter = ax.yaxis.get_major_formatter() formatter.set_useOffset(False) formatter.set_powerlimits((-2,2)) formatter.useMathText=True c = ax.pcolormesh(data.mesh_e.T, data.mesh_dm.T, data.diffs_rel.edep_lsnl.T) from mpl_tools.helpers import add_colorbar add_colorbar(c, rasterized=True) c.set_rasterized(True) savefig(opts.output, suffix='_dist_diff_rel_heatmap') 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 or opts.show_all: P.show()
def init_configuration(self): edges = np.arange(0.0, 12+1.e-8, self.opts.fine_step or 0.01) edges_final = np.concatenate( ( [0.8], np.arange(1, 6.0, self.opts.fine_step_final or 0.02), np.arange(6, 7.0, 0.1), [7.0, 7.5, 12.0] ) ) if self.opts.final_emin is not None: print('Truncate final binning E>={}'.format(self.opts.final_emin)) edges_final = edges_final[edges_final>=self.opts.final_emin] if self.opts.final_emax is not None: print('Truncate final binning E<={}'.format(self.opts.final_emax)) edges_final = edges_final[edges_final<=self.opts.final_emax] if self.opts.final_emin is not None or self.opts.final_emax is not None: print('Final binning:', edges_final) self.cfg = NestedDict( # # Numbers # numbers0 = OrderedDict( bundle = dict(name='parameters', version='v05'), state='fixed', labels=dict( seconds_in_year = 'Number of seconds in year', days_in_second = 'Number of days in a second', conversion_factor = 'Conversion factor: W[GW]/[MeV] N[fissions]->N[fissions]/T[s]', ), pars = dict( seconds_in_year = 365.0*24.0*60.0*60.0, days_in_second = 1.0/(24.0*60.0*60.0), conversion_factor = R.NeutrinoUnits.reactorPowerConversion, #taken from transformations/neutrino/ReactorNorm.cc ), ), numbers = OrderedDict( bundle = dict(name='parameters', version='v06'), pars = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/files/juno_input_numbers.py', skip = ('percent',), state= 'fixed' ), bkg_shape_unc = OrderedDict( bundle = dict(name='parameters', version='v06'), pars = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/files/bkg_bin2bin.yaml', hooks = OrderedDict(bin_width_factor=lambda pars: (1.0/pars['bin_width'], '1/`bin width`')), state= 'fixed' ), # Detector and reactor norm = OrderedDict( bundle = dict(name="parameters", version = "v01"), parameter = "norm", label = 'Reactor power/detection efficiency correlated normalization', pars = uncertain(1.0, (2**2+1**2)**0.5, 'percent') ), baselines = OrderedDict( bundle = dict(name='reactor_baselines', version='v02', major = 'rd'), reactors = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/files/reactor_baselines.yaml', reactors_key = 'reactor_baseline', detectors = dict(AD1=0.0), unit = 'km' ), # Reactor energy_per_fission = OrderedDict( bundle = dict(name="parameters", version = "v06"), pars = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/files/energy_per_fission.yaml', separate_uncertainty = '{}_scale' ), thermal_power = OrderedDict( bundle = dict(name="parameters", version = "v06", names=dict(thermal_power='thermal_power_nominal')), pars = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/files/thermal_power.yaml', separate_uncertainty = '{}_scale' ), # Backgrounds bkg_rate = OrderedDict( bundle = dict(name="parameters", version = "v06"), pars = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/files/bkg_rates.yaml', separate_uncertainty = '{}_norm' ), # # Transformations # # General kinint2 = OrderedDict( bundle = dict(name='integral_2d1d', version='v03', names=dict(integral='kinint2')), variables = ('evis', 'ctheta'), edges = edges, # edges = np.linspace(0.0, 12.001, 601), xorders = 4, yorder = 5, ), rebin = OrderedDict( bundle = dict(name='rebin', version='v04', major=''), rounding = 5, edges = edges_final, instances={ 'rebin': 'Final histogram {detector}', } ), rebin_bkg = OrderedDict( bundle = dict(name='rebin', version='v04', major=''), rounding = 5, edges = edges_final, instances={ 'rebin_acc': 'Accidentals {autoindex}', 'rebin_lihe': '9Li/8He {autoindex}', 'rebin_fastn': 'Fast neutrons {autoindex}', 'rebin_alphan': 'C(alpha,n)O {autoindex}', 'rebin_geonu': 'Geo-nu {autoindex}' } ), bkg_shape_uncertainty = OrderedDict( bundle = dict(name='trans_sumsq', version='v01', major=''), ninputs = 3, instances={'sumsq_bkg': 'Bkg shape variance {autoindex}'} ), bkg_edges = OrderedDict( bundle = dict(name='trans_histedges', version='v01', major=''), types = ('widths', ), instances={'bkgbin': 'Bkg bins {autoindex}'} ), variance = OrderedDict( bundle = dict(name='trans_snapshot', version='v01', major=''), instances={'sumsq_snapshot': 'Bkg shape variance snapshot, not corrected|{autoindex}', 'staterr2': 'Stat. errors (snapshot)'} ), # Oscillations and detection ibd_xsec = OrderedDict( bundle = dict(name='xsec_ibd', version='v02'), order = 1, ), oscprob = OrderedDict( bundle = dict(name='oscprob', version='v05', major='rdc', inactive=self.opts.oscprob=='matter'), parameters = dict( DeltaMSq23 = 2.453e-03, DeltaMSq12 = 7.53e-05, SinSqDouble13 = (0.08529904, 0.00267792), SinSqDouble12 = 0.851004, # SinSq13 = (0.0218, 0.0007), # SinSq12 = 0.307, ) ), # oscprob_matter = OrderedDict( # bundle = dict(name='oscprob_matter', version='v01', major='rd', inactive=self.opts.oscprob=='vacuum', # names=dict(oscprob='oscprob_matter')), # density = 2.6, # g/cm3 # pdgyear = self.opts.pdgyear, # dm = '23' # ), anuspec_hm = OrderedDict( bundle = dict(name='reactor_anu_spectra', version='v05'), name = 'anuspec', filename = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/deprecated/JUNOInputs2020_6_26.root', objectnamefmt = 'HuberMuellerFlux_{isotope}', free_params=False, # enable free spectral model varmode='log', varname='anue_weight_{index:02d}', ns_name='spectral_weights', edges = np.concatenate( ( np.arange( 1.8, 8.7, 0.025 ), [ 12.3 ] ) ), ), offeq_correction = OrderedDict( bundle = dict(name='reactor_offeq_spectra', version='v05', major=''), offeq_data = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/deprecated/JUNOInputs2020_6_26.root', objectnamefmt = 'NonEq_FluxRatio', relsigma = 0.3, ), fission_fractions = OrderedDict( bundle = dict(name="parameters_yaml_v01", major = 'i'), parameter = 'fission_fractions_nominal', separate_uncertainty = "fission_fractions_scale", label = 'Fission fraction of {isotope} in reactor {reactor}', objectize=True, data = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/files/fission_fractions.yaml' ), snf_correction = OrderedDict( bundle = dict(name='reactor_snf_spectra', version='v05', major='r'), snf_average_spectra = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/deprecated/JUNOInputs2020_6_26.root', objectname = 'SNF_FluxRatio' ), lsnl = OrderedDict( bundle = dict(name='energy_nonlinearity_db_root', version='v03', major='l'), names = OrderedDict( [ ('nominal', 'positronScintNL'), ('pull0', 'positronScintNLpull0'), ('pull1', 'positronScintNLpull1'), ('pull2', 'positronScintNLpull2'), ('pull3', 'positronScintNLpull3'), ]), filename = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/deprecated/JUNOInputs2020_6_26.root', edges = 'evis_edges', extrapolation_strategy = 'extrapolate', nonlin_range = (0.95, 12.), expose_matrix = True ), shape_uncertainty = OrderedDict( unc = uncertain(1.0, 1.0, 'percent'), nbins = 200 # number of bins, the uncertainty is defined to ), snf_norm = OrderedDict( bundle = dict(name="parameters", version = "v01"), parameter = 'snf_norm', label='SNF norm', pars = uncertain(1.0, 'fixed'), ), reactor_active_norm = OrderedDict( bundle = dict(name="parameters", version = "v01"), parameter = 'reactor_active_norm', label='Reactor nu (active norm)', pars = uncertain(1.0, 'fixed'), ), # # Backgrounds # bkg_spectra = OrderedDict( bundle = dict(name='root_histograms_v05'), filename = 'data/data_juno/data-joint/2020-06-11-NMO-Analysis-Input/deprecated/JUNOInputs2020_6_26.root', formats = ['AccBkgHistogramAD', 'Li9BkgHistogramAD', 'FnBkgHistogramAD', 'AlphaNBkgHistogramAD', 'GeoNuTh232' , 'GeoNuU238'], names = ['acc_spectrum', 'lihe_spectrum', 'fastn_spectrum', 'alphan_spectrum', 'geonu_Th232_spectrum' , 'geonu_U238_spectrum'], labels = ['Accidentals|(norm spectrum)', '9Li/8He|(norm spectrum)', 'Fast n|(norm spectrum)', 'AlphaN|(norm spectrum)', 'GeoNu Th232|(norm spectrum)', 'GeoNu U238|(norm spectrum)'], normalize = True, ), geonu_fractions=OrderedDict( bundle = dict(name='var_fractions_v02'), names = [ 'Th232', 'U238' ], format = 'frac_{component}', fractions = uncertaindict( Th232 = ( 0.23, 'fixed' ) ), ), ) if 'eres' in self.opts.energy_model: self.cfg.eres = OrderedDict( bundle = dict(name='detector_eres_normal', version='v01', major=''), # pars: sigma_e/e = sqrt(a^2 + b^2/E + c^2/E^2), # a - non-uniformity # b - statistical term # c - noise parameter = 'eres', pars = uncertaindict([ ('a_nonuniform', (0.0082, 0.0001)), ('b_stat', (0.0261, 0.0002)), ('c_noise', (0.0123, 0.0004)) ], mode='absolute'), expose_matrix = False ) elif 'multieres' in self.opts.energy_model: self.cfg.subdetector_fraction = OrderedDict( bundle = dict(name="parameters", version = "v03"), parameter = "subdetector_fraction", label = 'Subdetector fraction weight for {subdetector}', pars = uncertaindict( [(subdet_name, (0.2, 0.04, 'relative')) for subdet_name in self.subdetectors_names], ), covariance = 'data/data_juno/energy_resolution/2019_subdetector_eres_n200_proper/subdetector5_cov.txt' ) self.cfg.multieres = OrderedDict( bundle = dict(name='detector_multieres_stats', version='v01', major='s'), # pars: sigma_e/e = sqrt(b^2/E), parameter = 'eres', relsigma = self.opts.eres_b_relsigma, nph = 'data/data_juno/energy_resolution/2019_subdetector_eres_n200_proper/subdetector5_nph.txt', rescale_nph = self.opts.eres_npe, expose_matrix = False ) if not 'lsnl' in self.opts.correlation: self.cfg.lsnl.correlations = None self.cfg.lsnl.correlations_pars = None if not 'subdetectors' in self.opts.correlation: self.cfg.subdetector_fraction.correlations = None
def init_configuration(self): if self.opts.eres_npe: self.opts.eres_sigma = self.opts.eres_npe**-0.5 else: self.opts.eres_npe = self.opts.eres_sigma**-2 print('Energy resolution at 1 MeV: {}% ({} pe)'.format( self.opts.eres_sigma * 100, self.opts.eres_npe)) self.cfg = NestedDict( kinint2 = NestedDict( bundle = dict(name='integral_2d1d', version='v03', names=dict(integral='kinint2')), variables = ('evis', 'ctheta'), edges = np.arange(0.0, 12.001, 0.01), #FIXME # edges = np.linspace(0.0, 12.001, 601), xorders = 4, yorder = 5, ), rebin = NestedDict( bundle = dict(name='rebin', version='v03', major=''), rounding = 3, edges = np.concatenate( ( [0.7], np.arange(1, 6.0, self.opts.estep), np.arange(6, 7.0, 0.1), [7.0, 7.5, 12.0] ) ), name = 'rebin', label = 'Final histogram {detector}' ), ibd_xsec = NestedDict( bundle = dict(name='xsec_ibd', version='v02'), order = 1, ), oscprob = NestedDict( bundle = dict(name='oscprob', version='v04', major='rdc', inactive=self.opts.oscprob=='matter'), pdgyear = self.opts.pdgyear, dm = self.opts.dm ), oscprob_matter = NestedDict( bundle = dict(name='oscprob_matter', version='v01', major='rd', inactive=self.opts.oscprob=='vacuum', names=dict(oscprob='oscprob_matter')), density = 2.6, # g/cm3 pdgyear = self.opts.pdgyear, dm = self.opts.dm ), anuspec_hm = NestedDict( bundle = dict(name='reactor_anu_spectra', version='v03', inactive=self.opts.flux!='huber-mueller'), name = 'anuspec', filename = ['data/reactor_anu_spectra/Huber/Huber_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat', 'data/reactor_anu_spectra/Mueller/Mueller_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat'], # strategy = dict( underflow='constant', overflow='extrapolate' ), edges = np.concatenate( ( np.arange( 1.8, 8.7, 0.025 ), [ 12.3 ] ) ), ), anuspec_ill = NestedDict( bundle = dict(name='reactor_anu_spectra', version='v03', inactive=self.opts.flux!='ill-vogel'), name = 'anuspec', filename = ['data/reactor_anu_spectra/ILL/ILL_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat', 'data/reactor_anu_spectra/Vogel/Vogel_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat'], # strategy = dict( underflow='constant', overflow='extrapolate' ), edges = np.concatenate( ( np.arange( 1.8, 8.7, 0.025 ), [ 12.3 ] ) ), ), offeq_correction = NestedDict( bundle = dict(name='reactor_offeq_spectra', version='v03', major='ir'), offeq_data = 'data/reactor_anu_spectra/Mueller/offeq/mueller_offequilibrium_corr_{isotope}.dat', ), eff = NestedDict( bundle = dict( name='parameters', version='v01'), parameter="eff", label='Detection efficiency', pars = uncertain(0.8, 'fixed') ), global_norm = NestedDict( bundle = dict( name='parameters', version='v01'), parameter="global_norm", label='Global normalization', pars = uncertain(1, 'free'), ), fission_fractions = NestedDict( bundle = dict(name="parameters_yaml_v01", major = 'i'), parameter = "fission_fractions", label = 'Fission fraction of {isotope} in reactor {reactor}', objectize=True, data = 'data/data_juno/fission_fractions/2013.12.05_xubo.yaml' ), livetime = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "livetime", label = 'Livetime of {detector} in seconds', pars = uncertaindict( [('AD1', (6*365*seconds_per_day, 'fixed'))], ), ), baselines = NestedDict( bundle = dict(name='reactor_baselines', version='v01', major = 'rd'), reactors = 'near-equal' in self.opts.reactors \ and 'data/juno_nominal/coordinates_reactors_equal.py' \ or 'data/juno_nominal/coordinates_reactors.py', detectors = 'data/juno_nominal/coordinates_det.py', unit = 'km' ), norm = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "norm", label = 'Reactor power/detection efficiency correlated normalization', pars = uncertain(1.0, (2**2+1**2)**0.5, 'percent') ), thermal_power = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "thermal_power", label = 'Thermal power of {reactor} in GWt', pars = uncertaindict([ ('TS1', 4.6), ('TS2', 4.6), ('TS3', 4.6), ('TS4', 4.6), ('YJ1', 2.9), ('YJ2', 2.9), ('YJ3', 2.9), ('YJ4', 2.9), ('YJ5', 2.9), ('YJ6', 2.9), ('DYB', 17.4), ('HZ', 17.4), ], uncertainty=0.8, mode='percent' ), ), target_protons = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "target_protons", label = 'Number of protons in {detector}', pars = uncertaindict( [('AD1', (1.42e33, 'fixed'))], ), ), conversion_factor = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter='conversion_factor', label='Conversion factor from GWt to MeV', #taken from transformations/neutrino/ReactorNorm.cc pars = uncertain(R.NeutrinoUnits.reactorPowerConversion, 'fixed'), ), eper_fission = NestedDict( bundle = dict(name="parameters", version = "v01"), parameter = "eper_fission", label = 'Energy per fission for {isotope} in MeV', pars = uncertaindict( [ ('U235', (201.92, 0.46)), ('U238', (205.52, 0.96)), ('Pu239', (209.99, 0.60)), ('Pu241', (213.60, 0.65)) ], mode='absolute' ), ), lsnl = NestedDict( bundle = dict( name='energy_nonlinearity_birks_cherenkov', version='v01', major=''), stopping_power='data/data_juno/energy_model/2019_birks_cherenkov_v01/stoppingpower.txt', annihilation_electrons=dict( file='data/data_juno/energy_model/2019_birks_cherenkov_v01/hgamma2e.root', histogram='hgamma2e_1KeV', scale=1.0/50000 # events 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", (11.99, '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 = 'Conservative normalization point at 12 MeV' ), ), shape_uncertainty = NestedDict( unc = uncertain(1.0, 1.0, 'percent'), nbins = 200 # number of bins, the uncertainty is defined to ) ) if 'eres' in self.opts.energy_model: bconf = self.opts.eres_b_relsigma and (self.opts.eres_b_relsigma, 'relative') or ('fixed', ) self.cfg.eres = NestedDict( bundle=dict(name='detector_eres_normal', version='v01', major=''), # pars: sigma_e/e = sqrt( a^2 + b^2/E + c^2/E^2 ), parameter='eres', pars=uncertaindict([('a', (0.000, 'fixed')), ('b', (self.opts.eres_sigma, ) + bconf), ('c', (0.000, 'fixed'))]), expose_matrix=False) elif 'multieres' in self.opts.energy_model: if self.opts.subdetectors_number == 200: self.cfg.subdetector_fraction = NestedDict( bundle=dict(name="parameters", version="v02"), parameter="subdetector_fraction", label='Subdetector fraction weight for {subdetector}', pars=uncertaindict( [(subdet_name, (1.0 / self.opts.subdetectors_number, 0.04, 'relative')) for subdet_name in self.subdetectors_names], ), correlations= 'data/data_juno/energy_resolution/2019_subdetector_eres_n200_proper/corrmap_xuyu.txt' ) self.cfg.multieres = NestedDict( bundle=dict(name='detector_multieres_stats', version='v01', major='s'), # pars: sigma_e/e = sqrt(b^2/E), parameter='eres', relsigma=self.opts.eres_b_relsigma, nph= 'data/data_juno/energy_resolution/2019_subdetector_eres_n200_proper/subdetector200_nph.txt', rescale_nph=self.opts.eres_npe, expose_matrix=False) elif self.opts.subdetectors_number == 5: self.cfg.subdetector_fraction = NestedDict( bundle=dict(name="parameters", version="v03"), parameter="subdetector_fraction", label='Subdetector fraction weight for {subdetector}', pars=uncertaindict( [(subdet_name, (1.0 / self.opts.subdetectors_number, 0.04, 'relative')) for subdet_name in self.subdetectors_names], ), covariance= 'data/data_juno/energy_resolution/2019_subdetector_eres_n200_proper/subdetector5_cov.txt' ) self.cfg.multieres = NestedDict( bundle=dict(name='detector_multieres_stats', version='v01', major='s'), # pars: sigma_e/e = sqrt(b^2/E), parameter='eres', relsigma=self.opts.eres_b_relsigma, nph= 'data/data_juno/energy_resolution/2019_subdetector_eres_n200_proper/subdetector5_nph.txt', rescale_nph=self.opts.eres_npe, expose_matrix=False) else: assert False if not 'lsnl' in self.opts.correlation: self.cfg.lsnl.correlations = None self.cfg.lsnl.correlations_pars = None if not 'subdetectors' in self.opts.correlation: self.cfg.subdetector_fraction.correlations = None self.cfg.eff.pars = uncertain(0.73, 'fixed') self.cfg.livetime.pars['AD1'] = uncertain(6 * 330 * seconds_per_day, 'fixed')
expr = 'prod[a]| sum[z]| weight1[z]*weight2[a] * spec| enu()' a = Expression(expr, indices=indices) print(a.expressions_raw) print(a.expressions) a.parse() a.guessname(lib, save=True) a.tree.dump(True) print() cfg = NestedDict( weight1=NestedDict(bundle='dummyvar', variables=uncertaindict([ ('weight1', (2, 0.1)), ], mode='percent')), weight2=NestedDict(bundle='dummyvar', variables=uncertaindict([ ('weight2', (3, 0.1)), ], mode='percent')), enu=NestedDict(bundle='dummy', name='enu', input=False, size=10, debug=False), spec=NestedDict(bundle='dummy', name='spec', input=True, size=10,
'norm1[d] * norm2[z] * eres[z,d]| hist[d]()' ], # Configuration bundles=NestedDict(eres=NestedDict( bundle=dict(name='detector_eres_normal', version='v01', major=['z'], names=dict(eres_matrix='smearing_matrix', )), parameter='eres', pars=uncertaindict([ ('z1.a', (0.0, 'fixed')), ('z1.b', (0.05, 30, 'percent')), ('z1.c', (0.0, 'fixed')), ('z2.a', (0.0, 'fixed')), ('z2.b', (0.10, 30, 'percent')), ('z2.c', (0.0, 'fixed')), ('z3.a', (0.0, 'fixed')), ('z3.b', (0.15, 30, 'percent')), ('z3.c', (0.0, 'fixed')), ]), labels=dict(matrix='Smearing\nmatrix\n{autoindex}', smear='Energy\nresolution\n{autoindex}', parameter='{description} (zone {autoindex})'), split_transformations=True), norm1=NestedDict( bundle='parameters_v01', parameter='norm1', label='Normalization at detector {detector}', pars=uncertaindict( [
def init_configuration(self): self.cfg = NestedDict( integral=NestedDict( bundle=dict(name='integral_2d1d', version='v03'), variables=('evis', 'ctheta'), edges=N.linspace(0.0, 12.0, 241, dtype='d'), xorders=4, yorder=2, ), ibd_xsec=NestedDict(bundle=dict(name='xsec_ibd', version='v02'), order=1, pdg_year='dyboscar'), oscprob=NestedDict( bundle=dict(name='oscprob', version='v04', major='rdc'), # pdg_year='dyboscar', dm='23', ), anuspec=NestedDict( bundle=dict(name='reactor_anu_spectra', version='v04'), name='anuspec', filename=[ 'data/reactor_anu_spectra/Huber/Huber_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat', 'data/reactor_anu_spectra/Mueller/Mueller_smooth_extrap_{isotope}_13MeV0.01MeVbin.dat' ], free_params=True, # enable free spectral model varmode='plain', varname='anue_weight_{index}', ns_name='spectral_weights', edges=N.concatenate((N.arange(1.8, 8.7, 0.5), [12.3])), ), offeq_correction=NestedDict( bundle=dict(name='reactor_offeq_spectra', version='v04', major='ir'), offeq_data= 'data/reactor_anu_spectra/Mueller/offeq/mueller_offequilibrium_corr_{isotope}.dat', ), eff=NestedDict( bundle=dict(name='efficiencies', version='v02', names=dict(norm='global_norm'), major=''), correlated=False, uncorrelated=True, norm=True, efficiencies='data/dayabay/efficiency/P15A_efficiency.py'), livetime=NestedDict( bundle=dict(name='dayabay_livetime_hdf', version='v02'), file= 'data/dayabay/data/P15A/dubna/dayabay_data_dubna_v15_bcw_adsimple.hdf5', ), baselines=NestedDict( bundle=dict(name='reactor_baselines', version='v01', major='rd'), reactors= 'data/dayabay/reactor/coordinates/coordinates_docDB_9757.py', detectors= 'data/dayabay/ad/coordinates/coordinates_docDB_9757.py', unit='m'), thermal_power=NestedDict( bundle=dict(name='dayabay_reactor_burning_info_v02', major='ri'), reactor_info= 'data/dayabay/reactor/power/WeeklyAvg_P15A_v1.txt.npz', fission_uncertainty_info= 'data/dayabay/reactor/fission_fraction/2013.12.05_djurcic.py', add_ff=True, nominal_power=False, ), nominal_thermal_power=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='nominal_thermal_power', label='Nominal thermal power [Gw] for {reactor}', pars=uncertaindict( [ ('DB1', 2.895), ('DB2', 2.895), ('LA1', 2.895), ('LA2', 2.895), ('LA3', 2.895), ('LA4', 2.895), ], uncertainty=0.5, mode='percent', ), ), snf_ff=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='snf_fission_fractions', objectize=True, label='SNF fission fraction {isotope}', pars=uncertaindict( [('U235', 0.563), ('U238', 0.079), ('Pu239', 0.301), ('Pu241', 0.057)], mode='fixed', ), ), snf_denom=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='snf_denom', objectize=True, label='SNF inverse weight for average energy release per decay', pars=uncertain(snf_energy_per_decay, 'fixed'), ), snf_correction=NestedDict( bundle=dict(name='reactor_snf_spectra', version='v04', major='r'), snf_average_spectra= './data/reactor_anu_spectra/SNF/kopeikin_0412.044_spent_fuel_spectrum_smooth.dat', ), eper_fission=NestedDict( bundle=dict(name="parameters", version="v01"), parameter="eper_fission", label='Energy per fission for {isotope} in MeV', pars=uncertaindict([('Pu239', (211.12, 0.34)), ('Pu241', (214.26, 0.33)), ('U235', (202.36, 0.26)), ('U238', (205.99, 0.52))], mode='absolute'), ), conversion_factor=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='conversion_factor', label='Conversion factor from GWt to MeV', #taken from transformations/neutrino/ReactorNorm.cc pars=uncertain(R.NeutrinoUnits.reactorPowerConversion, 'fixed'), ), nprotons_nominal=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='nprotons_nominal', label= 'Daya Bay nominal number of protons (20 tons x GdLS Np/ton)', pars=uncertain(20.0 * 7.163e28, 'fixed'), ), nprotons_corr=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='nprotons_corr', label='Correction to number of protons per AD', pars=uncertaindict( [('AD11', 19941. / nominal_mass), ('AD12', 19967. / nominal_mass), ('AD21', 19891. / nominal_mass), ('AD22', 19944. / nominal_mass), ('AD31', 19917. / nominal_mass), ('AD32', 19989. / nominal_mass), ('AD33', 19892. / nominal_mass), ('AD34', 19931. / nominal_mass)], mode='fixed', ), ), iav=NestedDict( bundle=dict(name='detector_iav_db_root_v03', major='d'), parname='OffdiagScale', scale=uncertain(1.0, 4, 'percent'), ndiag=1, filename='data/dayabay/tmp/detector_iavMatrix_P14A_LS.root', matrixname='iav_matrix', ), eres=NestedDict( bundle=dict(name='detector_eres_normal', version='v01', major=''), # pars: sigma_e/e = sqrt( a^2 + b^2/E + c^2/E^2 ), parameter='eres', pars=uncertaindict( [('a', 0.016), ('b', 0.081), ('c', 0.026)], # [('a', 0.014764) , # ('b', 0.0869) , # ('c', 0.0271)], mode='percent', uncertainty=30), expose_matrix=True), lsnl=NestedDict( bundle=dict(name='energy_nonlinearity_db_root', version='v02', major='dl'), names=['nominal', 'pull0', 'pull1', 'pull2', 'pull3'], filename='data/dayabay/tmp/detector_nl_consModel_450itr.root', par=uncertain(1.0, 0.2, 'percent'), edges='evis_edges', extrapolation_strategy='extrapolate', nonlin_range=(0.5, 12.)), rebin=NestedDict(bundle=dict(name='rebin', version='v03', major=''), rounding=3, edges=N.concatenate( ([0.7], N.arange(1.2, 8.1, 0.2), [12.0])), name='rebin', label='Final histogram\n {detector}'), # # Spectra # bkg_spectrum_acc=NestedDict( bundle=dict(name='root_histograms_v03'), filename= 'data/dayabay/data_spectra/P15A_IHEP_data/P15A_All_raw_sepctrum_coarse.root', format='{site}_AD{adnum_local}_singleTrigEnergy', name='bkg_spectrum_acc', label='Accidentals {detector}\n (norm spectrum)', groups=self.groups, normalize=True, ), bkg_spectrum_li=NestedDict( bundle=dict(name='root_histograms_v03'), filename='data/dayabay/bkg/lihe/toyli9spec_BCWmodel_v1.root', format='h_eVisAllSmeared', name='bkg_spectrum_li', label='9Li spectrum\n (norm)', normalize=True, ), bkg_spectrum_he=NestedDict( bundle=dict(name='root_histograms_v03'), filename='data/dayabay/bkg/lihe/toyhe8spec_BCWmodel_v1.root', format='h_eVisAllSmeared', name='bkg_spectrum_he', label='8He spectrum\n (norm)', normalize=True, ), bkg_spectrum_amc=NestedDict( bundle=dict(name='root_histograms_v03'), filename='data/dayabay/bkg/P12B_amc_expofit.root', format='hCorrAmCPromptSpec', name='bkg_spectrum_amc', label='AmC spectrum\n (norm)', normalize=True, ), bkg_spectrum_alphan=NestedDict( bundle=dict(name='root_histograms_v03'), filename='data/dayabay/bkg/P12B_alphan_coarse.root', format='AD{adnum_global_alphan_subst}', groups=self.groups, name='bkg_spectrum_alphan', label='C(alpha,n) spectrum\n {detector} (norm)', normalize=True, ), lihe_fractions=NestedDict( bundle=dict(name='var_fractions_v02'), names=['li', 'he'], format='frac_{component}', fractions=uncertaindict(li=(0.95, 0.05, 'relative')), ), bkg_spectrum_fastn=NestedDict( bundle=dict(name='dayabay_fastn_power', version='v02', major='s'), parameter='fastn_shape', name='bkg_spectrum_fastn', normalize=(0.7, 12.0), bins='evis_edges', order=2, ), # # Parameters # fastn_shape=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='fastn_shape', label='Fast neutron shape parameter for {site}', pars=uncertaindict( [('EH1', (67.79, 0.1132)), ('EH2', (58.30, 0.0817)), ('EH3', (68.02, 0.0997))], mode='relative', ), ), lihe_fracs=NestedDict( bundle=dict(name='dyb_lihe_fractions', version='v01'), frac_file_path='./data/dayabay/fractions/{site}_fractions.txt', mode=self.opts.lihe_fractions) if self.opts.lihe_fractions != 'no' else NestedDict(), # # Rates # bkg_rate_acc=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='bkg_rate_acc', label='Acc rate at {detector}', pars=uncertaindict( [ ('AD11', 8.463602), ('AD12', 8.464611), ('AD21', 6.290756), ('AD22', 6.180896), ('AD31', 1.273798), ('AD32', 1.189542), ('AD33', 1.197807), ('AD34', 0.983096), ], uncertainty=1.0, mode='percent', ), separate_uncertainty='acc_norm', ), bkg_rate_lihe=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='bkg_rate_lihe', label='⁹Li/⁸He rate at {site}', pars=uncertaindict( [('EH1', (2.46, 1.06)), ('EH2', (1.72, 0.77)), ('EH3', (0.15, 0.06))], mode='absolute', ), ), bkg_rate_fastn=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='bkg_rate_fastn', label='Fast neutron rate at {site}', pars=uncertaindict( [('EH1', (0.792, 0.103)), ('EH2', (0.566, 0.074)), ('EH3', (0.047, 0.009))], mode='absolute', ), ), bkg_rate_amc=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='bkg_rate_amc', label='AmC rate at {detector}', pars=uncertaindict( [ ('AD11', (0.18, 0.08)), ('AD12', (0.18, 0.08)), ('AD21', (0.16, 0.07)), ('AD22', (0.15, 0.07)), ('AD31', (0.07, 0.03)), ('AD32', (0.06, 0.03)), ('AD33', (0.07, 0.03)), ('AD34', (0.05, 0.02)), ], mode='absolute', ), ), bkg_rate_alphan=NestedDict( bundle=dict(name="parameters", version="v01"), parameter='bkg_rate_alphan', label='C(alpha,n) rate at {detector}', pars=uncertaindict( [ ('AD11', (0.08)), ('AD12', (0.07)), ('AD21', (0.05)), ('AD22', (0.07)), ('AD31', (0.05)), ('AD32', (0.05)), ('AD33', (0.05)), ('AD34', (0.05)), ], uncertainty=50, mode='percent', ), ), )
variants = OrderedDict([ ( 'AD11', 'EH1_AD1' ), ( 'AD12', 'EH1_AD2' ), ( 'AD21', 'EH2_AD3' ), ( 'AD22', 'EH2_AD8' ), ( 'AD31', 'EH3_AD4' ), ( 'AD32', 'EH3_AD5' ), ( 'AD33', 'EH3_AD6' ), ( 'AD34', 'EH3_AD7' ), ]) ) ) cfg.lihe = NestedDict( rates = NestedDict( docdb = [10956], lifraction = uncertain( 0.95, 0.05, 'percent' ), correlation = 'group', rates = uncertaindict( mode = 'absolute', EH1 = (2.71, 0.90), EH2 = (1.91, 0.73), EH3 = (0.22, 0.07), ) ), spectra = NestedDict( docdb = [8772, 8860], list = [ 'li_spectrum', 'he_spectrum' ], li_spectrum = NestedDict( bundle = 'root_histograms_v01', file = 'data/background/lihe/13.09/toyli9spec_BCWmodel_v1.root', format = 'h_eVisAllSmeared', ), he_spectrum = NestedDict( bundle = 'root_histograms_v01', file = 'data/background/lihe/13.09/toyhe8spec_BCWmodel_v1.root', format = 'h_eVisAllSmeared',