"""
app.py
Mainloop of the validphys application. Here we define tailoted extensions to
the reporthengine application (such as extra command line flags). Additionally
the *provider modules* that serve as source to the validphys actions are
declared here.
The entry point of the validphys application is the ``main`` funcion of this
module.
"""
import contextlib
import logging
import os
import sys
from reportengine import app
from validphys import mplstyles, uploadutils
from validphys.config import Config, Environment
from validphys.lhapdf_compatibility import lhapdf
providers = [
"validphys.results",
"validphys.commondata",
"validphys.pdfgrids",
"validphys.pdfplots",
"validphys.dataplots",
"validphys.fitdata",
"validphys.arclength",
"validphys.sumrules",
"validphys.reweighting",
"validphys.kinematics",
"validphys.correlations",
"validphys.eff_exponents",
"validphys.asy_exponents",
"validphys.theorycovariance.construction",
"validphys.theorycovariance.output",
"validphys.theorycovariance.tests",
"validphys.replica_selector",
"validphys.closuretest",
"validphys.mc_gen",
"validphys.theoryinfo",
"validphys.pseudodata",
"validphys.renametools",
"validphys.covmats",
"validphys.hyperoptplot",
"validphys.deltachi2",
"validphys.n3fit_data",
"validphys.mc2hessian",
"reportengine.report",
"validphys.overfit_metric",
"validphys.hessian2mc",
]
log = logging.getLogger(__name__)
[docs]
class App(app.App):
environment_class = Environment
config_class = Config
critical_message = """A critical error occurred. This is likely due to one of the following reasons:
- A bug in validphys.
- Corruption of the provided resources (e.g. incorrect plotting files).
- Cosmic rays hitting your CPU and altering the registers.
The traceback above should help determine the cause of the problem. If you
believe this is a bug in validphys (please discard the cosmic rays first),
please open an issue on GitHub<https://github.com/NNPDF/nnpdf/issues>,
including the contents of the following file:
%s
"""
@property
def default_style(self):
return os.fspath(mplstyles.smallstyle)
def __init__(self, name="validphys", providers=providers):
super().__init__(name, providers)
@property
def argparser(self):
parser = super().argparser
cout = parser.add_mutually_exclusive_group()
# We want True False or None, so that none defaults to debug or quiet.
# That's why we use store_const
cout.add_argument(
"--cout",
action="store_const",
const=True,
help="display C output. Default depends on log level",
)
cout.add_argument("--no-cout", dest="cout", action="store_const", const=False)
net = parser.add_mutually_exclusive_group()
net.add_argument(
"--net",
action="store_true",
default=True,
help="Enable remote loader. " "Try to download missing resources. This is the default",
)
net.add_argument(
"--no-net",
dest="net",
action="store_false",
help="Disable remote loader. Use only local resources.",
)
parser.add_argument(
"--upload",
action="store_true",
help="Upload the resulting output folder to the Milan server.",
)
return parser
[docs]
def init(self):
super().init()
cout = self.args["cout"]
if cout is None:
if self.args["loglevel"] <= logging.DEBUG:
cout = True
if not cout:
lhapdf.setVerbosity(0)
[docs]
@staticmethod
def upload_context(do_upload, output):
"""If do_upload is False, do notihing. Otherwise, on enter, check the
requiements for uploading and on exit,
upload the output path if do_upload is True. Otherwise do nothing.
Raise SystemExit on error."""
if do_upload:
return uploadutils.ReportUploader().upload_or_exit_context(output)
return contextlib.ExitStack()
[docs]
def run(self):
if sys.version_info < (3, 9):
log.warning(
"validphys 2 is discontinued on Python<3.9 and will "
"not be longer updated. Please run\n"
"conda install python=3.9\n\n"
"If you have any problems, please open an issue "
"on https://github.com/NNPDF/nnpdf/issues."
)
with self.upload_context(self.args["upload"], self.args["output"]):
super().run()
[docs]
def main():
a = App()
a.main()
if __name__ == "__main__":
main()