From 7b8d0d6f7869d08625d8374466de0040d344fdbb Mon Sep 17 00:00:00 2001 From: juacrumar Date: Wed, 3 Aug 2022 13:02:33 +0200 Subject: [PATCH 1/7] reader for new commondata, from #1548 and #1500; only with the necessary files for the reader (no removals or rawdata) --- .github/workflows/tests.yml | 2 +- ...ground for the new commondata format.ipynb | 520 +++ buildmaster/NMCPD/data.yaml | 261 ++ buildmaster/NMCPD/filter.py | 69 + buildmaster/NMCPD/kinematics.yaml | 3121 +++++++++++++++++ buildmaster/NMCPD/metadata.yaml | 60 + buildmaster/NMCPD/uncertainties.yaml | 530 +++ buildmaster/NMCPD/uncertainties_dw.yaml | 266 ++ buildmaster/NMCPD/uncertainties_sh.yaml | 266 ++ validphys2/src/validphys/commondataparser.py | 184 +- validphys2/src/validphys/pineparser.py | 7 + validphys2/src/validphys/plotoptions/core.py | 6 +- validphys2/src/validphys/utils.py | 14 +- 13 files changed, 5281 insertions(+), 25 deletions(-) create mode 100644 Playground for the new commondata format.ipynb create mode 100644 buildmaster/NMCPD/data.yaml create mode 100644 buildmaster/NMCPD/filter.py create mode 100644 buildmaster/NMCPD/kinematics.yaml create mode 100644 buildmaster/NMCPD/metadata.yaml create mode 100644 buildmaster/NMCPD/uncertainties.yaml create mode 100644 buildmaster/NMCPD/uncertainties_dw.yaml create mode 100644 buildmaster/NMCPD/uncertainties_sh.yaml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e12b15d9d2..e1263e3145 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest] - python-version: [3.8, 3.9] + python-version: [3.9] include: - os: ubuntu-latest CONDA_OS: linux-64 diff --git a/Playground for the new commondata format.ipynb b/Playground for the new commondata format.ipynb new file mode 100644 index 0000000000..162485f5cf --- /dev/null +++ b/Playground for the new commondata format.ipynb @@ -0,0 +1,520 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "cc3f217c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[PosixPath('uncertainties.yaml'), PosixPath('uncertainties_sh.yaml')]\n" + ] + } + ], + "source": [ + "from pathlib import Path\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "\n", + "from reportengine.compat import yaml\n", + "import validphys\n", + "from validphys.commondataparser import parse_commondata_folder\n", + "\n", + "# Path to your buildmaster, here I'm guessing vp as installed in edit mode\n", + "BUILDMASTER_PATH = Path(validphys.__file__).parent / \"../../../buildmaster\"\n", + "DATASET = \"NMCPD\"\n", + "\n", + "#from validphys.core import CommonDataSpec\n", + "#import pandas as pd\n", + "#import numpy as np\n", + "#from collections import defaultdict\n", + "\n", + "dataset_path = BUILDMASTER_PATH / DATASET\n", + "metadata_file = dataset_path / \"metadata.yaml\"\n", + "metadata = yaml.safe_load(metadata_file.read_text())\n", + "ndata = metadata[\"ndata\"]\n", + "\n", + "ret = parse_commondata_folder(dataset_path, variant=\"shifted\")\n", + "print(ret.data_uncertainties)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b3c5ed78", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xq2y
midmidmid
index
10.00150.160.120852
20.00150.250.188831
30.00150.350.264363
40.00150.450.339895
50.00150.600.453194
............
2560.675026.490.044463
2570.675035.400.059419
2580.675047.030.078940
2590.675063.530.106635
2600.675099.030.166221
\n", + "

260 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " x q2 y\n", + " mid mid mid\n", + "index \n", + "1 0.0015 0.16 0.120852\n", + "2 0.0015 0.25 0.188831\n", + "3 0.0015 0.35 0.264363\n", + "4 0.0015 0.45 0.339895\n", + "5 0.0015 0.60 0.453194\n", + "... ... ... ...\n", + "256 0.6750 26.49 0.044463\n", + "257 0.6750 35.40 0.059419\n", + "258 0.6750 47.03 0.078940\n", + "259 0.6750 63.53 0.106635\n", + "260 0.6750 99.03 0.166221\n", + "\n", + "[260 rows x 3 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Read the kinematics dataframe\n", + "kin_df = None\n", + "if True:\n", + " kin_file = dataset_path / \"kinematics.yaml\"\n", + " kinyaml = yaml.safe_load(kin_file.read_text())\n", + " \n", + " kin_dict = {i+1: pd.DataFrame(d).stack() for i, d in enumerate(kinyaml[\"bins\"])}\n", + " kin_df = pd.concat(kin_dict, axis=1, names=[\"index\"]).swaplevel(0,1).T\n", + "kin_df" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "365489c7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namestat_1syst_1nuclear
treatmentADDADDADD
typeUNCORRCORRNUC_DW
index
10.02030.01090.0203
20.02120.01340.0212
30.02050.01120.0205
40.02580.01950.0258
50.01760.01210.0176
............
2560.02350.00340.0235
2570.03300.00330.0330
2580.03730.00260.0373
2590.05130.00290.0513
2600.06450.00340.0645
\n", + "

260 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + "name stat_1 syst_1 nuclear\n", + "treatment ADD ADD ADD\n", + "type UNCORR CORR NUC_DW\n", + "index \n", + "1 0.0203 0.0109 0.0203\n", + "2 0.0212 0.0134 0.0212\n", + "3 0.0205 0.0112 0.0205\n", + "4 0.0258 0.0195 0.0258\n", + "5 0.0176 0.0121 0.0176\n", + "... ... ... ...\n", + "256 0.0235 0.0034 0.0235\n", + "257 0.0330 0.0033 0.0330\n", + "258 0.0373 0.0026 0.0373\n", + "259 0.0513 0.0029 0.0513\n", + "260 0.0645 0.0034 0.0645\n", + "\n", + "[260 rows x 3 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Read the kinematics dataframe\n", + "variant = True\n", + "unc_df = None\n", + "\n", + "def read_uncertainties(unc_file):\n", + " uncyaml = yaml.safe_load(unc_file.read_text())\n", + " \n", + " mindex = pd.MultiIndex.from_tuples([(k, v[\"treatment\"], v[\"type\"]) for k,v in uncyaml[\"definition\"].items()], names=[\"name\", \"treatment\", \"type\"])\n", + " # I'm guessing there will be a better way of doing this than calling dataframe twice for the same thing\n", + " final_df = pd.DataFrame(pd.DataFrame(uncyaml[\"bins\"]).values, columns=mindex, index=range(1,ndata+1))\n", + " final_df.index.name = \"index\"\n", + " return final_df \n", + "\n", + "if True:\n", + " unc_df = read_uncertainties(dataset_path / \"uncertainties.yaml\")\n", + " \n", + " if variant:\n", + " # With a variant\n", + " var_df = read_uncertainties(dataset_path / \"uncertainties_dw.yaml\")\n", + " \n", + " unc_df = pd.concat([unc_df, var_df], axis=1)\n", + " \n", + "unc_df" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d3c39164", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
data
index
10.9815
21.0030
30.9675
41.0330
50.9912
......
2560.6717
2570.7194
2580.6959
2590.7020
2600.7724
\n", + "

