From f5605f6cebcdeff74da78987933f0cf4365a2357 Mon Sep 17 00:00:00 2001 From: Johannes Schumann <johannes.schumann@fau.de> Date: Mon, 25 May 2020 12:39:05 +0200 Subject: [PATCH] Removed scripts from project and moved to NuGenStudy --- scripts/neutrino_jobcard_generator.py | 88 ---------- scripts/nuclei_xsections.py | 235 -------------------------- scripts/plot_cc_xsection.py | 140 --------------- 3 files changed, 463 deletions(-) delete mode 100755 scripts/neutrino_jobcard_generator.py delete mode 100755 scripts/nuclei_xsections.py delete mode 100755 scripts/plot_cc_xsection.py diff --git a/scripts/neutrino_jobcard_generator.py b/scripts/neutrino_jobcard_generator.py deleted file mode 100755 index a64ac7f..0000000 --- a/scripts/neutrino_jobcard_generator.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -# Filename: neutrino_jobcard_generator.py -# Author: Johannes Schumann <jschumann@km3net.de> -""" -Convert ROOT and EVT files to HDF5. - -Usage: - neutrino_jobcard_generator.py - neutrino_jobcard_generator.py (-h | --help) - -Options: - -h --help Show this screen. - -""" -from km3buu.ctrl import run_jobcard -from km3buu.jobcard import Jobcard -from km3buu.jobcard import XSECTIONMODE_LOOKUP, PROCESS_LOOKUP, FLAVOR_LOOKUP -from km3buu.output import GiBUUOutput -from thepipe.logger import get_logger -from tempfile import TemporaryDirectory -from os.path import dirname - - -def generate_neutrino_jobcard(process, flavor, energy, target): - """ - Generate a jobcard for neutrino interaction - - Parameters - ---------- - process: str - Interaction channel ["CC", "NC", "antiCC", "antiNC"] - flavour: str - Flavour ["electron", "muon", "tau"] - energy: float - Initial energy of the neutrino in GeV - target: (int, int) - (Z, A) describing the target nukleon - input_path: str - The input path pointing to the GiBUU lookup data which should be used - """ - jc = Jobcard() - # NEUTRINO - jc.set_property("neutrino_induced", "process_ID", - PROCESS_LOOKUP[process.lower()]) - jc.set_property("neutrino_induced", "flavor_ID", - FLAVOR_LOOKUP[flavor.lower()]) - jc.set_property("neutrino_induced", "nuXsectionMode", - XSECTIONMODE_LOOKUP["dSigmaMC"]) - jc.set_property("neutrino_induced", "includeDIS", True) - jc.set_property("neutrino_induced", "printAbsorptionXS", "T") - jc.set_property("nl_SigmaMC", "enu", energy) - # INPUT - jc.set_property("input", "numTimeSteps", 0) - jc.set_property("input", "eventtype", 5) - jc.set_property("input", "numEnsembles", 100) - jc.set_property("input", "delta_T", 0.2) - jc.set_property("input", "localEnsemble", True) - jc.set_property("input", "num_runs_SameEnergy", 1) - jc.set_property("input", "LRF_equals_CALC_frame", True) - # TARGET - jc.set_property("target", "target_Z", target[0]) - jc.set_property("target", "target_A", target[1]) - # MISC - # jc.set_property("nl_neutrinoxsection", "DISmassless", True) - jc.set_property("neutrinoAnalysis", "outputEvents", True) - jc.set_property("pythia", "PARP(91)", 0.44) - return jc - - -def main(): - from docopt import docopt - args = docopt(__doc__) - - -if __name__ == '__main__': - main() - log = get_logger("ctrl.py") - log.setLevel("INFO") - tmpjc = generate_neutrino_jobcard("cc", "electron", 1.0, (1, 1)) - datadir = TemporaryDirectory(dir=dirname(__file__)) - run_jobcard(tmpjc, datadir.name) - data = GiBUUOutput(datadir.name) - print(data.events[1:10]) - - - - diff --git a/scripts/nuclei_xsections.py b/scripts/nuclei_xsections.py deleted file mode 100755 index 04664c2..0000000 --- a/scripts/nuclei_xsections.py +++ /dev/null @@ -1,235 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -# Filename: nuclei_xsections.py -# Author: Johannes Schumann <jschumann@km3net.de> -""" -Generate - -Usage: - nuclei_xsections.py DATAFILE [--Zmin=<Zmin>] [--Zmax=<Zmax>] [--threads=<n>] [--verbose] [--anticc] - nuclei_xsections.py DATAFILE PLOTFILE - nuclei_xsections.py (-h | --help) - -Options: - -h --help Show this screen. - OUTFILE Filename for the hdf5 output containing the plot data - PLOTFILE Filename for the pdf output containing the plots - --threads=<n> Number of worker threads which should be used to process data - parallel [default: 1] - --verbose Display GiBUU output -""" -import os -import time -import numpy as np -import km3pipe as kp -from tempfile import TemporaryDirectory -from os.path import dirname, abspath -from collections import defaultdict - -from concurrent.futures import ThreadPoolExecutor - -from km3buu.ctrl import run_jobcard -from km3buu.jobcard import Jobcard -from km3buu.jobcard import XSECTIONMODE_LOOKUP, PROCESS_LOOKUP, FLAVOR_LOOKUP -from km3buu.output import GiBUUOutput - - -def generate_neutrino_jobcard(process, flavor, energy, target): - """ - Generate a jobcard for neutrino interaction - - Parameters - ---------- - process: str - Interaction channel ["CC", "NC", "antiCC", "antiNC"] - flavour: str - Flavour ["electron", "muon", "tau"] - energy: float - Initial energy of the neutrino in GeV - target: (int, int) - (Z, A) describing the target nukleon - input_path: str - The input path pointing to the GiBUU lookup data which should be used - """ - jc = Jobcard() - # NEUTRINO - jc.set_property("neutrino_induced", "process_ID", - PROCESS_LOOKUP[process.lower()]) - jc.set_property("neutrino_induced", "flavor_ID", - FLAVOR_LOOKUP[flavor.lower()]) - jc.set_property("neutrino_induced", "nuXsectionMode", - XSECTIONMODE_LOOKUP["dSigmaMC"]) - jc.set_property("neutrino_induced", "includeDIS", True) - jc.set_property("neutrino_induced", "includeDELTA", True) - jc.set_property("neutrino_induced", "includeRES", True) - jc.set_property("neutrino_induced", "includeQE", True) - jc.set_property("neutrino_induced", "include1pi", True) - jc.set_property("neutrino_induced", "include2p2hQE", True) - jc.set_property("neutrino_induced", "include2pi", False) - jc.set_property("neutrino_induced", "include2p2hDelta", False) - jc.set_property("neutrino_induced", "printAbsorptionXS", "T") - jc.set_property("nl_SigmaMC", "enu", energy) - # INPUT - jc.set_property("input", "numTimeSteps", 0) - jc.set_property("input", "eventtype", 5) - jc.set_property("input", "numEnsembles", 10000) - jc.set_property("input", "delta_T", 0.2) - jc.set_property("input", "localEnsemble", True) - jc.set_property("input", "num_runs_SameEnergy", 1) - jc.set_property("input", "LRF_equals_CALC_frame", True) - # TARGET - jc.set_property("target", "target_Z", target[0]) - jc.set_property("target", "target_A", target[1]) - # MISC - # jc.set_property("nl_neutrinoxsection", "DISmassless", True) - jc.set_property("neutrinoAnalysis", "outputEvents", True) - jc.set_property("pythia", "PARP(91)", 0.44) - return jc - - -def worker(energy, Z, anti_flag=False): - process = "cc" - if anti_flag: - process = "anticc" - # create a neutrino jobcard for oxygen - tmpjc = generate_neutrino_jobcard(process, "electron", energy, (Z, 2 * Z)) - datadir = TemporaryDirectory(dir=dirname('.'), prefix="%sGeV" % energy) - run_jobcard(tmpjc, datadir.name) - data = GiBUUOutput(datadir) - return data - - -def plot(datafile, plotfile): - import h5py - import matplotlib.pyplot as plt - from matplotlib.backends.backend_pdf import PdfPages - import matplotlib.colors as colors - with PdfPages(plotfile) as pdf: - f = h5py.File(datafile, 'r') - data = f['xsec'][()] - data = data[['energy', 'Z', 'sum']] - energies = np.sort(np.unique(data['energy'])) - Zrange = np.sort(np.unique(data['Z'])) - fig, ax = plt.subplots() - h = ax.hist2d(x=data['energy'], - y=data['Z'], - bins=(energies, Zrange), - weights=np.divide(data['sum'], data['energy'])) - cb = plt.colorbar(h[3], ax=ax) - cb.ax.get_yaxis().labelpad = 15 - cb.ax.set_ylabel(r"$\nu$ Crosssection / E [$10^-38cm^{cm^2}/GeV$]") - plt.xlabel("Energy [GeV]") - plt.ylabel(r"Z") - plt.xscale('log') - pdf.savefig() - plt.close() - data = f['particles'][()] - data = data[['energy', 'Z', 'multiplicity', 'particles']] - particle_ids = np.unique(data['particles']) - for p in particle_ids: - mask = data['particles'] == p - fig, ax = plt.subplots() - tmp = data[mask] - h = ax.hist2d(x=tmp['energy'], - y=tmp['Z'], - bins=(energies, Zrange), - weights=tmp['multiplicity'], - norm=colors.LogNorm()) - cb = plt.colorbar(h[3], ax=ax) - cb.ax.get_yaxis().labelpad = 15 - cb.ax.set_ylabel(r"Particle Count") - plt.xlabel("Energy [GeV]") - plt.ylabel(r"Z") - plt.xscale('log') - plt.title('Particle %s' % p) - pdf.savefig() - plt.close() - - -class GiBUUTaskPump(kp.Module): - def configure(self): - self.tasks = self.require('tasks') - self.energies = self.require('energies') - self.Zrange = self.require('zrange') - - def process(self, blob): - blob = kp.Blob() - if len(self.tasks) == 0: - raise StopIteration - key = list(self.tasks.keys())[0] - task = self.tasks.pop(key) - res = task.result() - xsec = res.xsection - dct = dict(zip(xsec.dtype.names, xsec.tolist())) - dct.update({'energy': self.energies[key[0]], 'Z': self.Zrange[key[1]]}) - blob['Xsection'] = kp.Table(dct, h5loc='xsec') - ev = res.events[:] - ids, counts = np.unique(ev['id'], return_counts=True) - dct = { - 'energy': self.energies[key[0]], - 'Z': self.Zrange[key[1]], - 'particles': ids, - 'multiplicity': counts - } - blob['Particles'] = kp.Table(dct, h5loc='particles') - return blob - - -def main(): - from docopt import docopt - args = docopt(__doc__) - datafile = args['DATAFILE'] - if args['PLOTFILE']: - plotfile = args['PLOTFILE'] - plot(datafile, plotfile) - return - - if args["--verbose"]: - log = kp.logger.get_logger("ctrl.py") - log.setLevel("INFO") - workers = int(args["--threads"]) - xsections = defaultdict(list) - - Zmin = 1 - if args['--Zmin']: - Zmin = int(args['--Zmin']) - - Zmax = 16 - if args['--Zmax']: - Zmax = int(args['--Zmax']) - - energies = np.logspace(-1, 3, 100) - Zrange = range(Zmin, Zmax + 1) - tasks = {} - with ThreadPoolExecutor(max_workers=workers) as executor: - for i, energy in enumerate(energies): - for j, Z in enumerate(Zrange): - tasks[i, j] = executor.submit(worker, energy, Z, - args["--anticc"]) - if args["--verbose"]: - import click - while True: - time.sleep(1) - status = {k: v.done() for k, v in tasks.items()} - click.clear() - for idx, st in status.items(): - click.echo("Energy %.3f - Z %d: %s" % - (energies[idx[0]], Zrange[idx[1]], st)) - if all(status.values()): - break - - pipe = kp.Pipeline() - pipe.attach(GiBUUTaskPump, tasks=tasks, energies=energies, zrange=Zrange) - pipe.attach(kp.io.HDF5Sink, filename=datafile) - pipe.drain() - - # for i, res in tasks.items(): - # data = res.result() - # for k in ['sum', 'QE', 'highRES', 'DIS', 'Delta']: - # xsections[k].append(data.xsection[k]) - # for k in ['sum', 'QE', 'highRES', 'DIS', 'Delta']: - # plt.plot(energies, np.divide(xsections[k], energies), label=k) - - -if __name__ == '__main__': - main() diff --git a/scripts/plot_cc_xsection.py b/scripts/plot_cc_xsection.py deleted file mode 100755 index 9a2aa00..0000000 --- a/scripts/plot_cc_xsection.py +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -# Filename: plot_cc_xsection.py -# Author: Johannes Schumann <jschumann@km3net.de> -""" -Generate - -Usage: - neutrino_jobcard_generator.py OUTFILE [--threads=<n>] [--verbose] [--anticc] - neutrino_jobcard_generator.py (-h | --help) - -Options: - -h --help Show this screen. - OUTFILE Filename for the output pdf containing the plot - --threads=<n> Number of worker threads which should be used to process data - parallel [default: 1] - --verbose Display GiBUU output -""" -import os -import time -import numpy as np -import matplotlib.pyplot as plt -from thepipe.logger import get_logger -from tempfile import TemporaryDirectory -from os.path import dirname, abspath -from collections import defaultdict - -from concurrent.futures import ThreadPoolExecutor - -from km3buu.ctrl import run_jobcard -from km3buu.jobcard import Jobcard -from km3buu.jobcard import XSECTIONMODE_LOOKUP, PROCESS_LOOKUP, FLAVOR_LOOKUP -from km3buu.output import GiBUUOutput - - -def generate_neutrino_jobcard(process, flavor, energy, target): - """ - Generate a jobcard for neutrino interaction - - Parameters - ---------- - process: str - Interaction channel ["CC", "NC", "antiCC", "antiNC"] - flavour: str - Flavour ["electron", "muon", "tau"] - energy: float - Initial energy of the neutrino in GeV - target: (int, int) - (Z, A) describing the target nukleon - input_path: str - The input path pointing to the GiBUU lookup data which should be used - """ - jc = Jobcard() - # NEUTRINO - jc.set_property("neutrino_induced", "process_ID", - PROCESS_LOOKUP[process.lower()]) - jc.set_property("neutrino_induced", "flavor_ID", - FLAVOR_LOOKUP[flavor.lower()]) - jc.set_property("neutrino_induced", "nuXsectionMode", - XSECTIONMODE_LOOKUP["dSigmaMC"]) - jc.set_property("neutrino_induced", "includeDIS", True) - jc.set_property("neutrino_induced", "includeDELTA", True) - jc.set_property("neutrino_induced", "includeRES", True) - jc.set_property("neutrino_induced", "includeQE", True) - jc.set_property("neutrino_induced", "include1pi", True) - jc.set_property("neutrino_induced", "include2p2hQE", True) - jc.set_property("neutrino_induced", "include2pi", False) - jc.set_property("neutrino_induced", "include2p2hDelta", False) - jc.set_property("neutrino_induced", "printAbsorptionXS", "T") - jc.set_property("nl_SigmaMC", "enu", energy) - # INPUT - jc.set_property("input", "numTimeSteps", 0) - jc.set_property("input", "eventtype", 5) - jc.set_property("input", "numEnsembles", 10000) - jc.set_property("input", "delta_T", 0.2) - jc.set_property("input", "localEnsemble", True) - jc.set_property("input", "num_runs_SameEnergy", 1) - jc.set_property("input", "LRF_equals_CALC_frame", True) - # TARGET - jc.set_property("target", "target_Z", target[0]) - jc.set_property("target", "target_A", target[1]) - # MISC - # jc.set_property("nl_neutrinoxsection", "DISmassless", True) - jc.set_property("neutrinoAnalysis", "outputEvents", False) - jc.set_property("pythia", "PARP(91)", 0.44) - return jc - - -def worker(energy, anti_flag=False): - process = "cc" - if anti_flag: - process = "anticc" - # create a neutrino jobcard for oxygen - tmpjc = generate_neutrino_jobcard(process, "electron", energy, (8, 16)) - datadir = TemporaryDirectory(dir=dirname(__file__), - prefix="%sGeV" % energy) - run_jobcard(tmpjc, datadir.name) - data = GiBUUOutput(datadir.name) - return data - - -def main(): - from docopt import docopt - args = docopt(__doc__) - if args["--verbose"]: - log = get_logger("ctrl.py") - log.setLevel("INFO") - workers = int(args["--threads"]) - xsections = defaultdict(list) - energies = np.logspace(-1, 1, 60) - tasks = {} - with ThreadPoolExecutor(max_workers=workers) as executor: - for i, energy in enumerate(energies): - tasks[i] = executor.submit(worker, energy, args["--anticc"]) - if args["--verbose"]: - import click - while True: - time.sleep(1) - status = {k: v.done() for k, v in tasks.items()} - click.clear() - for thr, st in status.items(): - click.echo("Thread %s (%s): %s" % (thr, energies[thr], st)) - if all(status.values()): - break - for i, res in tasks.items(): - data = res.result() - for k in ['sum', 'QE', 'highRES', 'DIS', 'Delta']: - xsections[k].append(data.xsection[k]) - for k in ['sum', 'QE', 'highRES', 'DIS', 'Delta']: - plt.plot(energies, np.divide(xsections[k], energies), label=k) - plt.xlabel("Energy [GeV]") - plt.ylabel(r"$\nu$ Crosssection / E [$10^-38cm^{cm^2}/GeV$]") - plt.legend() - plt.xscale("log") - plt.grid() - plt.savefig(args["OUTFILE"]) - - -if __name__ == '__main__': - main() -- GitLab