Source code for NuRadioMC.EvtGen.proposal_table_manager

#!/usr/bin/env python
from NuRadioMC.EvtGen.NuRadioProposal import ProposalFunctions
import proposal
import os
import shutil
import argparse
import logging
import sys

logger = logging.getLogger('ProposalTablesManager')

[docs]def produce_proposal_tables(config_file, tables_path=None): """ produce proposal tables for all relevant flavors Parameters ---------- config_file: string one of the default PROPOSAL configurations ['InfIce','SouthPole', 'MooresBay', 'Greenland'] tables_path: string output path for the generated tables """ proposal_func = ProposalFunctions(config_file=config_file, tables_path=tables_path, create_new=True) for particle_code in [-15, -13, 13, 15]: logger.warning(f"producing tables for {config_file}, particle {particle_code}") proposal_func._ProposalFunctions__get_propagator(particle_code=particle_code)
[docs]def get_compiler(): # proposal (as of V 7.5.0) generates tables with different hashes for clang and gcc # infer which of the precalculation is relevant here compiler = "gcc" if "clang" in sys.version.lower(): compiler = "clang" return compiler
[docs]def produce_proposal_tables_tarball(config_file, tables_path=None): """ produce proposal tables tarball for all relevant flavors Note: the produced tarballs need to be placed in the NuRadioMC/proposal_tables/{version}/{compiler} directory on the desy cluster. Parameters ---------- config_file: string one of the default PROPOSAL configurations ['InfIce','SouthPole', 'MooresBay', 'Greenland'] tables_path: string output path for the generated tables """ if tables_path is None: proposal_func = ProposalFunctions(config_file=config_file) tables_path = proposal_func._ProposalFunctions__tables_path outdir = f"./{tables_path}/v{proposal.__version__}/{get_compiler()}" if not os.path.exists(outdir): os.makedirs(outdir) tarfile = config_file+".tar.gz" if os.path.isfile(os.path.join(outdir, tarfile)): logger.error(f"Output tarball {os.path.join(outdir, tarfile)} already exists.") raise IOError tables_path = os.path.join(outdir, config_file) produce_proposal_tables(config_file, tables_path) logger.warning("Producing gzipped tarball") shutil.make_archive(tables_path, 'gztar', tables_path)
[docs]def download_proposal_tables(config_file, tables_path=None): """ download precalculated proposal tables for all relevant flavors from the NuRadioMC data storage Parameters ---------- config_file: string one of the default PROPOSAL configurations ['InfIce','SouthPole', 'MooresBay', 'Greenland'] tables_path: string output path for the generated tables """ if tables_path is None: proposal_func = ProposalFunctions(config_file=config_file, create_new=True) tables_path = proposal_func._ProposalFunctions__tables_path # does not exist yet -> download file import requests proposal_version = proposal.__version__ URL = f'https://rnog-data.zeuthen.desy.de/proposal_tables/v{proposal_version}/{get_compiler()}/{config_file}.tar.gz' folder = tables_path #os.path.dirname(tables_path) if not os.path.exists(folder): os.makedirs(folder) logger.warning( "downloading pre-calculated proposal tables for {} from {}. This can take a while...".format(config_file, URL)) r = requests.get(URL) if r.status_code != requests.codes.ok: logger.error("error in download of proposal tables") raise IOError with open(f"{tables_path}/{config_file}.tar.gz", "wb") as code: code.write(r.content) logger.warning("...download finished.") logger.warning(f"...unpacking archive to {tables_path}") shutil.unpack_archive(f"{tables_path}/{config_file}.tar.gz", tables_path) os.remove(f"{tables_path}/{config_file}.tar.gz")
if __name__ == "__main__": parser = argparse.ArgumentParser("NuRadioProposal tables I/O") parser.add_argument("option", choices=["create", "download"]) parser.add_argument('config_file', help="one of the default configurations ['InfIce','SouthPole', 'MooresBay', 'Greenland'] or 'all'") parser.add_argument('-t', '--tables_path', default=None, help="target path for table creation/download") args = parser.parse_args() logger.warning(f"Your compiler type is {get_compiler()}") if args.option == "create": logger.warning(f"Creating proposal tables for {args.option}") if args.config_file == "all": cfgs = ['InfIce','SouthPole', 'MooresBay', 'Greenland'] for cfg in cfgs: produce_proposal_tables_tarball(cfg, args.tables_path) else: produce_proposal_tables_tarball(args.config_file, args.tables_path) elif args.option == "download": logger.warning(f"Downloading proposal tables for {args.option}") download_proposal_tables(args.config_file, args.tables_path)