Source code for km3pipe.cmd

# Filename: cmd.py
"""
KM3Pipe command line utility.

Usage:
    km3pipe test
    km3pipe update [GIT_BRANCH]
    km3pipe createconf [--overwrite] [--dump]
    km3pipe retrieve DET_ID RUN [-i -o OUTFILE]
    km3pipe (-h | --help)
    km3pipe --version

Options:
    -h --help           Show this screen.
    -m                  Get the MC detector file (flips the sign of DET_ID).
    -c CALIBR_ID        Geometrical calibration ID (eg. A01466417)
    -i                  Use iRODS instead of xrootd to retrieve files.
    -o OUT              Output folder or filename.
    -t T0_SET           Time calibration ID (eg. A01466431)
    -s REGEX            Regular expression to filter the runsetup name/id.
    DET_ID              Detector ID (eg. D_ARCA001).
    DETECTOR            Detector (eg. ARCA).
    GIT_BRANCH          Git branch to pull (eg. develop).
    RUN                 Run number.

"""
import re
import sys
import subprocess
import os
from datetime import datetime
import time

import km3db

from . import version
from .tools import irods_path, xrootd_path
from .hardware import Detector

from km3pipe.logger import get_logger

[docs] log = get_logger(__name__) # pylint: disable=C0103
__author__ = "Tamas Gal" __copyright__ = "Copyright 2016, Tamas Gal and the KM3NeT collaboration." __credits__ = [] __license__ = "MIT" __maintainer__ = "Tamas Gal and Moritz Lotze" __email__ = "tgal@km3net.de" __status__ = "Development"
[docs] SPS_CACHE = "/sps/km3net/repo/data/cache"
[docs] KM3PIPE_GIT = "https://git.km3net.de/km3py/km3pipe.git"
[docs] def run_tests(): print( "Running the km3pipe test suite. Make sure you have all the test " "dependencies and extras installed with\n\n" ' pip install "km3pipe[dev]"\n' ' pip install "km3pipe[extras]"\n' ) import pytest import km3pipe pytest.main([os.path.dirname(km3pipe.__file__)])
[docs] def update_km3pipe(git_branch=""): if git_branch == "" or git_branch is None: git_branch = "master" os.system(f"pip install -U git+{KM3PIPE_GIT}@{git_branch}")
[docs] def retrieve(run_id, det_id, use_irods=False, out=None): """Retrieve run from iRODS for a given detector (O)ID""" det_id = int(det_id) if use_irods: rpath = irods_path(det_id, run_id) cmd = "iget -Pv" else: rpath = xrootd_path(det_id, run_id) cmd = "xrdcp" filename = os.path.basename(rpath) if out is not None and os.path.isdir(out): outfile = os.path.join(out, filename) elif out is None: outfile = filename else: outfile = out if os.path.exists(outfile): print("Output file '{}' already exists.".format(outfile)) return cmd += " {0} {1}".format(rpath, outfile) if not km3db.core.on_whitelisted_host("lyon"): subprocess.call(cmd.split()) return subfolder = os.path.join(*rpath.split("/")[-3:-1]) cached_subfolder = os.path.join(SPS_CACHE, subfolder) cached_filepath = os.path.join(cached_subfolder, filename) lock_file = cached_filepath + ".in_progress" if os.path.exists(lock_file): print("File is already requested, waiting for the download to finish.") for _ in range(6 * 15): # 15 minute timeout time.sleep(10) if not os.path.exists(lock_file): print("Done.") break else: print( "Timeout reached. Deleting the lock file and initiating a " "new download." ) os.remove(lock_file) if not os.path.exists(cached_filepath): print("Downloading file to local SPS cache ({}).".format(SPS_CACHE)) try: os.makedirs(cached_subfolder, exist_ok=True) subprocess.call(["touch", lock_file]) subprocess.call(["chmod", "g+w", lock_file]) subprocess.call(cmd.split()) subprocess.call(["chmod", "g+w", outfile]) subprocess.call(["cp", "-p", outfile, cached_filepath]) except (OSError, KeyboardInterrupt) as e: print("\nAborting... {}".format(e)) for f in [outfile, lock_file, cached_filepath]: subprocess.call(["rm", "-f", f]) return finally: for f in [outfile, lock_file]: subprocess.call(["rm", "-f", f]) subprocess.call(["ln", "-s", cached_filepath, outfile])
[docs] def main(): from docopt import docopt args = docopt( __doc__, version="KM3Pipe {}".format( version, ), ) if args["test"]: run_tests() if args["update"]: update_km3pipe(args["GIT_BRANCH"]) if args["retrieve"]: retrieve(int(args["RUN"]), args["DET_ID"], use_irods=args["-i"], out=args["-o"])