260 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " data\n", + "index \n", + "1 0.9815\n", + "2 1.0030\n", + "3 0.9675\n", + "4 1.0330\n", + "5 0.9912\n", + "... ...\n", + "256 0.6717\n", + "257 0.7194\n", + "258 0.6959\n", + "259 0.7020\n", + "260 0.7724\n", + "\n", + "[260 rows x 1 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_df = None\n", + " \n", + "if True:\n", + " data_file = dataset_path / \"data.yaml\"\n", + " datayaml = yaml.safe_load(data_file.read_text(encoding=\"utf-8\"))\n", + " \n", + " data_df = pd.DataFrame(datayaml[\"data_central\"], index=range(1, ndata+1), columns=[\"data\"])\n", + " data_df.index.name = \"index\"\n", + " \n", + "data_df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "nnvortex", + "language": "python", + "name": "nnvortex" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/buildmaster/NMCPD/data.yaml b/buildmaster/NMCPD/data.yaml new file mode 100644 index 0000000000..4831d2f4e6 --- /dev/null +++ b/buildmaster/NMCPD/data.yaml @@ -0,0 +1,261 @@ +data_central: +- 0.9815 +- 1.003 +- 0.9675 +- 1.033 +- 0.9912 +- 1.008 +- 0.9824 +- 0.9825 +- 0.9736 +- 0.9704 +- 0.9921 +- 0.9959 +- 1.005 +- 1.0 +- 1.014 +- 0.9945 +- 0.9795 +- 0.9966 +- 0.9893 +- 0.9959 +- 0.9842 +- 0.9817 +- 1.011 +- 0.9993 +- 1.02 +- 0.9618 +- 0.9775 +- 0.9642 +- 0.9714 +- 0.9891 +- 0.975 +- 0.9837 +- 0.9924 +- 0.9683 +- 1.008 +- 0.953 +- 0.969 +- 0.9872 +- 0.968 +- 0.9624 +- 0.9797 +- 0.9747 +- 0.9738 +- 0.9813 +- 0.9844 +- 0.9734 +- 0.9821 +- 0.9573 +- 0.9747 +- 1.007 +- 0.9939 +- 0.9645 +- 0.9685 +- 0.9834 +- 0.9925 +- 0.9763 +- 0.968 +- 0.9761 +- 0.9716 +- 0.9817 +- 0.9942 +- 0.9493 +- 0.9601 +- 0.9408 +- 0.962 +- 0.9585 +- 0.9631 +- 0.9849 +- 0.9802 +- 0.9677 +- 0.9581 +- 0.979 +- 0.9764 +- 0.9592 +- 0.9893 +- 0.9738 +- 0.9557 +- 0.9264 +- 0.9308 +- 0.9618 +- 0.9723 +- 0.9633 +- 0.9554 +- 0.9572 +- 0.9766 +- 0.9565 +- 0.9611 +- 0.9669 +- 0.9817 +- 0.9686 +- 0.9572 +- 0.9439 +- 0.9101 +- 0.9539 +- 0.9204 +- 0.9738 +- 0.94 +- 0.9532 +- 0.9526 +- 0.9642 +- 0.9597 +- 0.9551 +- 0.9577 +- 0.9682 +- 0.9578 +- 0.9532 +- 0.9698 +- 0.9635 +- 0.9488 +- 0.9595 +- 1.001 +- 0.981 +- 0.971 +- 0.9477 +- 0.9449 +- 0.9486 +- 0.937 +- 0.945 +- 0.9367 +- 0.9394 +- 0.9328 +- 0.9432 +- 0.9371 +- 0.9592 +- 0.9678 +- 0.9351 +- 0.9385 +- 0.9413 +- 0.9313 +- 0.9445 +- 0.936 +- 0.9397 +- 0.942 +- 0.9245 +- 0.9218 +- 0.9254 +- 0.9291 +- 0.9319 +- 0.9554 +- 0.9233 +- 0.9264 +- 0.9005 +- 0.9227 +- 0.915 +- 0.9292 +- 0.9205 +- 0.9114 +- 0.9409 +- 0.9291 +- 0.9266 +- 0.9263 +- 0.9272 +- 0.9123 +- 0.9272 +- 0.905 +- 0.9039 +- 0.914 +- 0.9427 +- 0.9056 +- 0.9223 +- 0.8966 +- 0.9132 +- 0.9242 +- 0.9212 +- 0.9147 +- 0.8981 +- 0.9068 +- 0.9018 +- 0.8924 +- 0.905 +- 0.8453 +- 0.8859 +- 0.8781 +- 0.9173 +- 0.8983 +- 0.8811 +- 0.9134 +- 0.8869 +- 0.8622 +- 0.8676 +- 0.8787 +- 0.862 +- 0.8684 +- 0.8641 +- 0.8715 +- 0.897 +- 0.8552 +- 0.8761 +- 0.8714 +- 0.8702 +- 0.8445 +- 0.8607 +- 0.8464 +- 0.8534 +- 0.8549 +- 0.8617 +- 0.8651 +- 0.867 +- 0.8343 +- 0.8218 +- 0.8219 +- 0.8637 +- 0.8542 +- 0.8505 +- 0.8302 +- 0.8377 +- 0.8202 +- 0.8459 +- 0.8269 +- 0.8334 +- 0.832 +- 0.8444 +- 0.8104 +- 0.8027 +- 0.8205 +- 0.7953 +- 0.8332 +- 0.7939 +- 0.8222 +- 0.8188 +- 0.7828 +- 0.792 +- 0.8055 +- 0.8197 +- 0.762 +- 0.7732 +- 0.7614 +- 0.7771 +- 0.7608 +- 0.7698 +- 0.7793 +- 0.7754 +- 0.7626 +- 0.7529 +- 0.7705 +- 0.7474 +- 0.7575 +- 0.7632 +- 0.7254 +- 0.7209 +- 0.7323 +- 0.7442 +- 0.728 +- 0.7345 +- 0.7419 +- 0.7263 +- 0.7281 +- 0.7641 +- 0.6626 +- 0.7622 +- 0.6989 +- 0.7365 +- 0.7418 +- 0.7988 +- 0.7357 +- 0.6717 +- 0.7194 +- 0.6959 +- 0.702 +- 0.7724 diff --git a/buildmaster/NMCPD/filter.py b/buildmaster/NMCPD/filter.py new file mode 100644 index 0000000000..87293497bb --- /dev/null +++ b/buildmaster/NMCPD/filter.py @@ -0,0 +1,69 @@ +#Filter for NMCPD + +import sys +import yaml + +def filter_NMCPD(): + with open('metadata.yaml', 'r') as file: + metadata = yaml.safe_load(file) + + version = metadata['hepdata']['version'] + tables = metadata['hepdata']['tables'] + + data_central = [] + kin = [] + error = [] + error_nuc = [] + + for i in tables: + hepdata_tables="rawdata/HEPData-ins426595-v"+str(version)+"-Table_"+str(i)+".yaml" + with open(hepdata_tables, 'r') as file: + input = yaml.safe_load(file) + + values = input['dependent_variables'][0]['values'] + x = float(input['dependent_variables'][0]['qualifiers'][4]['value']) + sqrts = float(input['dependent_variables'][0]['qualifiers'][3]['value']) + + for j in range(len(values)): + + data_central_value = input['dependent_variables'][0]['values'][j]['value'] + data_central.append(data_central_value) + Q2 = input['independent_variables'][0]['values'][j]['value'] + y = Q2 / ( sqrts * sqrts * x ) + kin_value = {'x' : {'min': None, 'mid': x , 'max': None}, 'q2' : {'min': None, 'mid': Q2 , 'max': None} , 'y' : {'min': None, 'mid': y , 'max': None}} + kin.append(kin_value) + + error_value = {'stat_1': input['dependent_variables'][0]['values'][j]['errors'][0]['symerror'], 'syst_1': input['dependent_variables'][0]['values'][j]['errors'][1]['symerror']} + error.append(error_value) + + error_value_nuc = {'nuclear': input['dependent_variables'][0]['values'][j]['errors'][0]['symerror']} + error_nuc.append(error_value_nuc) + + error_definition = {'stat_1': {'description': "total statistical uncertainty", 'treatment': "ADD", 'type': "UNCORR"}, + 'syst_1': {'description': "total systematic uncertainty", 'treatment': "ADD", 'type': "CORR"}} + + error_definition_dw = {'nuclear': {'description': "nuclear uncertainty (deweighted)", 'treatment': "ADD", 'type': "NUC_DW"}} + error_definition_sh = {'nuclear': {'description': "nuclear uncertainty (shifted)", 'treatment': "ADD", 'type': "NUC_SH"}} + + data_central_yaml = { 'data_central' : data_central } + kinematics_yaml = { 'bins' : kin } + uncertainties_yaml = { 'definition': error_definition, 'bins' : error } + uncertainties_dw_yaml = { 'definition': error_definition_dw, 'bins' : error_nuc } + uncertainties_sh_yaml = { 'definition': error_definition_sh, 'bins' : error_nuc } + + with open('data.yaml', 'w') as file: + yaml.dump(data_central_yaml, file, sort_keys=False) + + with open('kinematics.yaml', 'w') as file: + yaml.dump(kinematics_yaml, file, sort_keys=False) + + with open('uncertainties.yaml', 'w') as file: + yaml.dump(uncertainties_yaml, file, sort_keys=False) + + with open('uncertainties_dw.yaml', 'w') as file: + yaml.dump(uncertainties_dw_yaml, file, sort_keys=False) + + with open('uncertainties_sh.yaml', 'w') as file: + yaml.dump(uncertainties_sh_yaml, file, sort_keys=False) + +filter_NMCPD() diff --git a/buildmaster/NMCPD/kinematics.yaml b/buildmaster/NMCPD/kinematics.yaml new file mode 100644 index 0000000000..fbb8b2c22e --- /dev/null +++ b/buildmaster/NMCPD/kinematics.yaml @@ -0,0 +1,3121 @@ +bins: +- x: + min: null + mid: 0.0015 + max: null + q2: + min: null + mid: 0.16 + max: null + y: + min: null + mid: 0.12085166998255134 + max: null +- x: + min: null + mid: 0.0015 + max: null + q2: + min: null + mid: 0.25 + max: null + y: + min: null + mid: 0.18883073434773648 + max: null +- x: + min: null + mid: 0.0015 + max: null + q2: + min: null + mid: 0.35 + max: null + y: + min: null + mid: 0.26436302808683104 + max: null +- x: + min: null + mid: 0.0015 + max: null + q2: + min: null + mid: 0.45 + max: null + y: + min: null + mid: 0.3398953218259257 + max: null +- x: + min: null + mid: 0.0015 + max: null + q2: + min: null + mid: 0.6 + max: null + y: + min: null + mid: 0.45319376243456755 + max: null +- x: + min: null + mid: 0.003 + max: null + q2: + min: null + mid: 0.17 + max: null + y: + min: null + mid: 0.06420244967823041 + max: null +- x: + min: null + mid: 0.003 + max: null + q2: + min: null + mid: 0.25 + max: null + y: + min: null + mid: 0.09441536717386824 + max: null +- x: + min: null + mid: 0.003 + max: null + q2: + min: null + mid: 0.35 + max: null + y: + min: null + mid: 0.13218151404341552 + max: null +- x: + min: null + mid: 0.003 + max: null + q2: + min: null + mid: 0.45 + max: null + y: + min: null + mid: 0.16994766091296284 + max: null +- x: + min: null + mid: 0.003 + max: null + q2: + min: null + mid: 0.63 + max: null + y: + min: null + mid: 0.23792672527814795 + max: null +- x: + min: null + mid: 0.003 + max: null + q2: + min: null + mid: 0.88 + max: null + y: + min: null + mid: 0.3323420924520162 + max: null +- x: + min: null + mid: 0.003 + max: null + q2: + min: null + mid: 1.12 + max: null + y: + min: null + mid: 0.42298084493892973 + max: null +- x: + min: null + mid: 0.005 + max: null + q2: + min: null + mid: 0.16 + max: null + y: + min: null + mid: 0.036255500994765405 + max: null +- x: + min: null + mid: 0.005 + max: null + q2: + min: null + mid: 0.25 + max: null + y: + min: null + mid: 0.056649220304320944 + max: null +- x: + min: null + mid: 0.005 + max: null + q2: + min: null + mid: 0.35 + max: null + y: + min: null + mid: 0.07930890842604932 + max: null +- x: + min: null + mid: 0.005 + max: null + q2: + min: null + mid: 0.45 + max: null + y: + min: null + mid: 0.1019685965477777 + max: null +- x: + min: null + mid: 0.005 + max: null + q2: + min: null + mid: 0.61 + max: null + y: + min: null + mid: 0.1382240975425431 + max: null +- x: + min: null + mid: 0.005 + max: null + q2: + min: null + mid: 0.88 + max: null + y: + min: null + mid: 0.1994052554712097 + max: null +- x: + min: null + mid: 0.005 + max: null + q2: + min: null + mid: 1.13 + max: null + y: + min: null + mid: 0.25605447577553064 + max: null +- x: + min: null + mid: 0.005 + max: null + q2: + min: null + mid: 1.38 + max: null + y: + min: null + mid: 0.3127036960798516 + max: null +- x: + min: null + mid: 0.005 + max: null + q2: + min: null + mid: 1.71 + max: null + y: + min: null + mid: 0.38748066688155525 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 0.16 + max: null + y: + min: null + mid: 0.022659688121728378 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 0.25 + max: null + y: + min: null + mid: 0.03540576269020059 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 0.35 + max: null + y: + min: null + mid: 0.049568067766280824 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 0.45 + max: null + y: + min: null + mid: 0.06373037284236106 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 0.64 + max: null + y: + min: null + mid: 0.09063875248691351 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 0.86 + max: null + y: + min: null + mid: 0.12179582365429004 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 1.12 + max: null + y: + min: null + mid: 0.15861781685209866 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 1.37 + max: null + y: + min: null + mid: 0.19402357954229926 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 1.75 + max: null + y: + min: null + mid: 0.24784033883140413 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 2.24 + max: null + y: + min: null + mid: 0.31723563370419733 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 2.73 + max: null + y: + min: null + mid: 0.38663092857699044 + max: null +- x: + min: null + mid: 0.008 + max: null + q2: + min: null + mid: 3.46 + max: null + y: + min: null + mid: 0.4900157556323762 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 0.16 + max: null + y: + min: null + mid: 0.014502200397906163 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 0.26 + max: null + y: + min: null + mid: 0.023566075646597514 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 0.35 + max: null + y: + min: null + mid: 0.031723563370419726 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 0.45 + max: null + y: + min: null + mid: 0.040787438619111084 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 0.62 + max: null + y: + min: null + mid: 0.05619602654188638 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 0.88 + max: null + y: + min: null + mid: 0.0797621021884839 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 1.12 + max: null + y: + min: null + mid: 0.10151540278534314 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 1.37 + max: null + y: + min: null + mid: 0.12417509090707152 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 1.74 + max: null + y: + min: null + mid: 0.1577114293272295 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 2.23 + max: null + y: + min: null + mid: 0.20212441804581713 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 2.74 + max: null + y: + min: null + mid: 0.24835018181414303 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 3.46 + max: null + y: + min: null + mid: 0.31361008360472076 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 4.47 + max: null + y: + min: null + mid: 0.40515522361650336 + max: null +- x: + min: null + mid: 0.0125 + max: null + q2: + min: null + mid: 5.41 + max: null + y: + min: null + mid: 0.4903556509542021 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 0.25 + max: null + y: + min: null + mid: 0.01618549151552027 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 0.35 + max: null + y: + min: null + mid: 0.022659688121728375 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 0.45 + max: null + y: + min: null + mid: 0.029133884727936488 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 0.62 + max: null + y: + min: null + mid: 0.040140018958490266 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 0.88 + max: null + y: + min: null + mid: 0.05697293013463135 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 1.12 + max: null + y: + min: null + mid: 0.07251100198953081 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 1.37 + max: null + y: + min: null + mid: 0.08869649350505109 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 1.75 + max: null + y: + min: null + mid: 0.11329844060864189 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 2.24 + max: null + y: + min: null + mid: 0.14502200397906162 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 2.73 + max: null + y: + min: null + mid: 0.17674556734948135 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 3.48 + max: null + y: + min: null + mid: 0.22530204189604217 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 4.47 + max: null + y: + min: null + mid: 0.2893965882975024 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 5.49 + max: null + y: + min: null + mid: 0.35543339368082516 + max: null +- x: + min: null + mid: 0.0175 + max: null + q2: + min: null + mid: 6.83 + max: null + y: + min: null + mid: 0.44218762820401375 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 0.26 + max: null + y: + min: null + mid: 0.011783037823298757 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 0.35 + max: null + y: + min: null + mid: 0.015861781685209863 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 0.45 + max: null + y: + min: null + mid: 0.020393719309555542 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 0.62 + max: null + y: + min: null + mid: 0.02809801327094319 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 0.86 + max: null + y: + min: null + mid: 0.038974663569372806 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 1.13 + max: null + y: + min: null + mid: 0.05121089515510613 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 1.37 + max: null + y: + min: null + mid: 0.06208754545353576 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 1.74 + max: null + y: + min: null + mid: 0.07885571466361475 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 2.24 + max: null + y: + min: null + mid: 0.10151540278534314 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 2.74 + max: null + y: + min: null + mid: 0.12417509090707152 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 3.45 + max: null + y: + min: null + mid: 0.1563518480399258 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 4.47 + max: null + y: + min: null + mid: 0.20257761180825168 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 5.48 + max: null + y: + min: null + mid: 0.24835018181414303 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 6.92 + max: null + y: + min: null + mid: 0.31361008360472076 + max: null +- x: + min: null + mid: 0.025 + max: null + q2: + min: null + mid: 8.92 + max: null + y: + min: null + mid: 0.40424883609163426 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 0.36 + max: null + y: + min: null + mid: 0.011653553891174593 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 0.45 + max: null + y: + min: null + mid: 0.014566942363968244 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 0.64 + max: null + y: + min: null + mid: 0.020717429139865944 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 0.86 + max: null + y: + min: null + mid: 0.027839045406694865 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 1.13 + max: null + y: + min: null + mid: 0.03657921082507581 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 1.38 + max: null + y: + min: null + mid: 0.04467195658283594 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 1.74 + max: null + y: + min: null + mid: 0.05632551047401054 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 2.24 + max: null + y: + min: null + mid: 0.07251100198953081 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 2.74 + max: null + y: + min: null + mid: 0.08869649350505109 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 3.46 + max: null + y: + min: null + mid: 0.11200360128740026 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 4.45 + max: null + y: + min: null + mid: 0.14405087448813042 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 5.47 + max: null + y: + min: null + mid: 0.17706927717979173 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 6.92 + max: null + y: + min: null + mid: 0.22400720257480053 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 8.96 + max: null + y: + min: null + mid: 0.29004400795812324 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 11.45 + max: null + y: + min: null + mid: 0.37064775570541414 + max: null +- x: + min: null + mid: 0.035 + max: null + q2: + min: null + mid: 14.36 + max: null + y: + min: null + mid: 0.4648473163257421 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 0.46 + max: null + y: + min: null + mid: 0.010423456535995055 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 0.61 + max: null + y: + min: null + mid: 0.01382240975425431 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 0.88 + max: null + y: + min: null + mid: 0.019940525547120974 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 1.13 + max: null + y: + min: null + mid: 0.025605447577553064 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 1.37 + max: null + y: + min: null + mid: 0.03104377272676788 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 1.74 + max: null + y: + min: null + mid: 0.03942785733180738 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 2.25 + max: null + y: + min: null + mid: 0.050984298273888846 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 2.74 + max: null + y: + min: null + mid: 0.06208754545353576 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 3.46 + max: null + y: + min: null + mid: 0.07840252090118019 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 4.46 + max: null + y: + min: null + mid: 0.10106220902290856 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 5.46 + max: null + y: + min: null + mid: 0.12372189714463694 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 6.9 + max: null + y: + min: null + mid: 0.1563518480399258 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 8.93 + max: null + y: + min: null + mid: 0.20235101492703442 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 11.44 + max: null + y: + min: null + mid: 0.25922683211257264 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 14.82 + max: null + y: + min: null + mid: 0.33581657796401454 + max: null +- x: + min: null + mid: 0.05 + max: null + q2: + min: null + mid: 19.19 + max: null + y: + min: null + mid: 0.43483941505596757 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 0.68 + max: null + y: + min: null + mid: 0.011006134230553783 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 0.86 + max: null + y: + min: null + mid: 0.013919522703347433 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 1.11 + max: null + y: + min: null + mid: 0.0179658955822275 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 1.38 + max: null + y: + min: null + mid: 0.02233597829141797 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 1.74 + max: null + y: + min: null + mid: 0.02816275523700527 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 2.24 + max: null + y: + min: null + mid: 0.036255500994765405 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 2.75 + max: null + y: + min: null + mid: 0.04451010166768074 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 3.47 + max: null + y: + min: null + mid: 0.05616365555885534 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 4.47 + max: null + y: + min: null + mid: 0.0723491470743756 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 5.47 + max: null + y: + min: null + mid: 0.08853463858989587 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 6.91 + max: null + y: + min: null + mid: 0.11184174637224506 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 8.91 + max: null + y: + min: null + mid: 0.1442127294032856 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 11.4 + max: null + y: + min: null + mid: 0.1845146032769311 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 14.89 + max: null + y: + min: null + mid: 0.24100196866609683 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 19.63 + max: null + y: + min: null + mid: 0.3177211984496629 + max: null +- x: + min: null + mid: 0.07 + max: null + q2: + min: null + mid: 26.07 + max: null + y: + min: null + mid: 0.4219557638096134 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 0.9 + max: null + y: + min: null + mid: 0.01132984406086419 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 1.11 + max: null + y: + min: null + mid: 0.013973474341732503 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 1.38 + max: null + y: + min: null + mid: 0.017372427559991757 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 1.76 + max: null + y: + min: null + mid: 0.022156139496801085 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 2.24 + max: null + y: + min: null + mid: 0.028198722995928655 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 2.75 + max: null + y: + min: null + mid: 0.0346189679637517 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 3.49 + max: null + y: + min: null + mid: 0.0439346175249067 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 4.47 + max: null + y: + min: null + mid: 0.05627155883562548 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 5.46 + max: null + y: + min: null + mid: 0.0687343873025761 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 6.91 + max: null + y: + min: null + mid: 0.08698802495619062 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 8.92 + max: null + y: + min: null + mid: 0.11229134335878731 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 11.37 + max: null + y: + min: null + mid: 0.14313369663558426 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 14.87 + max: null + y: + min: null + mid: 0.1871942013167228 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 19.74 + max: null + y: + min: null + mid: 0.24850124640162125 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 26.36 + max: null + y: + min: null + mid: 0.33183854382708894 + max: null +- x: + min: null + mid: 0.09 + max: null + q2: + min: null + mid: 34.74 + max: null + y: + min: null + mid: 0.4373319807493578 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 1.13 + max: null + y: + min: null + mid: 0.011638839807978666 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 1.38 + max: null + y: + min: null + mid: 0.014213804367265982 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 1.75 + max: null + y: + min: null + mid: 0.01802475191501121 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 2.24 + max: null + y: + min: null + mid: 0.02307168245121435 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 2.74 + max: null + y: + min: null + mid: 0.02822161156978898 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 3.49 + max: null + y: + min: null + mid: 0.03594650524765093 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 4.47 + max: null + y: + min: null + mid: 0.0460403663200572 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 5.46 + max: null + y: + min: null + mid: 0.05623722597483497 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 6.9 + max: null + y: + min: null + mid: 0.07106902183632992 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 8.92 + max: null + y: + min: null + mid: 0.09187473547537142 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 11.37 + max: null + y: + min: null + mid: 0.1171093881563871 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 14.85 + max: null + y: + min: null + mid: 0.15295289482166655 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 19.74 + max: null + y: + min: null + mid: 0.20331920160132644 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 26.52 + max: null + y: + min: null + mid: 0.27315224044919845 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 35.32 + max: null + y: + min: null + mid: 0.36379099293611195 + max: null +- x: + min: null + mid: 0.11 + max: null + q2: + min: null + mid: 44.94 + max: null + y: + min: null + mid: 0.4628756291774878 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 1.4 + max: null + y: + min: null + mid: 0.011329844060864187 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 1.75 + max: null + y: + min: null + mid: 0.014162305076080236 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 2.24 + max: null + y: + min: null + mid: 0.018127750497382702 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 2.74 + max: null + y: + min: null + mid: 0.02217412337626277 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 3.47 + max: null + y: + min: null + mid: 0.02808182777942767 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 4.48 + max: null + y: + min: null + mid: 0.036255500994765405 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 5.47 + max: null + y: + min: null + mid: 0.044267319294947934 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 6.9 + max: null + y: + min: null + mid: 0.055839945728544935 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 8.92 + max: null + y: + min: null + mid: 0.0721872921592204 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 11.37 + max: null + y: + min: null + mid: 0.09201451926573273 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 14.84 + max: null + y: + min: null + mid: 0.1200963470451604 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 19.76 + max: null + y: + min: null + mid: 0.15991265617334027 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 26.55 + max: null + y: + min: null + mid: 0.2148623998685316 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 35.28 + max: null + y: + min: null + mid: 0.28551207033377757 + max: null +- x: + min: null + mid: 0.14 + max: null + q2: + min: null + mid: 46.95 + max: null + y: + min: null + mid: 0.3799544133268384 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 1.82 + max: null + y: + min: null + mid: 0.011455731217096015 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 2.24 + max: null + y: + min: null + mid: 0.014099361497964327 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 2.75 + max: null + y: + min: null + mid: 0.01730948398187585 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 3.47 + max: null + y: + min: null + mid: 0.021841421606221524 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 4.47 + max: null + y: + min: null + mid: 0.02813577941781274 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 5.49 + max: null + y: + min: null + mid: 0.034556024385635785 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 6.92 + max: null + y: + min: null + mid: 0.043556956056211224 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 8.93 + max: null + y: + min: null + mid: 0.056208615257509566 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 11.37 + max: null + y: + min: null + mid: 0.07156684831779213 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 14.85 + max: null + y: + min: null + mid: 0.09347121350212957 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 19.75 + max: null + y: + min: null + mid: 0.12431356677892653 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 26.61 + max: null + y: + min: null + mid: 0.16749286136644229 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 35.37 + max: null + y: + min: null + mid: 0.22263143579598133 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 47.01 + max: null + y: + min: null + mid: 0.2958977607229031 + max: null +- x: + min: null + mid: 0.18 + max: null + q2: + min: null + mid: 63.04 + max: null + y: + min: null + mid: 0.39679631644271035 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 2.28 + max: null + y: + min: null + mid: 0.011480908648342378 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 2.74 + max: null + y: + min: null + mid: 0.013797232323007946 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 3.48 + max: null + y: + min: null + mid: 0.017523492147469948 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 4.47 + max: null + y: + min: null + mid: 0.022508623534250188 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 5.47 + max: null + y: + min: null + mid: 0.02754410978352316 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 6.97 + max: null + y: + min: null + mid: 0.03509733915743262 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 8.93 + max: null + y: + min: null + mid: 0.04496689220600765 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 11.38 + max: null + y: + min: null + mid: 0.05730383351672644 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 14.85 + max: null + y: + min: null + mid: 0.07477697080170365 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 19.74 + max: null + y: + min: null + mid: 0.09940049856064848 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 26.64 + max: null + y: + min: null + mid: 0.134145353680632 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 35.42 + max: null + y: + min: null + mid: 0.1783569229492487 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 46.95 + max: null + y: + min: null + mid: 0.2364160794033661 + max: null +- x: + min: null + mid: 0.225 + max: null + q2: + min: null + mid: 63.23 + max: null + y: + min: null + mid: 0.3183937955415301 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 2.78 + max: null + y: + min: null + mid: 0.011453442359709978 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 3.46 + max: null + y: + min: null + mid: 0.014255003800214579 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 4.47 + max: null + y: + min: null + mid: 0.01841614652802288 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 5.47 + max: null + y: + min: null + mid: 0.022536089822882584 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 6.89 + max: null + y: + min: null + mid: 0.028386409301583364 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 8.94 + max: null + y: + min: null + mid: 0.03683229305604576 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 11.37 + max: null + y: + min: null + mid: 0.04684375526255484 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 14.87 + max: null + y: + min: null + mid: 0.06126355679456381 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 19.74 + max: null + y: + min: null + mid: 0.08132768064053057 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 26.6 + max: null + y: + min: null + mid: 0.10959049164326816 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 35.43 + max: null + y: + min: null + mid: 0.14596959093687933 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 46.98 + max: null + y: + min: null + mid: 0.19355493599250892 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 63.48 + max: null + y: + min: null + mid: 0.26153400035769403 + max: null +- x: + min: null + mid: 0.275 + max: null + q2: + min: null + mid: 90.68 + max: null + y: + min: null + mid: 0.37359645797787805 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 3.57 + max: null + y: + min: null + mid: 0.011556440942081473 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 4.51 + max: null + y: + min: null + mid: 0.014599313346999284 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 5.48 + max: null + y: + min: null + mid: 0.01773929870101022 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 6.9 + max: null + y: + min: null + mid: 0.022335978291417976 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 8.91 + max: null + y: + min: null + mid: 0.028842545880657124 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 11.43 + max: null + y: + min: null + mid: 0.03700003360447934 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 14.85 + max: null + y: + min: null + mid: 0.048070909801095206 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 19.74 + max: null + y: + min: null + mid: 0.06390032050327403 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 26.63 + max: null + y: + min: null + mid: 0.08620392781166096 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 35.45 + max: null + y: + min: null + mid: 0.11475513484503874 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 47.12 + max: null + y: + min: null + mid: 0.15253207204226304 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 63.52 + max: null + y: + min: null + mid: 0.20562048421316956 + max: null +- x: + min: null + mid: 0.35 + max: null + q2: + min: null + mid: 96.35 + max: null + y: + min: null + mid: 0.31189442150407565 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 4.54 + max: null + y: + min: null + mid: 0.011430553785849649 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 5.47 + max: null + y: + min: null + mid: 0.01377205489176158 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 6.93 + max: null + y: + min: null + mid: 0.017447959853730852 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 8.92 + max: null + y: + min: null + mid: 0.02245826867175746 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 11.34 + max: null + y: + min: null + mid: 0.028551207033377757 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 14.89 + max: null + y: + min: null + mid: 0.03748919512583729 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 19.77 + max: null + y: + min: null + mid: 0.04977578157406334 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 26.64 + max: null + y: + min: null + mid: 0.067072676840316 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 35.5 + max: null + y: + min: null + mid: 0.08937988092459527 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 47.26 + max: null + y: + min: null + mid: 0.11898854007032035 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 63.65 + max: null + y: + min: null + mid: 0.16025434988311235 + max: null +- x: + min: null + mid: 0.45 + max: null + q2: + min: null + mid: 98.05 + max: null + y: + min: null + mid: 0.2468647133706075 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 5.53 + max: null + y: + min: null + mid: 0.011391643210287085 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 6.88 + max: null + y: + min: null + mid: 0.014172604934317384 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 8.91 + max: null + y: + min: null + mid: 0.018354347378599985 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 11.34 + max: null + y: + min: null + mid: 0.023360078481854528 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 14.85 + max: null + y: + min: null + mid: 0.030590578964333308 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 19.74 + max: null + y: + min: null + mid: 0.040663840320265286 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 26.64 + max: null + y: + min: null + mid: 0.05487764468753127 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 35.57 + max: null + y: + min: null + mid: 0.07327319149907985 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 47.16 + max: null + y: + min: null + mid: 0.09714826289279184 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 63.56 + max: null + y: + min: null + mid: 0.13093179791064144 + max: null +- x: + min: null + mid: 0.55 + max: null + q2: + min: null + mid: 98.82 + max: null + y: + min: null + mid: 0.203566398199018 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 7.04 + max: null + y: + min: null + mid: 0.011816607731627243 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 8.88 + max: null + y: + min: null + mid: 0.014905039297848002 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 11.36 + max: null + y: + min: null + mid: 0.019067707930580324 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 14.85 + max: null + y: + min: null + mid: 0.024925656933901214 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 19.79 + max: null + y: + min: null + mid: 0.03321742429103738 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 26.49 + max: null + y: + min: null + mid: 0.044463343581080346 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 35.4 + max: null + y: + min: null + mid: 0.05941873774142108 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 47.03 + max: null + y: + min: null + mid: 0.07893963943443598 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 63.53 + max: null + y: + min: null + mid: 0.10663481380543732 + max: null +- x: + min: null + mid: 0.675 + max: null + q2: + min: null + mid: 99.03 + max: null + y: + min: null + mid: 0.16622140108850084 + max: null diff --git a/buildmaster/NMCPD/metadata.yaml b/buildmaster/NMCPD/metadata.yaml new file mode 100644 index 0000000000..cdd23273ea --- /dev/null +++ b/buildmaster/NMCPD/metadata.yaml @@ -0,0 +1,60 @@ +# Generalia +setname: "NMCPD" +ndata: 260 +observable: {description: "Ratio of deuterium to proton structure function F2", label:"$F_2^d/F_2^p(x,Q^2)$", units: "" } +kinematics: + variables: + q2: {description: "Parton momentum transfer", label: "$Q^2$", units: "GeV²"} + x: {description: "Bjorken x", label: '$x$', units: ""} + y: {description: "Inelasticity", units: ""} + file: kinematics.yaml + +version: 0 +version_comment: "Initial implementation" + +# References +arXiv: + url: "https://arxiv.org/abs/hep-ex/9611022" +iNSPIRE: + url: "https://inspirehep.net/literature/424154" +hepdata: + url: "https://www.hepdata.net/record/ins426595" + version: 1 + tables: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] + +# Data +data_central: data.yaml +data_uncertainties: + - uncertainties.yaml + +# Data (variants) +variants: + deweighted: + data_uncertainties: + - uncertainties.yaml + - uncertainties_dw.yaml + shifted: + data_uncertainties: + - uncertainties.yaml + - uncertainties_sh.yaml + +# Plotting +kinematic_coverage: + x: x + q2: q2 +dataset_label: "NMC $d/p$" +plot_x: x +figure_by: + - q2 + +# Theory +theory: + FK_tables: + - - NMCPD_D1 + - NMCPD_D2 + - - NMCPD_P + operation: "RATIO" + +nnpdf_metadata: + nnpdf31_process: "DIS NC" + experiment: "NMC" diff --git a/buildmaster/NMCPD/uncertainties.yaml b/buildmaster/NMCPD/uncertainties.yaml new file mode 100644 index 0000000000..9e23417c8b --- /dev/null +++ b/buildmaster/NMCPD/uncertainties.yaml @@ -0,0 +1,530 @@ +definition: + stat_1: + description: total statistical uncertainty + treatment: ADD + type: UNCORR + syst_1: + description: total systematic uncertainty + treatment: ADD + type: CORR +bins: +- stat_1: 0.0203 + syst_1: 0.0109 +- stat_1: 0.0212 + syst_1: 0.0134 +- stat_1: 0.0205 + syst_1: 0.0112 +- stat_1: 0.0258 + syst_1: 0.0195 +- stat_1: 0.0176 + syst_1: 0.0121 +- stat_1: 0.0277 + syst_1: 0.007 +- stat_1: 0.0171 + syst_1: 0.0047 +- stat_1: 0.0137 + syst_1: 0.0113 +- stat_1: 0.0129 + syst_1: 0.0099 +- stat_1: 0.0118 + syst_1: 0.0057 +- stat_1: 0.0108 + syst_1: 0.0073 +- stat_1: 0.0116 + syst_1: 0.0078 +- stat_1: 0.0615 + syst_1: 0.003 +- stat_1: 0.025 + syst_1: 0.0037 +- stat_1: 0.0208 + syst_1: 0.0043 +- stat_1: 0.0172 + syst_1: 0.0046 +- stat_1: 0.0092 + syst_1: 0.0094 +- stat_1: 0.0157 + syst_1: 0.0032 +- stat_1: 0.0137 + syst_1: 0.0033 +- stat_1: 0.0128 + syst_1: 0.0032 +- stat_1: 0.0098 + syst_1: 0.0048 +- stat_1: 0.0547 + syst_1: 0.0041 +- stat_1: 0.025 + syst_1: 0.003 +- stat_1: 0.0213 + syst_1: 0.0028 +- stat_1: 0.018 + syst_1: 0.0035 +- stat_1: 0.0091 + syst_1: 0.0036 +- stat_1: 0.0083 + syst_1: 0.0051 +- stat_1: 0.0088 + syst_1: 0.0054 +- stat_1: 0.01 + syst_1: 0.0045 +- stat_1: 0.0083 + syst_1: 0.002 +- stat_1: 0.0086 + syst_1: 0.0023 +- stat_1: 0.0097 + syst_1: 0.0042 +- stat_1: 0.0122 + syst_1: 0.0084 +- stat_1: 0.0543 + syst_1: 0.0065 +- stat_1: 0.032 + syst_1: 0.0034 +- stat_1: 0.0233 + syst_1: 0.0026 +- stat_1: 0.0205 + syst_1: 0.0022 +- stat_1: 0.0127 + syst_1: 0.0023 +- stat_1: 0.0108 + syst_1: 0.0025 +- stat_1: 0.0092 + syst_1: 0.0035 +- stat_1: 0.0098 + syst_1: 0.0035 +- stat_1: 0.0072 + syst_1: 0.003 +- stat_1: 0.0085 + syst_1: 0.0041 +- stat_1: 0.0103 + syst_1: 0.0016 +- stat_1: 0.0087 + syst_1: 0.0022 +- stat_1: 0.0095 + syst_1: 0.0043 +- stat_1: 0.0134 + syst_1: 0.0058 +- stat_1: 0.0402 + syst_1: 0.0064 +- stat_1: 0.0301 + syst_1: 0.0033 +- stat_1: 0.0268 + syst_1: 0.0028 +- stat_1: 0.0161 + syst_1: 0.0025 +- stat_1: 0.0155 + syst_1: 0.0021 +- stat_1: 0.0129 + syst_1: 0.0026 +- stat_1: 0.0119 + syst_1: 0.0026 +- stat_1: 0.0084 + syst_1: 0.0025 +- stat_1: 0.0087 + syst_1: 0.0022 +- stat_1: 0.0098 + syst_1: 0.002 +- stat_1: 0.0092 + syst_1: 0.0018 +- stat_1: 0.01 + syst_1: 0.0028 +- stat_1: 0.0143 + syst_1: 0.0027 +- stat_1: 0.0107 + syst_1: 0.004 +- stat_1: 0.0375 + syst_1: 0.0063 +- stat_1: 0.0287 + syst_1: 0.0064 +- stat_1: 0.0313 + syst_1: 0.0037 +- stat_1: 0.0131 + syst_1: 0.0022 +- stat_1: 0.0154 + syst_1: 0.002 +- stat_1: 0.0124 + syst_1: 0.0023 +- stat_1: 0.0107 + syst_1: 0.0027 +- stat_1: 0.0076 + syst_1: 0.0023 +- stat_1: 0.0071 + syst_1: 0.002 +- stat_1: 0.0074 + syst_1: 0.0018 +- stat_1: 0.0065 + syst_1: 0.0023 +- stat_1: 0.0085 + syst_1: 0.0017 +- stat_1: 0.0097 + syst_1: 0.0017 +- stat_1: 0.0085 + syst_1: 0.0032 +- stat_1: 0.01 + syst_1: 0.0043 +- stat_1: 0.0375 + syst_1: 0.0064 +- stat_1: 0.034 + syst_1: 0.0061 +- stat_1: 0.0207 + syst_1: 0.003 +- stat_1: 0.0179 + syst_1: 0.0023 +- stat_1: 0.0183 + syst_1: 0.0023 +- stat_1: 0.0138 + syst_1: 0.0025 +- stat_1: 0.0089 + syst_1: 0.0024 +- stat_1: 0.0087 + syst_1: 0.0022 +- stat_1: 0.009 + syst_1: 0.0019 +- stat_1: 0.0069 + syst_1: 0.0021 +- stat_1: 0.0088 + syst_1: 0.0016 +- stat_1: 0.0111 + syst_1: 0.0018 +- stat_1: 0.0101 + syst_1: 0.0018 +- stat_1: 0.0115 + syst_1: 0.0021 +- stat_1: 0.0107 + syst_1: 0.0015 +- stat_1: 0.0144 + syst_1: 0.0031 +- stat_1: 0.0412 + syst_1: 0.006 +- stat_1: 0.0214 + syst_1: 0.0063 +- stat_1: 0.0213 + syst_1: 0.0029 +- stat_1: 0.0167 + syst_1: 0.0025 +- stat_1: 0.0138 + syst_1: 0.0025 +- stat_1: 0.0092 + syst_1: 0.0025 +- stat_1: 0.0077 + syst_1: 0.0023 +- stat_1: 0.0077 + syst_1: 0.002 +- stat_1: 0.0058 + syst_1: 0.0017 +- stat_1: 0.0069 + syst_1: 0.0015 +- stat_1: 0.0085 + syst_1: 0.0015 +- stat_1: 0.0076 + syst_1: 0.0015 +- stat_1: 0.0097 + syst_1: 0.0018 +- stat_1: 0.0087 + syst_1: 0.0014 +- stat_1: 0.009 + syst_1: 0.0015 +- stat_1: 0.0119 + syst_1: 0.0022 +- stat_1: 0.0438 + syst_1: 0.0063 +- stat_1: 0.0344 + syst_1: 0.0063 +- stat_1: 0.0542 + syst_1: 0.0068 +- stat_1: 0.0197 + syst_1: 0.0028 +- stat_1: 0.0117 + syst_1: 0.0027 +- stat_1: 0.0111 + syst_1: 0.0023 +- stat_1: 0.0096 + syst_1: 0.0023 +- stat_1: 0.0069 + syst_1: 0.0019 +- stat_1: 0.0079 + syst_1: 0.0016 +- stat_1: 0.0095 + syst_1: 0.0014 +- stat_1: 0.0082 + syst_1: 0.0015 +- stat_1: 0.0105 + syst_1: 0.0015 +- stat_1: 0.0105 + syst_1: 0.0018 +- stat_1: 0.0103 + syst_1: 0.0014 +- stat_1: 0.0103 + syst_1: 0.0013 +- stat_1: 0.0157 + syst_1: 0.0018 +- stat_1: 0.054 + syst_1: 0.0065 +- stat_1: 0.0537 + syst_1: 0.0062 +- stat_1: 0.0281 + syst_1: 0.0032 +- stat_1: 0.014 + syst_1: 0.0028 +- stat_1: 0.0136 + syst_1: 0.0025 +- stat_1: 0.0124 + syst_1: 0.0024 +- stat_1: 0.0082 + syst_1: 0.0021 +- stat_1: 0.0089 + syst_1: 0.0018 +- stat_1: 0.0106 + syst_1: 0.0016 +- stat_1: 0.0092 + syst_1: 0.0016 +- stat_1: 0.0114 + syst_1: 0.0014 +- stat_1: 0.0115 + syst_1: 0.0017 +- stat_1: 0.0116 + syst_1: 0.0014 +- stat_1: 0.0114 + syst_1: 0.0013 +- stat_1: 0.0147 + syst_1: 0.0012 +- stat_1: 0.0222 + syst_1: 0.0017 +- stat_1: 0.068 + syst_1: 0.0063 +- stat_1: 0.0306 + syst_1: 0.0031 +- stat_1: 0.0169 + syst_1: 0.0031 +- stat_1: 0.0151 + syst_1: 0.0026 +- stat_1: 0.0153 + syst_1: 0.0027 +- stat_1: 0.0097 + syst_1: 0.0022 +- stat_1: 0.0098 + syst_1: 0.002 +- stat_1: 0.0117 + syst_1: 0.0018 +- stat_1: 0.0102 + syst_1: 0.0017 +- stat_1: 0.0127 + syst_1: 0.0014 +- stat_1: 0.0126 + syst_1: 0.0017 +- stat_1: 0.013 + syst_1: 0.0015 +- stat_1: 0.0124 + syst_1: 0.0012 +- stat_1: 0.0147 + syst_1: 0.0011 +- stat_1: 0.0209 + syst_1: 0.0011 +- stat_1: 0.0345 + syst_1: 0.0019 +- stat_1: 0.031 + syst_1: 0.0037 +- stat_1: 0.0143 + syst_1: 0.0036 +- stat_1: 0.0127 + syst_1: 0.003 +- stat_1: 0.0125 + syst_1: 0.0028 +- stat_1: 0.009 + syst_1: 0.0023 +- stat_1: 0.0087 + syst_1: 0.0022 +- stat_1: 0.0095 + syst_1: 0.002 +- stat_1: 0.0081 + syst_1: 0.0019 +- stat_1: 0.01 + syst_1: 0.0016 +- stat_1: 0.0097 + syst_1: 0.0016 +- stat_1: 0.0101 + syst_1: 0.0017 +- stat_1: 0.0098 + syst_1: 0.0013 +- stat_1: 0.011 + syst_1: 0.0011 +- stat_1: 0.0149 + syst_1: 0.0011 +- stat_1: 0.0191 + syst_1: 0.001 +- stat_1: 0.0193 + syst_1: 0.0047 +- stat_1: 0.0146 + syst_1: 0.0037 +- stat_1: 0.015 + syst_1: 0.0033 +- stat_1: 0.0106 + syst_1: 0.0027 +- stat_1: 0.0117 + syst_1: 0.0022 +- stat_1: 0.012 + syst_1: 0.0025 +- stat_1: 0.0093 + syst_1: 0.0022 +- stat_1: 0.0108 + syst_1: 0.0018 +- stat_1: 0.0109 + syst_1: 0.0017 +- stat_1: 0.0114 + syst_1: 0.0018 +- stat_1: 0.0108 + syst_1: 0.0014 +- stat_1: 0.0122 + syst_1: 0.0013 +- stat_1: 0.0153 + syst_1: 0.0011 +- stat_1: 0.0202 + syst_1: 0.001 +- stat_1: 0.0297 + syst_1: 0.0011 +- stat_1: 0.0172 + syst_1: 0.0055 +- stat_1: 0.0161 + syst_1: 0.0044 +- stat_1: 0.0109 + syst_1: 0.0032 +- stat_1: 0.0121 + syst_1: 0.0027 +- stat_1: 0.0137 + syst_1: 0.0023 +- stat_1: 0.0101 + syst_1: 0.0024 +- stat_1: 0.0112 + syst_1: 0.0021 +- stat_1: 0.0112 + syst_1: 0.0018 +- stat_1: 0.0116 + syst_1: 0.0019 +- stat_1: 0.0112 + syst_1: 0.0017 +- stat_1: 0.0126 + syst_1: 0.0015 +- stat_1: 0.0155 + syst_1: 0.0013 +- stat_1: 0.0186 + syst_1: 0.0011 +- stat_1: 0.0248 + syst_1: 0.001 +- stat_1: 0.0203 + syst_1: 0.0068 +- stat_1: 0.0155 + syst_1: 0.0051 +- stat_1: 0.0141 + syst_1: 0.0033 +- stat_1: 0.0163 + syst_1: 0.003 +- stat_1: 0.0142 + syst_1: 0.0023 +- stat_1: 0.0134 + syst_1: 0.0025 +- stat_1: 0.0128 + syst_1: 0.002 +- stat_1: 0.0135 + syst_1: 0.0022 +- stat_1: 0.0127 + syst_1: 0.0019 +- stat_1: 0.014 + syst_1: 0.0017 +- stat_1: 0.0169 + syst_1: 0.0014 +- stat_1: 0.0214 + syst_1: 0.0013 +- stat_1: 0.0265 + syst_1: 0.001 +- stat_1: 0.0349 + syst_1: 0.001 +- stat_1: 0.0158 + syst_1: 0.008 +- stat_1: 0.0134 + syst_1: 0.0045 +- stat_1: 0.0143 + syst_1: 0.0041 +- stat_1: 0.012 + syst_1: 0.0031 +- stat_1: 0.0165 + syst_1: 0.0026 +- stat_1: 0.0118 + syst_1: 0.0028 +- stat_1: 0.0113 + syst_1: 0.0025 +- stat_1: 0.0109 + syst_1: 0.0023 +- stat_1: 0.012 + syst_1: 0.002 +- stat_1: 0.0147 + syst_1: 0.0018 +- stat_1: 0.0162 + syst_1: 0.0013 +- stat_1: 0.0213 + syst_1: 0.0011 +- stat_1: 0.0253 + syst_1: 0.001 +- stat_1: 0.0242 + syst_1: 0.0092 +- stat_1: 0.0245 + syst_1: 0.0066 +- stat_1: 0.0161 + syst_1: 0.0044 +- stat_1: 0.0211 + syst_1: 0.0035 +- stat_1: 0.0227 + syst_1: 0.0026 +- stat_1: 0.0158 + syst_1: 0.0036 +- stat_1: 0.0146 + syst_1: 0.0027 +- stat_1: 0.016 + syst_1: 0.0025 +- stat_1: 0.0187 + syst_1: 0.002 +- stat_1: 0.0222 + syst_1: 0.0015 +- stat_1: 0.0281 + syst_1: 0.0012 +- stat_1: 0.0296 + syst_1: 0.001 +- stat_1: 0.0356 + syst_1: 0.0072 +- stat_1: 0.0296 + syst_1: 0.0055 +- stat_1: 0.028 + syst_1: 0.0042 +- stat_1: 0.03 + syst_1: 0.0032 +- stat_1: 0.0282 + syst_1: 0.0037 +- stat_1: 0.0205 + syst_1: 0.0037 +- stat_1: 0.0216 + syst_1: 0.0029 +- stat_1: 0.0267 + syst_1: 0.0023 +- stat_1: 0.0331 + syst_1: 0.0021 +- stat_1: 0.0345 + syst_1: 0.001 +- stat_1: 0.0458 + syst_1: 0.0012 +- stat_1: 0.0361 + syst_1: 0.0067 +- stat_1: 0.0465 + syst_1: 0.0053 +- stat_1: 0.0353 + syst_1: 0.0046 +- stat_1: 0.0395 + syst_1: 0.0051 +- stat_1: 0.0281 + syst_1: 0.0049 +- stat_1: 0.0235 + syst_1: 0.0034 +- stat_1: 0.033 + syst_1: 0.0033 +- stat_1: 0.0373 + syst_1: 0.0026 +- stat_1: 0.0513 + syst_1: 0.0029 +- stat_1: 0.0645 + syst_1: 0.0034 diff --git a/buildmaster/NMCPD/uncertainties_dw.yaml b/buildmaster/NMCPD/uncertainties_dw.yaml new file mode 100644 index 0000000000..0a4fcdf5ab --- /dev/null +++ b/buildmaster/NMCPD/uncertainties_dw.yaml @@ -0,0 +1,266 @@ +definition: + nuclear: + description: nuclear uncertainty (deweighted) + treatment: ADD + type: NUC_DW +bins: +- nuclear: 0.0203 +- nuclear: 0.0212 +- nuclear: 0.0205 +- nuclear: 0.0258 +- nuclear: 0.0176 +- nuclear: 0.0277 +- nuclear: 0.0171 +- nuclear: 0.0137 +- nuclear: 0.0129 +- nuclear: 0.0118 +- nuclear: 0.0108 +- nuclear: 0.0116 +- nuclear: 0.0615 +- nuclear: 0.025 +- nuclear: 0.0208 +- nuclear: 0.0172 +- nuclear: 0.0092 +- nuclear: 0.0157 +- nuclear: 0.0137 +- nuclear: 0.0128 +- nuclear: 0.0098 +- nuclear: 0.0547 +- nuclear: 0.025 +- nuclear: 0.0213 +- nuclear: 0.018 +- nuclear: 0.0091 +- nuclear: 0.0083 +- nuclear: 0.0088 +- nuclear: 0.01 +- nuclear: 0.0083 +- nuclear: 0.0086 +- nuclear: 0.0097 +- nuclear: 0.0122 +- nuclear: 0.0543 +- nuclear: 0.032 +- nuclear: 0.0233 +- nuclear: 0.0205 +- nuclear: 0.0127 +- nuclear: 0.0108 +- nuclear: 0.0092 +- nuclear: 0.0098 +- nuclear: 0.0072 +- nuclear: 0.0085 +- nuclear: 0.0103 +- nuclear: 0.0087 +- nuclear: 0.0095 +- nuclear: 0.0134 +- nuclear: 0.0402 +- nuclear: 0.0301 +- nuclear: 0.0268 +- nuclear: 0.0161 +- nuclear: 0.0155 +- nuclear: 0.0129 +- nuclear: 0.0119 +- nuclear: 0.0084 +- nuclear: 0.0087 +- nuclear: 0.0098 +- nuclear: 0.0092 +- nuclear: 0.01 +- nuclear: 0.0143 +- nuclear: 0.0107 +- nuclear: 0.0375 +- nuclear: 0.0287 +- nuclear: 0.0313 +- nuclear: 0.0131 +- nuclear: 0.0154 +- nuclear: 0.0124 +- nuclear: 0.0107 +- nuclear: 0.0076 +- nuclear: 0.0071 +- nuclear: 0.0074 +- nuclear: 0.0065 +- nuclear: 0.0085 +- nuclear: 0.0097 +- nuclear: 0.0085 +- nuclear: 0.01 +- nuclear: 0.0375 +- nuclear: 0.034 +- nuclear: 0.0207 +- nuclear: 0.0179 +- nuclear: 0.0183 +- nuclear: 0.0138 +- nuclear: 0.0089 +- nuclear: 0.0087 +- nuclear: 0.009 +- nuclear: 0.0069 +- nuclear: 0.0088 +- nuclear: 0.0111 +- nuclear: 0.0101 +- nuclear: 0.0115 +- nuclear: 0.0107 +- nuclear: 0.0144 +- nuclear: 0.0412 +- nuclear: 0.0214 +- nuclear: 0.0213 +- nuclear: 0.0167 +- nuclear: 0.0138 +- nuclear: 0.0092 +- nuclear: 0.0077 +- nuclear: 0.0077 +- nuclear: 0.0058 +- nuclear: 0.0069 +- nuclear: 0.0085 +- nuclear: 0.0076 +- nuclear: 0.0097 +- nuclear: 0.0087 +- nuclear: 0.009 +- nuclear: 0.0119 +- nuclear: 0.0438 +- nuclear: 0.0344 +- nuclear: 0.0542 +- nuclear: 0.0197 +- nuclear: 0.0117 +- nuclear: 0.0111 +- nuclear: 0.0096 +- nuclear: 0.0069 +- nuclear: 0.0079 +- nuclear: 0.0095 +- nuclear: 0.0082 +- nuclear: 0.0105 +- nuclear: 0.0105 +- nuclear: 0.0103 +- nuclear: 0.0103 +- nuclear: 0.0157 +- nuclear: 0.054 +- nuclear: 0.0537 +- nuclear: 0.0281 +- nuclear: 0.014 +- nuclear: 0.0136 +- nuclear: 0.0124 +- nuclear: 0.0082 +- nuclear: 0.0089 +- nuclear: 0.0106 +- nuclear: 0.0092 +- nuclear: 0.0114 +- nuclear: 0.0115 +- nuclear: 0.0116 +- nuclear: 0.0114 +- nuclear: 0.0147 +- nuclear: 0.0222 +- nuclear: 0.068 +- nuclear: 0.0306 +- nuclear: 0.0169 +- nuclear: 0.0151 +- nuclear: 0.0153 +- nuclear: 0.0097 +- nuclear: 0.0098 +- nuclear: 0.0117 +- nuclear: 0.0102 +- nuclear: 0.0127 +- nuclear: 0.0126 +- nuclear: 0.013 +- nuclear: 0.0124 +- nuclear: 0.0147 +- nuclear: 0.0209 +- nuclear: 0.0345 +- nuclear: 0.031 +- nuclear: 0.0143 +- nuclear: 0.0127 +- nuclear: 0.0125 +- nuclear: 0.009 +- nuclear: 0.0087 +- nuclear: 0.0095 +- nuclear: 0.0081 +- nuclear: 0.01 +- nuclear: 0.0097 +- nuclear: 0.0101 +- nuclear: 0.0098 +- nuclear: 0.011 +- nuclear: 0.0149 +- nuclear: 0.0191 +- nuclear: 0.0193 +- nuclear: 0.0146 +- nuclear: 0.015 +- nuclear: 0.0106 +- nuclear: 0.0117 +- nuclear: 0.012 +- nuclear: 0.0093 +- nuclear: 0.0108 +- nuclear: 0.0109 +- nuclear: 0.0114 +- nuclear: 0.0108 +- nuclear: 0.0122 +- nuclear: 0.0153 +- nuclear: 0.0202 +- nuclear: 0.0297 +- nuclear: 0.0172 +- nuclear: 0.0161 +- nuclear: 0.0109 +- nuclear: 0.0121 +- nuclear: 0.0137 +- nuclear: 0.0101 +- nuclear: 0.0112 +- nuclear: 0.0112 +- nuclear: 0.0116 +- nuclear: 0.0112 +- nuclear: 0.0126 +- nuclear: 0.0155 +- nuclear: 0.0186 +- nuclear: 0.0248 +- nuclear: 0.0203 +- nuclear: 0.0155 +- nuclear: 0.0141 +- nuclear: 0.0163 +- nuclear: 0.0142 +- nuclear: 0.0134 +- nuclear: 0.0128 +- nuclear: 0.0135 +- nuclear: 0.0127 +- nuclear: 0.014 +- nuclear: 0.0169 +- nuclear: 0.0214 +- nuclear: 0.0265 +- nuclear: 0.0349 +- nuclear: 0.0158 +- nuclear: 0.0134 +- nuclear: 0.0143 +- nuclear: 0.012 +- nuclear: 0.0165 +- nuclear: 0.0118 +- nuclear: 0.0113 +- nuclear: 0.0109 +- nuclear: 0.012 +- nuclear: 0.0147 +- nuclear: 0.0162 +- nuclear: 0.0213 +- nuclear: 0.0253 +- nuclear: 0.0242 +- nuclear: 0.0245 +- nuclear: 0.0161 +- nuclear: 0.0211 +- nuclear: 0.0227 +- nuclear: 0.0158 +- nuclear: 0.0146 +- nuclear: 0.016 +- nuclear: 0.0187 +- nuclear: 0.0222 +- nuclear: 0.0281 +- nuclear: 0.0296 +- nuclear: 0.0356 +- nuclear: 0.0296 +- nuclear: 0.028 +- nuclear: 0.03 +- nuclear: 0.0282 +- nuclear: 0.0205 +- nuclear: 0.0216 +- nuclear: 0.0267 +- nuclear: 0.0331 +- nuclear: 0.0345 +- nuclear: 0.0458 +- nuclear: 0.0361 +- nuclear: 0.0465 +- nuclear: 0.0353 +- nuclear: 0.0395 +- nuclear: 0.0281 +- nuclear: 0.0235 +- nuclear: 0.033 +- nuclear: 0.0373 +- nuclear: 0.0513 +- nuclear: 0.0645 diff --git a/buildmaster/NMCPD/uncertainties_sh.yaml b/buildmaster/NMCPD/uncertainties_sh.yaml new file mode 100644 index 0000000000..d88571f56b --- /dev/null +++ b/buildmaster/NMCPD/uncertainties_sh.yaml @@ -0,0 +1,266 @@ +definition: + nuclear: + description: nuclear uncertainty (shifted) + treatment: ADD + type: NUC_SH +bins: +- nuclear: 0.0203 +- nuclear: 0.0212 +- nuclear: 0.0205 +- nuclear: 0.0258 +- nuclear: 0.0176 +- nuclear: 0.0277 +- nuclear: 0.0171 +- nuclear: 0.0137 +- nuclear: 0.0129 +- nuclear: 0.0118 +- nuclear: 0.0108 +- nuclear: 0.0116 +- nuclear: 0.0615 +- nuclear: 0.025 +- nuclear: 0.0208 +- nuclear: 0.0172 +- nuclear: 0.0092 +- nuclear: 0.0157 +- nuclear: 0.0137 +- nuclear: 0.0128 +- nuclear: 0.0098 +- nuclear: 0.0547 +- nuclear: 0.025 +- nuclear: 0.0213 +- nuclear: 0.018 +- nuclear: 0.0091 +- nuclear: 0.0083 +- nuclear: 0.0088 +- nuclear: 0.01 +- nuclear: 0.0083 +- nuclear: 0.0086 +- nuclear: 0.0097 +- nuclear: 0.0122 +- nuclear: 0.0543 +- nuclear: 0.032 +- nuclear: 0.0233 +- nuclear: 0.0205 +- nuclear: 0.0127 +- nuclear: 0.0108 +- nuclear: 0.0092 +- nuclear: 0.0098 +- nuclear: 0.0072 +- nuclear: 0.0085 +- nuclear: 0.0103 +- nuclear: 0.0087 +- nuclear: 0.0095 +- nuclear: 0.0134 +- nuclear: 0.0402 +- nuclear: 0.0301 +- nuclear: 0.0268 +- nuclear: 0.0161 +- nuclear: 0.0155 +- nuclear: 0.0129 +- nuclear: 0.0119 +- nuclear: 0.0084 +- nuclear: 0.0087 +- nuclear: 0.0098 +- nuclear: 0.0092 +- nuclear: 0.01 +- nuclear: 0.0143 +- nuclear: 0.0107 +- nuclear: 0.0375 +- nuclear: 0.0287 +- nuclear: 0.0313 +- nuclear: 0.0131 +- nuclear: 0.0154 +- nuclear: 0.0124 +- nuclear: 0.0107 +- nuclear: 0.0076 +- nuclear: 0.0071 +- nuclear: 0.0074 +- nuclear: 0.0065 +- nuclear: 0.0085 +- nuclear: 0.0097 +- nuclear: 0.0085 +- nuclear: 0.01 +- nuclear: 0.0375 +- nuclear: 0.034 +- nuclear: 0.0207 +- nuclear: 0.0179 +- nuclear: 0.0183 +- nuclear: 0.0138 +- nuclear: 0.0089 +- nuclear: 0.0087 +- nuclear: 0.009 +- nuclear: 0.0069 +- nuclear: 0.0088 +- nuclear: 0.0111 +- nuclear: 0.0101 +- nuclear: 0.0115 +- nuclear: 0.0107 +- nuclear: 0.0144 +- nuclear: 0.0412 +- nuclear: 0.0214 +- nuclear: 0.0213 +- nuclear: 0.0167 +- nuclear: 0.0138 +- nuclear: 0.0092 +- nuclear: 0.0077 +- nuclear: 0.0077 +- nuclear: 0.0058 +- nuclear: 0.0069 +- nuclear: 0.0085 +- nuclear: 0.0076 +- nuclear: 0.0097 +- nuclear: 0.0087 +- nuclear: 0.009 +- nuclear: 0.0119 +- nuclear: 0.0438 +- nuclear: 0.0344 +- nuclear: 0.0542 +- nuclear: 0.0197 +- nuclear: 0.0117 +- nuclear: 0.0111 +- nuclear: 0.0096 +- nuclear: 0.0069 +- nuclear: 0.0079 +- nuclear: 0.0095 +- nuclear: 0.0082 +- nuclear: 0.0105 +- nuclear: 0.0105 +- nuclear: 0.0103 +- nuclear: 0.0103 +- nuclear: 0.0157 +- nuclear: 0.054 +- nuclear: 0.0537 +- nuclear: 0.0281 +- nuclear: 0.014 +- nuclear: 0.0136 +- nuclear: 0.0124 +- nuclear: 0.0082 +- nuclear: 0.0089 +- nuclear: 0.0106 +- nuclear: 0.0092 +- nuclear: 0.0114 +- nuclear: 0.0115 +- nuclear: 0.0116 +- nuclear: 0.0114 +- nuclear: 0.0147 +- nuclear: 0.0222 +- nuclear: 0.068 +- nuclear: 0.0306 +- nuclear: 0.0169 +- nuclear: 0.0151 +- nuclear: 0.0153 +- nuclear: 0.0097 +- nuclear: 0.0098 +- nuclear: 0.0117 +- nuclear: 0.0102 +- nuclear: 0.0127 +- nuclear: 0.0126 +- nuclear: 0.013 +- nuclear: 0.0124 +- nuclear: 0.0147 +- nuclear: 0.0209 +- nuclear: 0.0345 +- nuclear: 0.031 +- nuclear: 0.0143 +- nuclear: 0.0127 +- nuclear: 0.0125 +- nuclear: 0.009 +- nuclear: 0.0087 +- nuclear: 0.0095 +- nuclear: 0.0081 +- nuclear: 0.01 +- nuclear: 0.0097 +- nuclear: 0.0101 +- nuclear: 0.0098 +- nuclear: 0.011 +- nuclear: 0.0149 +- nuclear: 0.0191 +- nuclear: 0.0193 +- nuclear: 0.0146 +- nuclear: 0.015 +- nuclear: 0.0106 +- nuclear: 0.0117 +- nuclear: 0.012 +- nuclear: 0.0093 +- nuclear: 0.0108 +- nuclear: 0.0109 +- nuclear: 0.0114 +- nuclear: 0.0108 +- nuclear: 0.0122 +- nuclear: 0.0153 +- nuclear: 0.0202 +- nuclear: 0.0297 +- nuclear: 0.0172 +- nuclear: 0.0161 +- nuclear: 0.0109 +- nuclear: 0.0121 +- nuclear: 0.0137 +- nuclear: 0.0101 +- nuclear: 0.0112 +- nuclear: 0.0112 +- nuclear: 0.0116 +- nuclear: 0.0112 +- nuclear: 0.0126 +- nuclear: 0.0155 +- nuclear: 0.0186 +- nuclear: 0.0248 +- nuclear: 0.0203 +- nuclear: 0.0155 +- nuclear: 0.0141 +- nuclear: 0.0163 +- nuclear: 0.0142 +- nuclear: 0.0134 +- nuclear: 0.0128 +- nuclear: 0.0135 +- nuclear: 0.0127 +- nuclear: 0.014 +- nuclear: 0.0169 +- nuclear: 0.0214 +- nuclear: 0.0265 +- nuclear: 0.0349 +- nuclear: 0.0158 +- nuclear: 0.0134 +- nuclear: 0.0143 +- nuclear: 0.012 +- nuclear: 0.0165 +- nuclear: 0.0118 +- nuclear: 0.0113 +- nuclear: 0.0109 +- nuclear: 0.012 +- nuclear: 0.0147 +- nuclear: 0.0162 +- nuclear: 0.0213 +- nuclear: 0.0253 +- nuclear: 0.0242 +- nuclear: 0.0245 +- nuclear: 0.0161 +- nuclear: 0.0211 +- nuclear: 0.0227 +- nuclear: 0.0158 +- nuclear: 0.0146 +- nuclear: 0.016 +- nuclear: 0.0187 +- nuclear: 0.0222 +- nuclear: 0.0281 +- nuclear: 0.0296 +- nuclear: 0.0356 +- nuclear: 0.0296 +- nuclear: 0.028 +- nuclear: 0.03 +- nuclear: 0.0282 +- nuclear: 0.0205 +- nuclear: 0.0216 +- nuclear: 0.0267 +- nuclear: 0.0331 +- nuclear: 0.0345 +- nuclear: 0.0458 +- nuclear: 0.0361 +- nuclear: 0.0465 +- nuclear: 0.0353 +- nuclear: 0.0395 +- nuclear: 0.0281 +- nuclear: 0.0235 +- nuclear: 0.033 +- nuclear: 0.0373 +- nuclear: 0.0513 +- nuclear: 0.0645 diff --git a/validphys2/src/validphys/commondataparser.py b/validphys2/src/validphys/commondataparser.py index ab2cbaf8c5..7eff57f1fd 100644 --- a/validphys2/src/validphys/commondataparser.py +++ b/validphys2/src/validphys/commondataparser.py @@ -1,18 +1,172 @@ """ -This module implements parsers for commondata and systype files into useful -datastructures, contained in the :py:mod:`validphys.coredata` module, which are -not backed by C++ managed memory, and so they can be easily pickled and -interfaces with common Python libraries. The integration of these objects into -the codebase is currently work in progress, and at the moment this module -serves as a proof of concept. +This module implements parsers for commondata and its associated metadata and uncertainties files +into useful structures that can be fed to the main :py:class:`validphys.coredata.CommonData` class. + +In this module a few auxiliary dataclasses that hold special information: + - TheoryMeta: contains the necessary information to read the (new style) fktables + - ReferenceMeta: literature references for the dataset + +The CommonMetaData defines how the CommonData file is to be loaded, +by modifying the CommonMetaData using one of the loaded Variants one can change the resulting +:py:class:`validphys.coredata.CommonData` object. """ +from copy import copy from operator import attrgetter +from dataclasses import dataclass, field +from pathlib import Path +import typing import pandas as pd +from validobj.custom import Parser +from validobj import ValidationError, parse_input +from validphys import convolution +from validphys.utils import parse_yaml_inp from validphys.core import peek_commondata_metadata from validphys.coredata import CommonData +# Auxiliary parser for common types or sanity checks +@Parser +def ValidPath(path_str: str) -> Path: + """Parse strings into paths""" + try: + return Path(path_str) + except Exception as e: + raise ValidationError(f"{path_str} is not a valid path") from e + + +@Parser +def ValidOperation(op_str: str) -> str: + """Ensures that the operation defined in the commondata file is implemented in validphys""" + ret = op_str.upper() + if ret not in convolution.OP: + raise ValidationError(f"The operation '{op_str}' is not implemented in validphys") + return ret + + +# Auxiliary objects +@dataclass +class TheoryMeta: + """Contains the necessary information to load the associated fktables""" + + FK_tables: list + operation: ValidOperation + conversion_factor: float = 1.0 + apfelcomb: typing.Optional[dict] = None + + @classmethod + def parser(cls, meta: dict): + return parse_input(meta, cls) + + +@dataclass +class ReferenceMeta: + """Holds literature information for the dataset""" + + url: str + version: int = 0 + tables: typing.List[int] = field(default_factory=list) + + @classmethod + def parser(cls, meta: dict): + return parse_input(meta, cls) + + +@dataclass +class Variant: + """Defines the keys of the CommonMetaData that can be overwritten""" + + data_uncertainties: typing.List[ValidPath] + + +# Define parsers for the more complicated structures +ValidTheory = Parser(TheoryMeta.parser) +ValidReference = Parser(ReferenceMeta.parser) + + +@Parser +def ValidVariants(variant_dict: dict) -> dict: + """Variants of a dataset are allowed to overwrite a subset of the keys of a dataset + (those defined in the Variant dataclass). + This wrapper class runs over the dictionary of variant and parses them into valid Variants + """ + return {k: parse_input(v, Variant) for k, v in variant_dict.items()} + + +@dataclass +class CommonMetaData: + setname: str + ndata: int + observable: dict + kinematics: dict + kinematic_coverage: dict + data_central: ValidPath + data_uncertainties: typing.List[ValidPath] + dataset_label: str + plot_x: str + figure_by: typing.List[str] + theory: ValidTheory + nnpdf_metadata: dict + version: int + version_comment: str = "" + arXiv: typing.Optional[ValidReference] = None + iNSPIRE: typing.Optional[ValidReference] = None + hepdata: typing.Optional[ValidReference] = None + variants: typing.Optional[ValidVariants] = None + + _enabled_variant: typing.List[str] = field(default=None, repr=False) + _default: dict = field(default=None, repr=False) + + def enable_variant(self, variant): + """Enable a variant for this class by giving its name. + Note that more than one variant can be enabled at once, but the last one will take priority + """ + if self.variants is None: + raise ValueError(f"There are no variants defined for {self.setname}") + if variant not in self.variants: + raise ValueError(f"The variant {variant} is not defined for {self.setname}") + # If there were not enabled variants, save the current state of the class + if self._enabled_variant is None: + # A shallow copy is enough because the variants update attributes of this class + self._default = copy(self.__dict__) + self._enabled_variant = [] + + self.__dict__.update(self.variants[variant].__dict__.items()) + self._enabled_variant.append(variant) + + def disable_variants(self): + """Get the CommonMetaData back to its original state""" + if self._default is not None: + self.__dict__.update(self._default) + + +# TODO: will be moved to coredata.py and will substitute CommonData.py +@dataclass(eq=False) +class _CommonData: + metadata: CommonMetaData + kinematics: pd.DataFrame + uncertainties: pd.DataFrame + data: pd.DataFrame + + +def parse_commondata_folder(commondata, variant=None): + """Given a commondata folder, parse the entire content into the appropiate objects""" + # First read the metadata which will define the commondata being read + metadata_file = commondata / "metadata.yaml" + common_meta = parse_yaml_inp(metadata_file, CommonMetaData) + if variant is not None: + common_meta.enable_variant(variant) + + # + return common_meta + + +def parse_commondata_metadata(metadata_file): + """Transitional function, it will be part of the load_commondata function below""" + return parse_yaml_inp(metadata_file, CommonMetaData) + + +##### TODO: the functions below have not been touched yet so they are targetting old commondata def load_commondata(spec): """ Load the data corresponding to a CommonDataSpec object. @@ -42,12 +196,12 @@ def parse_commondata(commondatafile, systypefile, setname): and systype files. """ # First parse commondata file - commondatatable = pd.read_csv(commondatafile, sep=r'\s+', skiprows=1, header=None) + commondatatable = pd.read_csv(commondatafile, sep=r"\s+", skiprows=1, header=None) # Remove NaNs # TODO: replace commondata files with bad formatting # Build header - commondataheader = ['entry', 'process', 'kin1', 'kin2', 'kin3', 'data', 'stat'] - nsys = (commondatatable.shape[1] - len(commondataheader)) // 2 + commondataheader = ["entry", "process", "kin1", "kin2", "kin3", "data", "stat"] + nsys = (commondatatable.shape[1] - len(commondataheader)) // 2 commondataheader += ["ADD", "MULT"] * nsys commondatatable.columns = commondataheader @@ -55,8 +209,8 @@ def parse_commondata(commondatafile, systypefile, setname): ndata = len(commondatatable) commondataproc = commondatatable["process"][1] # Check for consistency with commondata metadata - cdmetadata = peek_commondata_metadata(commondatafile) - if (setname, nsys, ndata) != attrgetter('name', 'nsys', 'ndata')(cdmetadata): + cdmetadata = peek_commondata_metadata(commondatafile) + if (setname, nsys, ndata) != attrgetter("name", "nsys", "ndata")(cdmetadata): raise ValueError("Commondata table information does not match metadata") # Now parse the systype file @@ -70,18 +224,18 @@ def parse_commondata(commondatafile, systypefile, setname): nkin=3, nsys=nsys, commondata_table=commondatatable, - systype_table=systypetable + systype_table=systypetable, ) + def parse_systypes(systypefile): - """Parses a systype file and returns a pandas dataframe. - """ + """Parses a systype file and returns a pandas dataframe.""" systypeheader = ["sys_index", "type", "name"] try: systypetable = pd.read_csv( systypefile, sep=r"\s+", names=systypeheader, skiprows=1, header=None ) - systypetable.dropna(axis='columns', inplace=True) + systypetable.dropna(axis="columns", inplace=True) # Some datasets e.g. CMSWCHARMRAT have no systematics except pd.errors.EmptyDataError: systypetable = pd.DataFrame(columns=systypeheader) diff --git a/validphys2/src/validphys/pineparser.py b/validphys2/src/validphys/pineparser.py index a0c696ec56..4a3954a3f9 100644 --- a/validphys2/src/validphys/pineparser.py +++ b/validphys2/src/validphys/pineparser.py @@ -68,6 +68,13 @@ def pineko_yaml(yaml_file, grids_folder, check_grid_existence=True): """ yaml_content = _load_yaml(yaml_file) + # TODO: the theory metadata can be found inside the commondata metadata + # however, for the time being, pineappl tables contain this information in the `yamldb` database + # they should be 100% compatible (and if they are not there is something wrong somewhere) + # For now this is inside just to check for compatibility (as there are circular imports to fix) + from validphys.commondataparser import ValidTheory + theory_meta = ValidTheory(yaml_content) + # Turn the operands and the members into paths (and check all of them exist) ret = [] for operand in yaml_content["operands"]: diff --git a/validphys2/src/validphys/plotoptions/core.py b/validphys2/src/validphys/plotoptions/core.py index d96aef7290..652165f58d 100644 --- a/validphys2/src/validphys/plotoptions/core.py +++ b/validphys2/src/validphys/plotoptions/core.py @@ -159,10 +159,8 @@ def from_commondata(cls, commondata, cuts=None, normalize=False): plot_params = ChainMap() if commondata.plotfiles: for file in commondata.plotfiles: - with open(file) as f: - processed_input = yaml.round_trip_load(f) - pf = parse_yaml_inp(processed_input, PlottingFile, file) - config_params = dataclasses.asdict(pf, dict_factory=dict_factory) + pf = parse_yaml_inp(file, PlottingFile) + config_params = dataclasses.asdict(pf, dict_factory=dict_factory) plot_params = plot_params.new_child(config_params) if normalize and 'normalize' in plot_params: plot_params = plot_params.new_child(config_params['normalize']) diff --git a/validphys2/src/validphys/utils.py b/validphys2/src/validphys/utils.py index 0c2956daaa..01583cee2a 100644 --- a/validphys2/src/validphys/utils.py +++ b/validphys2/src/validphys/utils.py @@ -12,14 +12,18 @@ import numpy as np from validobj import parse_input, ValidationError +from reportengine.compat import yaml -def parse_yaml_inp(inp, spec, path): - """Helper function to parse yaml using the `validobj` library and print +def parse_yaml_inp(input_yaml, spec): + """ + Helper function to parse yaml using the `validobj` library and print useful error messages in case of a parsing error. https://validobj.readthedocs.io/en/latest/examples.html#yaml-line-numbers """ + input_yaml = pathlib.Path(input_yaml) + inp = yaml.round_trip_load(input_yaml.open("r", encoding="utf-8")) try: return parse_input(inp, spec) except ValidationError as e: @@ -34,7 +38,7 @@ def parse_yaml_inp(inp, spec, path): # ``(line_number, column)`` for a given item in # the mapping. line = current_inp.lc.item(wrong_field)[0] - error_text_lines.append(f"Problem processing key at line {line} in {path}:") + error_text_lines.append(f"Problem processing key at line {line} in {input_yaml}:") current_inp = current_inp[wrong_field] elif hasattr(current_exc, 'wrong_index'): wrong_index = current_exc.wrong_index @@ -42,7 +46,7 @@ def parse_yaml_inp(inp, spec, path): # a given item. line = current_inp.lc.item(wrong_index)[0] current_inp = current_inp[wrong_index] - error_text_lines.append(f"Problem processing list item at line {line} in {path}:") + error_text_lines.append(f"Problem processing list item at line {line} in {input_yaml}:") elif hasattr(current_exc, 'unknown'): unknown_lines = [] for u in current_exc.unknown: @@ -50,7 +54,7 @@ def parse_yaml_inp(inp, spec, path): unknown_lines.sort() for line, key in unknown_lines: error_text_lines.append( - f"Unknown key {key!r} defined at line {line} in {path}:" + f"Unknown key {key!r} defined at line {line} in {input_yaml}:" ) error_text_lines.append(str(current_exc)) current_exc = current_exc.__cause__ From 7e4eeaa24daf25f67a6052b42c0e584c7da13f81 Mon Sep 17 00:00:00 2001 From: juacrumar Date: Wed, 3 Aug 2022 14:02:41 +0200 Subject: [PATCH 2/7] create the commondata class, able to set variants and load kinematics, uncertainties and data --- ...ground for the new commondata format.ipynb | 609 ++++++++++++++++-- validphys2/src/validphys/commondataparser.py | 134 +++- 2 files changed, 693 insertions(+), 50 deletions(-) diff --git a/Playground for the new commondata format.ipynb b/Playground for the new commondata format.ipynb index 162485f5cf..61b9b35bc4 100644 --- a/Playground for the new commondata format.ipynb +++ b/Playground for the new commondata format.ipynb @@ -7,44 +7,581 @@ "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "[PosixPath('uncertainties.yaml'), PosixPath('uncertainties_sh.yaml')]\n" - ] + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
data
index
10.9815
21.0030
30.9675
41.0330
50.9912
......
2560.6717
2570.7194
2580.6959
2590.7020
2600.7724
\n", + "

