diff --git a/n3fit/runcards/examples/developing.yml b/n3fit/runcards/examples/developing.yml index 57c10236bc..2db98eacd5 100644 --- a/n3fit/runcards/examples/developing.yml +++ b/n3fit/runcards/examples/developing.yml @@ -92,6 +92,7 @@ parameters: # This defines the parameter dictionary that is passed to the Model fitting: fitbasis: EVOL # EVOL (7), EVOLQED (8), etc. + savepseudodata: False basis: - {fl: sng, trainable: false, smallx: [1.093, 1.121], largex: [1.486, 3.287]} - {fl: g, trainable: false, smallx: [0.8329, 1.071], largex: [3.084, 6.767]} diff --git a/validphys2/src/validphys/commondataparser.py b/validphys2/src/validphys/commondataparser.py index 1611a1db65..80d55c0390 100644 --- a/validphys2/src/validphys/commondataparser.py +++ b/validphys2/src/validphys/commondataparser.py @@ -124,6 +124,7 @@ def parse_systypes(systypefile): @dataclasses.dataclass(frozen=True) class CommonDataMetadata: """Contains metadata information about the data being read""" + name: str nsys: int ndata: int diff --git a/validphys2/src/validphys/commondatawriter.py b/validphys2/src/validphys/commondatawriter.py new file mode 100644 index 0000000000..07b06b4585 --- /dev/null +++ b/validphys2/src/validphys/commondatawriter.py @@ -0,0 +1,83 @@ +""" +This module contains functions to write commondata and systypes +tables to files +""" + +def write_commondata_data(commondata, buffer): + """ + write commondata table to buffer, this can be a memory map, + compressed archive or strings (using for instance StringIO) + + + Parameters + ---------- + + commondata : validphys.coredata.CommonData + + buffer : memory map, compressed archive or strings + example: StringIO object + + + Example + ------- + >>> from validphys.loader import Loader + >>> from io import StringIO + + >>> l = Loader() + >>> cd = l.check_commondata("NMC").load_commondata_instance() + >>> sio = StringIO() + >>> write_commondata_data(cd,sio) + >>> print(sio.getvalue()) + + """ + header = f"{commondata.setname} {commondata.nsys} {commondata.ndata}\n" + buffer.write(header) + commondata.commondata_table.to_csv(buffer, sep="\t", header=None) + + +def write_commondata_to_file(commondata, path): + """ + write commondata table to file + """ + with open(path, "w") as file: + write_commondata_data(commondata, file) + + +def write_systype_data(commondata, buffer): + """ + write systype table to buffer, this can be a memory map, + compressed archive or strings (using for instance StringIO) + + + Parameters + ---------- + + commondata : validphys.coredata.CommonData + + buffer : memory map, compressed archive or strings + example: StringIO object + + + Example + ------- + >>> from validphys.loader import Loader + >>> from io import StringIO + + >>> l = Loader() + >>> cd = l.check_commondata("NMC").load_commondata_instance() + >>> sio = StringIO() + >>> write_systype_data(cd,sio) + >>> print(sio.getvalue()) + + """ + header = f"{commondata.nsys}\n" + buffer.write(header) + commondata.systype_table.to_csv(buffer, sep="\t", header=None) + + +def write_systype_to_file(commondata, path): + """ + write systype table to file + """ + with open(path, "w") as file: + write_systype_data(commondata, file) \ No newline at end of file diff --git a/validphys2/src/validphys/core.py b/validphys2/src/validphys/core.py index 59be563b0f..944056a6d7 100644 --- a/validphys2/src/validphys/core.py +++ b/validphys2/src/validphys/core.py @@ -277,6 +277,14 @@ def __iter__(self): def load(self): return parse_commondata(self.datafile, self.sysfile, self.name) + def load_commondata_instance(self): + """ + load a validphys.core.CommonDataSpec to validphys.core.CommonData + """ + from validphys.commondataparser import load_commondata + + return load_commondata(self) + @property def plot_kinlabels(self): return get_plot_kinlabels(self) @@ -618,6 +626,21 @@ def load(self): def load_commondata(self): return [d.load_commondata() for d in self.datasets] + + def load_commondata_instance(self): + """ + Given Experiment load list of validphys.coredata.CommonData + objects with cuts already applied + """ + commodata_list = [] + for dataset in self.datasets: + cd = dataset.commondata.load_commondata_instance() + if dataset.cuts is None: + commodata_list.append(cd) + else: + commodata_list.append(cd.with_cuts(dataset.cuts.load())) + return commodata_list + @property def thspec(self): #TODO: Is this good enough? Should we explicitly pass the theory diff --git a/validphys2/src/validphys/coredata.py b/validphys2/src/validphys/coredata.py index 2735606197..ce0a580cc4 100644 --- a/validphys2/src/validphys/coredata.py +++ b/validphys2/src/validphys/coredata.py @@ -7,7 +7,7 @@ import dataclasses import numpy as np import pandas as pd - +from validphys.commondatawriter import write_systype_to_file, write_commondata_to_file KIN_NAMES = ["kin1", "kin2", "kin3"] @@ -295,6 +295,11 @@ def get_kintable(self): def central_values(self): return self.commondata_table["data"] + def with_central_value(self, cv): + tb = self.commondata_table.copy() + tb["data"] = cv + return dataclasses.replace(self, commondata_table=tb) + def get_cv(self): return self.central_values.values @@ -364,21 +369,18 @@ def systematic_errors(self, central_values=None): converted_mult_errors = self.multiplicative_errors * central_values[:, np.newaxis] / 100 return pd.concat((self.additive_errors, converted_mult_errors), axis=1) + def export(self, path): """Export the data, and error types - Use the same format as libNNPDF: + Use the same format as libNNPDF: - A DATA_.dat file with the dataframe of accepted points - A systypes/STYPES_.dat file with the error types """ + dat_path = path / f"DATA_{self.setname}.dat" sys_path = path / "systypes" / f"SYSTYPE_{self.setname}_DEFAULT.dat" sys_path.parent.mkdir(exist_ok=True) - dat_string_raw = self.commondata_table.to_string(index=False, header=False, float_format="{:.8e}".format) - header = f"{self.setname} {self.nsys} {self.ndata}" - dat_string = "\n".join([f" {i+1} {r}" for i, r in enumerate(dat_string_raw.split("\n"))]) - dat_path.write_text(f"{header}\n{dat_string}\n") - - sys_raw = self.systype_table.to_string(index=True, header=False, index_names=False) - sys_path.write_text(f"{self.nsys}\n{sys_raw}\n") + write_systype_to_file(self, sys_path) + write_commondata_to_file(self, dat_path) diff --git a/validphys2/src/validphys/filters.py b/validphys2/src/validphys/filters.py index 1669772a39..2532ca2c00 100644 --- a/validphys2/src/validphys/filters.py +++ b/validphys2/src/validphys/filters.py @@ -9,10 +9,13 @@ import numpy as np -from reportengine.checks import make_argcheck, check, check_positive, make_check +from reportengine.checks import check, make_check from reportengine.compat import yaml import validphys.cuts - +from validphys.commondatawriter import ( + write_commondata_to_file, + write_systype_to_file, + ) log = logging.getLogger(__name__) KIN_LABEL = { @@ -72,12 +75,6 @@ def default_filter_rules_input(): return yaml.safe_load(read_text(validphys.cuts, "filters.yaml")) -@make_argcheck -def check_rngalgo(rngalgo: int): - """Check rngalgo content""" - check(0 <= rngalgo < 17, - "Invalid rngalgo. Must be int between [0, 16].") - def check_nonnegative(var: str): """Ensure that `var` is positive""" @@ -100,27 +97,8 @@ def export_mask(path, mask): """Dump mask to file""" np.savetxt(path, mask, fmt='%d') -@check_rngalgo -@check_nonnegative('filterseed') -@check_nonnegative('seed') -def prepare_nnpdf_rng(filterseed:int, rngalgo:int, seed:int): - """Initialise the internal NNPDF RNG, specified by ``rngalgo`` which must - be an integer between 0 and 16, seeded with ``filterseed``. - The RNG can then be subsequently used to i.e generate pseudodata. - """ - try: - from NNPDF import RandomGenerator - except ImportError as e: - logging.error("Generating closure data needs a valid installation of libNNPDF") - raise e - - log.warning("Importing libNNPDF") - log.info("Initialising RNG") - RandomGenerator.InitRNG(rngalgo, seed) - RandomGenerator.GetRNG().SetSeed(filterseed) - -@check_positive('errorsize') -def filter_closure_data(filter_path, data, fakepdf, fakenoise, errorsize, prepare_nnpdf_rng): + +def filter_closure_data(filter_path, data, fakepdf, fakenoise, filterseed): """Filter closure data. In addition to cutting data points, the data is generated from an underlying ``fakepdf``, applying a shift to the data if ``fakenoise`` is ``True``, which emulates the experimental central values @@ -128,13 +106,11 @@ def filter_closure_data(filter_path, data, fakepdf, fakenoise, errorsize, prepar """ log.info('Filtering closure-test data.') - return _filter_closure_data( - filter_path, data, fakepdf, fakenoise, errorsize) + return _filter_closure_data(filter_path, data, fakepdf, fakenoise, filterseed) -@check_positive("errorsize") def filter_closure_data_by_experiment( - filter_path, experiments_data, fakepdf, fakenoise, errorsize, prepare_nnpdf_rng, + filter_path, experiments_data, fakepdf, fakenoise, filterseed, experiments_index ): """ Like :py:func:`filter_closure_data` except filters data by experiment. @@ -145,10 +121,19 @@ def filter_closure_data_by_experiment( not reproducible. """ - return [ - _filter_closure_data(filter_path, exp, fakepdf, fakenoise, errorsize) - for exp in experiments_data - ] + + res = [] + for exp in experiments_data: + experiment_index = experiments_index[ + experiments_index.isin([exp.name], level=0) + ] + res.append( + _filter_closure_data( + filter_path, exp, fakepdf, fakenoise, filterseed, experiment_index + ) + ) + + return res def filter_real_data(filter_path, data): @@ -183,6 +168,7 @@ def _write_ds_cut_data(path, dataset): def _filter_real_data(filter_path, data): """Filter real experimental data.""" + total_data_points = 0 total_cut_data_points = 0 for dataset in data.datasets: @@ -194,24 +180,93 @@ def _filter_real_data(filter_path, data): return total_data_points, total_cut_data_points -def _filter_closure_data(filter_path, data, fakepdf, fakenoise, errorsize): - """Filter closure test data.""" +def _filter_closure_data( + filter_path, data, fakepdf, fakenoise, filterseed, experiments_index +): + """ + This function is accessed within a closure test only, that is, the fakedata + namespace has to be True (If fakedata = False, the _filter_real_data function + will be used to write the commondata files). + + The function writes commondata and systypes files within the + name_closure_test/filter folder. + If fakenoise is True, Level 1 type data is written to the filter folder, otherwise + Level 0 data is written. + + Level 1 data is generated from the Level 0 data by adding noise sampled from + the experimental covariance matrix using the validphys.pseudodata.make_replica + function. + + Parameters + ---------- + + filter_path : str + path to filter folder + + data : validphys.core.DataGroupSpec + + fakepdf : validphys.core.PDF + + fakenoise : bool + if fakenoise perform level1 shift of central data values + + filterseed : int + random seed used for the generation of + random noise added to Level 0 data + + + experiments_index : pandas.MultiIndex + + + Returns + ------- + tuple + total data points and points passing the cuts + + """ total_data_points = 0 total_cut_data_points = 0 - fakeset = fakepdf.legacy_load() - # Load data, don't cache result - loaded_data = data.load.__wrapped__(data) - # generate level 1 shift if fakenoise - loaded_data.MakeClosure(fakeset, fakenoise) - for j, dataset in enumerate(data.datasets): + + # circular import generated @ core.py + from validphys.pseudodata import level0_commondata_wc, make_level1_data + + closure_data = level0_commondata_wc(data, fakepdf) + + for dataset in data.datasets: + #== print number of points passing cuts, make dataset directory and write FKMASK ==# path = filter_path / dataset.name nfull, ncut = _write_ds_cut_data(path, dataset) + make_dataset_dir(path / "systypes") total_data_points += nfull total_cut_data_points += ncut - loaded_ds = loaded_data.GetSet(j) - if errorsize != 1.0: - loaded_ds.RescaleErrors(errorsize) - loaded_ds.Export(str(path)) + + if fakenoise: + #======= Level 1 closure test =======# + + closure_data = make_level1_data( + data, + closure_data, + filterseed, + experiments_index, + ) + + #====== write commondata and systype files ======# + if fakenoise: + log.info("Writing Level1 data") + else: + log.info("Writing Level0 data") + + for cd in closure_data: + path_cd = filter_path / cd.setname / f"DATA_{cd.setname}.dat" + path_sys = ( + filter_path + / cd.setname + / "systypes" + / f"SYSTYPE_{cd.setname}_DEFAULT.dat" + ) + write_commondata_to_file(commondata=cd, path=path_cd) + write_systype_to_file(commondata=cd, path=path_sys) + return total_data_points, total_cut_data_points diff --git a/validphys2/src/validphys/pseudodata.py b/validphys2/src/validphys/pseudodata.py index 142072e0d6..67d0144a7b 100644 --- a/validphys2/src/validphys/pseudodata.py +++ b/validphys2/src/validphys/pseudodata.py @@ -10,7 +10,7 @@ import numpy as np import pandas as pd -from validphys.covmats import INTRA_DATASET_SYS_NAME, sqrt_covmat +from validphys.covmats import INTRA_DATASET_SYS_NAME, sqrt_covmat, dataset_inputs_covmat_from_systematics from reportengine import collect @@ -236,10 +236,139 @@ def indexed_make_replica(groups_index, make_replica): return pd.DataFrame(make_replica, index=groups_index, columns=["data"]) +def level0_commondata_wc(data, fakepdf): + """ + Given a validphys.core.DataGroupSpec object, load commondata and + generate a new commondata instance with central values replaced + by fakepdf prediction + + Parameters + ---------- + + data : validphys.core.DataGroupSpec + + fakepdf: validphys.core.PDF + + Returns + ------- + list + list of validphys.coredata.CommonData instances corresponding to + all datasets within one experiment. The central value is replaced + by Level 0 fake data. + + Example + ------- + >>> from validphys.api import API + >>> API.level0_commondata_wc(dataset_inputs = [{"dataset":"NMC"}], use_cuts="internal", theoryid=200,fakepdf = "NNPDF40_nnlo_as_01180") + + [CommonData(setname='NMC', ndata=204, commondataproc='DIS_NCE', nkin=3, nsys=16)] + """ + from validphys.covmats import dataset_t0_predictions + level0_commondata_instances_wc = [] + + # ==== Load validphys.coredata.CommonData instance with cuts ====# + + for dataset in data.datasets: + commondata_wc = dataset.commondata.load_commondata_instance() + if dataset.cuts is not None: + cuts = dataset.cuts.load() + commondata_wc = commondata_wc.with_cuts(cuts) + + # == Generate a new CommonData instance with central value given by Level 0 data generated with fakepdf ==# + + t0_prediction = dataset_t0_predictions( + dataset=dataset, t0set=fakepdf + ) # N.B. cuts already applied to th. pred. + level0_commondata_instances_wc.append( + commondata_wc.with_central_value(t0_prediction) + ) + + return level0_commondata_instances_wc + -_group_recreate_pseudodata = collect('indexed_make_replica', ('group_dataset_inputs_by_experiment',)) -_recreate_fit_pseudodata = collect('_group_recreate_pseudodata', ('fitreplicas', 'fitenvironment')) -_recreate_pdf_pseudodata = collect('_group_recreate_pseudodata', ('pdfreplicas', 'fitenvironment')) +def make_level1_data( + data, level0_commondata_wc, filterseed, experiments_index +): + """ + Given a list of level0 commondata instances, return the same list + with central values replaced by level1 data + + + Parameters + ---------- + + data : validphys.core.DataGroupSpec + + level0_commondata_wc : list + list of validphys.coredata.CommonData instances corresponding to + all datasets within one experiment. The central value is replaced + by Level 0 fake data. Cuts already applied. + + filterseed: int + random seed used for the generation of Level 1 data + + + Returns + ------- + list + list of validphys.coredata.CommonData instances corresponding to + all datasets within one experiment. The central value is replaced + by Level 1 fake data. + + Example + ------- + + >>> from validphys.api import API + >>> dataset='NMC' + >>> l1_cd = API.make_level1_data(dataset_inputs = [{"dataset":dataset}],use_cuts="internal", theoryid=200, + fakepdf = "NNPDF40_nnlo_as_01180",filterseed=1) + >>> l1_cd + [CommonData(setname='NMC', ndata=204, commondataproc='DIS_NCE', nkin=3, nsys=16)] + """ + # =============== generate experimental covariance matrix ===============# + + dataset_input_list = list(data.dsinputs) + + commondata_wc = data.load_commondata_instance() + + covmat = dataset_inputs_covmat_from_systematics( + commondata_wc, + dataset_input_list, + use_weights_in_covmat=False, + norm_threshold=None, + _list_of_central_values=None, + _only_additive=False, + ) + + # ================== generation of pseudo data ======================# + # = generate pseudo data starting from theory predictions + level1_data = make_replica( + level0_commondata_wc, filterseed, covmat, sep_mult=False, genrep=True + ) + + indexed_level1_data = indexed_make_replica(experiments_index, level1_data) + + # ===== create commondata instances with central values given by pseudo_data =====# + level1_commondata_dict = {c.setname: c for c in level0_commondata_wc} + level1_commondata_instances_wc = [] + + for xx, grp in indexed_level1_data.groupby('dataset'): + level1_commondata_instances_wc.append( + level1_commondata_dict[xx].with_central_value(grp.values) + ) + + return level1_commondata_instances_wc + + +_group_recreate_pseudodata = collect( + 'indexed_make_replica', ('group_dataset_inputs_by_experiment',) +) +_recreate_fit_pseudodata = collect( + '_group_recreate_pseudodata', ('fitreplicas', 'fitenvironment') +) +_recreate_pdf_pseudodata = collect( + '_group_recreate_pseudodata', ('pdfreplicas', 'fitenvironment') +) fit_tr_masks = collect('replica_training_mask_table', ('fitreplicas', 'fitenvironment')) pdf_tr_masks = collect('replica_training_mask_table', ('pdfreplicas', 'fitenvironment')) @@ -304,4 +433,4 @@ def recreate_pdf_pseudodata(_recreate_pdf_pseudodata, pdfreplicas, pdf_tr_masks) pdf_tr_masks_no_table = collect('replica_training_mask', ('pdfreplicas', 'fitenvironment')) def recreate_pdf_pseudodata_no_table(_recreate_pdf_pseudodata, pdfreplicas, pdf_tr_masks_no_table): - return recreate_pdf_pseudodata(_recreate_pdf_pseudodata, pdfreplicas, pdf_tr_masks_no_table) \ No newline at end of file + return recreate_pdf_pseudodata(_recreate_pdf_pseudodata, pdfreplicas, pdf_tr_masks_no_table) diff --git a/validphys2/src/validphys/tests/conftest.py b/validphys2/src/validphys/tests/conftest.py index 74eb4315c3..b76f5073b7 100644 --- a/validphys2/src/validphys/tests/conftest.py +++ b/validphys2/src/validphys/tests/conftest.py @@ -23,6 +23,8 @@ def tmp(tmpdir): # Here define the default config items like the PDF, theory and experiment specs SINGLE_DATAPOINT = {'dataset': 'ATLASTTBARTOT8TEV', 'cfac': ['QCD']} +SINGLE_DATASET = {'dataset': 'NMC'} + DATA = [ {'dataset': 'NMC'}, {'dataset': 'ATLASTTBARTOT', 'cfac':['QCD']}, diff --git a/validphys2/src/validphys/tests/regressions/test_filter_rebuild_closure_data.csv b/validphys2/src/validphys/tests/regressions/test_filter_rebuild_closure_data.csv index f7ce521f40..a46ad353a5 100644 --- a/validphys2/src/validphys/tests/regressions/test_filter_rebuild_closure_data.csv +++ b/validphys2/src/validphys/tests/regressions/test_filter_rebuild_closure_data.csv @@ -1,236 +1,236 @@ group dataset id data_central -NMC NMC 16 0.4007353489505 -NMC NMC 21 0.3596156369461 -NMC NMC 22 0.3696772738631 -NMC NMC 27 0.3662960538326 -NMC NMC 28 0.3671016068397 -NMC NMC 29 0.3911462081599 -NMC NMC 34 0.3873596614146 -NMC NMC 35 0.3685951249355 -NMC NMC 36 0.3652752448135 -NMC NMC 40 0.3782916051482 -NMC NMC 41 0.3910438628795 -NMC NMC 42 0.3733418699219 -NMC NMC 46 0.3810537704863 -NMC NMC 47 0.3708532044501 -NMC NMC 48 0.3593684720153 -NMC NMC 51 0.3693367172184 -NMC NMC 52 0.3737791523646 -NMC NMC 53 0.3386288622738 -NMC NMC 54 0.3500948571991 -NMC NMC 57 0.3418514086764 -NMC NMC 58 0.3489404958264 -NMC NMC 59 0.3488612312165 -NMC NMC 60 0.3505041034015 -NMC NMC 63 0.3333040875332 -NMC NMC 64 0.2944010260022 -NMC NMC 65 0.3099040341106 -NMC NMC 68 0.2811103711856 -NMC NMC 69 0.2595731013581 -NMC NMC 83 0.332503113838 -NMC NMC 84 0.3062223521694 -NMC NMC 87 0.3477451853918 -NMC NMC 88 0.352597827366 -NMC NMC 89 0.3689837642521 -NMC NMC 91 0.3410075219517 -NMC NMC 92 0.3380026268081 -NMC NMC 93 0.3630165854001 -NMC NMC 94 0.3692037594232 -NMC NMC 95 0.3379900856468 -NMC NMC 97 0.3498975977998 -NMC NMC 98 0.3455821206785 -NMC NMC 99 0.3561806744993 -NMC NMC 100 0.3732490901176 -NMC NMC 101 0.3500032818012 -NMC NMC 104 0.3619815034828 -NMC NMC 105 0.3577747301693 -NMC NMC 106 0.3448546937843 -NMC NMC 107 0.3970272458214 -NMC NMC 108 0.3194277040841 -NMC NMC 110 0.3205419458354 -NMC NMC 111 0.3367281886952 -NMC NMC 112 0.3386950891887 -NMC NMC 113 0.3225662456658 -NMC NMC 114 0.29975210255 -NMC NMC 115 0.3258513025439 -NMC NMC 116 0.3369058963301 -NMC NMC 117 0.3302714626432 -NMC NMC 118 0.3149870988695 -NMC NMC 119 0.2993100089626 -NMC NMC 120 0.3368228206002 -NMC NMC 121 0.3102225912073 -NMC NMC 122 0.3180821969045 -NMC NMC 123 0.2933430928775 -NMC NMC 124 0.3098840948832 -NMC NMC 125 0.3231255065332 -NMC NMC 126 0.2902405904389 -NMC NMC 127 0.2669059748255 -NMC NMC 128 0.2689476065289 -NMC NMC 129 0.2956116242333 -NMC NMC 130 0.288082548032 -NMC NMC 131 0.2226505072116 -NMC NMC 132 0.2198391302795 -NMC NMC 133 0.204048963916 -NMC NMC 134 0.2127696389248 -NMC NMC 136 0.1375618648213 -NMC NMC 137 0.1339894685257 -NMC NMC 147 0.3489969251822 -NMC NMC 148 0.3552399410999 -NMC NMC 152 0.3483599212619 -NMC NMC 153 0.3560033903034 -NMC NMC 154 0.3796442730621 -NMC NMC 157 0.3429642181623 -NMC NMC 158 0.3706142444086 -NMC NMC 159 0.355255409241 -NMC NMC 160 0.352842258266 -NMC NMC 161 0.3539020551091 -NMC NMC 162 0.3521469993182 -NMC NMC 163 0.3632537732513 -NMC NMC 164 0.3725308840612 -NMC NMC 165 0.3576604586946 -NMC NMC 166 0.3816526263355 -NMC NMC 167 0.3688809286074 -NMC NMC 168 0.3385882966462 -NMC NMC 169 0.3387628659638 -NMC NMC 170 0.3760634504695 -NMC NMC 171 0.3785323104752 -NMC NMC 172 0.3632421316272 -NMC NMC 173 0.3623753029918 -NMC NMC 174 0.3362183838135 -NMC NMC 175 0.3432266150754 -NMC NMC 176 0.3640134644566 -NMC NMC 177 0.3576634295374 -NMC NMC 178 0.3597463154209 -NMC NMC 179 0.3603372275518 -NMC NMC 180 0.3177940693752 -NMC NMC 181 0.3620568994759 -NMC NMC 182 0.3701314089822 -NMC NMC 183 0.2978652392955 -NMC NMC 184 0.3541449769575 -NMC NMC 185 0.3448722906877 -NMC NMC 186 0.3412588395999 -NMC NMC 187 0.3570684620173 -NMC NMC 188 0.3286891216355 -NMC NMC 189 0.3477526408617 -NMC NMC 190 0.335703925785 -NMC NMC 191 0.3444529842929 -NMC NMC 192 0.3403578691808 -NMC NMC 193 0.3347353981548 -NMC NMC 194 0.3203688496486 -NMC NMC 195 0.3159487761597 -NMC NMC 196 0.3443688712277 -NMC NMC 197 0.3124097261611 -NMC NMC 198 0.3154190766316 -NMC NMC 199 0.2942857811848 -NMC NMC 200 0.2799806891526 -NMC NMC 201 0.2775840928341 -NMC NMC 202 0.2532591445827 -NMC NMC 203 0.2708438289781 -NMC NMC 204 0.254383734349 -NMC NMC 205 0.2584578349333 -NMC NMC 206 0.2288369641399 -NMC NMC 207 0.2168810713002 -NMC NMC 208 0.2203718114199 -NMC NMC 209 0.1847450793115 -NMC NMC 210 0.1459140382753 -NMC NMC 211 0.1143166792701 -NMC NMC 212 0.1267472998114 -NMC NMC 221 0.377311655587 -NMC NMC 222 0.3786167921399 -NMC NMC 225 0.3880648558735 -NMC NMC 226 0.3835579098506 -NMC NMC 227 0.3700815811285 -NMC NMC 229 0.3784519070427 -NMC NMC 230 0.3982216265502 -NMC NMC 231 0.4017000200127 -NMC NMC 232 0.3922919247205 -NMC NMC 233 0.4124193564822 -NMC NMC 234 0.3590905662548 -NMC NMC 235 0.3967950366239 -NMC NMC 236 0.3971726043601 -NMC NMC 237 0.4020683891529 -NMC NMC 238 0.3814902989618 -NMC NMC 239 0.386741867313 -NMC NMC 240 0.369385519281 -NMC NMC 241 0.3814990929537 -NMC NMC 242 0.381564927955 -NMC NMC 243 0.3948804610387 -NMC NMC 244 0.3839173773074 -NMC NMC 245 0.3802441689135 -NMC NMC 246 0.3752499091384 -NMC NMC 247 0.3974188959257 -NMC NMC 248 0.3836237312771 -NMC NMC 249 0.3911270447289 -NMC NMC 250 0.3877800272259 -NMC NMC 251 0.3629868559682 -NMC NMC 252 0.3754088188714 -NMC NMC 253 0.380648396326 -NMC NMC 254 0.379643330629 -NMC NMC 255 0.3717431381859 -NMC NMC 256 0.3850277979529 -NMC NMC 257 0.357666057149 -NMC NMC 258 0.3843712169454 -NMC NMC 259 0.3677026936208 -NMC NMC 260 0.3655736280598 -NMC NMC 261 0.3441364575008 -NMC NMC 262 0.3972401996537 -NMC NMC 263 0.3645143376461 -NMC NMC 264 0.3510977851517 -NMC NMC 265 0.3539138992202 -NMC NMC 266 0.3493708856316 -NMC NMC 267 0.3320087427879 -NMC NMC 268 0.3284299620477 -NMC NMC 269 0.3321367638445 -NMC NMC 270 0.3209261313501 -NMC NMC 271 0.3152880392914 -NMC NMC 272 0.3067196941747 -NMC NMC 273 0.3051998380667 -NMC NMC 274 0.3111118466168 -NMC NMC 275 0.2900155628937 -NMC NMC 276 0.2883840542816 -NMC NMC 277 0.2756559342559 -NMC NMC 278 0.2855005116247 -NMC NMC 279 0.2662589115441 -NMC NMC 280 0.2559570780724 -NMC NMC 281 0.2504174862552 -NMC NMC 282 0.2307957738123 -NMC NMC 283 0.241680108918 -NMC NMC 284 0.2146215617884 -NMC NMC 285 0.211746450436 -NMC NMC 286 0.2128987035927 -NMC NMC 287 0.1935284098196 -NMC NMC 288 0.131946290253 -NMC NMC 289 0.1180789438391 -NMC NMC 290 0.1049547912561 -NMC NMC 291 0.1106025920512 -ATLAS ATLASTTBARTOT 0 162.5686864865 -ATLAS ATLASTTBARTOT 1 236.1859490199 -ATLAS ATLASTTBARTOT 2 830.4482576268 -CMS CMSZDIFF12 1 2914.124612961 -CMS CMSZDIFF12 2 1080.410756147 -CMS CMSZDIFF12 3 466.257652438 -CMS CMSZDIFF12 4 227.8725970988 -CMS CMSZDIFF12 5 112.9922431625 -CMS CMSZDIFF12 6 60.11148107363 -CMS CMSZDIFF12 7 31.01641512591 -CMS CMSZDIFF12 11 2841.234006315 -CMS CMSZDIFF12 12 1045.712255313 -CMS CMSZDIFF12 13 455.7116015988 -CMS CMSZDIFF12 14 208.6895742617 -CMS CMSZDIFF12 15 111.8661789107 -CMS CMSZDIFF12 16 61.01526352725 -CMS CMSZDIFF12 17 30.58163323228 -CMS CMSZDIFF12 21 2534.025669336 -CMS CMSZDIFF12 22 911.9673411774 -CMS CMSZDIFF12 23 415.3681972017 -CMS CMSZDIFF12 24 198.7630470755 -CMS CMSZDIFF12 25 100.2899391664 -CMS CMSZDIFF12 26 56.45171623313 -CMS CMSZDIFF12 27 28.6103128109 -CMS CMSZDIFF12 31 1990.217512849 -CMS CMSZDIFF12 32 728.4681533061 -CMS CMSZDIFF12 33 332.4189366359 -CMS CMSZDIFF12 34 165.4302576598 -CMS CMSZDIFF12 35 88.19728756934 -CMS CMSZDIFF12 36 47.85196748986 -CMS CMSZDIFF12 37 24.06201644101 +NMC NMC 16 0.28019164359912174 +NMC NMC 21 0.35499349354805787 +NMC NMC 22 0.36699960383943325 +NMC NMC 27 0.36514731639520354 +NMC NMC 28 0.3796019817168817 +NMC NMC 29 0.3557283684527493 +NMC NMC 34 0.358213498117281 +NMC NMC 35 0.38344229108403 +NMC NMC 36 0.3906176180402464 +NMC NMC 40 0.3565478540570389 +NMC NMC 41 0.35449556242092534 +NMC NMC 42 0.3477428857498088 +NMC NMC 46 0.34058587588303324 +NMC NMC 47 0.37528607055424945 +NMC NMC 48 0.35810702495585167 +NMC NMC 51 0.35948420833368 +NMC NMC 52 0.3252481995431795 +NMC NMC 53 0.34839699344491915 +NMC NMC 54 0.3305599715630647 +NMC NMC 57 0.33854839805110815 +NMC NMC 58 0.3475248192617279 +NMC NMC 59 0.3224033407693148 +NMC NMC 60 0.3557230755468301 +NMC NMC 63 0.3076864562936749 +NMC NMC 64 0.3249652996062988 +NMC NMC 65 0.3225373982130234 +NMC NMC 68 0.2698593749956943 +NMC NMC 69 0.28697589129899725 +NMC NMC 83 0.3314942368553224 +NMC NMC 84 0.3497035726336489 +NMC NMC 87 0.3561247503065496 +NMC NMC 88 0.36048612554048426 +NMC NMC 89 0.342867775009473 +NMC NMC 91 0.3462149531948183 +NMC NMC 92 0.33322645114254057 +NMC NMC 93 0.3496968402988778 +NMC NMC 94 0.37224312344590277 +NMC NMC 95 0.3501229381653187 +NMC NMC 97 0.34862218791470695 +NMC NMC 98 0.3513864997869911 +NMC NMC 99 0.3463189635741315 +NMC NMC 100 0.34999374714067055 +NMC NMC 101 0.3219866280166407 +NMC NMC 104 0.3136568526784361 +NMC NMC 105 0.3238255813447048 +NMC NMC 106 0.34905991139783304 +NMC NMC 107 0.34365171884104645 +NMC NMC 108 0.2700951102701827 +NMC NMC 110 0.3516749264080651 +NMC NMC 111 0.3420426414588959 +NMC NMC 112 0.3368571659898279 +NMC NMC 113 0.32766489680568944 +NMC NMC 114 0.3309229352262125 +NMC NMC 115 0.3087559452541232 +NMC NMC 116 0.30434091887231657 +NMC NMC 117 0.31985278442485376 +NMC NMC 118 0.3081369779237656 +NMC NMC 119 0.32428991893790204 +NMC NMC 120 0.29177949202546344 +NMC NMC 121 0.2986166917278112 +NMC NMC 122 0.28530172048925173 +NMC NMC 123 0.30960790490633666 +NMC NMC 124 0.2838914377920225 +NMC NMC 125 0.327108232453106 +NMC NMC 126 0.30800213354866085 +NMC NMC 127 0.27505741362840286 +NMC NMC 128 0.3057396895330445 +NMC NMC 129 0.2948720021522578 +NMC NMC 130 0.28654594665723143 +NMC NMC 131 0.24998019481392156 +NMC NMC 132 0.23305710852110711 +NMC NMC 133 0.2285884324760879 +NMC NMC 134 0.21022049472555798 +NMC NMC 136 0.14289441509543208 +NMC NMC 137 0.1467309459465361 +NMC NMC 147 0.3783814687867924 +NMC NMC 148 0.3660143252628356 +NMC NMC 152 0.37316750851562697 +NMC NMC 153 0.38611716465278784 +NMC NMC 154 0.3698410284359639 +NMC NMC 157 0.36961892116181694 +NMC NMC 158 0.40918582365959344 +NMC NMC 159 0.3772237079249307 +NMC NMC 160 0.36695342000619174 +NMC NMC 161 0.37837880076113106 +NMC NMC 162 0.3574940348440908 +NMC NMC 163 0.38209182150349047 +NMC NMC 164 0.38555197565482335 +NMC NMC 165 0.38435365356895423 +NMC NMC 166 0.39523350385236933 +NMC NMC 167 0.352962329300064 +NMC NMC 168 0.33498853883029145 +NMC NMC 169 0.3799963472642203 +NMC NMC 170 0.3626711192860542 +NMC NMC 171 0.3726539470995713 +NMC NMC 172 0.38205670828934024 +NMC NMC 173 0.3624890112249862 +NMC NMC 174 0.351766590223616 +NMC NMC 175 0.38120620112890435 +NMC NMC 176 0.376704707091722 +NMC NMC 177 0.35767966843982835 +NMC NMC 178 0.3739917821379859 +NMC NMC 179 0.3779713226850912 +NMC NMC 180 0.3540178478852946 +NMC NMC 181 0.3563337922341492 +NMC NMC 182 0.3495895799725437 +NMC NMC 183 0.40513857686448185 +NMC NMC 184 0.3737246199455833 +NMC NMC 185 0.34224373934105096 +NMC NMC 186 0.3572968130894208 +NMC NMC 187 0.3513259873499916 +NMC NMC 188 0.36191625620248563 +NMC NMC 189 0.3757225472452201 +NMC NMC 190 0.34496599482267015 +NMC NMC 191 0.3671454519682669 +NMC NMC 192 0.3355832294500817 +NMC NMC 193 0.32611756260750746 +NMC NMC 194 0.3264723091842311 +NMC NMC 195 0.31358299893261243 +NMC NMC 196 0.3063679612675748 +NMC NMC 197 0.3243783766742867 +NMC NMC 198 0.2951522224003636 +NMC NMC 199 0.30478606823022336 +NMC NMC 200 0.3162026195490957 +NMC NMC 201 0.24410226609924124 +NMC NMC 202 0.29437714007416727 +NMC NMC 203 0.29086153651126373 +NMC NMC 204 0.2618537028601226 +NMC NMC 205 0.24746460684350655 +NMC NMC 206 0.22851397088173026 +NMC NMC 207 0.23143418017058778 +NMC NMC 208 0.2083333904728336 +NMC NMC 209 0.1871220049907259 +NMC NMC 210 0.13694037697890943 +NMC NMC 211 0.1410254122612783 +NMC NMC 212 0.10913012127955796 +NMC NMC 221 0.38635187132002613 +NMC NMC 222 0.4142522089627604 +NMC NMC 225 0.40345790673282933 +NMC NMC 226 0.40425695161223724 +NMC NMC 227 0.39659246253718794 +NMC NMC 229 0.4111692386727388 +NMC NMC 230 0.40555697596449714 +NMC NMC 231 0.4035342194456604 +NMC NMC 232 0.4151050115450948 +NMC NMC 233 0.3925537185116469 +NMC NMC 234 0.3991798063407916 +NMC NMC 235 0.42128296044596675 +NMC NMC 236 0.39594826617785617 +NMC NMC 237 0.4132863843007187 +NMC NMC 238 0.4063071052878472 +NMC NMC 239 0.39412536731089337 +NMC NMC 240 0.38212850421302924 +NMC NMC 241 0.3914294452161547 +NMC NMC 242 0.40047857374987483 +NMC NMC 243 0.4008070275555427 +NMC NMC 244 0.40262694743529254 +NMC NMC 245 0.39621958826618797 +NMC NMC 246 0.39102221801161896 +NMC NMC 247 0.3886398830939979 +NMC NMC 248 0.38188378549251667 +NMC NMC 249 0.3988887017211007 +NMC NMC 250 0.39585021194541986 +NMC NMC 251 0.40126477628252327 +NMC NMC 252 0.3964150971271786 +NMC NMC 253 0.3902202435316766 +NMC NMC 254 0.38160232623513723 +NMC NMC 255 0.3839102218492622 +NMC NMC 256 0.39033449259461933 +NMC NMC 257 0.37931861168091624 +NMC NMC 258 0.3709117293446901 +NMC NMC 259 0.3732315660927265 +NMC NMC 260 0.3720221661101343 +NMC NMC 261 0.3517503669287229 +NMC NMC 262 0.36807144164962735 +NMC NMC 263 0.3693458573629922 +NMC NMC 264 0.3592451130180051 +NMC NMC 265 0.35632376909940633 +NMC NMC 266 0.35150220374085334 +NMC NMC 267 0.34496329443474294 +NMC NMC 268 0.33956152225234476 +NMC NMC 269 0.3485667202754675 +NMC NMC 270 0.3391216940975037 +NMC NMC 271 0.33736702477837127 +NMC NMC 272 0.3133373105891819 +NMC NMC 273 0.32982788223049275 +NMC NMC 274 0.3211288416924518 +NMC NMC 275 0.3060547284123289 +NMC NMC 276 0.335436416428492 +NMC NMC 277 0.3073804246714358 +NMC NMC 278 0.294093691234672 +NMC NMC 279 0.2884616638265187 +NMC NMC 280 0.26397391314307916 +NMC NMC 281 0.2444528193940454 +NMC NMC 282 0.27832660956025357 +NMC NMC 283 0.25803828744513574 +NMC NMC 284 0.23389825136222092 +NMC NMC 285 0.2146733551898643 +NMC NMC 286 0.21813290674472682 +NMC NMC 287 0.212151341826686 +NMC NMC 288 0.16141376202106558 +NMC NMC 289 0.13433721471473095 +NMC NMC 290 0.11551212545868192 +NMC NMC 291 0.10901466846254028 +ATLAS ATLASTTBARTOT 0 165.5652425198355 +ATLAS ATLASTTBARTOT 1 245.16706727829992 +ATLAS ATLASTTBARTOT 2 801.771432400817 +CMS CMSZDIFF12 1 2973.4725103674823 +CMS CMSZDIFF12 2 1056.3849990121557 +CMS CMSZDIFF12 3 456.57202617345774 +CMS CMSZDIFF12 4 221.42094319673168 +CMS CMSZDIFF12 5 107.23839580843014 +CMS CMSZDIFF12 6 58.24831168720775 +CMS CMSZDIFF12 7 29.594897586398673 +CMS CMSZDIFF12 11 2828.9994410871873 +CMS CMSZDIFF12 12 1042.0799324021702 +CMS CMSZDIFF12 13 443.3584194436015 +CMS CMSZDIFF12 14 204.46185503728015 +CMS CMSZDIFF12 15 105.84479937812591 +CMS CMSZDIFF12 16 59.79512008357787 +CMS CMSZDIFF12 17 30.620091935371985 +CMS CMSZDIFF12 21 2590.081496607627 +CMS CMSZDIFF12 22 912.4546874257419 +CMS CMSZDIFF12 23 410.2638687475507 +CMS CMSZDIFF12 24 203.38813364945474 +CMS CMSZDIFF12 25 103.36390836336159 +CMS CMSZDIFF12 26 54.7135715358862 +CMS CMSZDIFF12 27 28.40706067537687 +CMS CMSZDIFF12 31 2029.9154133864206 +CMS CMSZDIFF12 32 737.238837202754 +CMS CMSZDIFF12 33 331.45213196343286 +CMS CMSZDIFF12 34 172.74641496097794 +CMS CMSZDIFF12 35 88.99325953676879 +CMS CMSZDIFF12 36 49.525868163359064 +CMS CMSZDIFF12 37 24.187338718035164 diff --git a/validphys2/src/validphys/tests/test_pseudodata.py b/validphys2/src/validphys/tests/test_pseudodata.py index 413975af7c..b6149006ff 100644 --- a/validphys2/src/validphys/tests/test_pseudodata.py +++ b/validphys2/src/validphys/tests/test_pseudodata.py @@ -8,11 +8,14 @@ recreation. """ import pandas as pd +import numpy as np +from numpy.testing import assert_allclose import pytest from validphys.api import API -from validphys.tests.conftest import FIT, PSEUDODATA_FIT - +from validphys.tests.conftest import FIT, PSEUDODATA_FIT, THEORYID, SINGLE_DATASET, PDF +from validphys.loader import Loader +from validphys.covmats import dataset_t0_predictions def test_read_fit_pseudodata(): fit_pseudodata = API.read_fit_pseudodata(fit=PSEUDODATA_FIT) @@ -80,3 +83,29 @@ def test_read_matches_recreate(): ) pd.testing.assert_index_equal(read.tr_idx, recreate.tr_idx, check_order=False) pd.testing.assert_index_equal(read.val_idx, recreate.val_idx, check_order=False) + + +def test_level0_commondata_wc(): + """ + check whether level0_commondata_wc and dataset_t0_predictions + coincide + """ + dataset = SINGLE_DATASET + pdfname = PDF + l = Loader() + datasetspec = l.check_dataset(list(dataset.values())[0], theoryid=THEORYID) + t0set = l.check_pdf(pdfname) + + l0_cd = API.level0_commondata_wc( + dataset_inputs=[dataset], + use_cuts="internal", + theoryid=THEORYID, + fakepdf=pdfname, + ) + l0_vals = l0_cd[0].central_values + assert_allclose( + dataset_t0_predictions(dataset=datasetspec, t0set=t0set), + l0_vals, + rtol=1e-07, + atol=0, + )