Skip to content
Snippets Groups Projects
runner.py 3.52 KiB
#!/usr/bin/env python
# coding=utf-8
# Filename: runner.py
# Author: Johannes Schumann <jschumann@km3net.de>
"""

Usage:
    runner.py fixed --energy=ENERGY --events=EVENTS (--CC|--NC) (--electron|--muon|--tau) --target-a=TARGETA --target-z=TARGETZ (--sphere=RADIUS | --can) [--outdir=OUTDIR] [--km3netfile=OUTFILE]
    runner.py range --energy-min=ENERGYMIN --energy-max=ENERGYMAX --events=EVENTS (--CC|--NC) (--electron|--muon|--tau) --target-a=TARGETA --target-z=TARGETZ (--sphere=RADIUS | --can) [--flux=FLUXFILE] [--outdir=OUTDIR] [--km3netfile=OUTFILE]
    runner.py (-h | --help)

Options:
    -h --help   Show this screen.
    --energy=ENERGY                 Neutrino energy [type: float]                   
    --energy-min=ENERGYMIN          Neutrino energy [type: float]                   
    --energy-max=ENERGYMAX          Neutrino energy [type: float]                   
    --events=EVENTS                 Number of simulated events [type: int]          
    --target-a=TARGETA              Target nucleons [type: int]                     
    --target-z=TARGETZ              Target protons [type: int]                      
    --sphere=RADIUS                 Radius of the sphere volume in metres [type: float]
    --can                           Use CAN with std. dimensions
    --flux=FLUXFILE                 Flux definition [type: path]
    --outdir=OUTDIR                 Output directory [type: path]
    (--CC | --NC)                   Interaction type
    (--electron | --muon | --tau)   Neutrino flavor
"""
from type_docopt import docopt
from pathlib import Path
from tempfile import TemporaryDirectory
from os.path import join

from km3buu.jobcard import generate_neutrino_jobcard
from km3buu.ctrl import run_jobcard
from km3buu.geometry import CanVolume, SphericalVolume
from km3buu.output import GiBUUOutput, write_detector_file


def main():
    args = docopt(__doc__, types={'path': Path})

    events = args["--events"]
    energy = args["--energy"] if args["fixed"] else (args["--energy-min"],
                                                     args["--energy-max"])
    interaction = "CC" if args["--CC"] else "NC"
    flavour = "electron" if args["--electron"] else (
        "muon" if args["--muon"] else "tau")
    target = (args["--target-z"], args["--target-a"])

    jc = generate_neutrino_jobcard(events,
                                   interaction,
                                   flavour,
                                   energy,
                                   target,
                                   fluxfile=args["--flux"])

    outdir = args["--outdir"] if args["--outdir"] else TemporaryDirectory()
    outdirname = outdir if args["--outdir"] else outdir.name

    run_jobcard(jc, outdirname)

    fobj = GiBUUOutput(outdir)

    volume = SphericalVolume(
        args["--sphere"]) if args["--sphere"] else CanVolume()

    if args["fixed"]:
        descriptor = "{0}_{1}_{2}GeV_A{3}Z{4}".format(flavour, interaction,
                                                      energy, target[0],
                                                      target[1])
    else:
        descriptor = "{0}_{1}_{2}-{3}GeV_A{4}Z{5}".format(
            flavour, interaction, energy[0], energy[1], target[0], target[1])

    if args["--km3netfile"]:
        outfilename = args["--km3netfile"]
    else:
        outfilename = "km3buu_" + descriptor + ".root"
        if args["--outdir"]:
            outfilename = join(args["--outdir"], outfilename)

    write_detector_file(fobj, geometry=volume, ofile=outfilename)


if __name__ == '__main__':
    main()