260 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " data\n", + "index \n", + "1 0.9815\n", + "2 1.0030\n", + "3 0.9675\n", + "4 1.0330\n", + "5 0.9912\n", + "... ...\n", + "256 0.6717\n", + "257 0.7194\n", + "258 0.6959\n", + "259 0.7020\n", + "260 0.7724\n", + "\n", + "[260 rows x 1 columns]" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pathlib import Path\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "\n", + "from reportengine.compat import yaml\n", + "import validphys\n", + "from validphys.commondataparser import parse_commondata_folder\n", + "\n", + "# Path to your buildmaster, here I'm guessing vp as installed in edit mode\n", + "BUILDMASTER_PATH = Path(validphys.__file__).parent / \"../../../buildmaster\"\n", + "DATASET = \"NMCPD\"\n", + "\n", + "#from validphys.core import CommonDataSpec\n", + "#import pandas as pd\n", + "#import numpy as np\n", + "#from collections import defaultdict\n", + "\n", + "dataset_path = BUILDMASTER_PATH / DATASET\n", + "metadata_file = dataset_path / \"metadata.yaml\"\n", + "metadata = yaml.safe_load(metadata_file.read_text())\n", + "ndata = metadata[\"ndata\"]\n", + "\n", + "ret = parse_commondata_folder(DATASET, variant=\"shifted\")\n", + "ret.data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ad7f6092", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namestat_1syst_1nuclear
treatmentADDADDADD
typeUNCORRCORRNUC_SH
index
10.02030.01090.0203
20.02120.01340.0212
30.02050.01120.0205
40.02580.01950.0258
50.01760.01210.0176
............
2560.02350.00340.0235
2570.03300.00330.0330
2580.03730.00260.0373
2590.05130.00290.0513
2600.06450.00340.0645
\n", + "

