From de4605a73b54c6b6bf266a5fa7ff82c9132120ec Mon Sep 17 00:00:00 2001 From: juacrumar Date: Thu, 18 Aug 2022 09:38:13 +0200 Subject: [PATCH 1/6] add integrability observables for evolution basis --- .../NNPDF_INTEG_XT3_40/integrability.yaml | 6 ++ pinecards/NNPDF_INTEG_XT3_40/metadata.txt | 10 ++ .../NNPDF_INTEG_XT8_40/integrability.yaml | 6 ++ pinecards/NNPDF_INTEG_XT8_40/metadata.txt | 10 ++ pinefarm/external/integrability.py | 99 +++++++++++++++++++ pinefarm/info.py | 5 +- 6 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 pinecards/NNPDF_INTEG_XT3_40/integrability.yaml create mode 100644 pinecards/NNPDF_INTEG_XT3_40/metadata.txt create mode 100644 pinecards/NNPDF_INTEG_XT8_40/integrability.yaml create mode 100644 pinecards/NNPDF_INTEG_XT8_40/metadata.txt create mode 100644 pinefarm/external/integrability.py diff --git a/pinecards/NNPDF_INTEG_XT3_40/integrability.yaml b/pinecards/NNPDF_INTEG_XT3_40/integrability.yaml new file mode 100644 index 00000000..0434e812 --- /dev/null +++ b/pinecards/NNPDF_INTEG_XT3_40/integrability.yaml @@ -0,0 +1,6 @@ +hadron_pid: 2212 +lepton_pid: 11 +flavour: 103 +q2: 2.7225 +xgrid: + - 1.0e-9 diff --git a/pinecards/NNPDF_INTEG_XT3_40/metadata.txt b/pinecards/NNPDF_INTEG_XT3_40/metadata.txt new file mode 100644 index 00000000..fdeffad4 --- /dev/null +++ b/pinecards/NNPDF_INTEG_XT3_40/metadata.txt @@ -0,0 +1,10 @@ +description=Integrability for T3 +x1_label=Q2 +x1_label_tex=$Q^2$ +x1_unit=GeV^2 +x2_label=T3 +x2_label_tex=$\sum_i(x_i T_3(x_i))^2$ +x2_unit= +y_label=xfx +y_label_tex=$xf(x)$ +y_unit= diff --git a/pinecards/NNPDF_INTEG_XT8_40/integrability.yaml b/pinecards/NNPDF_INTEG_XT8_40/integrability.yaml new file mode 100644 index 00000000..978c7f27 --- /dev/null +++ b/pinecards/NNPDF_INTEG_XT8_40/integrability.yaml @@ -0,0 +1,6 @@ +hadron_pid: 2212 +lepton_pid: 11 +flavour: 108 +q2: 2.7225 +xgrid: + - 1.0e-9 diff --git a/pinecards/NNPDF_INTEG_XT8_40/metadata.txt b/pinecards/NNPDF_INTEG_XT8_40/metadata.txt new file mode 100644 index 00000000..934ac509 --- /dev/null +++ b/pinecards/NNPDF_INTEG_XT8_40/metadata.txt @@ -0,0 +1,10 @@ +description=Integrability for T8 +x1_label=Q2 +x1_label_tex=$Q^2$ +x1_unit=GeV^2 +x2_label=T8 +x2_label_tex=$\sum_i(x_i T_8(x_i))^2$ +x2_unit= +y_label=xfx +y_label_tex=$xf(x)$ +y_unit= diff --git a/pinefarm/external/integrability.py b/pinefarm/external/integrability.py new file mode 100644 index 00000000..6e0a9769 --- /dev/null +++ b/pinefarm/external/integrability.py @@ -0,0 +1,99 @@ +import yaml +import typing +from dataclasses import dataclass + +import numpy as np +import pandas as pd +from lhapdf import mkPDF +import pineappl +from eko import basis_rotation + +from .. import configs +from . import interface + +_RUNCARD = "integrability.yaml" + + +def is_integrability(name): + """Is this an integrability dataset? + The decision is based on the existence of `integrability.yaml`""" + return (configs.configs["paths"]["runcards"] / name / _RUNCARD).exists() + + +def evolution_to_flavour(evol_fl): + """Uses eko to transform an evolution pid (>100) to flavour basis + in a pineappl-usable way (flavour, weight) + """ + if evol_fl < 100: + return [(evol_fl, 1.0)] + idx = basis_rotation.evol_basis_pids.index(evol_fl) + row = basis_rotation.rotate_flavor_to_evolution[idx] + lumis = [] + for i, w in enumerate(row): + if w != 0.0: + lumis.append((basis_rotation.flavor_basis_pids[i], w)) + return lumis + + +@dataclass +class _IntegrabilityRuncard: + hadron_pid: int + lepton_pid: int + flavour: int + q2: float + xgrid: typing.List[float] + + +class Integrability(interface.External): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + input_card = self.source / _RUNCARD + yaml_dict = yaml.safe_load(input_card.open("r", encoding="utf-8")) + self._info = _IntegrabilityRuncard(**yaml_dict) + self._evo2fl = evolution_to_flavour(self._info.flavour) + + def run(self): + pass + + def generate_pineappl(self): + """Generate the pineappl grid for the integrability observable""" + ## Generate the grid + lumi_entries = [(fl, self._info.lepton_pid, w) for fl, w in self._evo2fl] + luminosities = [pineappl.lumi.LumiEntry(lumi_entries)] + # Set default parameters + orders = [pineappl.grid.Order(0, 0, 0, 0)] + params = pineappl.subgrid.SubgridParams() + # Initialize and parametrize grid + grid = pineappl.grid.Grid.create(luminosities, orders, [0.0, 1.0], params) + grid.set_key_value("initial_state_1", str(self._info.hadron_pid)) + grid.set_key_value("initial_state_2", str(self._info.lepton_pid)) + # Fill grid with x*T8 + # use subgrid because fill doesn't work? + x = self._info.xgrid + w = np.array(x).reshape(1, -1, 1) + sg = pineappl.import_only_subgrid.ImportOnlySubgridV1( + w, [self._info.q2], x, np.ones_like(x) + ) + grid.set_subgrid(0, 0, 0, sg) + grid.write(self.grid) + + def collect_versions(self): + return {"integrability_version": "1.0"} + + def results(self): + pdf = mkPDF(self.pdf) + final_result = 0.0 + q2 = self._info.q2 * np.ones_like(self._info.xgrid) + + for fl, w in self._evo2fl: + final_result += w * np.sum(pdf.xfxQ2(fl, self._info.xgrid, q2)) + final_cv = [final_result] + + d = { + "result": final_cv, + "error": np.zeros_like(final_cv), + "sv_min": np.zeros_like(final_cv), + "sv_max": np.zeros_like(final_cv), + } + return pd.DataFrame(data=d) diff --git a/pinefarm/info.py b/pinefarm/info.py index 1f1bfddd..2d94e18e 100644 --- a/pinefarm/info.py +++ b/pinefarm/info.py @@ -3,7 +3,7 @@ import enum import typing -from .external import interface, mg5, positivity, vrap, yad +from .external import interface, mg5, positivity, vrap, yad, integrability class Kind(enum.Enum): @@ -11,6 +11,7 @@ class Kind(enum.Enum): positivity = enum.auto() ftdy = enum.auto() hadronic = enum.auto() + integrability = enum.auto() @dataclasses.dataclass @@ -29,5 +30,7 @@ def label(dataset: str) -> Info: ) if vrap.is_vrap(dataset): return Info(color="green", external=vrap.Vrap, kind=Kind.ftdy) + if integrability.is_integrability(dataset): + return Info(color="brown", external=integrability.Integrability, kind=Kind.integrability) return Info(color="blue", external=mg5.Mg5, kind=Kind.hadronic) From 8f2ab9f50d9b871cdd1ff0e6a0bb2fa1528d2469 Mon Sep 17 00:00:00 2001 From: juacrumar Date: Thu, 18 Aug 2022 09:48:11 +0200 Subject: [PATCH 2/6] remove x from metadata --- pinecards/NNPDF_INTEG_XT3_40/metadata.txt | 10 ++-------- pinecards/NNPDF_INTEG_XT8_40/metadata.txt | 10 ++-------- pinefarm/external/integrability.py | 2 +- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/pinecards/NNPDF_INTEG_XT3_40/metadata.txt b/pinecards/NNPDF_INTEG_XT3_40/metadata.txt index fdeffad4..97e11ba7 100644 --- a/pinecards/NNPDF_INTEG_XT3_40/metadata.txt +++ b/pinecards/NNPDF_INTEG_XT3_40/metadata.txt @@ -1,10 +1,4 @@ description=Integrability for T3 -x1_label=Q2 -x1_label_tex=$Q^2$ -x1_unit=GeV^2 -x2_label=T3 -x2_label_tex=$\sum_i(x_i T_3(x_i))^2$ -x2_unit= -y_label=xfx -y_label_tex=$xf(x)$ +y_label=xT3 +y_label_tex=$\sum_i(x_i T_3(x_i))$ y_unit= diff --git a/pinecards/NNPDF_INTEG_XT8_40/metadata.txt b/pinecards/NNPDF_INTEG_XT8_40/metadata.txt index 934ac509..44597023 100644 --- a/pinecards/NNPDF_INTEG_XT8_40/metadata.txt +++ b/pinecards/NNPDF_INTEG_XT8_40/metadata.txt @@ -1,10 +1,4 @@ description=Integrability for T8 -x1_label=Q2 -x1_label_tex=$Q^2$ -x1_unit=GeV^2 -x2_label=T8 -x2_label_tex=$\sum_i(x_i T_8(x_i))^2$ -x2_unit= -y_label=xfx -y_label_tex=$xf(x)$ +y_label=xT8 +y_label_tex=$\sum_i(x_i T_8(x_i))$ y_unit= diff --git a/pinefarm/external/integrability.py b/pinefarm/external/integrability.py index 6e0a9769..69648389 100644 --- a/pinefarm/external/integrability.py +++ b/pinefarm/external/integrability.py @@ -71,7 +71,7 @@ def generate_pineappl(self): # Fill grid with x*T8 # use subgrid because fill doesn't work? x = self._info.xgrid - w = np.array(x).reshape(1, -1, 1) + w = np.array(x).reshape((1, -1, 1)) sg = pineappl.import_only_subgrid.ImportOnlySubgridV1( w, [self._info.q2], x, np.ones_like(x) ) From 3a5b7c9dc053707bb74d181c69b5add50c5a385f Mon Sep 17 00:00:00 2001 From: juacrumar Date: Thu, 18 Aug 2022 12:52:41 +0200 Subject: [PATCH 3/6] hack for x2 integrability --- pinefarm/external/integrability.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/pinefarm/external/integrability.py b/pinefarm/external/integrability.py index 69648389..66d2f9dc 100644 --- a/pinefarm/external/integrability.py +++ b/pinefarm/external/integrability.py @@ -1,6 +1,7 @@ import yaml +import json import typing -from dataclasses import dataclass +import dataclasses import numpy as np import pandas as pd @@ -35,7 +36,7 @@ def evolution_to_flavour(evol_fl): return lumis -@dataclass +@dataclasses.dataclass class _IntegrabilityRuncard: hadron_pid: int lepton_pid: int @@ -43,6 +44,9 @@ class _IntegrabilityRuncard: q2: float xgrid: typing.List[float] + def asdict(self): + return dataclasses.asdict(self) + class Integrability(interface.External): def __init__(self, *args, **kwargs): @@ -68,13 +72,13 @@ def generate_pineappl(self): grid = pineappl.grid.Grid.create(luminosities, orders, [0.0, 1.0], params) grid.set_key_value("initial_state_1", str(self._info.hadron_pid)) grid.set_key_value("initial_state_2", str(self._info.lepton_pid)) + grid.set_key_value("runcard", json.dumps(self._info.asdict())) + grid.set_key_value("lumi_id_types", "pdg_mc_ids") # Fill grid with x*T8 # use subgrid because fill doesn't work? x = self._info.xgrid w = np.array(x).reshape((1, -1, 1)) - sg = pineappl.import_only_subgrid.ImportOnlySubgridV1( - w, [self._info.q2], x, np.ones_like(x) - ) + sg = pineappl.import_only_subgrid.ImportOnlySubgridV1(w, [self._info.q2], x, x) grid.set_subgrid(0, 0, 0, sg) grid.write(self.grid) From 4c7238b94b146127e39ab6b9b0787472e0a633bf Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 18 Aug 2022 16:02:41 +0200 Subject: [PATCH 4/6] Run pre-commit and standardize inputs --- pinefarm/external/integrability.py | 19 ++++++++++--------- pinefarm/info.py | 6 ++++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/pinefarm/external/integrability.py b/pinefarm/external/integrability.py index 66d2f9dc..fba13dcc 100644 --- a/pinefarm/external/integrability.py +++ b/pinefarm/external/integrability.py @@ -1,13 +1,14 @@ -import yaml +# -*- coding: utf-8 -*- +import dataclasses import json import typing -import dataclasses +import lhapdf import numpy as np import pandas as pd -from lhapdf import mkPDF import pineappl -from eko import basis_rotation +import yaml +from eko import basis_rotation as br from .. import configs from . import interface @@ -27,12 +28,12 @@ def evolution_to_flavour(evol_fl): """ if evol_fl < 100: return [(evol_fl, 1.0)] - idx = basis_rotation.evol_basis_pids.index(evol_fl) - row = basis_rotation.rotate_flavor_to_evolution[idx] + idx = br.evol_basis_pids.index(evol_fl) + row = br.rotate_flavor_to_evolution[idx] lumis = [] for i, w in enumerate(row): if w != 0.0: - lumis.append((basis_rotation.flavor_basis_pids[i], w)) + lumis.append((br.flavor_basis_pids[i], w)) return lumis @@ -74,7 +75,7 @@ def generate_pineappl(self): grid.set_key_value("initial_state_2", str(self._info.lepton_pid)) grid.set_key_value("runcard", json.dumps(self._info.asdict())) grid.set_key_value("lumi_id_types", "pdg_mc_ids") - # Fill grid with x*T8 + # Fill grid with x*Tn # use subgrid because fill doesn't work? x = self._info.xgrid w = np.array(x).reshape((1, -1, 1)) @@ -86,7 +87,7 @@ def collect_versions(self): return {"integrability_version": "1.0"} def results(self): - pdf = mkPDF(self.pdf) + pdf = lhapdf.mkPDF(self.pdf) final_result = 0.0 q2 = self._info.q2 * np.ones_like(self._info.xgrid) diff --git a/pinefarm/info.py b/pinefarm/info.py index 2d94e18e..4c0f173c 100644 --- a/pinefarm/info.py +++ b/pinefarm/info.py @@ -3,7 +3,7 @@ import enum import typing -from .external import interface, mg5, positivity, vrap, yad, integrability +from .external import integrability, interface, mg5, positivity, vrap, yad class Kind(enum.Enum): @@ -31,6 +31,8 @@ def label(dataset: str) -> Info: if vrap.is_vrap(dataset): return Info(color="green", external=vrap.Vrap, kind=Kind.ftdy) if integrability.is_integrability(dataset): - return Info(color="brown", external=integrability.Integrability, kind=Kind.integrability) + return Info( + color="brown", external=integrability.Integrability, kind=Kind.integrability + ) return Info(color="blue", external=mg5.Mg5, kind=Kind.hadronic) From 62524c6c687703c9d1b5685e74e719d343dc0701 Mon Sep 17 00:00:00 2001 From: juacrumar Date: Thu, 18 Aug 2022 16:01:16 +0200 Subject: [PATCH 5/6] use q0 from theory --- pinecards/NNPDF_INTEG_XT3_40/integrability.yaml | 1 - pinecards/NNPDF_INTEG_XT8_40/integrability.yaml | 1 - pinefarm/external/integrability.py | 7 +++---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/pinecards/NNPDF_INTEG_XT3_40/integrability.yaml b/pinecards/NNPDF_INTEG_XT3_40/integrability.yaml index 0434e812..bd1b8254 100644 --- a/pinecards/NNPDF_INTEG_XT3_40/integrability.yaml +++ b/pinecards/NNPDF_INTEG_XT3_40/integrability.yaml @@ -1,6 +1,5 @@ hadron_pid: 2212 lepton_pid: 11 flavour: 103 -q2: 2.7225 xgrid: - 1.0e-9 diff --git a/pinecards/NNPDF_INTEG_XT8_40/integrability.yaml b/pinecards/NNPDF_INTEG_XT8_40/integrability.yaml index 978c7f27..2bd8afed 100644 --- a/pinecards/NNPDF_INTEG_XT8_40/integrability.yaml +++ b/pinecards/NNPDF_INTEG_XT8_40/integrability.yaml @@ -1,6 +1,5 @@ hadron_pid: 2212 lepton_pid: 11 flavour: 108 -q2: 2.7225 xgrid: - 1.0e-9 diff --git a/pinefarm/external/integrability.py b/pinefarm/external/integrability.py index fba13dcc..c169a208 100644 --- a/pinefarm/external/integrability.py +++ b/pinefarm/external/integrability.py @@ -9,7 +9,6 @@ import pineappl import yaml from eko import basis_rotation as br - from .. import configs from . import interface @@ -42,7 +41,6 @@ class _IntegrabilityRuncard: hadron_pid: int lepton_pid: int flavour: int - q2: float xgrid: typing.List[float] def asdict(self): @@ -55,6 +53,7 @@ def __init__(self, *args, **kwargs): input_card = self.source / _RUNCARD yaml_dict = yaml.safe_load(input_card.open("r", encoding="utf-8")) + self._q2 = np.power(self.theory["Q0"], 2) self._info = _IntegrabilityRuncard(**yaml_dict) self._evo2fl = evolution_to_flavour(self._info.flavour) @@ -79,7 +78,7 @@ def generate_pineappl(self): # use subgrid because fill doesn't work? x = self._info.xgrid w = np.array(x).reshape((1, -1, 1)) - sg = pineappl.import_only_subgrid.ImportOnlySubgridV1(w, [self._info.q2], x, x) + sg = pineappl.import_only_subgrid.ImportOnlySubgridV1(w, [self._q2], x, x) grid.set_subgrid(0, 0, 0, sg) grid.write(self.grid) @@ -89,7 +88,7 @@ def collect_versions(self): def results(self): pdf = lhapdf.mkPDF(self.pdf) final_result = 0.0 - q2 = self._info.q2 * np.ones_like(self._info.xgrid) + q2 = self._q2 * np.ones_like(self._info.xgrid) for fl, w in self._evo2fl: final_result += w * np.sum(pdf.xfxQ2(fl, self._info.xgrid, q2)) From 0f75f665f79cc4803bab532c3062467150754a05 Mon Sep 17 00:00:00 2001 From: Felix Hekhorn Date: Thu, 18 Aug 2022 16:35:04 +0200 Subject: [PATCH 6/6] Run pre-commit --- pinefarm/external/integrability.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pinefarm/external/integrability.py b/pinefarm/external/integrability.py index c169a208..3237c51f 100644 --- a/pinefarm/external/integrability.py +++ b/pinefarm/external/integrability.py @@ -9,6 +9,7 @@ import pineappl import yaml from eko import basis_rotation as br + from .. import configs from . import interface