From d7bfe81136c230982bf017fe9b05990666624efa Mon Sep 17 00:00:00 2001 From: juacrumar Date: Thu, 17 Oct 2024 18:15:53 +0200 Subject: [PATCH 1/6] first batch of changes necessary --- n3fit/src/evolven3fit/eko_utils.py | 37 +++++++++++++++++----- n3fit/src/evolven3fit/evolve.py | 50 +++++++++++++++++++++++++----- 2 files changed, 72 insertions(+), 15 deletions(-) diff --git a/n3fit/src/evolven3fit/eko_utils.py b/n3fit/src/evolven3fit/eko_utils.py index 357a045d84..e1eb52adee 100644 --- a/n3fit/src/evolven3fit/eko_utils.py +++ b/n3fit/src/evolven3fit/eko_utils.py @@ -1,7 +1,6 @@ import logging from typing import Any, Dict, Optional -from ekobox.cards import _operator as default_op_card import numpy as np from eko.io import runcards @@ -56,8 +55,7 @@ def construct_eko_cards( theory["MaxNfAs"] = theory["MaxNfPdf"] # The Legacy function is able to construct a theory card for eko starting from a NNPDF theory - legacy_class = runcards.Legacy(theory, {}) - theory_card = legacy_class.new_theory + theory_card = runcards.Legacy(theory, {}).new_theory # construct mugrid @@ -125,8 +123,7 @@ def construct_eko_photon_cards( mu0 = float(q_gamma) # The Legacy function is able to construct a theory card for eko starting from a NNPDF theory - legacy_class = runcards.Legacy(theory, {}) - theory_card = legacy_class.new_theory + theory_card = runcards.Legacy(theory, {}).new_theory # The photon needs to be evolved down to Q0 q_fin = theory["Q0"] @@ -173,10 +170,34 @@ def build_opcard(op_card_dict, theory, x_grid, mu0, mugrid): if op_card_dict is None: op_card_dict = {} - op_card = default_op_card - - op_card.update({"mu0": mu0, "mugrid": mugrid}) + # Taken from cards.py https://github.com/NNPDF/eko/blob/master/src/ekobox/cards.py + # 7735fdb + op_card = dict( + init=(1.65, 4), + mugrid=[(100.0, 5)], + xgrid=np.geomspace(1e-7, 1.0, 50).tolist(), + configs=dict( + # These three values might be set by op_card_dict + ev_op_iterations=10, + n_integration_cores=1, + polarized=False, + # + ev_op_max_order=[10, 0], + interpolation_polynomial_degree=4, + interpolation_is_log=True, + scvar_method=None, + inversion_method=None, + evolution_method="iterate-exact", + time_like=False, + ), + debug=dict( + skip_singlet=False, + skip_non_singlet=False, + ), + ) + op_card["init"] = (mu0, theory["nf0"]) + op_card["mugrid"] = mugrid op_card["xgrid"] = x_grid # Specify the evolution options and defaults differently from TRN / EXA diff --git a/n3fit/src/evolven3fit/evolve.py b/n3fit/src/evolven3fit/evolve.py index 087d3fcd70..67ad7f5046 100644 --- a/n3fit/src/evolven3fit/evolve.py +++ b/n3fit/src/evolven3fit/evolve.py @@ -94,9 +94,9 @@ def evolve_fit( else: raise ValueError(f"dump_eko not provided and {eko_path=} not found") - with eko.EKO.edit(eko_path) as eko_op: - x_grid_obj = eko.interpolation.XGrid(x_grid) - eko.io.manipulate.xgrid_reshape(eko_op, targetgrid=x_grid_obj, inputgrid=x_grid_obj) +# with eko.EKO.edit(eko_path) as eko_op: +# x_grid_obj = eko.interpolation.XGrid(x_grid) +# eko.io.manipulate.xgrid_reshape(eko_op, targetgrid=x_grid_obj, inputgrid=x_grid_obj) with eko.EKO.read(eko_path) as eko_op: # Read the cards directly from the eko to make sure they are consistent @@ -114,12 +114,46 @@ def evolve_fit( info["XMax"] = float(x_grid[-1]) # Save the PIDs in the info file in the same order as in the evolution info["Flavors"] = basis_rotation.flavor_basis_pids - info["NumFlavors"] = theory.heavy.num_flavs_max_pdf + info["NumFlavors"] = 5 # TODO: Maximum number in evol dump_info_file(usr_path, info) - for replica, pdf_data in initial_PDFs_dict.items(): - evolved_blocks = evolve_exportgrid(pdf_data, eko_op, x_grid) - dump_evolved_replica(evolved_blocks, usr_path, int(replica.removeprefix("replica_"))) + # Read the information from all replicas into what eko wants: + all_replicas = [] + for pdf_data in initial_PDFs_dict.values(): + all_replicas.append(np.array(pdf_data["pdfgrid"]).T) + + all_evolved, _ = apply.apply_grids(eko_op, np.array(all_replicas)) + #{(Q2, nf): (replica, flavour, x)} + nreplicas = len(all_replicas) + all_evolved = [{i: k[r] for i,k in all_evolved.items()} for r in range(nreplicas)] + + # Now, replica by replica, break into blocks + targetgrid = eko_op.xgrid.tolist() + by_nf = defaultdict(list) + for q, nf in sorted(eko_op.evolgrid, key=lambda ep: ep[1]): + by_nf[nf].append(q) + q2block_per_nf = {nf: sorted(qs) for nf, qs in by_nf.items()} + + for replica, evolved_pdf in enumerate(all_evolved): + blocks = [] + for nf, q2grid in q2block_per_nf.items(): + + def pdf_xq2(pid, x, Q2): + x_idx = targetgrid.index(x) + pid_idx = info["Flavors"].index(pid) + return x * evolved_pdf[(Q2, nf)][pid_idx][x_idx] +# return x * evolved_pdf[(Q2, nf)]["pdfs"][pid][x_idx] + + block = genpdf.generate_block( + pdf_xq2, xgrid=targetgrid, sorted_q2grid=q2grid, pids=basis_rotation.flavor_basis_pids + ) + blocks.append(block) + + dump_evolved_replica(blocks, usr_path, int(replica + 1)) + +# for replica, pdf_data in initial_PDFs_dict.items(): +# evolved_blocks = evolve_exportgrid(pdf_data, eko_op, x_grid) +# dump_evolved_replica(evolved_blocks, usr_path, int(replica.removeprefix("replica_"))) # remove folder: # The function dump_evolved_replica dumps the replica files in a temporary folder @@ -170,6 +204,8 @@ def evolve_exportgrid(exportgrid, eko, x_grid): """ # construct LhapdfLike object pdf_grid = np.array(exportgrid["pdfgrid"]).transpose() + + pdf_to_evolve = utils.LhapdfLike(pdf_grid, exportgrid["q20"], x_grid) # evolve pdf evolved_pdf = apply.apply_pdf(eko, pdf_to_evolve) From d38757662bb19aa7253ec4d6eb25a6790d3f695b Mon Sep 17 00:00:00 2001 From: giacomomagni Date: Tue, 5 Nov 2024 16:13:18 +0100 Subject: [PATCH 2/6] add evolve reshape --- n3fit/src/evolven3fit/evolve.py | 47 +++++++++++++++------------------ 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/n3fit/src/evolven3fit/evolve.py b/n3fit/src/evolven3fit/evolve.py index 1363800678..cb1df4c2a7 100644 --- a/n3fit/src/evolven3fit/evolve.py +++ b/n3fit/src/evolven3fit/evolve.py @@ -5,11 +5,11 @@ import sys from ekobox import apply, genpdf, info_file -from joblib import Parallel, delayed import numpy as np -import psutil import eko +from eko.interpolation import XGrid +from eko.io import manipulate from eko import basis_rotation, runner from reportengine.compat import yaml @@ -24,8 +24,6 @@ "level": logging.DEBUG, } -NUM_CORES = psutil.cpu_count(logical=False) - def evolve_fit( fit_folder, @@ -106,11 +104,7 @@ def evolve_fit( else: raise ValueError(f"dump_eko not provided and {eko_path=} not found") -# with eko.EKO.edit(eko_path) as eko_op: -# x_grid_obj = eko.interpolation.XGrid(x_grid) -# eko.io.manipulate.xgrid_reshape(eko_op, targetgrid=x_grid_obj, inputgrid=x_grid_obj) - - with eko.EKO.read(eko_path) as eko_op: + with eko.EKO.edit(eko_path) as eko_op: # Read the cards directly from the eko to make sure they are consistent theory = eko_op.theory_card op = eko_op.operator_card @@ -126,7 +120,7 @@ def evolve_fit( info["XMax"] = float(x_grid[-1]) # Save the PIDs in the info file in the same order as in the evolution info["Flavors"] = basis_rotation.flavor_basis_pids - info["NumFlavors"] = 5 # TODO: Maximum number in evol + info["NumFlavors"] = 5 # TODO: Maximum number in evol dump_info_file(usr_path, info) # Read the information from all replicas into what eko wants: @@ -134,11 +128,21 @@ def evolve_fit( for pdf_data in initial_PDFs_dict.values(): all_replicas.append(np.array(pdf_data["pdfgrid"]).T) + # reshape the xgrid eko if necessary + for _, elem in eko_op.items(): + elem = manipulate.xgrid_reshape( + elem, + eko_op.xgrid, + op.configs.interpolation_polynomial_degree, + targetgrid=XGrid(x_grid), + inputgrid=XGrid(x_grid), + ) + all_evolved, _ = apply.apply_grids(eko_op, np.array(all_replicas)) - #{(Q2, nf): (replica, flavour, x)} + # {(Q2, nf): (replica, flavour, x)} nreplicas = len(all_replicas) - all_evolved = [{i: k[r] for i,k in all_evolved.items()} for r in range(nreplicas)] - + all_evolved = [{i: k[r] for i, k in all_evolved.items()} for r in range(nreplicas)] + # Now, replica by replica, break into blocks targetgrid = eko_op.xgrid.tolist() by_nf = defaultdict(list) @@ -154,25 +158,17 @@ def pdf_xq2(pid, x, Q2): x_idx = targetgrid.index(x) pid_idx = info["Flavors"].index(pid) return x * evolved_pdf[(Q2, nf)][pid_idx][x_idx] -# return x * evolved_pdf[(Q2, nf)]["pdfs"][pid][x_idx] block = genpdf.generate_block( - pdf_xq2, xgrid=targetgrid, sorted_q2grid=q2grid, pids=basis_rotation.flavor_basis_pids + pdf_xq2, + xgrid=targetgrid, + sorted_q2grid=q2grid, + pids=basis_rotation.flavor_basis_pids, ) blocks.append(block) dump_evolved_replica(blocks, usr_path, int(replica + 1)) -# for replica, pdf_data in initial_PDFs_dict.items(): -# evolved_blocks = evolve_exportgrid(pdf_data, eko_op, x_grid) -# dump_evolved_replica(evolved_blocks, usr_path, int(replica.removeprefix("replica_"))) - - # Choose the number of cores to be the Minimal value - nb_cores = min(NUM_CORES, abs(ncores)) - Parallel(n_jobs=nb_cores)( - delayed(_wrap_evolve)(pdf, r) for r, pdf in initial_PDFs_dict.items() - ) - # remove folder: # The function dump_evolved_replica dumps the replica files in a temporary folder # We need then to remove it after fixing the position of those replica files @@ -223,7 +219,6 @@ def evolve_exportgrid(exportgrid, eko, x_grid): # construct LhapdfLike object pdf_grid = np.array(exportgrid["pdfgrid"]).transpose() - pdf_to_evolve = utils.LhapdfLike(pdf_grid, exportgrid["q20"], x_grid) # evolve pdf evolved_pdf = apply.apply_pdf(eko, pdf_to_evolve) From 761a684940f4fe2dd1d1de1981f4581330257ed4 Mon Sep 17 00:00:00 2001 From: giacomomagni Date: Tue, 5 Nov 2024 17:10:38 +0100 Subject: [PATCH 3/6] remove use-fhmruvv from evolven3fit cli --- n3fit/src/n3fit/scripts/evolven3fit.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/n3fit/src/n3fit/scripts/evolven3fit.py b/n3fit/src/n3fit/scripts/evolven3fit.py index c9b506b4e5..9ea39f6ad9 100644 --- a/n3fit/src/n3fit/scripts/evolven3fit.py +++ b/n3fit/src/n3fit/scripts/evolven3fit.py @@ -99,7 +99,7 @@ def evolven3fit_new(): def main(): parser = ArgumentParser( description="evolven3fit - a script with tools to evolve PDF fits", - usage="""evolven3fit [-h] [-q Q_FIN] [-p Q_POINTS] [-n N_CORES] [-e EV_OP_ITERATIONS] [--use-fhmruvv] + usage="""evolven3fit [-h] [-q Q_FIN] [-p Q_POINTS] [-n N_CORES] [-e EV_OP_ITERATIONS] {produce_eko,produce_eko_photon,evolve} [fit folder] Note that with the now removed apfel-based version of `evolven3fit` the syntax was @@ -123,11 +123,7 @@ def main(): default=None, help="ev_op_iterations for the EXA theory. Overrides the settings given in the theory card.", ) - parser.add_argument( - "--use-fhmruvv", - action="store_true", - help="Use the FHMRUVV N3LO splitting splitting functions", - ) + subparsers = parser.add_subparsers(title="actions", dest="actions") construct_eko_parser(subparsers) construct_eko_photon_parser(subparsers) @@ -141,9 +137,8 @@ def main(): if args.ev_op_iterations is not None: op_card_info["configs"]["ev_op_iterations"] = args.ev_op_iterations + # Here we do not allow any modification of the theory card, for the moment. theory_card_info = {} - if args.use_fhmruvv: - theory_card_info["use_fhmruvv"] = args.use_fhmruvv if args.no_net: loader = Loader() From d37d7b7f8e41a10362017ad12a6ea4ba042d40e3 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Thu, 7 Nov 2024 17:13:55 +0100 Subject: [PATCH 4/6] fix evolven3fit evolve --- n3fit/src/evolven3fit/cli.py | 3 +-- n3fit/src/evolven3fit/evolve.py | 20 ++++++++++---------- n3fit/src/n3fit/scripts/evolven3fit.py | 1 - 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/n3fit/src/evolven3fit/cli.py b/n3fit/src/evolven3fit/cli.py index 84f07e4ce9..723fbd8076 100644 --- a/n3fit/src/evolven3fit/cli.py +++ b/n3fit/src/evolven3fit/cli.py @@ -2,7 +2,7 @@ def cli_evolven3fit( - configuration_folder, q_fin, q_points, op_card_info, theory_card_info, force, load, dump, ncores + configuration_folder, q_fin, q_points, op_card_info, theory_card_info, force, load, dump, ): """Evolves the fitted PDFs. @@ -31,5 +31,4 @@ def cli_evolven3fit( force, load, dump, - ncores, ) diff --git a/n3fit/src/evolven3fit/evolve.py b/n3fit/src/evolven3fit/evolve.py index cb1df4c2a7..1088720134 100644 --- a/n3fit/src/evolven3fit/evolve.py +++ b/n3fit/src/evolven3fit/evolve.py @@ -34,7 +34,6 @@ def evolve_fit( force, eko_path, dump_eko=None, - ncores=1, ): """ Evolves all the fitted replica in fit_folder/nnfit @@ -126,7 +125,10 @@ def evolve_fit( # Read the information from all replicas into what eko wants: all_replicas = [] for pdf_data in initial_PDFs_dict.values(): - all_replicas.append(np.array(pdf_data["pdfgrid"]).T) + # swap photon postion to match eko.basis_roation.flavor_basis_pids + pdfgrid = np.array(pdf_data["pdfgrid"]) + pdfgrid = np.append(pdfgrid[:,-1].reshape(x_grid.size,1), pdfgrid[:,:-1], axis=1) + all_replicas.append(pdfgrid.T) # reshape the xgrid eko if necessary for _, elem in eko_op.items(): @@ -138,26 +140,24 @@ def evolve_fit( inputgrid=XGrid(x_grid), ) - all_evolved, _ = apply.apply_grids(eko_op, np.array(all_replicas)) # {(Q2, nf): (replica, flavour, x)} - nreplicas = len(all_replicas) - all_evolved = [{i: k[r] for i, k in all_evolved.items()} for r in range(nreplicas)] + all_evolved, _ = apply.apply_grids(eko_op, np.array(all_replicas)) # Now, replica by replica, break into blocks targetgrid = eko_op.xgrid.tolist() by_nf = defaultdict(list) - for q, nf in sorted(eko_op.evolgrid, key=lambda ep: ep[1]): - by_nf[nf].append(q) - q2block_per_nf = {nf: sorted(qs) for nf, qs in by_nf.items()} + for q2, nf in sorted(eko_op.evolgrid, key=lambda ep: ep[1]): + by_nf[nf].append(q2) + q2block_per_nf = {nf: sorted(q2s) for nf, q2s in by_nf.items()} - for replica, evolved_pdf in enumerate(all_evolved): + for replica in range(len(all_replicas)): blocks = [] for nf, q2grid in q2block_per_nf.items(): def pdf_xq2(pid, x, Q2): x_idx = targetgrid.index(x) pid_idx = info["Flavors"].index(pid) - return x * evolved_pdf[(Q2, nf)][pid_idx][x_idx] + return x * all_evolved[(Q2, nf)][replica][pid_idx][x_idx] block = genpdf.generate_block( pdf_xq2, diff --git a/n3fit/src/n3fit/scripts/evolven3fit.py b/n3fit/src/n3fit/scripts/evolven3fit.py index 9ea39f6ad9..cc85d31e3a 100644 --- a/n3fit/src/n3fit/scripts/evolven3fit.py +++ b/n3fit/src/n3fit/scripts/evolven3fit.py @@ -164,7 +164,6 @@ def main(): args.force, eko_path, None, - args.n_cores, ) else: # If we are in the business of producing an eko, do some checks before starting: From 0b20b32979e7cf2870433bf1f09f38430f5c9c31 Mon Sep 17 00:00:00 2001 From: Giacomo Magni Date: Fri, 8 Nov 2024 00:05:53 +0100 Subject: [PATCH 5/6] sort replicas and dived by x --- n3fit/src/evolven3fit/evolve.py | 36 +++++++++++++++++---------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/n3fit/src/evolven3fit/evolve.py b/n3fit/src/evolven3fit/evolve.py index 1088720134..4cd21489b1 100644 --- a/n3fit/src/evolven3fit/evolve.py +++ b/n3fit/src/evolven3fit/evolve.py @@ -122,35 +122,38 @@ def evolve_fit( info["NumFlavors"] = 5 # TODO: Maximum number in evol dump_info_file(usr_path, info) - # Read the information from all replicas into what eko wants: + # Read the information from all the sorted replicas into what eko wants + n_replicas = len(initial_PDFs_dict) all_replicas = [] - for pdf_data in initial_PDFs_dict.values(): + for rep_idx in range(1, n_replicas + 1): # swap photon postion to match eko.basis_roation.flavor_basis_pids - pdfgrid = np.array(pdf_data["pdfgrid"]) + pdfgrid = np.array(initial_PDFs_dict[f"replica_{rep_idx}"]["pdfgrid"]) pdfgrid = np.append(pdfgrid[:,-1].reshape(x_grid.size,1), pdfgrid[:,:-1], axis=1) - all_replicas.append(pdfgrid.T) + # and divide by x + all_replicas.append(pdfgrid.T / x_grid ) # reshape the xgrid eko if necessary - for _, elem in eko_op.items(): - elem = manipulate.xgrid_reshape( - elem, - eko_op.xgrid, - op.configs.interpolation_polynomial_degree, - targetgrid=XGrid(x_grid), - inputgrid=XGrid(x_grid), - ) + if not XGrid(x_grid) == eko_op.xgrid: + for _, elem in eko_op.items(): + elem = manipulate.xgrid_reshape( + elem, + eko_op.xgrid, + op.configs.interpolation_polynomial_degree, + targetgrid=XGrid(x_grid), + inputgrid=XGrid(x_grid), + ) - # {(Q2, nf): (replica, flavour, x)} + # output is {(Q2, nf): (replica, flavour, x)} all_evolved, _ = apply.apply_grids(eko_op, np.array(all_replicas)) - # Now, replica by replica, break into blocks + # Now, replica by replica, break into nf blocks targetgrid = eko_op.xgrid.tolist() by_nf = defaultdict(list) for q2, nf in sorted(eko_op.evolgrid, key=lambda ep: ep[1]): by_nf[nf].append(q2) q2block_per_nf = {nf: sorted(q2s) for nf, q2s in by_nf.items()} - for replica in range(len(all_replicas)): + for replica in range(n_replicas): blocks = [] for nf, q2grid in q2block_per_nf.items(): @@ -166,8 +169,7 @@ def pdf_xq2(pid, x, Q2): pids=basis_rotation.flavor_basis_pids, ) blocks.append(block) - - dump_evolved_replica(blocks, usr_path, int(replica + 1)) + dump_evolved_replica(blocks, usr_path, replica + 1) # remove folder: # The function dump_evolved_replica dumps the replica files in a temporary folder From 13c969af09956951a633b4be6dca61df27fafdd8 Mon Sep 17 00:00:00 2001 From: giacomomagni Date: Fri, 8 Nov 2024 00:16:50 +0100 Subject: [PATCH 6/6] some cleaning --- n3fit/src/evolven3fit/evolve.py | 64 ++--------------------- n3fit/src/evolven3fit/utils.py | 45 ---------------- n3fit/src/n3fit/tests/test_evolven3fit.py | 11 ---- 3 files changed, 5 insertions(+), 115 deletions(-) diff --git a/n3fit/src/evolven3fit/evolve.py b/n3fit/src/evolven3fit/evolve.py index 4cd21489b1..b6bbc2da6f 100644 --- a/n3fit/src/evolven3fit/evolve.py +++ b/n3fit/src/evolven3fit/evolve.py @@ -8,9 +8,9 @@ import numpy as np import eko +from eko import basis_rotation, runner from eko.interpolation import XGrid from eko.io import manipulate -from eko import basis_rotation, runner from reportengine.compat import yaml from . import eko_utils, utils @@ -26,14 +26,7 @@ def evolve_fit( - fit_folder, - q_fin, - q_points, - op_card_dict, - theory_card_dict, - force, - eko_path, - dump_eko=None, + fit_folder, q_fin, q_points, op_card_dict, theory_card_dict, force, eko_path, dump_eko=None ): """ Evolves all the fitted replica in fit_folder/nnfit @@ -128,12 +121,12 @@ def evolve_fit( for rep_idx in range(1, n_replicas + 1): # swap photon postion to match eko.basis_roation.flavor_basis_pids pdfgrid = np.array(initial_PDFs_dict[f"replica_{rep_idx}"]["pdfgrid"]) - pdfgrid = np.append(pdfgrid[:,-1].reshape(x_grid.size,1), pdfgrid[:,:-1], axis=1) + pdfgrid = np.append(pdfgrid[:, -1].reshape(x_grid.size, 1), pdfgrid[:, :-1], axis=1) # and divide by x - all_replicas.append(pdfgrid.T / x_grid ) + all_replicas.append(pdfgrid.T / x_grid) # reshape the xgrid eko if necessary - if not XGrid(x_grid) == eko_op.xgrid: + if XGrid(x_grid) != eko_op.xgrid: for _, elem in eko_op.items(): elem = manipulate.xgrid_reshape( elem, @@ -201,53 +194,6 @@ def load_fit(usr_path): return pdf_dict -def evolve_exportgrid(exportgrid, eko, x_grid): - """ - Evolves the provided exportgrid for the desired replica with the eko and returns the evolved block - - Parameters - ---------- - exportgrid: dict - exportgrid of pdf at fitting scale - eko: eko object - eko operator for evolution - xgrid: list - xgrid to be used as the targetgrid - Returns - ------- - : list(np.array) - list of evolved blocks - """ - # construct LhapdfLike object - pdf_grid = np.array(exportgrid["pdfgrid"]).transpose() - - pdf_to_evolve = utils.LhapdfLike(pdf_grid, exportgrid["q20"], x_grid) - # evolve pdf - evolved_pdf = apply.apply_pdf(eko, pdf_to_evolve) - # generate block to dump - targetgrid = eko.bases.targetgrid.tolist() - - # Finally separate by nf block (and order per nf/q) - by_nf = defaultdict(list) - for q, nf in sorted(eko.evolgrid, key=lambda ep: ep[1]): - by_nf[nf].append(q) - q2block_per_nf = {nf: sorted(qs) for nf, qs in by_nf.items()} - - blocks = [] - for nf, q2grid in q2block_per_nf.items(): - - def pdf_xq2(pid, x, Q2): - x_idx = targetgrid.index(x) - return x * evolved_pdf[(Q2, nf)]["pdfs"][pid][x_idx] - - block = genpdf.generate_block( - pdf_xq2, xgrid=targetgrid, sorted_q2grid=q2grid, pids=basis_rotation.flavor_basis_pids - ) - blocks.append(block) - - return blocks - - def dump_evolved_replica(evolved_blocks, usr_path, replica_num): """ Dump the evolved replica given by evolved_block as the replica num "replica_num" in diff --git a/n3fit/src/evolven3fit/utils.py b/n3fit/src/evolven3fit/utils.py index 9f0b6ad9fd..14b5c5d80f 100644 --- a/n3fit/src/evolven3fit/utils.py +++ b/n3fit/src/evolven3fit/utils.py @@ -10,51 +10,6 @@ from .q2grids import Q2GRID_DEFAULT, Q2GRID_NNPDF40 -class LhapdfLike: - """ - Class which emulates lhapdf but only for an initial condition PDF (i.e. with only one q2 value). - - Q20 is the fitting scale fo the pdf and it is the only available scale for the objects of this class. - - X_GRID is the grid of x values on top of which the pdf is interpolated. - - PDF_GRID is a dictionary containing the pdf grids at fitting scale for each pid. - """ - - def __init__(self, pdf_grid, q20, x_grid): - self.pdf_grid = pdf_grid - self.q20 = q20 - self.x_grid = x_grid - self.funcs = [ - interp1d(self.x_grid, self.pdf_grid[pid], kind="cubic") for pid in range(len(PIDS_DICT)) - ] - - def xfxQ2(self, pid, x, q2): - """Return the value of the PDF for the requested pid, x value and, whatever the requested - q2 value, for the fitting q2. - - Parameters - ---------- - - pid: int - pid index of particle - x: float - x-value - q2: float - Q square value - - Returns - ------- - : float - x * PDF value - """ - return self.funcs[list(PIDS_DICT.values()).index(PIDS_DICT[pid])](x) - - def hasFlavor(self, pid): - """Check if the requested pid is in the PDF.""" - return pid in PIDS_DICT - - def read_runcard(usr_path): """Read the runcard and return the relevant information for evolven3fit""" return yaml.safe_load((usr_path / "filter.yml").read_text(encoding="UTF-8")) diff --git a/n3fit/src/n3fit/tests/test_evolven3fit.py b/n3fit/src/n3fit/tests/test_evolven3fit.py index 52799829f6..949adc58d3 100644 --- a/n3fit/src/n3fit/tests/test_evolven3fit.py +++ b/n3fit/src/n3fit/tests/test_evolven3fit.py @@ -98,17 +98,6 @@ def test_generate_q2grid(): def test_utils(): - # Testing the fake LHAPDF class - q20 = 1.65**2 - x_grid = np.geomspace(1.0e-7, 1.0, 30) - fake_grids = [[x * (1.0 - x) for x in x_grid] for _ in PIDS_DICT.keys()] - pdf_grid = {pid: v for pid, v in zip(range(len(PIDS_DICT)), fake_grids)} - my_PDF = utils.LhapdfLike(pdf_grid, q20, x_grid) - assert my_PDF.hasFlavor(6) - assert not my_PDF.hasFlavor(0) - for pid in PIDS_DICT: - for x in x_grid: - np.testing.assert_allclose(my_PDF.xfxQ2(pid, x, q20), x * (1.0 - x)) # Testing read_runcard runcard = utils.read_runcard(REGRESSION_FOLDER) assert isinstance(runcard["description"], str)