260 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + "name stat_1 syst_1 nuclear\n", + "treatment ADD ADD ADD\n", + "type UNCORR CORR NUC_SH\n", + "index \n", + "1 0.0203 0.0109 0.0203\n", + "2 0.0212 0.0134 0.0212\n", + "3 0.0205 0.0112 0.0205\n", + "4 0.0258 0.0195 0.0258\n", + "5 0.0176 0.0121 0.0176\n", + "... ... ... ...\n", + "256 0.0235 0.0034 0.0235\n", + "257 0.0330 0.0033 0.0330\n", + "258 0.0373 0.0026 0.0373\n", + "259 0.0513 0.0029 0.0513\n", + "260 0.0645 0.0034 0.0645\n", + "\n", + "[260 rows x 3 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ret.uncertainties" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "34e3fc68", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namestat_1syst_1
treatmentADDADD
typeUNCORRCORR
index
10.02030.0109
20.02120.0134
30.02050.0112
40.02580.0195
50.01760.0121
.........
2560.02350.0034
2570.03300.0033
2580.03730.0026
2590.05130.0029
2600.06450.0034
\n", + "

260 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + "name stat_1 syst_1\n", + "treatment ADD ADD\n", + "type UNCORR CORR\n", + "index \n", + "1 0.0203 0.0109\n", + "2 0.0212 0.0134\n", + "3 0.0205 0.0112\n", + "4 0.0258 0.0195\n", + "5 0.0176 0.0121\n", + "... ... ...\n", + "256 0.0235 0.0034\n", + "257 0.0330 0.0033\n", + "258 0.0373 0.0026\n", + "259 0.0513 0.0029\n", + "260 0.0645 0.0034\n", + "\n", + "[260 rows x 2 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "from pathlib import Path\n", - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "\n", - "from reportengine.compat import yaml\n", - "import validphys\n", - "from validphys.commondataparser import parse_commondata_folder\n", - "\n", - "# Path to your buildmaster, here I'm guessing vp as installed in edit mode\n", - "BUILDMASTER_PATH = Path(validphys.__file__).parent / \"../../../buildmaster\"\n", - "DATASET = \"NMCPD\"\n", - "\n", - "#from validphys.core import CommonDataSpec\n", - "#import pandas as pd\n", - "#import numpy as np\n", - "#from collections import defaultdict\n", - "\n", - "dataset_path = BUILDMASTER_PATH / DATASET\n", - "metadata_file = dataset_path / \"metadata.yaml\"\n", - "metadata = yaml.safe_load(metadata_file.read_text())\n", - "ndata = metadata[\"ndata\"]\n", - "\n", - "ret = parse_commondata_folder(dataset_path, variant=\"shifted\")\n", - "print(ret.data_uncertainties)" + "ret.enable_variant(None)\n", + "ret.uncertainties" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, + "id": "95d7dd50", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xq2y
midmidmid
index
10.00150.160.120852
20.00150.250.188831
30.00150.350.264363
40.00150.450.339895
50.00150.600.453194
............
2560.675026.490.044463
2570.675035.400.059419
2580.675047.030.078940
2590.675063.530.106635
2600.675099.030.166221
\n", + "

