def hessian_from_lincomb(pdf, V, set_name=None, folder=None, db=None, extra_fields=None): """Construct a new LHAPDF grid from a linear combination of members""" # preparing output folder neig = V.shape[1] base = applwrap.getlhapdfpath()[-1] + "/" + str(pdf) + "/" + str(pdf) if set_name is None: set_name = str(pdf) + "_hessian_" + str(neig) if folder is None: folder = "" set_root = os.path.join(folder, set_name) if not os.path.exists(set_root): os.makedirs(os.path.join(set_root)) # copy replica 0 shutil.copy(base + "_0000.dat", set_root + "/" + set_name + "_0000.dat") with open(base + ".info", "r") as inn, open(set_root + "/" + set_name + ".info", "w") as out: for l in inn.readlines(): if l.find("SetDesc:") >= 0: out.write('SetDesc: "Hessian ' + str(pdf) + '_hessian"\n') elif l.find("NumMembers:") >= 0: out.write("NumMembers: " + str(neig + 1) + "\n") elif l.find("ErrorType: replicas") >= 0: out.write("ErrorType: symmhessian\n") else: out.write(l) if extra_fields is not None: yaml.dump(extra_fields, out, default_flow_style=False) headers, grids = load_all_replicas(pdf, db=db) hess_name = set_root + "/" + set_name result = (big_matrix(grids).dot(V)).add(grids[0], axis=0) hess_header = b"PdfType: error\nFormat: lhagrid1\n" for column in result.columns: write_replica(column + 1, hess_name, hess_header, result[column]) return set_root
def get_lha_paths(): return applwrap.getlhapdfpath()