260 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " x q2 y\n", + " mid mid mid\n", + "index \n", + "1 0.0015 0.16 0.120852\n", + "2 0.0015 0.25 0.188831\n", + "3 0.0015 0.35 0.264363\n", + "4 0.0015 0.45 0.339895\n", + "5 0.0015 0.60 0.453194\n", + "... ... ... ...\n", + "256 0.6750 26.49 0.044463\n", + "257 0.6750 35.40 0.059419\n", + "258 0.6750 47.03 0.078940\n", + "259 0.6750 63.53 0.106635\n", + "260 0.6750 99.03 0.166221\n", + "\n", + "[260 rows x 3 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ret.kinematics" + ] + }, + { + "cell_type": "code", + "execution_count": 5, "id": "b3c5ed78", "metadata": {}, "outputs": [ @@ -181,7 +718,7 @@ "[260 rows x 3 columns]" ] }, - "execution_count": 2, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -200,7 +737,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "id": "365489c7", "metadata": {}, "outputs": [ @@ -344,7 +881,7 @@ "[260 rows x 3 columns]" ] }, - "execution_count": 3, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -377,7 +914,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "id": "d3c39164", "metadata": {}, "outputs": [ @@ -477,7 +1014,7 @@ "[260 rows x 1 columns]" ] }, - "execution_count": 4, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } diff --git a/validphys2/src/validphys/commondataparser.py b/validphys2/src/validphys/commondataparser.py index 7eff57f1fd..10131b39d2 100644 --- a/validphys2/src/validphys/commondataparser.py +++ b/validphys2/src/validphys/commondataparser.py @@ -2,8 +2,13 @@ This module implements parsers for commondata and its associated metadata and uncertainties files into useful structures that can be fed to the main :py:class:`validphys.coredata.CommonData` class. +A CommonData file is completely defined by a name (which defines the folder in which the information is) +and a variant (which defines which files inside of the folder will be read). + + In this module a few auxiliary dataclasses that hold special information: - TheoryMeta: contains the necessary information to read the (new style) fktables + - KinematicsMeta: containins metadata about the kinematics - ReferenceMeta: literature references for the dataset The CommonMetaData defines how the CommonData file is to be loaded, @@ -11,12 +16,14 @@ :py:class:`validphys.coredata.CommonData` object. """ from copy import copy +from functools import cached_property from operator import attrgetter from dataclasses import dataclass, field from pathlib import Path import typing import pandas as pd +from reportengine.compat import yaml from validobj.custom import Parser from validobj import ValidationError, parse_input @@ -59,6 +66,18 @@ def parser(cls, meta: dict): return parse_input(meta, cls) +@dataclass +class KinematicsMeta: + """Contains all metadata for the kinematics of the dataset""" + + file: ValidPath + variables: dict + + @classmethod + def parser(cls, meta: dict): + parse_input(meta, cls) + + @dataclass class ReferenceMeta: """Holds literature information for the dataset""" @@ -82,6 +101,7 @@ class Variant: # Define parsers for the more complicated structures ValidTheory = Parser(TheoryMeta.parser) ValidReference = Parser(ReferenceMeta.parser) +ValidKinematics = Parser(KinematicsMeta.parser) @Parser @@ -98,7 +118,7 @@ class CommonMetaData: setname: str ndata: int observable: dict - kinematics: dict + kinematics: ValidKinematics kinematic_coverage: dict data_central: ValidPath data_uncertainties: typing.List[ValidPath] @@ -117,10 +137,14 @@ class CommonMetaData: _enabled_variant: typing.List[str] = field(default=None, repr=False) _default: dict = field(default=None, repr=False) + # TODO: these methods will be moved to the main CommonData class + # as any change of variant should trigger a reload of the commondata def enable_variant(self, variant): """Enable a variant for this class by giving its name. Note that more than one variant can be enabled at once, but the last one will take priority """ + if variant is None: + return self.disable_variants() if self.variants is None: raise ValueError(f"There are no variants defined for {self.setname}") if variant not in self.variants: @@ -141,24 +165,106 @@ def disable_variants(self): # TODO: will be moved to coredata.py and will substitute CommonData.py -@dataclass(eq=False) +# and obviously the folder here is only for development purposes +_folder_data = Path(__file__).parent / "../../../buildmaster" + + +@dataclass class _CommonData: - metadata: CommonMetaData - kinematics: pd.DataFrame - uncertainties: pd.DataFrame - data: pd.DataFrame + """ + Data, kinematics and uncertainties contained in Commondata files. + A CommonData is only defined by its name and the enabled variant. + + The information from CommonData is provided by the following properties + - metadata: all metadata information for the dataset + - data: central data for the dataset + - uncertainties: uncertainties of the dataset + - kinematics: kinematic information + """ + + name: str + variant: typing.Optional[str] = None + + def enable_variant(self, new_variant): + if new_variant != self.variant: + self.variant = new_variant + self.metadata.enable_variant(self.variant) + # Delete loaded information as it will need to be recomputed + del self.data + del self.uncertainties + + # The files where the CommonData information is retreived from as defined by the metadata + @property + def metadata_file(self): + return _folder_data / self.name / "metadata.yaml" + + @property + def data_file(self): + return _folder_data / self.name / self.metadata.data_central + + @property + def uncertainity_files(self): + return [_folder_data / self.name / i for i in self.metadata.data_uncertainties] + + @property + def kinematics_file(self): + return _folder_data / self.name / self.metadata.kinematics.file + + @property + def ndata(self): + return self.metadata.ndata + + @cached_property + def metadata(self): + ret = parse_yaml_inp(self.metadata_file, CommonMetaData) + if self.variant: + ret.enable_variant(self.variant) + return ret + + @cached_property + def data(self): + """Pandas DataFrame containing the central data""" + datayaml = yaml.safe_load(self.data_file.read_text(encoding="utf-8")) + data_df = pd.DataFrame( + datayaml["data_central"], index=range(1, self.ndata + 1), columns=["data"] + ) + data_df.index.name = "index" + return data_df + + @cached_property + def uncertainties(self): + """Pandas DataFrame containing all uncertainties""" + # TODO: uncertainties are complicated enough that they _might_ need their own class + all_df = [] + for ufile in self.uncertainity_files: + uncyaml = yaml.safe_load(ufile.read_text()) + + mindex = pd.MultiIndex.from_tuples( + [(k, v["treatment"], v["type"]) for k, v in uncyaml["definition"].items()], + names=["name", "treatment", "type"], + ) + # I'm guessing there will be a better way of doing this than calling dataframe twice for the same thing? + final_df = pd.DataFrame( + pd.DataFrame(uncyaml["bins"]).values, columns=mindex, index=range(1, self.ndata + 1) + ) + final_df.index.name = "index" + all_df.append(final_df) + return pd.concat(all_df, axis=1) + + @cached_property + def kinematics(self): + """Pandas DataFrame containing kinematic information""" + kinyaml = yaml.safe_load(self.kinematics_file.read_text()) + + kin_dict = {i + 1: pd.DataFrame(d).stack() for i, d in enumerate(kinyaml["bins"])} + kin_df = pd.concat(kin_dict, axis=1, names=["index"]).swaplevel(0, 1).T + return kin_df def parse_commondata_folder(commondata, variant=None): """Given a commondata folder, parse the entire content into the appropiate objects""" - # First read the metadata which will define the commondata being read - metadata_file = commondata / "metadata.yaml" - common_meta = parse_yaml_inp(metadata_file, CommonMetaData) - if variant is not None: - common_meta.enable_variant(variant) - - # - return common_meta + cmdata = _CommonData(commondata, variant=variant) + return cmdata def parse_commondata_metadata(metadata_file): From 83957cc5be47ff1488614d27a23f491dc2aa06bf Mon Sep 17 00:00:00 2001 From: juacrumar Date: Sat, 27 Aug 2022 14:48:36 +0200 Subject: [PATCH 3/7] make apfelcomb fixes its own class, simplify validpath --- ...ground for the new commondata format.ipynb | 2 +- validphys2/src/validphys/commondataparser.py | 35 ++++++++++++++++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Playground for the new commondata format.ipynb b/Playground for the new commondata format.ipynb index 61b9b35bc4..eb70c113b3 100644 --- a/Playground for the new commondata format.ipynb +++ b/Playground for the new commondata format.ipynb @@ -1049,7 +1049,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/validphys2/src/validphys/commondataparser.py b/validphys2/src/validphys/commondataparser.py index 10131b39d2..2d8812df72 100644 --- a/validphys2/src/validphys/commondataparser.py +++ b/validphys2/src/validphys/commondataparser.py @@ -36,22 +36,47 @@ @Parser def ValidPath(path_str: str) -> Path: """Parse strings into paths""" - try: - return Path(path_str) - except Exception as e: - raise ValidationError(f"{path_str} is not a valid path") from e + return Path(path_str) @Parser def ValidOperation(op_str: str) -> str: """Ensures that the operation defined in the commondata file is implemented in validphys""" ret = op_str.upper() + # TODO: make eventually operations into an enum if ret not in convolution.OP: raise ValidationError(f"The operation '{op_str}' is not implemented in validphys") return ret # Auxiliary objects +@dataclass +class ApfelComb: + """Some of the grids might have been converted from apfelcomb and introduce hacks. + These are the allowed hacks: + - repetition_flags: + list of fktables which might need to be repeated + necessary to apply c-factors in compound observables + - normalization: + mapping with the single fktables which need to be normalized and the factor + note that when they are global factors they are promoted to conversion_factor + - shifts: + mapping with the single fktables and their respective shifts + necessary to create "gaps" that some cfactors or datasets might expect + """ + + repetition_flags: typing.Optional[typing.List[str]] = None + normalization: typing.Optional[dict] = None + shifts: typing.Optional[dict] = None + + @classmethod + def parser(cls, meta: dict): + return parse_input(meta, cls) + + +ValidApfelComb = Parser(ApfelComb.parser) + + @dataclass class TheoryMeta: """Contains the necessary information to load the associated fktables""" @@ -59,7 +84,7 @@ class TheoryMeta: FK_tables: list operation: ValidOperation conversion_factor: float = 1.0 - apfelcomb: typing.Optional[dict] = None + apfelcomb: typing.Optional[ValidApfelComb] = None @classmethod def parser(cls, meta: dict): From 68244b1ab92673ce3b9516365f1c94899f7281ab Mon Sep 17 00:00:00 2001 From: juacrumar Date: Sat, 27 Aug 2022 23:32:51 +0200 Subject: [PATCH 4/7] ensure the commondataparser is compatible with theory 400 --- ...ground for the new commondata format.ipynb | 4 +- validphys2/src/validphys/commondataparser.py | 45 +++++++++++++----- validphys2/src/validphys/core.py | 4 +- validphys2/src/validphys/loader.py | 10 ++-- validphys2/src/validphys/pineparser.py | 47 +++++++------------ 5 files changed, 57 insertions(+), 53 deletions(-) diff --git a/Playground for the new commondata format.ipynb b/Playground for the new commondata format.ipynb index eb70c113b3..c422f49932 100644 --- a/Playground for the new commondata format.ipynb +++ b/Playground for the new commondata format.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "cc3f217c", "metadata": {}, "outputs": [ @@ -102,7 +102,7 @@ "[260 rows x 1 columns]" ] }, - "execution_count": 1, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } diff --git a/validphys2/src/validphys/commondataparser.py b/validphys2/src/validphys/commondataparser.py index 2d8812df72..63981b4c33 100644 --- a/validphys2/src/validphys/commondataparser.py +++ b/validphys2/src/validphys/commondataparser.py @@ -17,7 +17,6 @@ """ from copy import copy from functools import cached_property -from operator import attrgetter from dataclasses import dataclass, field from pathlib import Path import typing @@ -27,11 +26,12 @@ from validobj.custom import Parser from validobj import ValidationError, parse_input -from validphys import convolution from validphys.utils import parse_yaml_inp -from validphys.core import peek_commondata_metadata from validphys.coredata import CommonData +EXT = "pineappl.lz4" + + # Auxiliary parser for common types or sanity checks @Parser def ValidPath(path_str: str) -> Path: @@ -43,8 +43,11 @@ def ValidPath(path_str: str) -> Path: def ValidOperation(op_str: str) -> str: """Ensures that the operation defined in the commondata file is implemented in validphys""" ret = op_str.upper() - # TODO: make eventually operations into an enum - if ret not in convolution.OP: + # TODO: move accepted operations to this module so that the convolution receives an operation to apply + # instead of an operation to understand + from validphys.convolution import OP + + if ret not in OP: raise ValidationError(f"The operation '{op_str}' is not implemented in validphys") return ret @@ -54,7 +57,7 @@ def ValidOperation(op_str: str) -> str: class ApfelComb: """Some of the grids might have been converted from apfelcomb and introduce hacks. These are the allowed hacks: - - repetition_flags: + - repetition_flag: list of fktables which might need to be repeated necessary to apply c-factors in compound observables - normalization: @@ -65,7 +68,7 @@ class ApfelComb: necessary to create "gaps" that some cfactors or datasets might expect """ - repetition_flags: typing.Optional[typing.List[str]] = None + repetition_flag: typing.Optional[typing.List[str]] = None normalization: typing.Optional[dict] = None shifts: typing.Optional[dict] = None @@ -73,21 +76,34 @@ class ApfelComb: def parser(cls, meta: dict): return parse_input(meta, cls) - ValidApfelComb = Parser(ApfelComb.parser) - @dataclass class TheoryMeta: """Contains the necessary information to load the associated fktables""" - FK_tables: list + FK_tables: typing.List[list] operation: ValidOperation - conversion_factor: float = 1.0 + conversion_factor: float = 1.0 + comment: typing.Optional[str] = None apfelcomb: typing.Optional[ValidApfelComb] = None - + # The following options are transitional so that the yamldb can be used from the theory + appl: typing.Optional[bool] = False + target_dataset: typing.Optional[str] = None + + def fktables_to_paths(self, grids_folder): + """Given a source for pineappl grids, constructs the lists of fktables + to be loaded""" + ret = [] + for operand in self.FK_tables: + ret.append([grids_folder / f"{m}.{EXT}" for m in operand]) + return ret + @classmethod def parser(cls, meta: dict): + """The yaml databases in the server use "operands" instead of "FK_tables" """ + if "operands" in meta: + meta["FK_tables"] = meta.pop("operands") return parse_input(meta, cls) @@ -340,6 +356,11 @@ def parse_commondata(commondatafile, systypefile, setname): ndata = len(commondatatable) commondataproc = commondatatable["process"][1] # Check for consistency with commondata metadata + # TODO: the check for consistency would introduce a circular import + # this entire function is to be removed _anyway_ + from validphys.core import peek_commondata_metadata + from operator import attrgetter + cdmetadata = peek_commondata_metadata(commondatafile) if (setname, nsys, ndata) != attrgetter("name", "nsys", "ndata")(cdmetadata): raise ValueError("Commondata table information does not match metadata") diff --git a/validphys2/src/validphys/core.py b/validphys2/src/validphys/core.py index 694135e3ae..2214866c4a 100644 --- a/validphys2/src/validphys/core.py +++ b/validphys2/src/validphys/core.py @@ -558,8 +558,8 @@ def __init__(self, fkpath, cfactors, metadata=None): # If this is a yaml file that loads an applgrid-converted pineappl, # keep also the name of the target # this is needed since we can now easily reutilize grids - if not self.legacy and self.metadata.get("appl"): - super().__init__(fkpath, cfactors, self.metadata.get("target_dataset")) + if not self.legacy and self.metadata.appl: + super().__init__(fkpath, cfactors, self.metadata.target_dataset) else: super().__init__(fkpath, cfactors) diff --git a/validphys2/src/validphys/loader.py b/validphys2/src/validphys/loader.py index d9a86bb092..678775958e 100644 --- a/validphys2/src/validphys/loader.py +++ b/validphys2/src/validphys/loader.py @@ -365,15 +365,13 @@ def check_fkyaml(self, name, theoryID, cfac): Receives a yaml file describing the fktables necessary for a given observable the theory ID and the corresponding cfactors """ - theory = self.check_theoryID(theoryID) - fkpath = (theory.yamldb_path / name).with_suffix(".yaml") - metadata, fklist = pineparser.get_yaml_information(fkpath, theory.path) - op = metadata["operation"] + _, theopath = self.check_theoryID(theoryID) + metadata, fklist = pineparser.get_yaml_information(fkpath, theopath) # TODO: # at the moment there are no pineappl specific c-factors # so they need to be loaded from the NNPDF names / compounds files - cfac_name = metadata["target_dataset"] + cfac_name = metadata.target_dataset # check whether there is a compound file cpath = theory.path / "compound" / f"FK_{cfac_name}-COMPOUND.dat" if cpath.exists(): @@ -385,7 +383,7 @@ def check_fkyaml(self, name, theoryID, cfac): ### fkspecs = [FKTableSpec(i, c, metadata) for i, c in zip(fklist, cfactors)] - return fkspecs, op + return fkspecs, metadata.operation def check_compound(self, theoryID, setname, cfac): thid, theopath = self.check_theoryID(theoryID) diff --git a/validphys2/src/validphys/pineparser.py b/validphys2/src/validphys/pineparser.py index 4a3954a3f9..eaa076292c 100644 --- a/validphys2/src/validphys/pineparser.py +++ b/validphys2/src/validphys/pineparser.py @@ -10,9 +10,7 @@ from reportengine.compat import yaml from validphys.coredata import FKTableData - -########### This part might eventually be part of whatever commondata reader -EXT = "pineappl.lz4" +from validphys.commondataparser import TheoryMeta, EXT class YamlFileNotFound(FileNotFoundError): @@ -44,7 +42,7 @@ def _load_yaml(yaml_file): return ret -def pineko_yaml(yaml_file, grids_folder, check_grid_existence=True): +def pineko_yaml(yaml_file, grids_folder): """Given a yaml_file, returns the corresponding dictionary and grids. The dictionary contains all information and we return an extra field @@ -56,8 +54,6 @@ def pineko_yaml(yaml_file, grids_folder, check_grid_existence=True): path of the yaml file for the given dataset grids_folder : pathlib.Path path of the grids folder - check_grid_existence: bool - if True (default) checks whether the grid exists Returns ------- @@ -71,22 +67,10 @@ def pineko_yaml(yaml_file, grids_folder, check_grid_existence=True): # TODO: the theory metadata can be found inside the commondata metadata # however, for the time being, pineappl tables contain this information in the `yamldb` database # they should be 100% compatible (and if they are not there is something wrong somewhere) - # For now this is inside just to check for compatibility (as there are circular imports to fix) - from validphys.commondataparser import ValidTheory - theory_meta = ValidTheory(yaml_content) - - # Turn the operands and the members into paths (and check all of them exist) - ret = [] - for operand in yaml_content["operands"]: - tmp = [] - for member in operand: - p = grids_folder / f"{member}.{EXT}" - if not p.exists() and check_grid_existence: - raise GridFileNotFound(f"Failed to find {p}") - tmp.append(p) - ret.append(tmp) - - return yaml_content, ret + # so already at this stage, use TheoryMeta parser to get the metadata for pineappl theories + theory_meta = TheoryMeta.parser(yaml_content) # TODO: why ValidTheory is not usable here? + member_paths = theory_meta.fktables_to_paths(grids_folder) + return theory_meta, member_paths def pineko_apfelcomb_compatibility_flags(gridpaths, metadata): @@ -127,7 +111,8 @@ def pineko_apfelcomb_compatibility_flags(gridpaths, metadata): shift: list(int) Shift in the data index for each grid that forms the fktable """ - if metadata.get("apfelcomb") is None: + apfelcomb = metadata.apfelcomb + if apfelcomb is None: return None # Can't pathlib understand double suffixes? @@ -135,24 +120,24 @@ def pineko_apfelcomb_compatibility_flags(gridpaths, metadata): ret = {} # Check whether we have a normalization active and whether it affects any of the grids - if metadata["apfelcomb"].get("normalization") is not None: - norm_info = metadata["apfelcomb"]["normalization"] + if apfelcomb.normalization is not None: + norm_info = apfelcomb.normalization # Now fill the operands that need normalization ret["normalization"] = [norm_info.get(op, 1.0) for op in operands] # Check whether the repetition flag is active - if metadata["apfelcomb"].get("repetition_flag") is not None: + if apfelcomb.repetition_flag is not None: if len(operands) == 1: - ret["repetition_flag"] = operands[0] in metadata["apfelcomb"]["repetition_flag"] + ret["repetition_flag"] = operands[0] in apfelcomb.repetition_flag else: # Just for the sake of it, let's check whether we did something stupid - if any(op in metadata["apfelcomb"]["repetition_flag"] for op in operands): + if any(op in apfelcomb.repetition_flag for op in operands): raise ValueError(f"The yaml info for {metadata['target_dataset']} is broken") # Check whether the dataset has shifts # NOTE: this only happens for ATLASZPT8TEVMDIST, if that gets fixed we might as well remove it - if metadata["apfelcomb"].get("shifts") is not None: - shift_info = metadata["apfelcomb"]["shifts"] + if apfelcomb.shifts is not None: + shift_info = apfelcomb.shifts ret["shifts"] = [shift_info.get(op, 0) for op in operands] return ret @@ -290,7 +275,7 @@ def pineappl_reader(fkspec): ndata += apfelcomb["shifts"][i] # Check conversion factors and remove the x* from the fktable - raw_fktable *= fkspec.metadata.get("conversion_factor", 1.0) / xdivision + raw_fktable *= fkspec.metadata.conversion_factor / xdivision # Create the multi-index for the dataframe # for optimized pineappls different grids can potentially have different indices From a9bbdc39243a1040650f010f7ed2cd36786610b3 Mon Sep 17 00:00:00 2001 From: juacrumar Date: Wed, 31 Aug 2022 10:21:51 +0200 Subject: [PATCH 5/7] typing.List -> list --- ...ground for the new commondata format.ipynb | 20 +++++++++- validphys2/src/validphys/commondataparser.py | 40 +++++++++---------- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/Playground for the new commondata format.ipynb b/Playground for the new commondata format.ipynb index c422f49932..df42fe77af 100644 --- a/Playground for the new commondata format.ipynb +++ b/Playground for the new commondata format.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "cc3f217c", "metadata": {}, "outputs": [ @@ -102,7 +102,7 @@ "[260 rows x 1 columns]" ] }, - "execution_count": 2, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -1031,6 +1031,22 @@ " \n", "data_df" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82140044", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3cee3516", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/validphys2/src/validphys/commondataparser.py b/validphys2/src/validphys/commondataparser.py index 63981b4c33..b50f0a3a1a 100644 --- a/validphys2/src/validphys/commondataparser.py +++ b/validphys2/src/validphys/commondataparser.py @@ -19,7 +19,7 @@ from functools import cached_property from dataclasses import dataclass, field from pathlib import Path -import typing +from typing import Optional import pandas as pd from reportengine.compat import yaml @@ -68,9 +68,9 @@ class ApfelComb: necessary to create "gaps" that some cfactors or datasets might expect """ - repetition_flag: typing.Optional[typing.List[str]] = None - normalization: typing.Optional[dict] = None - shifts: typing.Optional[dict] = None + repetition_flag: Optional[list[str]] = None + normalization: Optional[dict] = None + shifts: Optional[dict] = None @classmethod def parser(cls, meta: dict): @@ -82,14 +82,14 @@ def parser(cls, meta: dict): class TheoryMeta: """Contains the necessary information to load the associated fktables""" - FK_tables: typing.List[list] + FK_tables: list[list] operation: ValidOperation conversion_factor: float = 1.0 - comment: typing.Optional[str] = None - apfelcomb: typing.Optional[ValidApfelComb] = None + comment: Optional[str] = None + apfelcomb: Optional[ValidApfelComb] = None # The following options are transitional so that the yamldb can be used from the theory - appl: typing.Optional[bool] = False - target_dataset: typing.Optional[str] = None + appl: Optional[bool] = False + target_dataset: Optional[str] = None def fktables_to_paths(self, grids_folder): """Given a source for pineappl grids, constructs the lists of fktables @@ -116,7 +116,7 @@ class KinematicsMeta: @classmethod def parser(cls, meta: dict): - parse_input(meta, cls) + return parse_input(meta, cls) @dataclass @@ -125,7 +125,7 @@ class ReferenceMeta: url: str version: int = 0 - tables: typing.List[int] = field(default_factory=list) + tables: list[int] = field(default_factory=list) @classmethod def parser(cls, meta: dict): @@ -136,7 +136,7 @@ def parser(cls, meta: dict): class Variant: """Defines the keys of the CommonMetaData that can be overwritten""" - data_uncertainties: typing.List[ValidPath] + data_uncertainties: list[ValidPath] # Define parsers for the more complicated structures @@ -162,20 +162,20 @@ class CommonMetaData: kinematics: ValidKinematics kinematic_coverage: dict data_central: ValidPath - data_uncertainties: typing.List[ValidPath] + data_uncertainties: list[ValidPath] dataset_label: str plot_x: str - figure_by: typing.List[str] + figure_by: list[str] theory: ValidTheory nnpdf_metadata: dict version: int version_comment: str = "" - arXiv: typing.Optional[ValidReference] = None - iNSPIRE: typing.Optional[ValidReference] = None - hepdata: typing.Optional[ValidReference] = None - variants: typing.Optional[ValidVariants] = None + arXiv: Optional[ValidReference] = None + iNSPIRE: Optional[ValidReference] = None + hepdata: Optional[ValidReference] = None + variants: Optional[ValidVariants] = None - _enabled_variant: typing.List[str] = field(default=None, repr=False) + _enabled_variant: list[str] = field(default=None, repr=False) _default: dict = field(default=None, repr=False) # TODO: these methods will be moved to the main CommonData class @@ -224,7 +224,7 @@ class _CommonData: """ name: str - variant: typing.Optional[str] = None + variant: Optional[str] = None def enable_variant(self, new_variant): if new_variant != self.variant: From e39b513557da6c3fe3d3838063d27ce8610bfc34 Mon Sep 17 00:00:00 2001 From: juacrumar Date: Wed, 14 Dec 2022 11:42:04 +0100 Subject: [PATCH 6/7] remove unnecessary parsers --- ...ground for the new commondata format.ipynb | 25 +++---------- buildmaster/NMCPD/metadata.yaml | 3 ++ validphys2/src/validphys/commondataparser.py | 37 +++++-------------- 3 files changed, 18 insertions(+), 47 deletions(-) diff --git a/Playground for the new commondata format.ipynb b/Playground for the new commondata format.ipynb index df42fe77af..b534c9c058 100644 --- a/Playground for the new commondata format.ipynb +++ b/Playground for the new commondata format.ipynb @@ -108,6 +108,9 @@ } ], "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", "from pathlib import Path\n", "import pandas as pd\n", "import numpy as np\n", @@ -1031,29 +1034,13 @@ " \n", "data_df" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "82140044", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3cee3516", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "nnvortex", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "nnvortex" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -1065,7 +1052,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.8" } }, "nbformat": 4, diff --git a/buildmaster/NMCPD/metadata.yaml b/buildmaster/NMCPD/metadata.yaml index cdd23273ea..5a39e97d12 100644 --- a/buildmaster/NMCPD/metadata.yaml +++ b/buildmaster/NMCPD/metadata.yaml @@ -49,6 +49,9 @@ figure_by: # Theory theory: + apfelcomb: + repetition_flag: + - NMCPD_P FK_tables: - - NMCPD_D1 - NMCPD_D2 diff --git a/validphys2/src/validphys/commondataparser.py b/validphys2/src/validphys/commondataparser.py index b50f0a3a1a..7714bbcace 100644 --- a/validphys2/src/validphys/commondataparser.py +++ b/validphys2/src/validphys/commondataparser.py @@ -19,7 +19,7 @@ from functools import cached_property from dataclasses import dataclass, field from pathlib import Path -from typing import Optional +from typing import Optional, Dict import pandas as pd from reportengine.compat import yaml @@ -53,8 +53,9 @@ def ValidOperation(op_str: str) -> str: # Auxiliary objects + @dataclass -class ApfelComb: +class ValidApfelComb: """Some of the grids might have been converted from apfelcomb and introduce hacks. These are the allowed hacks: - repetition_flag: @@ -72,11 +73,6 @@ class ApfelComb: normalization: Optional[dict] = None shifts: Optional[dict] = None - @classmethod - def parser(cls, meta: dict): - return parse_input(meta, cls) - -ValidApfelComb = Parser(ApfelComb.parser) @dataclass class TheoryMeta: @@ -106,47 +102,32 @@ def parser(cls, meta: dict): meta["FK_tables"] = meta.pop("operands") return parse_input(meta, cls) +ValidTheory = Parser(TheoryMeta.parser) @dataclass -class KinematicsMeta: +class ValidKinematics: """Contains all metadata for the kinematics of the dataset""" file: ValidPath variables: dict - @classmethod - def parser(cls, meta: dict): - return parse_input(meta, cls) - @dataclass -class ReferenceMeta: +class ValidReference: """Holds literature information for the dataset""" - url: str version: int = 0 tables: list[int] = field(default_factory=list) - @classmethod - def parser(cls, meta: dict): - return parse_input(meta, cls) - @dataclass class Variant: """Defines the keys of the CommonMetaData that can be overwritten""" - data_uncertainties: list[ValidPath] -# Define parsers for the more complicated structures -ValidTheory = Parser(TheoryMeta.parser) -ValidReference = Parser(ReferenceMeta.parser) -ValidKinematics = Parser(KinematicsMeta.parser) - - @Parser -def ValidVariants(variant_dict: dict) -> dict: +def ValidVariants(variant_dict: dict) -> Dict[str, Variant]: """Variants of a dataset are allowed to overwrite a subset of the keys of a dataset (those defined in the Variant dataclass). This wrapper class runs over the dictionary of variant and parses them into valid Variants @@ -178,8 +159,8 @@ class CommonMetaData: _enabled_variant: list[str] = field(default=None, repr=False) _default: dict = field(default=None, repr=False) - # TODO: these methods will be moved to the main CommonData class - # as any change of variant should trigger a reload of the commondata + # TODO: enabling a variant will not modify the CommonMetaData + # but rather create a new instance of CommonMetaData def enable_variant(self, variant): """Enable a variant for this class by giving its name. Note that more than one variant can be enabled at once, but the last one will take priority From a13dde319eda264cfa26a9b0edf395545cae89e4 Mon Sep 17 00:00:00 2001 From: juacrumar Date: Wed, 14 Dec 2022 13:47:17 +0100 Subject: [PATCH 7/7] never modify in-place, return new instance --- ...ground for the new commondata format.ipynb | 18 ++- validphys2/src/validphys/commondataparser.py | 130 ++++++++++-------- 2 files changed, 87 insertions(+), 61 deletions(-) diff --git a/Playground for the new commondata format.ipynb b/Playground for the new commondata format.ipynb index b534c9c058..69ec538ad8 100644 --- a/Playground for the new commondata format.ipynb +++ b/Playground for the new commondata format.ipynb @@ -134,7 +134,7 @@ "metadata = yaml.safe_load(metadata_file.read_text())\n", "ndata = metadata[\"ndata\"]\n", "\n", - "ret = parse_commondata_folder(DATASET, variant=\"shifted\")\n", + "ret = parse_commondata_folder(DATASET, variants=[\"shifted\"])\n", "ret.data" ] }, @@ -1034,6 +1034,22 @@ " \n", "data_df" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e0e4ab3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b32b815", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/validphys2/src/validphys/commondataparser.py b/validphys2/src/validphys/commondataparser.py index 7714bbcace..a23b991f4e 100644 --- a/validphys2/src/validphys/commondataparser.py +++ b/validphys2/src/validphys/commondataparser.py @@ -15,11 +15,9 @@ by modifying the CommonMetaData using one of the loaded Variants one can change the resulting :py:class:`validphys.coredata.CommonData` object. """ -from copy import copy -from functools import cached_property -from dataclasses import dataclass, field from pathlib import Path from typing import Optional, Dict +import dataclasses import pandas as pd from reportengine.compat import yaml @@ -54,7 +52,8 @@ def ValidOperation(op_str: str) -> str: # Auxiliary objects -@dataclass + +@dataclasses.dataclass class ValidApfelComb: """Some of the grids might have been converted from apfelcomb and introduce hacks. These are the allowed hacks: @@ -74,13 +73,13 @@ class ValidApfelComb: shifts: Optional[dict] = None -@dataclass +@dataclasses.dataclass class TheoryMeta: """Contains the necessary information to load the associated fktables""" FK_tables: list[list] operation: ValidOperation - conversion_factor: float = 1.0 + conversion_factor: float = 1.0 comment: Optional[str] = None apfelcomb: Optional[ValidApfelComb] = None # The following options are transitional so that the yamldb can be used from the theory @@ -94,7 +93,7 @@ def fktables_to_paths(self, grids_folder): for operand in self.FK_tables: ret.append([grids_folder / f"{m}.{EXT}" for m in operand]) return ret - + @classmethod def parser(cls, meta: dict): """The yaml databases in the server use "operands" instead of "FK_tables" """ @@ -102,9 +101,11 @@ def parser(cls, meta: dict): meta["FK_tables"] = meta.pop("operands") return parse_input(meta, cls) + ValidTheory = Parser(TheoryMeta.parser) -@dataclass + +@dataclasses.dataclass class ValidKinematics: """Contains all metadata for the kinematics of the dataset""" @@ -112,17 +113,19 @@ class ValidKinematics: variables: dict -@dataclass +@dataclasses.dataclass class ValidReference: """Holds literature information for the dataset""" + url: str version: int = 0 - tables: list[int] = field(default_factory=list) + tables: list[int] = dataclasses.field(default_factory=list) -@dataclass +@dataclasses.dataclass class Variant: """Defines the keys of the CommonMetaData that can be overwritten""" + data_uncertainties: list[ValidPath] @@ -135,7 +138,7 @@ def ValidVariants(variant_dict: dict) -> Dict[str, Variant]: return {k: parse_input(v, Variant) for k, v in variant_dict.items()} -@dataclass +@dataclasses.dataclass class CommonMetaData: setname: str ndata: int @@ -154,36 +157,19 @@ class CommonMetaData: arXiv: Optional[ValidReference] = None iNSPIRE: Optional[ValidReference] = None hepdata: Optional[ValidReference] = None - variants: Optional[ValidVariants] = None + variants: Optional[ValidVariants] = dataclasses.field(default_factory=dict) - _enabled_variant: list[str] = field(default=None, repr=False) - _default: dict = field(default=None, repr=False) + def apply_variant(self, variant_name): + """Return a new instance of this class with the variant applied - # TODO: enabling a variant will not modify the CommonMetaData - # but rather create a new instance of CommonMetaData - def enable_variant(self, variant): - """Enable a variant for this class by giving its name. - Note that more than one variant can be enabled at once, but the last one will take priority + This class also defines how the variant is applied to the commondata """ - if variant is None: - return self.disable_variants() - if self.variants is None: - raise ValueError(f"There are no variants defined for {self.setname}") - if variant not in self.variants: - raise ValueError(f"The variant {variant} is not defined for {self.setname}") - # If there were not enabled variants, save the current state of the class - if self._enabled_variant is None: - # A shallow copy is enough because the variants update attributes of this class - self._default = copy(self.__dict__) - self._enabled_variant = [] - - self.__dict__.update(self.variants[variant].__dict__.items()) - self._enabled_variant.append(variant) - - def disable_variants(self): - """Get the CommonMetaData back to its original state""" - if self._default is not None: - self.__dict__.update(self._default) + try: + variant = self.variants[variant_name] + except KeyError as e: + raise ValueError(f"The requested variant does not exist in {ret.name}") from e + + return dataclasses.replace(self, data_uncertainties=variant.data_uncertainties) # TODO: will be moved to coredata.py and will substitute CommonData.py @@ -191,11 +177,11 @@ def disable_variants(self): _folder_data = Path(__file__).parent / "../../../buildmaster" -@dataclass +@dataclasses.dataclass class _CommonData: """ Data, kinematics and uncertainties contained in Commondata files. - A CommonData is only defined by its name and the enabled variant. + A CommonData is only defined by its name and the enabled variant(s). The information from CommonData is provided by the following properties - metadata: all metadata information for the dataset @@ -205,15 +191,29 @@ class _CommonData: """ name: str - variant: Optional[str] = None + variants: list[str] = dataclasses.field(default_factory=list) + + _metadata: Optional[CommonMetaData] = None def enable_variant(self, new_variant): - if new_variant != self.variant: - self.variant = new_variant - self.metadata.enable_variant(self.variant) - # Delete loaded information as it will need to be recomputed - del self.data - del self.uncertainties + """Function to enable a new variant for the CommonData + This function checks whether the variant is accepted and, if it is, + it gets added to the ``variants`` property of this class so that + when the metadata is accessed it contains the variant information. + + The attribute ``metadata`` gets then replace with a new instance of ``CommonMetaData`` + """ + if new_variant is None: + # Reset the metadata to the unvaried state + self.variants = [] + self._metadata = None + return + + if new_variant not in self.metadata.variants: + raise ValueError(f"The requested variant does not exist in {self.name}") + + self.variants.append(new_variant) + self._metadata = None # The files where the CommonData information is retreived from as defined by the metadata @property @@ -236,14 +236,20 @@ def kinematics_file(self): def ndata(self): return self.metadata.ndata - @cached_property + @property def metadata(self): - ret = parse_yaml_inp(self.metadata_file, CommonMetaData) - if self.variant: - ret.enable_variant(self.variant) - return ret + if self._metadata is None: + # Read the metadata for the first time + ret = parse_yaml_inp(self.metadata_file, CommonMetaData) + + # Iterate over variants to update the information in the original metadata + for variant_name in self.variants: + ret = ret.apply_variant(variant_name) - @cached_property + self._metadata = ret + return self._metadata + + @property def data(self): """Pandas DataFrame containing the central data""" datayaml = yaml.safe_load(self.data_file.read_text(encoding="utf-8")) @@ -253,7 +259,7 @@ def data(self): data_df.index.name = "index" return data_df - @cached_property + @property def uncertainties(self): """Pandas DataFrame containing all uncertainties""" # TODO: uncertainties are complicated enough that they _might_ need their own class @@ -267,13 +273,15 @@ def uncertainties(self): ) # I'm guessing there will be a better way of doing this than calling dataframe twice for the same thing? final_df = pd.DataFrame( - pd.DataFrame(uncyaml["bins"]).values, columns=mindex, index=range(1, self.ndata + 1) + pd.DataFrame(uncyaml["bins"]).values, + columns=mindex, + index=range(1, self.ndata + 1), ) final_df.index.name = "index" all_df.append(final_df) return pd.concat(all_df, axis=1) - @cached_property + @property def kinematics(self): """Pandas DataFrame containing kinematic information""" kinyaml = yaml.safe_load(self.kinematics_file.read_text()) @@ -283,9 +291,11 @@ def kinematics(self): return kin_df -def parse_commondata_folder(commondata, variant=None): - """Given a commondata folder, parse the entire content into the appropiate objects""" - cmdata = _CommonData(commondata, variant=variant) +def parse_commondata_folder(commondata, variants=[]): + """Given a commondata folder, parse the entire content into the appropiate objects + A list of variants can be also given + """ + cmdata = _CommonData(commondata, variants=variants) return cmdata