From f8eba5d4f56f164846a20532b86c0d9ab7a4f771 Mon Sep 17 00:00:00 2001 From: Sylvester Joosten <sylvester.joosten@gmail.com> Date: Sat, 30 Jan 2021 18:01:13 -0600 Subject: [PATCH] Update the CI scripts for the DIS stub to be consistent with the more generic DVMP scripts. Also did some more restructuring of the benchmark to make it easier to split off a generic benchmark library in the future. --- .clang-format | 2 +- .gitlab-ci.yml | 6 +- .rootlogon.C | 12 +- accelerator | 1 + benchmarks.json => benchmarks/benchmarks.json | 0 {dis => benchmarks/dis}/.gitignore | 0 {dis => benchmarks/dis}/README.md | 0 benchmarks/dis/analysis/dis.h | 26 +++ benchmarks/dis/analysis/dis_electrons.cxx | 116 ++++++++++ benchmarks/dis/benchmark.json | 6 + benchmarks/dis/config.yml | 50 +++++ benchmarks/dis/dis.sh | 141 +++++++++++++ benchmarks/dis/env.sh | 50 +++++ benchmarks/dis/gen.sh | 96 +++++++++ .../dis}/generator/gen_central_electrons.cxx | 0 .../dis/generator/pythia_dis.cxx | 24 +-- {dvcs => benchmarks/dvcs}/config.yml | 4 +- {dvcs => benchmarks/dvcs}/dvcs.sh | 10 +- .../dvcs}/scripts/dvcs_tests.cxx | 0 .../dvcs}/scripts/merge_results.py | 0 benchmarks/dvmp/analysis/dvmp.h | 56 +++++ .../dvmp}/analysis/vm_invar.cxx | 139 ++++++------ .../dvmp}/analysis/vm_mass.cxx | 176 ++++++++-------- {dvmp => benchmarks/dvmp}/benchmark.json | 0 {dvmp => benchmarks/dvmp}/config.yml | 22 +- {dvmp => benchmarks/dvmp}/dvmp.sh | 23 +- {dvmp => benchmarks/dvmp}/env.sh | 0 {dvmp => benchmarks/dvmp}/gen.sh | 13 +- .../dvmp}/generator/jpsi_barrel.json.in | 0 .../dvmp}/generator/jpsi_central.json.in | 0 dis/analysis/rec_dis_electrons.cxx | 113 ---------- dis/config.yml | 26 --- dis/dis.sh | 100 --------- dis/gen.sh | 65 ------ dis/generator/placeholder | 0 dis/util/placeholder | 0 dvcs/tests/report.xml | 10 - dvcs/tests/report2.xml | 12 -- dvmp/.gitignore | 0 dvmp/analysis/benchmark.hh | 1 - dvmp/analysis/exception.hh | 1 - dvmp/analysis/plot.h | 40 ---- dvmp/analysis/util.h | 198 ------------------ include/benchmark.h | 124 +++++++++++ include/exception.h | 22 ++ {dvmp/analysis => include}/mt.h | 0 include/plot.h | 42 ++++ include/util.h | 159 ++++++++++++++ {config => options}/env.sh | 4 + pythia_dis | Bin 0 -> 304896 bytes tools/{start_dev_shell.sh => dev-shell} | 0 util/benchmark.hh | 117 ----------- util/build_detector.sh | 4 +- util/collect_benchmarks.py | 2 +- util/collect_tests.py | 2 +- util/compile_analyses.py | 119 +++++++++++ util/exception.hh | 23 -- util/parse_cmd.sh | 6 +- 58 files changed, 1237 insertions(+), 926 deletions(-) create mode 160000 accelerator rename benchmarks.json => benchmarks/benchmarks.json (100%) rename {dis => benchmarks/dis}/.gitignore (100%) rename {dis => benchmarks/dis}/README.md (100%) create mode 100644 benchmarks/dis/analysis/dis.h create mode 100644 benchmarks/dis/analysis/dis_electrons.cxx create mode 100644 benchmarks/dis/benchmark.json create mode 100644 benchmarks/dis/config.yml create mode 100755 benchmarks/dis/dis.sh create mode 100644 benchmarks/dis/env.sh create mode 100755 benchmarks/dis/gen.sh rename {dis => benchmarks/dis}/generator/gen_central_electrons.cxx (100%) rename dis/src/pythia_dis.cc => benchmarks/dis/generator/pythia_dis.cxx (94%) rename {dvcs => benchmarks/dvcs}/config.yml (80%) rename {dvcs => benchmarks/dvcs}/dvcs.sh (87%) rename {dvcs => benchmarks/dvcs}/scripts/dvcs_tests.cxx (100%) rename {dvcs => benchmarks/dvcs}/scripts/merge_results.py (100%) create mode 100644 benchmarks/dvmp/analysis/dvmp.h rename {dvmp => benchmarks/dvmp}/analysis/vm_invar.cxx (54%) rename {dvmp => benchmarks/dvmp}/analysis/vm_mass.cxx (56%) rename {dvmp => benchmarks/dvmp}/benchmark.json (100%) rename {dvmp => benchmarks/dvmp}/config.yml (62%) rename {dvmp => benchmarks/dvmp}/dvmp.sh (91%) rename {dvmp => benchmarks/dvmp}/env.sh (100%) rename {dvmp => benchmarks/dvmp}/gen.sh (91%) rename {dvmp => benchmarks/dvmp}/generator/jpsi_barrel.json.in (100%) rename {dvmp => benchmarks/dvmp}/generator/jpsi_central.json.in (100%) delete mode 100644 dis/analysis/rec_dis_electrons.cxx delete mode 100644 dis/config.yml delete mode 100644 dis/dis.sh delete mode 100644 dis/gen.sh delete mode 100644 dis/generator/placeholder delete mode 100644 dis/util/placeholder delete mode 100644 dvcs/tests/report.xml delete mode 100644 dvcs/tests/report2.xml delete mode 100644 dvmp/.gitignore delete mode 120000 dvmp/analysis/benchmark.hh delete mode 120000 dvmp/analysis/exception.hh delete mode 100644 dvmp/analysis/plot.h delete mode 100644 dvmp/analysis/util.h create mode 100644 include/benchmark.h create mode 100644 include/exception.h rename {dvmp/analysis => include}/mt.h (100%) create mode 100644 include/plot.h create mode 100644 include/util.h rename {config => options}/env.sh (96%) create mode 100755 pythia_dis rename tools/{start_dev_shell.sh => dev-shell} (100%) delete mode 100644 util/benchmark.hh create mode 100755 util/compile_analyses.py delete mode 100644 util/exception.hh diff --git a/.clang-format b/.clang-format index 05b10dc8..c43c6165 100644 --- a/.clang-format +++ b/.clang-format @@ -44,7 +44,7 @@ BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeColon BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true -ColumnLimit: 120 +ColumnLimit: 100 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: false diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4f819023..d522499b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -33,9 +33,9 @@ detector: - ./util/build_detector.sh include: - - local: 'dis/config.yml' - - local: 'dvmp/config.yml' - - local: 'dvcs/config.yml' + - local: 'benchmarks/dis/config.yml' + - local: 'benchmarks/dvmp/config.yml' + - local: 'benchmarks/dvcs/config.yml' summary: stage: finish diff --git a/.rootlogon.C b/.rootlogon.C index 0be78dd3..9c11c3a4 100644 --- a/.rootlogon.C +++ b/.rootlogon.C @@ -1,10 +1,16 @@ { // Ensure fmt is loaded R__LOAD_LIBRARY(libfmt); + // + // top-level include-dir + gROOT->ProcessLine(".include include"); // setup a local build directory so we don't polute our source code with - // ROOT dictionaries etc. - gSystem->SetBuildDir("/tmp/root_build"); + // ROOT dictionaries etc. if desired + const char* build_dir = gSystem->Getenv("ROOT_BUILD_DIR"); + if (build_dir) { + gSystem->SetBuildDir(build_dir); + } // style definition based off the ATLAS style TStyle* s = gStyle; @@ -37,7 +43,7 @@ // use large fonts // Int_t font=72; // Helvetica italics - Int_t font = 43; // Helvetica + Int_t font = 43; // Helvetica Double_t tsize = 26; s->SetTextFont(font); diff --git a/accelerator b/accelerator new file mode 160000 index 00000000..f3ff428e --- /dev/null +++ b/accelerator @@ -0,0 +1 @@ +Subproject commit f3ff428e3b926a41e95beaa984d8dc05cec37cc7 diff --git a/benchmarks.json b/benchmarks/benchmarks.json similarity index 100% rename from benchmarks.json rename to benchmarks/benchmarks.json diff --git a/dis/.gitignore b/benchmarks/dis/.gitignore similarity index 100% rename from dis/.gitignore rename to benchmarks/dis/.gitignore diff --git a/dis/README.md b/benchmarks/dis/README.md similarity index 100% rename from dis/README.md rename to benchmarks/dis/README.md diff --git a/benchmarks/dis/analysis/dis.h b/benchmarks/dis/analysis/dis.h new file mode 100644 index 00000000..0e88a01a --- /dev/null +++ b/benchmarks/dis/analysis/dis.h @@ -0,0 +1,26 @@ +#ifndef DVMP_H +#define DVMP_H + +#include <util.h> + +#include <algorithm> +#include <cmath> +#include <exception> +#include <fmt/core.h> +#include <limits> +#include <string> +#include <vector> + +#include <Math/Vector4D.h> + +// Additional utility functions for DVMP benchmarks. Where useful, these can be +// promoted to the top-level util library +namespace util { + + // ADD EXTRA DIS UTILTIY FUNCTIONS HERE + + //========================================================================================================= + +} // namespace util + +#endif diff --git a/benchmarks/dis/analysis/dis_electrons.cxx b/benchmarks/dis/analysis/dis_electrons.cxx new file mode 100644 index 00000000..02dc7b0d --- /dev/null +++ b/benchmarks/dis/analysis/dis_electrons.cxx @@ -0,0 +1,116 @@ +#include "dis.h" +#include "plot.h" + +#include <benchmark.h> +#include <mt.h> +#include <util.h> + +#include "ROOT/RDataFrame.hxx" +#include <cmath> +#include <fmt/color.h> +#include <fmt/core.h> +#include <fstream> +#include <iostream> +#include <nlohmann/json.hpp> +#include <string> +#include <vector> + +int dis_electrons(const std::string& config_name) +{ + // read our configuration + std::ifstream config_file{config_name}; + nlohmann::json config; + config_file >> config; + + const std::string rec_file = config["rec_file"]; + const std::string detector = config["detector"]; + std::string output_prefix = config["output_prefix"]; + const std::string test_tag = config["test_tag"]; + + fmt::print(fmt::emphasis::bold | fg(fmt::color::forest_green), + "Running DIS electron analysis...\n"); + fmt::print(" - Detector package: {}\n", detector); + fmt::print(" - input file: {}\n", rec_file); + fmt::print(" - output prefix: {}\n", output_prefix); + fmt::print(" - test tag: {}\n", test_tag); + + // create our test definition + // test_tag + eic::util::Test dis_Q2_resolution{ + {{"name", fmt::format("{}_Q2_resolution", test_tag)}, + {"title", "DIS Q2 resolution"}, + {"description", + fmt::format("DIS Q2 resolution with {}, estimated using a Gaussian fit.", detector)}, + {"quantity", "resolution (in %)"}, + {"target", "0.1"}}}; + + // Run this in multi-threaded mode if desired + ROOT::EnableImplicitMT(kNumThreads); + + const double electron_mass = util::get_pdg_mass("electron"); + + // Ensure our output prefix always ends on a dot, a slash or a dash + // Necessary when generating output plots + if (output_prefix.back() != '.' && output_prefix.back() != '/' && output_prefix.back() != '-') { + output_prefix += "-"; + } + + ROOT::RDataFrame d("events", rec_file); + + // utility lambda functions to bind the reconstructed particle type + // (as we have no PID yet) + auto momenta_from_tracking = + [electron_mass](const std::vector<eic::TrackParametersData>& tracks) { + return util::momenta_from_tracking(tracks, electron_mass); + }; + + auto d0 = d.Define("p_rec", momenta_from_tracking, {"outputTrackParameters"}) + .Define("N", "p_rec.size()") + .Define("p_sim", util::momenta_from_simulation, {"mcparticles2"}) + .Define("mom_sim", util::mom, {"p_sim"}) + .Define("mom_rec", util::mom, {"p_rec"}); + + auto h_mom_sim = d0.Histo1D({"h_mom_sim", "; GeV; counts", 100, 0, 50}, "mom_sim"); + auto h_mom_rec = d0.Histo1D({"h_mom_rec", "; GeV; counts", 100, 0, 50}, "mom_rec"); + + auto c = new TCanvas(); + + // Plot our histograms. + // TODO: to start I'm explicitly plotting the histograms, but want to + // factorize out the plotting code moving forward. + { + TCanvas c{"canvas", "canvas", 1200, 1200}; + c.cd(); + // gPad->SetLogx(false); + gPad->SetLogy(true); + auto& h1 = *h_mom_sim; + auto& h2 = *h_mom_rec; + // histogram style + h1.SetLineColor(plot::kMpBlue); + h1.SetLineWidth(2); + h2.SetLineColor(plot::kMpOrange); + h2.SetLineWidth(2); + // axes + h1.GetXaxis()->CenterTitle(); + h1.GetYaxis()->CenterTitle(); + // draw everything + h1.DrawClone("hist"); + h2.DrawClone("hist same"); + // FIXME hardcoded beam configuration + plot::draw_label(18, 275, detector); + TText* tptr1; + auto t1 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); + t1->SetFillColorAlpha(kWhite, 0); + t1->SetTextFont(43); + t1->SetTextSize(25); + tptr1 = t1->AddText("simulated"); + tptr1->SetTextColor(plot::kMpBlue); + tptr1 = t1->AddText("reconstructed"); + tptr1->SetTextColor(plot::kMpOrange); + t1->Draw(); + + c.Print(fmt::format("{}momentum.png", output_prefix).c_str()); + } + + return 0; +} diff --git a/benchmarks/dis/benchmark.json b/benchmarks/dis/benchmark.json new file mode 100644 index 00000000..1754f81a --- /dev/null +++ b/benchmarks/dis/benchmark.json @@ -0,0 +1,6 @@ +{ + "name": "DIS/SIDIS", + "title": "DIS/SIDIS Benchmarks", + "description": "Benchmark for (Semi-inclusive) DIS", + "target": "0.8" +} diff --git a/benchmarks/dis/config.yml b/benchmarks/dis/config.yml new file mode 100644 index 00000000..6331fd56 --- /dev/null +++ b/benchmarks/dis/config.yml @@ -0,0 +1,50 @@ +dis:generate: + stage: initialize + needs: [] + timeout: 1 hours + cache: + key: + files: + - benchmarks/dis/generator/pythia_dis.cxx + prefix: "$CI_COMMIT_REF_SLUG" + paths: + - input/dis + artifacts: + paths: + - input + script: + - bash benchmarks/dis/gen.sh --config barrel --ebeam 18 --pbeam 275 + +dis:process: + stage: process + needs: ["detector", "dis:generate"] + timeout: 1 hour + script: + - source options/env.sh + - ./util/compile_analyses.py dis + - ./benchmarks/dis/dis.sh --config barrel --ebeam 18 --pbeam 275 + artifacts: + paths: + - results + retry: + max: 2 + when: + - runner_system_failure + cache: + key: + files: + - .rootlogon.C + - util/compile_analyses.py + prefix: "$CI_COMMIT_REF_SLUG" + paths: + - .local/root_build + +dis:results: + stage: collect + needs: ["dis:process"] + script: + - ./util/collect_tests.py dis + artifacts: + paths: + - results/dis.json + - results/dis diff --git a/benchmarks/dis/dis.sh b/benchmarks/dis/dis.sh new file mode 100755 index 00000000..77fb85a5 --- /dev/null +++ b/benchmarks/dis/dis.sh @@ -0,0 +1,141 @@ +#!/bin/bash + +## ============================================================================= +## Run the DIS benchmarks in 5 steps: +## 1. Parse the command line and setup environment +## 2. Detector simulation through npsim +## 3. Digitization and reconstruction through Juggler +## 4. Root-based Physics analyses +## 5. Finalize +## ============================================================================= + +## make sure we launch this script from the project root directory +PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/../.. +pushd ${PROJECT_ROOT} + +echo "Running the DIS benchmarks" + +## ============================================================================= +## Step 1: Setup the environment variables +## +## First parse the command line flags. +## This sets the following environment variables: +## - CONFIG: The specific generator configuration +## - EBEAM: The electron beam energy +## - PBEAM: The ion beam energy +source util/parse_cmd.sh $@ + +## To run the reconstruction, we need the following global variables: +## - JUGGLER_INSTALL_PREFIX: Install prefix for Juggler (simu/recon) +## - JUGGLER_DETECTOR: the detector package we want to use for this benchmark +## - DETECTOR_PATH: full path to the detector definitions +## +## You can ready options/env.sh for more in-depth explanations of the variables +## and how they can be controlled. +source options/env.sh + +## We also need the following benchmark-specific variables: +## +## - BENCHMARK_TAG: Unique identified for this benchmark process. +## - BEAM_TAG: Identifier for the chosen beam configuration +## - INPUT_PATH: Path for generator-level input to the benchmarks +## - TMP_PATH: Path for temporary data (not exported as artifacts) +## - RESULTS_PATH: Path for benchmark output figures and files +## +## You can read dvmp/env.sh for more in-depth explanations of the variables. +source benchmarks/dis/env.sh + +## Get a unique file names based on the configuration options +GEN_FILE=${INPUT_PATH}/gen-${CONFIG}_${JUGGLER_N_EVENTS}.hepmc + +SIM_FILE=${TMP_PATH}/sim-${CONFIG}.root +SIM_LOG=${TMP_PATH}/sim-${CONFIG}.log + + +REC_FILE=${TMP_PATH}/rec-${CONFIG}.root +REC_LOG=${TMP_PATH}/sim-${CONFIG}.log + +PLOT_TAG=${CONFIG} + +## ============================================================================= +## Step 2: Run the simulation +echo "Running Geant4 simulation" +npsim --runType batch \ + --part.minimalKineticEnergy 1000*GeV \ + -v WARNING \ + --numberOfEvents ${JUGGLER_N_EVENTS} \ + --compactFile ${DETECTOR_PATH}/${JUGGLER_DETECTOR}.xml \ + --inputFiles ${GEN_FILE} \ + --outputFile ${SIM_FILE} +if [ "$?" -ne "0" ] ; then + echo "ERROR running npsim" + exit 1 +fi + +## ============================================================================= +## Step 3: Run digitization & reconstruction +echo "Running the digitization and reconstruction" +## FIXME Need to figure out how to pass file name to juggler from the commandline +## the tracker_reconstruction.py options file uses the following environment +## variables: +## - JUGGLER_SIM_FILE: input detector simulation +## - JUGGLER_REC_FILE: output reconstructed data +## - JUGGLER_DETECTOR_PATH: Location of the detector geometry +## - JUGGLER_N_EVENTS: number of events to process (part of global environment) +## - JUGGLER_DETECTOR: detector package (part of global environment) +export JUGGLER_SIM_FILE=${SIM_FILE} +export JUGGLER_REC_FILE=${REC_FILE} +export JUGGLER_DETECTOR_PATH=${DETECTOR_PATH} +xenv -x ${JUGGLER_INSTALL_PREFIX}/Juggler.xenv \ + gaudirun.py options/tracker_reconstruction.py \ + 2>&1 > ${REC_LOG} +## on-error, first retry running juggler again as there is still a random +## crash we need to address FIXME +if [ "$?" -ne "0" ] ; then + echo "Juggler crashed, retrying..." + xenv -x ${JUGGLER_INSTALL_PREFIX}/Juggler.xenv \ + gaudirun.py options/tracker_reconstruction.py \ + 2>&1 > ${REC_LOG} + if [ "$?" -ne "0" ] ; then + echo "ERROR running juggler, both attempts failed" + exit 1 + fi +fi + +## ============================================================================= +## Step 4: Analysis +## write a temporary configuration file for the analysis script +echo "Running analysis" +CONFIG="${TMP_PATH}/${PLOT_TAG}.json" +cat << EOF > ${CONFIG} +{ + "rec_file": "${REC_FILE}", + "detector": "${JUGGLER_DETECTOR}", + "output_prefix": "${RESULTS_PATH}/${PLOT_TAG}", + "test_tag": "${BEAM_TAG}" +} +EOF +#cat ${CONFIG} +root -b -q "benchmarks/dis/analysis/dis_electrons.cxx+(\"${CONFIG}\")" +#root -b -q "benchmarks/dis/analysis/dis_electrons.cxx(\"${CONFIG}\")" +if [[ "$?" -ne "0" ]] ; then + echo "ERROR running rec_dis_electron script" + exit 1 +fi + +## ============================================================================= +## Step 5: finalize +echo "Finalizing DIS benchmark" + +## Move over reconsturction artifacts as long as we don't have +## too many events +if [ "${JUGGLER_N_EVENTS}" -lt "500" ] ; then + cp ${REC_FILE} ${RESULTS_PATH} +fi + +## Always move over log files to the results path +cp ${REC_LOG} ${RESULTS_PATH} + +## ============================================================================= +## All done! +echo "DIS benchmarks complete" diff --git a/benchmarks/dis/env.sh b/benchmarks/dis/env.sh new file mode 100644 index 00000000..1a5b153f --- /dev/null +++ b/benchmarks/dis/env.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +## ============================================================================= +## Local configuration variables for this particular benchmark +## It defines the following additional variables: +## +## - BENCHMARK_TAG: Tag to identify this particular benchmark +## - BEAM_TAG Tag to identify the beam configuration +## - INPUT_PATH: Path for generator-level input to the benchmarks +## - TMP_PATH: Path for temporary data (not exported as artifacts) +## - RESULTS_PATH: Path for benchmark output figures and files +## +## This script assumes that EBEAM and PBEAM are set as part of the +## calling script (usually as command line argument). +## +## ============================================================================= + +## Tag for the local benchmark. Should be the same as the directory name for +## this particular benchmark set (for clarity). +## This tag is used for the output artifacts directory (results/${JUGGLER_TAG}) +## and a tag in some of the output files. +export BENCHMARK_TAG="dis" +echo "Setting up the local environment for the ${BENCHMARK_TAG^^} benchmarks" + +## Extra beam tag to identify the desired beam configuration +export BEAM_TAG="${EBEAM}on${PBEAM}" + +## Data path for input data (generator-level hepmc file) +INPUT_PATH="input/${BENCHMARK_TAG}/${BEAM_TAG}" +mkdir -p ${INPUT_PATH} +export INPUT_PATH=`realpath ${INPUT_PATH}` +echo "INPUT_PATH: ${INPUT_PATH}" + + +## Data path for temporary data (not exported as artifacts) +TMP_PATH=${LOCAL_PREFIX}/tmp/${BEAM_TAG} +mkdir -p ${TMP_PATH} +export TMP_PATH=`realpath ${TMP_PATH}` +echo "TMP_PATH: ${TMP_PATH}" + +## Data path for benchmark output (plots and reconstructed files +## if not too big). +RESULTS_PATH="results/${BENCHMARK_TAG}/${BEAM_TAG}" +mkdir -p ${RESULTS_PATH} +export RESULTS_PATH=`realpath ${RESULTS_PATH}` +echo "RESULTS_PATH: ${RESULTS_PATH}" + +## ============================================================================= +## That's all! +echo "Local environment setup complete." diff --git a/benchmarks/dis/gen.sh b/benchmarks/dis/gen.sh new file mode 100755 index 00000000..4a42081a --- /dev/null +++ b/benchmarks/dis/gen.sh @@ -0,0 +1,96 @@ +#!/bin/bash + +## ============================================================================= +## Standin for a proper pythia generation process, similar to how we +## generate events for DVMP +## Runs in 5 steps: +## 1. Parse the command line and setup the environment +## 2. Check if we can load the requested file from the cache +## 3. Build generator exe +## 4. Run the actual generator +## 5. Finalize +## ============================================================================= +## ============================================================================= + +## make sure we launch this script from the project root directory +PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/../.. +pushd ${PROJECT_ROOT} + +## ============================================================================= +## Step 1: Setup the environment variables +## First parse the command line flags. +## This sets the following environment variables: +## - CONFIG: The specific generator configuration --> not currenlty used FIXME +## - EBEAM: The electron beam energy --> not currently used FIXME +## - PBEAM: The ion beam energy --> not currently used FIXME +source util/parse_cmd.sh $@ + +## To run the generator, we need the following global variables: +## +## - LOCAL_PREFIX: Place to cache local packages and data +## - JUGGLER_N_EVENTS: Number of events to process +## - JUGGLER_RNG_SEED: Random seed for event generation. +## +## You can read options/env.sh for more in-depth explanations of the variables +## and how they can be controlled. +source options/env.sh + +## We also need the following benchmark-specific variables: +## +## - BENCHMARK_TAG: Unique identified for this benchmark process. +## - INPUT_PATH: Path for generator-level input to the benchmarks +## - TMP_PATH: Path for temporary data (not exported as artifacts) +## +## You can read dvmp/env.sh for more in-depth explanations of the variables. +source benchmarks/dis/env.sh + +## Get a unique file name prefix based on the configuration options +GEN_TAG=gen-${CONFIG}_${JUGGLER_N_EVENTS} ## Generic file prefix + +## ============================================================================= +## Step 2: Check if we really need to run, or can use the cache. +if [ -f "${INPUT_PATH}/${GEN_TAG}.hepmc" ]; then + echo "Found cached generator output for $GEN_TAG, no need to rerun" + exit 0 +fi + +echo "Generator output for $GEN_TAG not found in cache, need to run generator" + +## ============================================================================= +## Step 3: Build generator exe +## TODO: need to configurability to the generator exe + +echo "Compiling benchmarks/dis/generator/pythia_dis.cxx ..." +g++ benchmarks/dis/generator/pythia_dis.cxx -o pythia_dis \ + -I/usr/local/include -Iinclude \ + -O2 -std=c++11 -pedantic -W -Wall -Wshadow -fPIC \ + -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lpythia8 -ldl \ + -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lHepMC3 +if [[ "$?" -ne "0" ]] ; then + echo "ERROR compiling pythia" + exit 1 +fi +echo "done" + +## ============================================================================= +## Step 4: Run the event generator +echo "Running the generator" +./pythia_dis ${TMP_PATH}/${GEN_TAG}.hepmc +if [[ "$?" -ne "0" ]] ; then + echo "ERROR running pythia" + exit 1 +fi + + +## ============================================================================= +## Step 5: Finally, move relevant output into the artifacts directory and clean up +## ============================================================================= +echo "Moving generator output into ${INPUT_PATH}" +mv ${TMP_PATH}/${GEN_TAG}.hepmc ${INPUT_PATH}/${GEN_TAG}.hepmc +## this step only matters for local execution +echo "Cleaning up" +## does nothing + +## ============================================================================= +## All done! +echo "$BENCHMARK_TAG event generation complete" diff --git a/dis/generator/gen_central_electrons.cxx b/benchmarks/dis/generator/gen_central_electrons.cxx similarity index 100% rename from dis/generator/gen_central_electrons.cxx rename to benchmarks/dis/generator/gen_central_electrons.cxx diff --git a/dis/src/pythia_dis.cc b/benchmarks/dis/generator/pythia_dis.cxx similarity index 94% rename from dis/src/pythia_dis.cc rename to benchmarks/dis/generator/pythia_dis.cxx index ff819a7e..a4867968 100644 --- a/dis/src/pythia_dis.cc +++ b/benchmarks/dis/generator/pythia_dis.cxx @@ -1,7 +1,7 @@ #include "Pythia8/Pythia.h" #include "Pythia8Plugins/HepMC3.h" -#include <unistd.h> #include <cassert> +#include <unistd.h> using namespace Pythia8; @@ -13,7 +13,7 @@ using std::string; enum class mode { none, help, list, part }; struct settings { - double E_electron = 10.0; // GeV + double E_electron = 18.0; // GeV double E_ion = 275.0; // GeV std::string outfile = "dis.hepmc"; int ion_PID = 2212; @@ -22,7 +22,7 @@ struct settings { bool success = false; double Q2_min = 4.0; int N_events = 1000; - mode selected = mode::none; + mode selected = mode::none; }; template <typename T> @@ -63,16 +63,15 @@ void print_man_page(T cli, const char* argv0) } //______________________________________________________________________________ -settings cmdline_settings(int argc, char* argv[]) { +settings cmdline_settings(int argc, char* argv[]) +{ settings s; - auto lastOpt = - " options:" % (option("-h", "--help").set(s.selected, mode::help) % "show help", - value("file", s.outfile).if_missing([] { - std::cout << "You need to provide an output filename argument!\n"; - }) % "output file"); + auto lastOpt = " options:" % (option("-h", "--help").set(s.selected, mode::help) % "show help", + value("file", s.outfile).if_missing([] { + std::cout << "You need to provide an output filename argument!\n"; + }) % "output file"); - auto cli = - (command("help").set(s.selected, mode::help) | lastOpt); + auto cli = (command("help").set(s.selected, mode::help) | lastOpt); assert(cli.flags_are_prefix_free()); @@ -95,7 +94,8 @@ settings cmdline_settings(int argc, char* argv[]) { } //______________________________________________________________________________ -int main(int argc, char* argv[]) { +int main(int argc, char* argv[]) +{ settings s = cmdline_settings(argc, argv); if (!s.success) { diff --git a/dvcs/config.yml b/benchmarks/dvcs/config.yml similarity index 80% rename from dvcs/config.yml rename to benchmarks/dvcs/config.yml index 0f63429f..d2c1a447 100644 --- a/dvcs/config.yml +++ b/benchmarks/dvcs/config.yml @@ -3,7 +3,7 @@ dvcs:process: timeout: 1 hour needs: ["detector"] script: - - bash dvcs/dvcs.sh + - bash benchmarks/dvcs/dvcs.sh artifacts: paths: - results @@ -18,5 +18,3 @@ dvcs:results: paths: - results # reports: - # junit: ["results/dvcs/dvcs_report.xml"] - diff --git a/dvcs/dvcs.sh b/benchmarks/dvcs/dvcs.sh similarity index 87% rename from dvcs/dvcs.sh rename to benchmarks/dvcs/dvcs.sh index 436406f2..35bbcafe 100644 --- a/dvcs/dvcs.sh +++ b/benchmarks/dvcs/dvcs.sh @@ -15,9 +15,9 @@ echo "JUGGLER_FILE_NAME_TAG = ${JUGGLER_FILE_NAME_TAG}" ## - JUGGLER_DETECTOR: the detector package we want to use for this benchmark ## - DETECTOR_PATH: full path to the detector definitions ## -## You can ready config/env.sh for more in-depth explanations of the variables +## You can ready options/env.sh for more in-depth explanations of the variables ## and how they can be controlled. -source config/env.sh +source options/env.sh curl -o test_proton_dvcs_eic.hepmc "https://eicweb.phy.anl.gov/api/v4/projects/345/jobs/artifacts/master/raw/data/test_proton_dvcs_eic.hepmc?job=compile" @@ -51,7 +51,7 @@ fi mkdir -p results/dvcs -root -b -q "dvcs/scripts/dvcs_tests.cxx(\"${JUGGLER_REC_FILE}\")" +root -b -q "benchmarks/dvcs/scripts/dvcs_tests.cxx(\"${JUGGLER_REC_FILE}\")" if [[ "$?" -ne "0" ]] ; then echo "ERROR running root script" exit 1 @@ -62,10 +62,6 @@ if [[ "${JUGGLER_N_EVENTS}" -lt "500" ]] ; then cp ${JUGGLER_REC_FILE} results/dvcs/. fi -# Collect the results -#cp dvcs/report.xml results/dvcs/. -#cp dvcs/report2.xml results/dvcs/. - diff --git a/dvcs/scripts/dvcs_tests.cxx b/benchmarks/dvcs/scripts/dvcs_tests.cxx similarity index 100% rename from dvcs/scripts/dvcs_tests.cxx rename to benchmarks/dvcs/scripts/dvcs_tests.cxx diff --git a/dvcs/scripts/merge_results.py b/benchmarks/dvcs/scripts/merge_results.py similarity index 100% rename from dvcs/scripts/merge_results.py rename to benchmarks/dvcs/scripts/merge_results.py diff --git a/benchmarks/dvmp/analysis/dvmp.h b/benchmarks/dvmp/analysis/dvmp.h new file mode 100644 index 00000000..371b454f --- /dev/null +++ b/benchmarks/dvmp/analysis/dvmp.h @@ -0,0 +1,56 @@ +#ifndef DVMP_H +#define DVMP_H + +#include <util.h> + +#include <algorithm> +#include <cmath> +#include <exception> +#include <fmt/core.h> +#include <limits> +#include <string> +#include <vector> + +#include <Math/Vector4D.h> + +// Additional utility functions for DVMP benchmarks. Where useful, these can be +// promoted to the top-level util library +namespace util { + + // Calculate the 4-vector sum of a given pair of particles + inline ROOT::Math::PxPyPzMVector + get_sum(const std::pair<ROOT::Math::PxPyPzMVector, ROOT::Math::PxPyPzMVector>& particle_pair) + { + return (particle_pair.first + particle_pair.second); + } + + //======================================================================================================== + // for structure functions + + struct inv_quant { // add more when needed + double nu, Q2, x; + }; + + // for simu + inline inv_quant calc_inv_quant_simu(const std::vector<ROOT::Math::PxPyPzMVector>& parts) + { + ROOT::Math::PxPyPzMVector q(parts[0] - parts[2]); + ROOT::Math::PxPyPzMVector P(parts[3]); + + double nu = q.Dot(P) / P.mass(); + double Q2 = -q.Dot(q); + inv_quant quantities = {nu, Q2, Q2 / 2. / P.mass() / nu}; + return quantities; + } + + inline double get_nu_simu(inv_quant quantities) { return quantities.nu / 1000.; } + inline double get_Q2_simu(inv_quant quantities) { return quantities.Q2; } + inline double get_x_simu(inv_quant quantities) { return quantities.x; } + + // for tracking, add later + + //========================================================================================================= + +} // namespace util + +#endif diff --git a/dvmp/analysis/vm_invar.cxx b/benchmarks/dvmp/analysis/vm_invar.cxx similarity index 54% rename from dvmp/analysis/vm_invar.cxx rename to benchmarks/dvmp/analysis/vm_invar.cxx index f8723733..03349825 100644 --- a/dvmp/analysis/vm_invar.cxx +++ b/benchmarks/dvmp/analysis/vm_invar.cxx @@ -1,7 +1,9 @@ -#include "benchmark.hh" -#include "mt.h" +#include "dvmp.h" #include "plot.h" -#include "util.h" + +#include <benchmark.h> +#include <mt.h> +#include <util.h> #include <ROOT/RDataFrame.hxx> #include <cmath> @@ -17,36 +19,35 @@ // a desired vector meson (e.g. jpsi) and a desired decay particle (e.g. muon) // Output figures are written to our output prefix (which includes the output // file prefix), and labeled with our detector name. -// TODO: I think it would be better to pass small json configuration file to -// the test, instead of this ever-expanding list of function arguments. // FIXME: MC does not trace back into particle history. Need to fix that -int vm_invar(const std::string& config_name) { +int vm_invar(const std::string& config_name) +{ // read our configuration - std::ifstream config_file{config_name}; + std::ifstream config_file{config_name}; nlohmann::json config; config_file >> config; - const std::string rec_file = config["rec_file"]; - const std::string vm_name = config["vm_name"]; - const std::string decay_name = config["decay"]; - const std::string detector = config["detector"]; - std::string output_prefix = config["output_prefix"]; - const std::string test_tag = config["test_tag"]; + const std::string rec_file = config["rec_file"]; + const std::string vm_name = config["vm_name"]; + const std::string decay_name = config["decay"]; + const std::string detector = config["detector"]; + std::string output_prefix = config["output_prefix"]; + const std::string test_tag = config["test_tag"]; fmt::print(fmt::emphasis::bold | fg(fmt::color::forest_green), "Running VM invariant mass analysis...\n"); fmt::print(" - Vector meson: {}\n", vm_name); fmt::print(" - Decay particle: {}\n", decay_name); fmt::print(" - Detector package: {}\n", detector); + fmt::print(" - input file: {}\n", rec_file); fmt::print(" - output prefix: {}\n", output_prefix); // create our test definition // test_tag - eic::util::Test vm_mass_resolution_test{ - {{"name", - fmt::format("{}_{}_{}_mass_resolution", test_tag, vm_name, decay_name)}, + eic::util::Test Q2_resolution_test{ + {{"name", fmt::format("{}_{}_{}_Q2_resolution", test_tag, vm_name, decay_name)}, {"title", - fmt::format("{} -> {} Invariant Mass Resolution", vm_name, decay_name)}, + fmt::format("Q^2 Resolution for {} -> {} events with {}", vm_name, decay_name, detector)}, {"description", "Invariant Mass Resolution calculated from raw " "tracking data using a Gaussian fit."}, {"quantity", "resolution"}, @@ -56,12 +57,11 @@ int vm_invar(const std::string& config_name) { ROOT::EnableImplicitMT(kNumThreads); // The particles we are looking for. E.g. J/psi decaying into e+e- - const double vm_mass = util::get_pdg_mass(vm_name); + const double vm_mass = util::get_pdg_mass(vm_name); const double decay_mass = util::get_pdg_mass(decay_name); // Ensure our output prefix always ends on a dot, a slash or a dash - if (output_prefix.back() != '.' && output_prefix.back() != '/' && - output_prefix.back() != '-') { + if (output_prefix.back() != '.' && output_prefix.back() != '/' && output_prefix.back() != '-') { output_prefix += "-"; } @@ -70,74 +70,68 @@ int vm_invar(const std::string& config_name) { // utility lambda functions to bind the vector meson and decay particle // types - auto momenta_from_tracking = - [decay_mass](const std::vector<eic::TrackParametersData>& tracks) { - return util::momenta_from_tracking(tracks, decay_mass); - }; + auto momenta_from_tracking = [decay_mass](const std::vector<eic::TrackParametersData>& tracks) { + return util::momenta_from_tracking(tracks, decay_mass); + }; //==================================================================== - + // Define analysis flow - auto d_im = - d.Define("p_rec", momenta_from_tracking, {"outputTrackParameters"}) - .Define("N", "p_rec.size()") - .Define("p_sim", util::momenta_from_simulation, {"mcparticles2"}) - //================================================================ - .Define("invariant_quantities", util::calc_inv_quant_simu, {"p_sim"}) - .Define("nu_sim" , util::get_nu_simu, {"invariant_quantities"}) - .Define("Q2_sim" , util::get_Q2_simu, {"invariant_quantities"}) - .Define("x_sim" , util::get_x_simu, {"invariant_quantities"}); - //================================================================ + auto d_im = d.Define("p_rec", momenta_from_tracking, {"outputTrackParameters"}) + .Define("N", "p_rec.size()") + .Define("p_sim", util::momenta_from_simulation, {"mcparticles2"}) + //================================================================ + .Define("invariant_quantities", util::calc_inv_quant_simu, {"p_sim"}) + .Define("nu_sim", util::get_nu_simu, {"invariant_quantities"}) + .Define("Q2_sim", util::get_Q2_simu, {"invariant_quantities"}) + .Define("x_sim", util::get_x_simu, {"invariant_quantities"}); + //================================================================ // Define output histograms - - auto h_nu_sim = d_im.Histo1D( - {"h_nu_sim", ";#nu/1000;#", 100, 0., 2.}, "nu_sim"); - auto h_Q2_sim = d_im.Histo1D( - {"h_Q2_sim", ";Q^{2};#", 100, 0., 15.}, "Q2_sim"); - auto h_x_sim = d_im.Histo1D( - {"h_x_sim", ";x;#", 100, 0., 0.1}, "x_sim"); + auto h_nu_sim = d_im.Histo1D({"h_nu_sim", ";#nu/1000;#", 100, 0., 2.}, "nu_sim"); + auto h_Q2_sim = d_im.Histo1D({"h_Q2_sim", ";Q^{2};#", 100, 0., 15.}, "Q2_sim"); + auto h_x_sim = d_im.Histo1D({"h_x_sim", ";x;#", 100, 0., 0.1}, "x_sim"); // Plot our histograms. // TODO: to start I'm explicitly plotting the histograms, but want to // factorize out the plotting code moving forward. { - + // Print canvas to output file - + TCanvas c{"canvas2", "canvas2", 1800, 600}; c.Divide(3, 1, 0.0001, 0.0001); - //pad 1 nu + // pad 1 nu c.cd(1); - //gPad->SetLogx(false); - //gPad->SetLogy(false); + // gPad->SetLogx(false); + // gPad->SetLogy(false); auto& hnu = *h_nu_sim; // histogram style hnu.SetLineColor(plot::kMpBlue); hnu.SetLineWidth(2); // axes hnu.GetXaxis()->CenterTitle(); - //hnu.GetXaxis()->SetTitle("#times1000"); + // hnu.GetXaxis()->SetTitle("#times1000"); // draw everything hnu.DrawClone("hist"); // FIXME hardcoded beam configuration - plot::draw_label(10, 100, detector, vm_name, "#nu"); + plot::draw_label(10, 100, detector); TText* tptr21; - auto t21 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); + auto t21 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); t21->SetFillColorAlpha(kWhite, 0); t21->SetTextFont(43); t21->SetTextSize(25); tptr21 = t21->AddText("simulated"); tptr21->SetTextColor(plot::kMpBlue); - //tptr1 = t1->AddText("reconstructed"); - //tptr1->SetTextColor(plot::kMpOrange); + // tptr1 = t1->AddText("reconstructed"); + // tptr1->SetTextColor(plot::kMpOrange); t21->Draw(); - - //pad 2 Q2 + + // pad 2 Q2 c.cd(2); - //gPad->SetLogx(false); - //gPad->SetLogy(false); + // gPad->SetLogx(false); + // gPad->SetLogy(false); auto& hQ2 = *h_Q2_sim; // histogram style hQ2.SetLineColor(plot::kMpBlue); @@ -147,22 +141,22 @@ int vm_invar(const std::string& config_name) { // draw everything hQ2.DrawClone("hist"); // FIXME hardcoded beam configuration - plot::draw_label(10, 100, detector, vm_name, "Q^{2}"); + plot::draw_label(10, 100, detector); TText* tptr22; - auto t22 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); + auto t22 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); t22->SetFillColorAlpha(kWhite, 0); t22->SetTextFont(43); t22->SetTextSize(25); tptr22 = t22->AddText("simulated"); tptr22->SetTextColor(plot::kMpBlue); - //tptr1 = t1->AddText("reconstructed"); - //tptr1->SetTextColor(plot::kMpOrange); + // tptr1 = t1->AddText("reconstructed"); + // tptr1->SetTextColor(plot::kMpOrange); t22->Draw(); - - //pad 1 nu + + // pad 1 nu c.cd(3); - //gPad->SetLogx(false); - //gPad->SetLogy(false); + // gPad->SetLogx(false); + // gPad->SetLogy(false); auto& hx = *h_x_sim; // histogram style hx.SetLineColor(plot::kMpBlue); @@ -172,28 +166,27 @@ int vm_invar(const std::string& config_name) { // draw everything hx.DrawClone("hist"); // FIXME hardcoded beam configuration - plot::draw_label(10, 100, detector, vm_name, "x"); + plot::draw_label(10, 100, detector); TText* tptr23; - auto t23 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); + auto t23 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); t23->SetFillColorAlpha(kWhite, 0); t23->SetTextFont(43); t23->SetTextSize(25); tptr23 = t23->AddText("simulated"); tptr23->SetTextColor(plot::kMpBlue); - //tptr1 = t1->AddText("reconstructed"); - //tptr1->SetTextColor(plot::kMpOrange); + // tptr1 = t1->AddText("reconstructed"); + // tptr1->SetTextColor(plot::kMpOrange); t23->Draw(); - + c.Print(fmt::format("{}InvariantQuantities.png", output_prefix).c_str()); } - // TODO we're not actually doing an IM fit yet, so for now just return an + // TODO we're not actually getting the resolutions yet // error for the test result - vm_mass_resolution_test.error(-1); + Q2_resolution_test.error(-1); // write out our test data - eic::util::write_test(vm_mass_resolution_test, - fmt::format("{}vm_invar.json", output_prefix)); + eic::util::write_test(Q2_resolution_test, fmt::format("{}vm_invar.json", output_prefix)); // That's all! return 0; diff --git a/dvmp/analysis/vm_mass.cxx b/benchmarks/dvmp/analysis/vm_mass.cxx similarity index 56% rename from dvmp/analysis/vm_mass.cxx rename to benchmarks/dvmp/analysis/vm_mass.cxx index fb736909..82abba6f 100644 --- a/dvmp/analysis/vm_mass.cxx +++ b/benchmarks/dvmp/analysis/vm_mass.cxx @@ -1,7 +1,9 @@ -#include "benchmark.hh" -#include "mt.h" +#include "dvmp.h" #include "plot.h" -#include "util.h" + +#include <benchmark.h> +#include <mt.h> +#include <util.h> #include <ROOT/RDataFrame.hxx> #include <cmath> @@ -20,33 +22,34 @@ // TODO: I think it would be better to pass small json configuration file to // the test, instead of this ever-expanding list of function arguments. // FIXME: MC does not trace back into particle history. Need to fix that -int vm_mass(const std::string& config_name) { +int vm_mass(const std::string& config_name) +{ // read our configuration - std::ifstream config_file{config_name}; + std::ifstream config_file{config_name}; nlohmann::json config; config_file >> config; - const std::string rec_file = config["rec_file"]; - const std::string vm_name = config["vm_name"]; - const std::string decay_name = config["decay"]; - const std::string detector = config["detector"]; - std::string output_prefix = config["output_prefix"]; - const std::string test_tag = config["test_tag"]; + const std::string rec_file = config["rec_file"]; + const std::string vm_name = config["vm_name"]; + const std::string decay_name = config["decay"]; + const std::string detector = config["detector"]; + std::string output_prefix = config["output_prefix"]; + const std::string test_tag = config["test_tag"]; fmt::print(fmt::emphasis::bold | fg(fmt::color::forest_green), "Running VM invariant mass analysis...\n"); fmt::print(" - Vector meson: {}\n", vm_name); fmt::print(" - Decay particle: {}\n", decay_name); fmt::print(" - Detector package: {}\n", detector); + fmt::print(" - input file: {}\n", rec_file); fmt::print(" - output prefix: {}\n", output_prefix); // create our test definition // test_tag - eic::util::Test vm_mass_resolution_test{ - {{"name", - fmt::format("{}_{}_{}_mass_resolution", test_tag, vm_name, decay_name)}, - {"title", - fmt::format("{} -> {} Invariant Mass Resolution", vm_name, decay_name)}, + eic::util::Test mass_resolution_test{ + {{"name", fmt::format("{}_{}_{}_mass_resolution", test_tag, vm_name, decay_name)}, + {"title", fmt::format("{} Invariant Mass Resolution for {} -> {} with {}", vm_name, vm_name, + decay_name, detector)}, {"description", "Invariant Mass Resolution calculated from raw " "tracking data using a Gaussian fit."}, {"quantity", "resolution"}, @@ -56,12 +59,11 @@ int vm_mass(const std::string& config_name) { ROOT::EnableImplicitMT(kNumThreads); // The particles we are looking for. E.g. J/psi decaying into e+e- - const double vm_mass = util::get_pdg_mass(vm_name); + const double vm_mass = util::get_pdg_mass(vm_name); const double decay_mass = util::get_pdg_mass(decay_name); // Ensure our output prefix always ends on a dot, a slash or a dash - if (output_prefix.back() != '.' && output_prefix.back() != '/' && - output_prefix.back() != '-') { + if (output_prefix.back() != '.' && output_prefix.back() != '/' && output_prefix.back() != '-') { output_prefix += "-"; } @@ -70,56 +72,46 @@ int vm_mass(const std::string& config_name) { // utility lambda functions to bind the vector meson and decay particle // types - auto momenta_from_tracking = - [decay_mass](const std::vector<eic::TrackParametersData>& tracks) { - return util::momenta_from_tracking(tracks, decay_mass); - }; - auto find_decay_pair = - [vm_mass](const std::vector<ROOT::Math::PxPyPzMVector>& parts) { - return util::find_decay_pair(parts, vm_mass); - }; - - - //util::PrintGeant4(mcparticles2); + auto momenta_from_tracking = [decay_mass](const std::vector<eic::TrackParametersData>& tracks) { + return util::momenta_from_tracking(tracks, decay_mass); + }; + auto find_decay_pair = [vm_mass](const std::vector<ROOT::Math::PxPyPzMVector>& parts) { + return util::find_decay_pair(parts, vm_mass); + }; + + // util::PrintGeant4(mcparticles2); // Define analysis flow - auto d_im = - d.Define("p_rec", momenta_from_tracking, {"outputTrackParameters"}) - .Define("N", "p_rec.size()") - .Define("p_sim", util::momenta_from_simulation, {"mcparticles2"}) - .Define("decay_pair_rec", find_decay_pair, {"p_rec"}) - .Define("decay_pair_sim", find_decay_pair, {"p_sim"}) - .Define("mass_rec", util::get_im, {"decay_pair_rec"}) - .Define("mass_sim", util::get_im, {"decay_pair_sim"}) - .Define("pt_rec", util::get_pt, {"decay_pair_rec"}) - .Define("pt_sim", util::get_pt, {"decay_pair_sim"}) - .Define("phi_rec" , util::get_phi, {"decay_pair_rec"}) - .Define("phi_sim" , util::get_phi, {"decay_pair_sim"}) - .Define("rapidity_rec" , util::get_y, {"decay_pair_rec"}) - .Define("rapidity_sim" , util::get_y, {"decay_pair_sim"}); - + auto d_im = d.Define("p_rec", momenta_from_tracking, {"outputTrackParameters"}) + .Define("N", "p_rec.size()") + .Define("p_sim", util::momenta_from_simulation, {"mcparticles2"}) + .Define("decay_pair_rec", find_decay_pair, {"p_rec"}) + .Define("decay_pair_sim", find_decay_pair, {"p_sim"}) + .Define("p_vm_rec", "decay_pair_rec.first + decay_pair_rec.second") + .Define("p_vm_sim", "decay_pair_sim.first + decay_pair_sim.second") + //.Define("p_vm_sim", util::get_sum, {"decay_pair_sim"}) + .Define("mass_rec", "p_vm_rec.M()") + .Define("mass_sim", "p_vm_sim.M()") + .Define("pt_rec", "p_vm_rec.pt()") + .Define("pt_sim", "p_vm_sim.pt()") + .Define("phi_rec", "p_vm_rec.phi()") + .Define("phi_sim", "p_vm_sim.phi()") + .Define("eta_rec", "p_vm_rec.eta()") + .Define("eta_sim", "p_vm_sim.eta()"); // Define output histograms - auto h_im_rec = d_im.Histo1D( - {"h_im_rec", ";m_{ll'} (GeV/c^{2});#", 100, -1.1, vm_mass + 5}, "mass_rec"); - auto h_im_sim = d_im.Histo1D( - {"h_im_sim", ";m_{ll'} (GeV/c^{2});#", 100, -1.1, vm_mass + 5}, "mass_sim"); - - auto h_pt_rec = d_im.Histo1D( - {"h_pt_rec", ";p_{T} (GeV/c);#", 400, 0., 40.}, "pt_rec"); - auto h_pt_sim = d_im.Histo1D( - {"h_pt_sim", ";p_{T} (GeV/c);#", 400, 0., 40.}, "pt_sim"); - - auto h_phi_rec = d_im.Histo1D( - {"h_phi_rec", ";#phi_{ll'};#", 90, -M_PI, M_PI}, "phi_rec"); - auto h_phi_sim = d_im.Histo1D( - {"h_phi_sim", ";#phi_{ll'};#", 90, -M_PI, M_PI}, "phi_sim"); - - auto h_y_rec = d_im.Histo1D( - {"h_y_rec", ";y_{ll'};#", 1000, -5., 5.}, "rapidity_rec"); - auto h_y_sim = d_im.Histo1D( - {"h_y_sim", ";y_{ll'};#", 1000, -5., 5.}, "rapidity_sim"); + auto h_im_rec = + d_im.Histo1D({"h_im_rec", ";m_{ll'} (GeV/c^{2});#", 100, -1.1, vm_mass + 5}, "mass_rec"); + auto h_im_sim = + d_im.Histo1D({"h_im_sim", ";m_{ll'} (GeV/c^{2});#", 100, -1.1, vm_mass + 5}, "mass_sim"); + + auto h_pt_rec = d_im.Histo1D({"h_pt_rec", ";p_{T} (GeV/c);#", 400, 0., 40.}, "pt_rec"); + auto h_pt_sim = d_im.Histo1D({"h_pt_sim", ";p_{T} (GeV/c);#", 400, 0., 40.}, "pt_sim"); + auto h_phi_rec = d_im.Histo1D({"h_phi_rec", ";#phi_{ll'};#", 90, -M_PI, M_PI}, "phi_rec"); + auto h_phi_sim = d_im.Histo1D({"h_phi_sim", ";#phi_{ll'};#", 90, -M_PI, M_PI}, "phi_sim"); + auto h_eta_rec = d_im.Histo1D({"h_eta_rec", ";#eta_{ll'};#", 1000, -5., 5.}, "eta_rec"); + auto h_eta_sim = d_im.Histo1D({"h_eta_sim", ";#eta_{ll'};#", 1000, -5., 5.}, "eta_sim"); // Plot our histograms. // TODO: to start I'm explicitly plotting the histograms, but want to @@ -127,10 +119,10 @@ int vm_mass(const std::string& config_name) { { TCanvas c{"canvas", "canvas", 1200, 1200}; c.Divide(2, 2, 0.0001, 0.0001); - //pad 1 mass + // pad 1 mass c.cd(1); - //gPad->SetLogx(false); - //gPad->SetLogy(false); + // gPad->SetLogx(false); + // gPad->SetLogy(false); auto& h11 = *h_im_sim; auto& h12 = *h_im_rec; // histogram style @@ -145,9 +137,9 @@ int vm_mass(const std::string& config_name) { h11.DrawClone("hist"); h12.DrawClone("hist same"); // FIXME hardcoded beam configuration - plot::draw_label(10, 100, detector, vm_name, "Invariant mass"); + plot::draw_label(10, 100, detector); TText* tptr1; - auto t1 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); + auto t1 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); t1->SetFillColorAlpha(kWhite, 0); t1->SetTextFont(43); t1->SetTextSize(25); @@ -156,11 +148,11 @@ int vm_mass(const std::string& config_name) { tptr1 = t1->AddText("reconstructed"); tptr1->SetTextColor(plot::kMpOrange); t1->Draw(); - - //pad 2 pt + + // pad 2 pt c.cd(2); - //gPad->SetLogx(false); - //gPad->SetLogy(false); + // gPad->SetLogx(false); + // gPad->SetLogy(false); auto& h21 = *h_pt_sim; auto& h22 = *h_pt_rec; // histogram style @@ -175,9 +167,9 @@ int vm_mass(const std::string& config_name) { h21.DrawClone("hist"); h22.DrawClone("hist same"); // FIXME hardcoded beam configuration - plot::draw_label(10, 100, detector, vm_name, "Transverse Momentum"); + plot::draw_label(10, 100, detector); TText* tptr2; - auto t2 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); + auto t2 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); t2->SetFillColorAlpha(kWhite, 0); t2->SetTextFont(43); t2->SetTextSize(25); @@ -186,11 +178,11 @@ int vm_mass(const std::string& config_name) { tptr2 = t2->AddText("reconstructed"); tptr2->SetTextColor(plot::kMpOrange); t2->Draw(); - - //pad 3 phi + + // pad 3 phi c.cd(3); - //gPad->SetLogx(false); - //gPad->SetLogy(false); + // gPad->SetLogx(false); + // gPad->SetLogy(false); auto& h31 = *h_phi_sim; auto& h32 = *h_phi_rec; // histogram style @@ -205,9 +197,9 @@ int vm_mass(const std::string& config_name) { h31.DrawClone("hist"); h32.DrawClone("hist same"); // FIXME hardcoded beam configuration - plot::draw_label(10, 100, detector, vm_name, "#phi"); + plot::draw_label(10, 100, detector); TText* tptr3; - auto t3 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); + auto t3 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); t3->SetFillColorAlpha(kWhite, 0); t3->SetTextFont(43); t3->SetTextSize(25); @@ -216,13 +208,13 @@ int vm_mass(const std::string& config_name) { tptr3 = t3->AddText("reconstructed"); tptr3->SetTextColor(plot::kMpOrange); t3->Draw(); - - //pad 4 rapidity + + // pad 4 rapidity c.cd(4); - //gPad->SetLogx(false); - //gPad->SetLogy(false); - auto& h41 = *h_y_sim; - auto& h42 = *h_y_rec; + // gPad->SetLogx(false); + // gPad->SetLogy(false); + auto& h41 = *h_eta_sim; + auto& h42 = *h_eta_rec; // histogram style h41.SetLineColor(plot::kMpBlue); h41.SetLineWidth(2); @@ -235,9 +227,9 @@ int vm_mass(const std::string& config_name) { h41.DrawClone("hist"); h42.DrawClone("hist same"); // FIXME hardcoded beam configuration - plot::draw_label(10, 100, detector, vm_name, "Rapidity"); + plot::draw_label(10, 100, detector); TText* tptr4; - auto t4 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); + auto t4 = new TPaveText(.6, .8417, .9, .925, "NB NDC"); t4->SetFillColorAlpha(kWhite, 0); t4->SetTextFont(43); t4->SetTextSize(25); @@ -248,16 +240,14 @@ int vm_mass(const std::string& config_name) { t4->Draw(); c.Print(fmt::format("{}vm_mass_pt_phi_rapidity.png", output_prefix).c_str()); - } // TODO we're not actually doing an IM fit yet, so for now just return an // error for the test result - vm_mass_resolution_test.error(-1); + mass_resolution_test.error(-1); // write out our test data - eic::util::write_test(vm_mass_resolution_test, - fmt::format("{}vm_mass.json", output_prefix)); + eic::util::write_test(mass_resolution_test, fmt::format("{}_mass.json", output_prefix)); // That's all! return 0; diff --git a/dvmp/benchmark.json b/benchmarks/dvmp/benchmark.json similarity index 100% rename from dvmp/benchmark.json rename to benchmarks/dvmp/benchmark.json diff --git a/dvmp/config.yml b/benchmarks/dvmp/config.yml similarity index 62% rename from dvmp/config.yml rename to benchmarks/dvmp/config.yml index 5a17fddd..941bafd4 100644 --- a/dvmp/config.yml +++ b/benchmarks/dvmp/config.yml @@ -6,8 +6,8 @@ dvmp:generate: cache: key: files: - - dvmp/generator/jpsi_central.json - - dvmp/scripts/jpsi_central-generate.sh + - benchmarks/dvmp/generator/jpsi_central.json + - benchmarks/dvmp/scripts/jpsi_central-generate.sh prefix: "$CI_COMMIT_REF_SLUG" paths: - input/dvmp @@ -15,7 +15,7 @@ dvmp:generate: paths: - input script: - - ./util/run_many.py ./dvmp/gen.sh + - ./util/run_many.py ./benchmarks/dvmp/gen.sh -c jpsi_barrel -e 10x100 --decay muon --decay electron @@ -26,7 +26,9 @@ dvmp:process: needs: ["detector", "dvmp:generate"] timeout: 1 hour script: - - ./util/run_many.py ./dvmp/dvmp.sh + - source options/env.sh + - ./util/compile_analyses.py dvmp + - ./util/run_many.py ./benchmarks/dvmp/dvmp.sh -c jpsi_barrel -e 10x100 --decay muon --decay electron @@ -35,6 +37,18 @@ dvmp:process: artifacts: paths: - results + retry: + max: 2 + when: + - runner_system_failure + cache: + key: + files: + - .rootlogon.C + - util/compile_analyses.py + prefix: "$CI_COMMIT_REF_SLUG" + paths: + - .local/root_build dvmp:results: stage: collect diff --git a/dvmp/dvmp.sh b/benchmarks/dvmp/dvmp.sh similarity index 91% rename from dvmp/dvmp.sh rename to benchmarks/dvmp/dvmp.sh index 0d263a96..1746a860 100755 --- a/dvmp/dvmp.sh +++ b/benchmarks/dvmp/dvmp.sh @@ -10,7 +10,7 @@ ## ============================================================================= ## make sure we launch this script from the project root directory -PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/.. +PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/../.. pushd ${PROJECT_ROOT} echo "Running the DVMP benchmarks" @@ -35,9 +35,9 @@ source util/parse_cmd.sh $@ ## - JUGGLER_DETECTOR: the detector package we want to use for this benchmark ## - DETECTOR_PATH: full path to the detector definitions ## -## You can ready config/env.sh for more in-depth explanations of the variables +## You can ready options/env.sh for more in-depth explanations of the variables ## and how they can be controlled. -source config/env.sh +source options/env.sh ## We also need the following benchmark-specific variables: ## @@ -48,7 +48,7 @@ source config/env.sh ## - RESULTS_PATH: Path for benchmark output figures and files ## ## You can read dvmp/env.sh for more in-depth explanations of the variables. -source dvmp/env.sh +source benchmarks/dvmp/env.sh ## Get a unique file names based on the configuration options GEN_FILE=${INPUT_PATH}/gen-${CONFIG}_${DECAY}_${JUGGLER_N_EVENTS}.hepmc @@ -107,7 +107,6 @@ if [ "$?" -ne "0" ] ; then exit 1 fi fi -#ls -l ## ============================================================================= ## Step 4: Analysis @@ -127,10 +126,14 @@ EOF #cat ${CONFIG} ## run the analysis script with this configuration -root -b -q "dvmp/analysis/vm_mass.cxx(\"${CONFIG}\")" -root -b -q "dvmp/analysis/vm_invar.cxx(\"${CONFIG}\")" +root -b -q "benchmarks/dvmp/analysis/vm_mass.cxx+(\"${CONFIG}\")" if [ "$?" -ne "0" ] ; then - echo "ERROR running root script" + echo "ERROR running vm_mass script" + exit 1 +fi +root -b -q "benchmarks/dvmp/analysis/vm_invar.cxx+(\"${CONFIG}\")" +if [ "$?" -ne "0" ] ; then + echo "ERROR running vm_invar script" exit 1 fi @@ -145,11 +148,11 @@ if [ "${JUGGLER_N_EVENTS}" -lt "500" ] ; then fi ## Always move over log files to the results path -mv ${SIM_LOG} ${REC_LOG} ${RESULTS_PATH} +mv ${REC_LOG} ${RESULTS_PATH} ## cleanup output files -rm -f ${REC_FILE} ${SIM_FILE} +#rm -f ${REC_FILE} ${SIM_FILE} ## --> not needed for CI ## ============================================================================= ## All done! diff --git a/dvmp/env.sh b/benchmarks/dvmp/env.sh similarity index 100% rename from dvmp/env.sh rename to benchmarks/dvmp/env.sh diff --git a/dvmp/gen.sh b/benchmarks/dvmp/gen.sh similarity index 91% rename from dvmp/gen.sh rename to benchmarks/dvmp/gen.sh index 0c9544b7..8bef0a11 100755 --- a/dvmp/gen.sh +++ b/benchmarks/dvmp/gen.sh @@ -11,9 +11,10 @@ ## ============================================================================= ## make sure we launch this script from the project root directory -PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/.. +PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/../.. pushd ${PROJECT_ROOT} + ## ============================================================================= ## Step 1: Setup the environment variables ## @@ -32,9 +33,9 @@ source util/parse_cmd.sh $@ ## - JUGGLER_N_EVENTS: Number of events to process ## - JUGGLER_RNG_SEED: Random seed for event generation. ## -## You can read config/env.sh for more in-depth explanations of the variables +## You can read options/env.sh for more in-depth explanations of the variables ## and how they can be controlled. -source config/env.sh +source options/env.sh ## We also need the following benchmark-specific variables: ## @@ -43,7 +44,7 @@ source config/env.sh ## - TMP_PATH: Path for temporary data (not exported as artifacts) ## ## You can read dvmp/env.sh for more in-depth explanations of the variables. -source dvmp/env.sh +source benchmarks/dvmp/env.sh ## Get a unique file name prefix based on the configuration options GEN_TAG=gen-${CONFIG}_${DECAY}_${JUGGLER_N_EVENTS} ## Generic file prefix @@ -72,7 +73,7 @@ elif [ $DECAY = "muon" ]; then fi ## generate the config file for this generator setup -CONFIG_IN="${BENCHMARK_TAG}/generator/${CONFIG}.json.in" +CONFIG_IN="benchmarks/${BENCHMARK_TAG}/generator/${CONFIG}.json.in" echo "Creating generator configuration file ${GEN_TAG}.json" if [ ! -f ${CONFIG_IN} ]; then echo "ERROR: cannot find master config file ${CONFIG_IN}" @@ -106,4 +107,6 @@ done echo "Cleaning up" rm ${TMP_PATH}/${GEN_TAG}.json +## ============================================================================= ## All done! +echo "$BENCHMARK_TAG event generation complete" diff --git a/dvmp/generator/jpsi_barrel.json.in b/benchmarks/dvmp/generator/jpsi_barrel.json.in similarity index 100% rename from dvmp/generator/jpsi_barrel.json.in rename to benchmarks/dvmp/generator/jpsi_barrel.json.in diff --git a/dvmp/generator/jpsi_central.json.in b/benchmarks/dvmp/generator/jpsi_central.json.in similarity index 100% rename from dvmp/generator/jpsi_central.json.in rename to benchmarks/dvmp/generator/jpsi_central.json.in diff --git a/dis/analysis/rec_dis_electrons.cxx b/dis/analysis/rec_dis_electrons.cxx deleted file mode 100644 index b7227a1d..00000000 --- a/dis/analysis/rec_dis_electrons.cxx +++ /dev/null @@ -1,113 +0,0 @@ -#include "ROOT/RDataFrame.hxx" -#include <iostream> - -#include "dd4pod/Geant4ParticleCollection.h" -#include "eicd/TrackParametersCollection.h" -#include "eicd/ClusterCollection.h" -#include "eicd/ClusterData.h" - -using ROOT::RDataFrame; -using namespace ROOT::VecOps; - -auto p_track = [](std::vector<eic::TrackParametersData> const& in) { - std::vector<double> result; - for (size_t i = 0; i < in.size(); ++i) { - result.push_back(std::abs(1.0/(in[i].qOverP))); - } - return result; -}; - -std::vector<float> pt (std::vector<dd4pod::Geant4ParticleData> const& in){ - std::vector<float> result; - for (size_t i = 0; i < in.size(); ++i) { - result.push_back(std::sqrt(in[i].psx * in[i].psx + in[i].psy * in[i].psy)); - } - return result; -} - -auto momentum = [](std::vector<ROOT::Math::PxPyPzMVector> const& in) { - std::vector<double> result; - for (size_t i = 0; i < in.size(); ++i) { - result.push_back(in[i].E()); - } - return result; -}; -auto theta = [](std::vector<ROOT::Math::PxPyPzMVector> const& in) { - std::vector<double> result; - for (size_t i = 0; i < in.size(); ++i) { - result.push_back(in[i].Theta()*180/M_PI); - } - return result; -}; -auto fourvec = [](ROOT::VecOps::RVec<dd4pod::Geant4ParticleData> const& in) { - std::vector<ROOT::Math::PxPyPzMVector> result; - ROOT::Math::PxPyPzMVector lv; - for (size_t i = 0; i < in.size(); ++i) { - lv.SetCoordinates(in[i].psx, in[i].psy, in[i].psz, in[i].mass); - result.push_back(lv); - } - return result; -}; - -auto delta_p = [](const std::vector<double>& tracks, const std::vector<double>& thrown) { - std::vector<double> res; - for (const auto& p1 : thrown) { - for (const auto& p2 : tracks) { - res.push_back(p1 - p2); - } - } - return res; -}; - -int rec_dis_electrons(const char* fname = "topside/rec_central_electrons.root") -{ - - ROOT::EnableImplicitMT(); - ROOT::RDataFrame df("events", fname); - - auto df0 = df.Define("isThrown", "mcparticles2.genStatus == 1") - .Define("thrownParticles", "mcparticles2[isThrown]") - .Define("thrownP", fourvec, {"thrownParticles"}) - .Define("p_thrown", momentum, {"thrownP"}) - .Define("nTracks", "outputTrackParameters.size()") - .Define("p_track", p_track, {"outputTrackParameters"}) - .Define("p_track1", p_track, {"outputTrackParameters1"}) - .Define("p_track2", p_track, {"outputTrackParameters2"}) - .Define("delta_p",delta_p, {"p_track", "p_thrown"}) - .Define("delta_p1",delta_p, {"p_track1", "p_thrown"}) - .Define("delta_p2",delta_p, {"p_track2", "p_thrown"}); - - auto h_nTracks = df0.Histo1D({"h_nTracks", "; N tracks ", 10, 0, 10}, "nTracks"); - auto h_pTracks = df0.Histo1D({"h_pTracks", "; GeV/c ", 100, 0, 10}, "p_track"); - - auto h_delta_p = df0.Histo1D({"h_delta_p", "; GeV/c ", 100, -10, 10}, "delta_p"); - auto h_delta_p1 = df0.Histo1D({"h_delta_p1", "; GeV/c ", 100, -10, 10}, "delta_p1"); - auto h_delta_p2 = df0.Histo1D({"h_delta_p2", "; GeV/c ", 100, -10, 10}, "delta_p2"); - - auto c = new TCanvas(); - - h_nTracks->DrawCopy(); - c->SaveAs("results/dis/rec_central_electrons_nTracks.png"); - c->SaveAs("results/dis/rec_central_electrons_nTracks.pdf"); - - h_pTracks->DrawCopy(); - c->SaveAs("results/dis/rec_central_electrons_pTracks.png"); - c->SaveAs("results/dis/rec_central_electrons_pTracks.pdf"); - - THStack * hs = new THStack("hs_delta_p","; GeV/c "); - TH1D* h1 = (TH1D*) h_delta_p->Clone(); - hs->Add(h1); - h1 = (TH1D*) h_delta_p1->Clone(); - h1->SetLineColor(2); - hs->Add(h1); - h1 = (TH1D*) h_delta_p2->Clone(); - h1->SetLineColor(4); - h1->SetFillStyle(3001); - h1->SetFillColor(4); - hs->Add(h1); - hs->Draw("nostack"); - c->SaveAs("results/dis/rec_central_electrons_delta_p.png"); - c->SaveAs("results/dis/rec_central_electrons_delta_p.pdf"); - - return 0; -} diff --git a/dis/config.yml b/dis/config.yml deleted file mode 100644 index 7db7df61..00000000 --- a/dis/config.yml +++ /dev/null @@ -1,26 +0,0 @@ -dis:generate: - stage: initialize - image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:latest - needs: [] - timeout: 1 hours - artifacts: - paths: - - results - script: - - bash dis/gen.sh - -dis:process: - stage: process - needs: ["detector", "dis:generate"] - timeout: 1 hour - artifacts: - paths: - - results - script: - - echo "DIS benchmarks" - -dis:results: - stage: collect - needs: ["dis:process"] - script: - - echo "All DIS benchmarks successful" diff --git a/dis/dis.sh b/dis/dis.sh deleted file mode 100644 index 7c68e130..00000000 --- a/dis/dis.sh +++ /dev/null @@ -1,100 +0,0 @@ -#!/bin/bash - -## ============================================================================= -## Run the DVMP benchmarks in 5 steps: -## 1. Build/install detector package -## 2. Detector simulation through npsim -## 3. Digitization and reconstruction through Juggler -## 4. Root-based Physics analyses -## 5. Finalize -## ============================================================================= - -echo "Running the DIS benchmarks" - -## make sure we launch this script from the project root directory -PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/.. -pushd ${PROJECT_ROOT} - -## ============================================================================= -## Load the environment variables. To build the detector we need the following -## variables: -## -## - JUGGLER_INSTALL_PREFIX: Install prefix for Juggler (simu/recon) -## - JUGGLER_DETECTOR: the detector package we want to use for this benchmark -## - DETECTOR_PATH: full path to the detector definitions -## -## You can ready config/env.sh for more in-depth explanations of the variables -## and how they can be controlled. -source config/env.sh - -## Extra environment variables for DVMP: -## file tag for these tests -JUGGLER_FILE_NAME_TAG="dis" -# TODO use the input file name, as we will be generating a lot of these -# in the future... -# FIXME Generator file hardcoded for now -## note: these variables need to be exported to be accessible from -## the juggler options.py. We should really work on a dedicated -## juggler launcher to get rid of these "magic" variables. FIXME -export JUGGLER_GEN_FILE="results/dis/${JUGGLER_FILE_NAME_TAG}.hepmc" -export JUGGLER_SIM_FILE="sim_${JUGGLER_FILE_NAME_TAG}.root" -export JUGGLER_REC_FILE="rec_${JUGGLER_FILE_NAME_TAG}.root" - - -## ============================================================================= -## Step 1: Build/install the desired detector package -## TODO remove this -#bash util/build_detector.sh - - -## ============================================================================= -## Step 2: Run the simulation -echo "Running Geant4 simulation" -npsim --runType batch \ - --part.minimalKineticEnergy 1000*GeV \ - -v WARNING \ - --numberOfEvents ${JUGGLER_N_EVENTS} \ - --compactFile ${DETECTOR_PATH}/${JUGGLER_DETECTOR}.xml \ - --inputFiles ${JUGGLER_GEN_FILE} \ - --outputFile ${JUGGLER_SIM_FILE} -if [ "$?" -ne "0" ] ; then - echo "ERROR running npsim" - exit 1 -fi - -## ============================================================================= -## Step 3: Run digitization & reconstruction -echo "Running the digitization and reconstruction" -# FIXME Need to figure out how to pass file name to juggler from the commandline -xenv -x ${JUGGLER_INSTALL_PREFIX}/Juggler.xenv \ - gaudirun.py options/tracker_reconstruction.py -if [ "$?" -ne "0" ] ; then - echo "ERROR running juggler" - exit 1 -fi -ls -l - -## ============================================================================= -## Step 4: Analysis -root -b -q "dis/analysis/rec_dis_electrons.cxx(\"${JUGGLER_DETECTOR}/${JUGGLER_REC_FILE}\")" -if [[ "$?" -ne "0" ]] ; then - echo "ERROR running root script" - exit 1 -fi - -## ============================================================================= -## Step 5: finalize -echo "Finalizing ${JUGGLER_FILE_NAME_TAG} benchmark" - -## Copy over reconsturction artifacts as long as we don't have -## too many events -if [ "${JUGGLER_N_EVENTS}" -lt "500" ] ; then - cp ${JUGGLER_REC_FILE} results/dis/. -fi - -## cleanup output files -rm ${JUGGLER_REC_FILE} ${JUGGLER_SIM_FILE} - -## ============================================================================= -## All done! -echo "${JUGGLER_FILE_NAME_TAG} benchmarks complete" diff --git a/dis/gen.sh b/dis/gen.sh deleted file mode 100644 index e56e4edd..00000000 --- a/dis/gen.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -## ============================================================================= -## Standin for a proper pythia generation process, similar to how we -## generate events for DVMP -## ============================================================================= - -## TODO: use JUGGLER_FILE_NAME_TAG instead of explicitly refering to dis - -echo "Running the DIS benchmarks" - -## make sure we launch this script from the project root directory -PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/.. -pushd ${PROJECT_ROOT} - -## ============================================================================= -## Load the environment variables. To build the detector we need the following -## variables: -## -## - JUGGLER_INSTALL_PREFIX: Install prefix for Juggler (simu/recon) -## - JUGGLER_DETECTOR: the detector package we want to use for this benchmark -## - DETECTOR_PATH: full path to the detector definitions -## -## You can ready config/env.sh for more in-depth explanations of the variables -## and how they can be controlled. -source config/env.sh - -## Setup local environment -export DATA_PATH=results/dis - -## Extra environment variables for DVMP: -## file tag for these tests -JUGGLER_FILE_NAME_TAG="dis" - -## ============================================================================= -## Step 1: Dummy event generator -## TODO better file name that encodes the actual configuration we're running -echo "Compiling dis/src/pythia_dis.cc ..." -g++ dis/src/pythia_dis.cc -o pythia_dis \ - -I/usr/local/include -Iinclude \ - -O2 -std=c++11 -pedantic -W -Wall -Wshadow -fPIC \ - -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lpythia8 -ldl \ - -L/usr/local/lib -Wl,-rpath,/usr/local/lib -lHepMC3 -if [[ "$?" -ne "0" ]] ; then - echo "ERROR compiling pythia" - exit 1 -fi -echo "done" -pwd -ls -lrth - -./pythia_dis dis.hepmc -if [[ "$?" -ne "0" ]] ; then - echo "ERROR running pythia" - exit 1 -fi - -## ============================================================================= -## Step 2: finalize -echo "Moving event generator output into ${DATA_PATH}" -#mv .local/${JUGGLER_FILE_NAME_TAG}.hepmc ${DATA_PATH}/${JUGGLER_FILE_NAME_TAG}.hepmc - -## ============================================================================= -## All done! -echo "dis event generation complete" diff --git a/dis/generator/placeholder b/dis/generator/placeholder deleted file mode 100644 index e69de29b..00000000 diff --git a/dis/util/placeholder b/dis/util/placeholder deleted file mode 100644 index e69de29b..00000000 diff --git a/dvcs/tests/report.xml b/dvcs/tests/report.xml deleted file mode 100644 index 2ba9c6e4..00000000 --- a/dvcs/tests/report.xml +++ /dev/null @@ -1,10 +0,0 @@ -<testsuites> - <testsuite name="DVCS" tests="3" failures="1"> - <testcase classname="foo1" name="ASuccessfulTest" time="10.0"/> - <testcase classname="foo2" name="AnotherSuccessfulTest" time="20.0"/> - <testcase classname="foo3" name="AFailingTest" time="30.0"> - <failure type="NotEnoughFoo"> details about failure </failure> - </testcase> - </testsuite> -</testsuites> - diff --git a/dvcs/tests/report2.xml b/dvcs/tests/report2.xml deleted file mode 100644 index f437ef44..00000000 --- a/dvcs/tests/report2.xml +++ /dev/null @@ -1,12 +0,0 @@ -<testsuite tests="3"> - <testcase time="1.00" classname="bar1" name="ASuccessfulTest2"/> - <testcase time="2.00" classname="bar2" name="AnotherSuccessfulTest2"> - <!-- - <system-out>[[ATTACHMENT|/absolute/path/to/some/file]]</system-out> - --> - </testcase> - <testcase time="3.00" classname="bar3" name="AFailingTest2"> - <failure type="NotEnoughFoo"> MORE details about failure </failure> - </testcase> -</testsuite> - diff --git a/dvmp/.gitignore b/dvmp/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/dvmp/analysis/benchmark.hh b/dvmp/analysis/benchmark.hh deleted file mode 120000 index a9677242..00000000 --- a/dvmp/analysis/benchmark.hh +++ /dev/null @@ -1 +0,0 @@ -../../util/benchmark.hh \ No newline at end of file diff --git a/dvmp/analysis/exception.hh b/dvmp/analysis/exception.hh deleted file mode 120000 index e50e23b6..00000000 --- a/dvmp/analysis/exception.hh +++ /dev/null @@ -1 +0,0 @@ -../../util/exception.hh \ No newline at end of file diff --git a/dvmp/analysis/plot.h b/dvmp/analysis/plot.h deleted file mode 100644 index 69ebba34..00000000 --- a/dvmp/analysis/plot.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef PLOT_H -#define PLOT_H - -#include <TColor.h> -#include <fmt/core.h> -#include <vector> - -namespace plot { - -const int kMpBlue = TColor::GetColor(0x1f, 0x77, 0xb4); -const int kMpOrange = TColor::GetColor(0xff, 0x7f, 0x0e); -const int kMpGreen = TColor::GetColor(0x2c, 0xa0, 0x2c); -const int kMpRed = TColor::GetColor(0xd6, 0x27, 0x28); -const int kMpPurple = TColor::GetColor(0x94, 0x67, 0xbd); -const int kMpBrown = TColor::GetColor(0x8c, 0x56, 0x4b); -const int kMpPink = TColor::GetColor(0xe3, 0x77, 0xc2); -const int kMpGrey = TColor::GetColor(0x7f, 0x7f, 0x7f); -const int kMpMoss = TColor::GetColor(0xbc, 0xbd, 0x22); -const int kMpCyan = TColor::GetColor(0x17, 0xbe, 0xcf); - -const std::vector<int> kPalette = {kMpBlue, kMpOrange, kMpGreen, kMpRed, - kMpPurple, kMpBrown, kMpPink, kMpGrey, - kMpMoss, kMpCyan}; - -void draw_label(int ebeam, int pbeam, const std::string_view detector, - std::string_view vm, std::string_view what) { - auto t = new TPaveText(.15, 0.800, .7, .925, "NB NDC"); - t->SetFillColorAlpha(kWhite, 0.4); - t->SetTextFont(43); - t->SetTextSize(25); - t->AddText(fmt::format("#bf{{{} }}SIMULATION", detector).c_str()); - t->AddText(fmt::format("{} for {} DVMP.", what, vm).c_str()); - t->AddText(fmt::format("{} GeV on {} GeV", ebeam, pbeam, what).c_str()); - t->SetTextAlign(12); - t->Draw(); -} - -} // namespace plot - -#endif diff --git a/dvmp/analysis/util.h b/dvmp/analysis/util.h deleted file mode 100644 index dad7048e..00000000 --- a/dvmp/analysis/util.h +++ /dev/null @@ -1,198 +0,0 @@ -#ifndef UTIL_H -#define UTIL_H - -#include <algorithm> -#include <cmath> -#include <exception> -#include <fmt/core.h> -#include <limits> -#include <string> -#include <vector> - -#include <Math/Vector4D.h> - -#include "dd4pod/Geant4ParticleCollection.h" -#include "eicd/TrackParametersCollection.h" - -namespace util { - -// Exception definition for unknown particle errors -// FIXME: A utility exception base class should be included in the analysis -// utility library, so we can skip most of this boilerplate -class unknown_particle_error : public std::exception { -public: - unknown_particle_error(std::string_view particle) : m_particle{particle} {} - virtual const char* what() const throw() { - return fmt::format("Unknown particle type: {}", m_particle).c_str(); - } - virtual const char* type() const throw() { return "unknown_particle_error"; } - -private: - const std::string m_particle; -}; - -// Simple function to return the appropriate PDG mass for the particles -// we care about for this process. -// FIXME: consider something more robust (maybe based on hepPDT) to the -// analysis utility library -inline double get_pdg_mass(std::string_view part) { - if (part == "electron") { - return 0.0005109989461; - } else if (part == "muon") { - return .1056583745; - } else if (part == "jpsi") { - return 3.0969; - } else if (part == "upsilon") { - return 9.49630; - } else { - throw unknown_particle_error{part}; - } -} - -// Get a vector of 4-momenta from raw tracking info, using an externally -// provided particle mass assumption. -// FIXME: should be part of utility library -inline auto -momenta_from_tracking(const std::vector<eic::TrackParametersData>& tracks, - const double mass) { - std::vector<ROOT::Math::PxPyPzMVector> momenta{tracks.size()}; - // transform our raw tracker info into proper 4-momenta - std::transform(tracks.begin(), tracks.end(), momenta.begin(), - [mass](const auto& track) { - // make sure we don't divide by zero - if (fabs(track.qOverP) < 1e-9) { - return ROOT::Math::PxPyPzMVector{}; - } - const double p = fabs(1. / track.qOverP); - const double px = p * cos(track.phi) * sin(track.theta); - const double py = p * sin(track.phi) * sin(track.theta); - const double pz = p * cos(track.theta); - return ROOT::Math::PxPyPzMVector{px, py, pz, mass}; - }); - return momenta; -} - -// Get a vector of 4-momenta from the simulation data. -// FIXME: should be part of utility library -// TODO: Add PID selector (maybe using ranges?) -inline auto -momenta_from_simulation(const std::vector<dd4pod::Geant4ParticleData>& parts) { - std::vector<ROOT::Math::PxPyPzMVector> momenta{parts.size()}; - // transform our simulation particle data into 4-momenta - std::transform(parts.begin(), parts.end(), momenta.begin(), - [](const auto& part) { - return ROOT::Math::PxPyPzMVector{part.psx, part.psy, - part.psz, part.mass}; - }); - return momenta; -} - -// Find the decay pair candidates from a vector of particles (parts), -// with invariant mass closest to a desired value (pdg_mass) -// FIXME: not sure if this belongs here, or in the utility library. Probably the -// utility library -inline std::pair<ROOT::Math::PxPyPzMVector, ROOT::Math::PxPyPzMVector> -find_decay_pair(const std::vector<ROOT::Math::PxPyPzMVector>& parts, - const double pdg_mass) { - int first = -1; - int second = -1; - double best_mass = -1; - - // go through all particle combinatorics, calculate the invariant mass - // for each combination, and remember which combination is the closest - // to the desired pdg_mass - for (int i = 0; i < parts.size(); ++i) { - for (int j = i + 1; j < parts.size(); ++j) { - const double new_mass{(parts[i] + parts[j]).mass()}; - if (fabs(new_mass - pdg_mass) < fabs(best_mass - pdg_mass)) { - first = i; - second = j; - best_mass = new_mass; - } - } - } - if (first < 0) { - return {{}, {}}; - } - return {parts[first], parts[second]}; -} - -// Calculate the invariant mass of a given pair of particles -inline double -get_im(const std::pair<ROOT::Math::PxPyPzMVector, ROOT::Math::PxPyPzMVector>& - particle_pair) { - return (particle_pair.first + particle_pair.second).mass(); -} - -// Calculate the transverse momentum of a given pair of particles -inline double -get_pt(const std::pair<ROOT::Math::PxPyPzMVector, ROOT::Math::PxPyPzMVector>& - particle_pair) { - double px_pair = (particle_pair.first + particle_pair.second).px(); - double py_pair = (particle_pair.first + particle_pair.second).py(); - return sqrt(px_pair*px_pair + py_pair*py_pair); -} - -// Calculate the azimuthal angle of a given pair of particles -inline double -get_phi(const std::pair<ROOT::Math::PxPyPzMVector, ROOT::Math::PxPyPzMVector>& - particle_pair) { - double px_pair = (particle_pair.first + particle_pair.second).px(); - double py_pair = (particle_pair.first + particle_pair.second).py(); - double phi_pair = std::atan2(py_pair,px_pair); - //if(py_pair <= 0.) phi_pair = - phi_pair; - return phi_pair; -} - -// Calculate the rapidity of a given pair of particles -inline double -get_y(const std::pair<ROOT::Math::PxPyPzMVector, ROOT::Math::PxPyPzMVector>& - particle_pair) { - double px_pair = (particle_pair.first + particle_pair.second).px(); - double py_pair = (particle_pair.first + particle_pair.second).py(); - double pz_pair = (particle_pair.first + particle_pair.second).pz(); - double mass_pair = (particle_pair.first + particle_pair.second).mass(); - double energy_pair = sqrt(mass_pair*mass_pair + px_pair*px_pair + py_pair*py_pair + pz_pair*pz_pair); - return 0.5*log((energy_pair + pz_pair)/(energy_pair - pz_pair)); -} - -//======================================================================================================== -//for structure functions - -struct inv_quant{ //add more when needed - double nu, Q2, x; -}; - -//for simu -inline inv_quant calc_inv_quant_simu(const std::vector<ROOT::Math::PxPyPzMVector>& parts){ - ROOT::Math::PxPyPzMVector q(parts[0] - parts[2]); - ROOT::Math::PxPyPzMVector P(parts[3]); - - double nu = q.Dot(P) / P.mass(); - double Q2 = - q.Dot(q); - inv_quant quantities = {nu, Q2, Q2/2./P.mass()/nu}; - return quantities; -} - -inline double get_nu_simu(inv_quant quantities) { - return quantities.nu/1000.; -} -inline double get_Q2_simu(inv_quant quantities) { - return quantities.Q2; -} -inline double get_x_simu(inv_quant quantities) { - return quantities.x; -} - -//for tracking, add later - -//========================================================================================================= - - - - - - -} // namespace util - -#endif diff --git a/include/benchmark.h b/include/benchmark.h new file mode 100644 index 00000000..0634be0a --- /dev/null +++ b/include/benchmark.h @@ -0,0 +1,124 @@ +#ifndef BENCHMARK_H +#define BENCHMARK_H + +#include "exception.h" +#include <fmt/core.h> +#include <fstream> +#include <iomanip> +#include <iostream> +#include <nlohmann/json.hpp> +#include <string> + +// Bookkeeping of test data to store data of one or more tests in a json file to +// facilitate future accounting. +// +// Usage Example 1 (single test): +// ============================== +// 1. define our test +// eic::util::Test test1{ +// {{"name", "example_test"}, +// {"title", "Example Test"}, +// {"description", "This is an example of a test definition"}, +// {"quantity", "efficiency"}, +// {"target", "1"}}}; +// 2. set pass/fail/error status and return value (in this case .99) +// test1.pass(0.99) +// 3. write our test data to a json file +// eic::util::write_test(test1, "test1.json"); +// +// Usage Example 2 (multiple tests): +// ================================= +// 1. define our tests +// eic::util::Test test1{ +// {{"name", "example_test"}, +// {"title", "Example Test"}, +// {"description", "This is an example of a test definition"}, +// {"quantity", "efficiency"}, +// {"target", "1"}}}; +// eic::util::Test test2{ +// {{"name", "another_test"}, +// {"title", "Another example Test"}, +// {"description", "This is a second example of a test definition"}, +// {"quantity", "resolution"}, +// {"target", "3."}}}; +// 2. set pass/fail/error status and return value (in this case .99) +// test1.fail(10) +// 3. write our test data to a json file +// eic::util::write_test({test1, test2}, "test.json"); + +// Namespace for utility scripts, FIXME this should be part of an independent +// library +namespace eic::util { + + struct TestDefinitionError : Exception { + TestDefinitionError(std::string_view msg) : Exception(msg, "test_definition_error") {} + }; + + // Wrapper for our test data json, with three methods to set the status + // after test completion (to pass, fail or error). The default value + // is error. + // The following fields should be defined in the definitions json + // for the test to make sense: + // - name: unique identifier for this test + // - title: Slightly more verbose identifier for this test + // - description: Concise description of what is tested + // - quantity: What quantity is tested? Unites of value/target + // - target: Target value of <quantity> that we want to reach + // - value: Actual value of <quantity> + // - weight: Weight for this test (this is defaulted to 1.0 if not specified) + // - result: pass/fail/error + struct Test { + // note: round braces for the json constructor, as else it will pick the wrong + // initializer-list constructur (it will put everything in an array) + Test(const std::map<std::string, std::string>& definition) : json(definition) + { + // std::cout << json.dump() << std::endl; + // initialize with error (as we don't have a value yet) + error(); + // Check that all required fields are present + for (const auto& field : + {"name", "title", "description", "quantity", "target", "value", "result"}) { + if (json.find(field) == json.end()) { + throw TestDefinitionError{ + fmt::format("Error in test definition: field '{}' missing", field)}; + } + } + // Default "weight" to 1 if not set + if (json.find("weight") == json.end()) { + json["weight"] = 1.0; + } + } + // Set this test to pass/fail/error + void pass(double value) { update_result("pass", value); } + void fail(double value) { update_result("fail", value); } + void error(double value = 0) { update_result("error", value); } + + nlohmann::json json; + + private: + void update_result(std::string_view status, double value) + { + json["result"] = status; + json["value"] = value; + } + }; + + void write_test(const std::vector<Test>& data, const std::string& fname) + { + nlohmann::json test; + for (auto& entry : data) { + test["tests"].push_back(entry.json); + } + std::cout << fmt::format("Writing test data to {}\n", fname); + std::ofstream output_file(fname); + output_file << std::setw(4) << test << "\n"; + } + void write_test(const Test& data, const std::string& fname) + { + std::vector<Test> vtd{data}; + write_test(vtd, fname); + } + +} // namespace eic::util + +#endif diff --git a/include/exception.h b/include/exception.h new file mode 100644 index 00000000..b630bd00 --- /dev/null +++ b/include/exception.h @@ -0,0 +1,22 @@ +#ifndef UTIL_EXCEPTION_H +#define UTIL_EXCEPTION_H + +#include <exception> +#include <string> + +namespace eic::util { + class Exception : public std::exception { + public: + Exception(std::string_view msg, std::string_view type = "exception") : msg_{msg}, type_{type} {} + + virtual const char* what() const throw() { return msg_.c_str(); } + virtual const char* type() const throw() { return type_.c_str(); } + virtual ~Exception() throw() {} + + private: + std::string msg_; + std::string type_; + }; +} // namespace eic::util + +#endif diff --git a/dvmp/analysis/mt.h b/include/mt.h similarity index 100% rename from dvmp/analysis/mt.h rename to include/mt.h diff --git a/include/plot.h b/include/plot.h new file mode 100644 index 00000000..c1986163 --- /dev/null +++ b/include/plot.h @@ -0,0 +1,42 @@ +#ifndef PLOT_H +#define PLOT_H + +#include <TCanvas.h> +#include <TColor.h> +#include <TPad.h> +#include <TPaveText.h> +#include <TStyle.h> +#include <fmt/core.h> +#include <vector> + +namespace plot { + + const int kMpBlue = TColor::GetColor(0x1f, 0x77, 0xb4); + const int kMpOrange = TColor::GetColor(0xff, 0x7f, 0x0e); + const int kMpGreen = TColor::GetColor(0x2c, 0xa0, 0x2c); + const int kMpRed = TColor::GetColor(0xd6, 0x27, 0x28); + const int kMpPurple = TColor::GetColor(0x94, 0x67, 0xbd); + const int kMpBrown = TColor::GetColor(0x8c, 0x56, 0x4b); + const int kMpPink = TColor::GetColor(0xe3, 0x77, 0xc2); + const int kMpGrey = TColor::GetColor(0x7f, 0x7f, 0x7f); + const int kMpMoss = TColor::GetColor(0xbc, 0xbd, 0x22); + const int kMpCyan = TColor::GetColor(0x17, 0xbe, 0xcf); + + const std::vector<int> kPalette = {kMpBlue, kMpOrange, kMpGreen, kMpRed, kMpPurple, + kMpBrown, kMpPink, kMpGrey, kMpMoss, kMpCyan}; + + void draw_label(int ebeam, int pbeam, const std::string_view detector) + { + auto t = new TPaveText(.15, 0.800, .7, .925, "NB NDC"); + t->SetFillColorAlpha(kWhite, 0.4); + t->SetTextFont(43); + t->SetTextSize(25); + t->AddText(fmt::format("#bf{{{} }}SIMULATION", detector).c_str()); + t->AddText(fmt::format("{} GeV on {} GeV", ebeam, pbeam).c_str()); + t->SetTextAlign(12); + t->Draw(); + } + +} // namespace plot + +#endif diff --git a/include/util.h b/include/util.h new file mode 100644 index 00000000..56fb1289 --- /dev/null +++ b/include/util.h @@ -0,0 +1,159 @@ +#ifndef UTIL_H +#define UTIL_H + +// TODO: should probably be moved to a global benchmark utility library + +#include <algorithm> +#include <cmath> +#include <exception> +#include <fmt/core.h> +#include <limits> +#include <string> +#include <vector> + +#include <Math/Vector4D.h> + +#include "dd4pod/Geant4ParticleCollection.h" +#include "eicd/TrackParametersCollection.h" + +namespace util { + + // Exception definition for unknown particle errors + // FIXME: A utility exception base class should be included in the analysis + // utility library, so we can skip most of this boilerplate + class unknown_particle_error : public std::exception { + public: + unknown_particle_error(std::string_view particle) : m_particle{particle} {} + virtual const char* what() const throw() + { + return fmt::format("Unknown particle type: {}", m_particle).c_str(); + } + virtual const char* type() const throw() { return "unknown_particle_error"; } + + private: + const std::string m_particle; + }; + + // Simple function to return the appropriate PDG mass for the particles + // we care about for this process. + // FIXME: consider something more robust (maybe based on hepPDT) to the + // analysis utility library + inline double get_pdg_mass(std::string_view part) + { + if (part == "electron") { + return 0.0005109989461; + } else if (part == "muon") { + return .1056583745; + } else if (part == "jpsi") { + return 3.0969; + } else if (part == "upsilon") { + return 9.49630; + } else { + throw unknown_particle_error{part}; + } + } + + // Get a vector of 4-momenta from raw tracking info, using an externally + // provided particle mass assumption. + inline auto momenta_from_tracking(const std::vector<eic::TrackParametersData>& tracks, + const double mass) + { + std::vector<ROOT::Math::PxPyPzMVector> momenta{tracks.size()}; + // transform our raw tracker info into proper 4-momenta + std::transform(tracks.begin(), tracks.end(), momenta.begin(), [mass](const auto& track) { + // make sure we don't divide by zero + if (fabs(track.qOverP) < 1e-9) { + return ROOT::Math::PxPyPzMVector{}; + } + const double p = fabs(1. / track.qOverP); + const double px = p * cos(track.phi) * sin(track.theta); + const double py = p * sin(track.phi) * sin(track.theta); + const double pz = p * cos(track.theta); + return ROOT::Math::PxPyPzMVector{px, py, pz, mass}; + }); + return momenta; + } + + // Get a vector of 4-momenta from the simulation data. + // TODO: Add PID selector (maybe using ranges?) + inline auto momenta_from_simulation(const std::vector<dd4pod::Geant4ParticleData>& parts) + { + std::vector<ROOT::Math::PxPyPzMVector> momenta{parts.size()}; + // transform our simulation particle data into 4-momenta + std::transform(parts.begin(), parts.end(), momenta.begin(), [](const auto& part) { + return ROOT::Math::PxPyPzMVector{part.psx, part.psy, part.psz, part.mass}; + }); + return momenta; + } + + // Find the decay pair candidates from a vector of particles (parts), + // with invariant mass closest to a desired value (pdg_mass) + inline std::pair<ROOT::Math::PxPyPzMVector, ROOT::Math::PxPyPzMVector> + find_decay_pair(const std::vector<ROOT::Math::PxPyPzMVector>& parts, const double pdg_mass) + { + int first = -1; + int second = -1; + double best_mass = -1; + + // go through all particle combinatorics, calculate the invariant mass + // for each combination, and remember which combination is the closest + // to the desired pdg_mass + for (size_t i = 0; i < parts.size(); ++i) { + for (size_t j = i + 1; j < parts.size(); ++j) { + const double new_mass{(parts[i] + parts[j]).mass()}; + if (fabs(new_mass - pdg_mass) < fabs(best_mass - pdg_mass)) { + first = i; + second = j; + best_mass = new_mass; + } + } + } + if (first < 0) { + return {{}, {}}; + } + return {parts[first], parts[second]}; + } + + // Calculate the magnitude of the momentum of a vector of 4-vectors + inline auto mom(const std::vector<ROOT::Math::PxPyPzMVector>& momenta) + { + std::vector<double> P(momenta.size()); + // transform our raw tracker info into proper 4-momenta + std::transform(momenta.begin(), momenta.end(), P.begin(), + [](const auto& mom) { return mom.P(); }); + return P; + } + // Calculate the transverse momentum of a vector of 4-vectors + inline auto pt(const std::vector<ROOT::Math::PxPyPzMVector>& momenta) + { + std::vector<double> pt(momenta.size()); + // transform our raw tracker info into proper 4-momenta + std::transform(momenta.begin(), momenta.end(), pt.begin(), + [](const auto& mom) { return mom.pt(); }); + return pt; + } + + // Calculate the azimuthal angle phi of a vector of 4-vectors + inline auto phi(const std::vector<ROOT::Math::PxPyPzMVector>& momenta) + { + std::vector<double> phi(momenta.size()); + // transform our raw tracker info into proper 4-momenta + std::transform(momenta.begin(), momenta.end(), phi.begin(), + [](const auto& mom) { return mom.phi(); }); + return phi; + } + // Calculate the pseudo-rapidity of a vector of particles + inline auto eta(const std::vector<ROOT::Math::PxPyPzMVector>& momenta) + { + std::vector<double> eta(momenta.size()); + // transform our raw tracker info into proper 4-momenta + std::transform(momenta.begin(), momenta.end(), eta.begin(), + [](const auto& mom) { return mom.eta(); }); + return eta; + } + + //========================================================================================================= + +} // namespace util + +#endif diff --git a/config/env.sh b/options/env.sh similarity index 96% rename from config/env.sh rename to options/env.sh index 5abe4194..542ee7de 100755 --- a/config/env.sh +++ b/options/env.sh @@ -87,6 +87,10 @@ echo "DETECTOR_PREFIX: ${DETECTOR_PREFIX}" export DETECTOR_PATH="${DETECTOR_PREFIX}/${JUGGLER_DETECTOR}" echo "DETECTOR_PATH: ${DETECTOR_PATH}" +## build dir for ROOT to put its binaries etc. +export ROOT_BUILD_DIR=$LOCAL_PREFIX/root_build +echo "ROOT_BUILD_DIR: ${ROOT_BUILD_DIR}" + ## ============================================================================= ## Setup PATH and LD_LIBRARY_PATH to include our prefixes echo "Adding JUGGLER_INSTALL_PREFIX and LOCAL_PREFIX to PATH and LD_LIBRARY_PATH" diff --git a/pythia_dis b/pythia_dis new file mode 100755 index 0000000000000000000000000000000000000000..91a83f279189632193eaa87181405aaad17b8378 GIT binary patch literal 304896 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�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 b4;Dy$F!dTJvA0+GmoC+uet@fh>#O*GQV0;E literal 0 HcmV?d00001 diff --git a/tools/start_dev_shell.sh b/tools/dev-shell similarity index 100% rename from tools/start_dev_shell.sh rename to tools/dev-shell diff --git a/util/benchmark.hh b/util/benchmark.hh deleted file mode 100644 index f8abec06..00000000 --- a/util/benchmark.hh +++ /dev/null @@ -1,117 +0,0 @@ -#ifndef BENCHMARK_LOADED -#define BENCHMARK_LOADED - -#include "exception.hh" -#include <fmt/core.h> -#include <fstream> -#include <iostream> -#include <nlohmann/json.hpp> -#include <string> - -// Bookkeeping of test data to store data of one or more tests in a json file to -// facilitate future accounting. -// -// Usage Example 1 (single test): -// ============================== -// 1. define our test -// eic::util::Test test1{ -// {{"name", "example_test"}, -// {"title", "Example Test"}, -// {"description", "This is an example of a test definition"}, -// {"quantity", "efficiency"}, -// {"target", "1"}}}; -// 2. set pass/fail/error status and return value (in this case .99) -// test1.pass(0.99) -// 3. write our test data to a json file -// eic::util::write_test(test1, "test1.json"); -// -// Usage Example 2 (multiple tests): -// ================================= -// 1. define our tests -// eic::util::Test test1{ -// {{"name", "example_test"}, -// {"title", "Example Test"}, -// {"description", "This is an example of a test definition"}, -// {"quantity", "efficiency"}, -// {"target", "1"}}}; -// eic::util::Test test2{ -// {{"name", "another_test"}, -// {"title", "Another example Test"}, -// {"description", "This is a second example of a test definition"}, -// {"quantity", "resolution"}, -// {"target", "3."}}}; -// 2. set pass/fail/error status and return value (in this case .99) -// test1.fail(10) -// 3. write our test data to a json file -// eic::util::write_test({test1, test2}, "test.json"); - -// Namespace for utility scripts, FIXME this should be part of an independent -// library -namespace eic::util { - -struct TestDefinitionError : Exception { - TestDefinitionError(std::string_view msg) - : Exception(msg, "test_definition_error") {} -}; - -// Wrapper for our test data json, with three methods to set the status -// after test completion (to pass, fail or error). The default value -// is error. -// The following fields should be defined in the definitions json -// for the test to make sense: -// - name: unique identifier for this test -// - title: Slightly more verbose identifier for this test -// - description: Concise description of what is tested -// - quantity: What quantity is tested? Unites of value/target -// - target: Target value of <quantity> that we want to reach -// - value: Actual value of <quantity> -// - weight: Weight for this test (this is defaulted to 1.0 if not specified) -// - result: pass/fail/error -struct Test { - Test(nlohmann::json definition) : json{std::move(definition)} { - // initialize with error (as we don't have a value yet) - error(); - // Check that all required fields are present - for (const auto& field : {"name", "title", "description", "quantity", - "target", "value", "result"}) { - if (json.find(field) == json.end()) { - throw TestDefinitionError{ - fmt::format("Error in test definition: field '{}' missing", field)}; - } - } - // Default "weight" to 1 if not set - if (json.find("weight") == json.end()) { - json["weight"] = 1.0; - } - } - // Set this test to pass/fail/error - void pass(double value) { update_result("pass", value); } - void fail(double value) { update_result("fail", value); } - void error(double value = 0) { update_result("error", value); } - - nlohmann::json json; - -private: - void update_result(std::string_view status, double value) { - json["result"] = status; - json["value"] = value; - } -}; - -void write_test(const std::vector<Test>& data, const std::string& fname) { - nlohmann::json test; - for (auto& entry : data) { - test["tests"].push_back(entry.json); - } - std::cout << fmt::format("Writing test data to {}\n", fname); - std::ofstream output_file(fname); - output_file << std::setw(4) << test << "\n"; -} -void write_test(const Test& data, const std::string& fname) { - std::vector<Test> vtd{data}; - write_test(vtd, fname); -} - -} // namespace eic::util - -#endif diff --git a/util/build_detector.sh b/util/build_detector.sh index 03641f48..02313585 100755 --- a/util/build_detector.sh +++ b/util/build_detector.sh @@ -18,9 +18,9 @@ pushd ${PROJECT_ROOT} ## - DETECTOR_PATH: full path for the detector definitions ## this is the same as ${DETECTOR_PREFIX}/${JUGGLER_DETECTOR} ## -## You can read config/env.sh for more in-depth explanations of the variables +## You can read options/env.sh for more in-depth explanations of the variables ## and how they can be controlled. -source config/env.sh +source options/env.sh ## ============================================================================= ## Step 1: download/update the detector definitions (if needed) diff --git a/util/collect_benchmarks.py b/util/collect_benchmarks.py index 8f9fd675..0af7e9a1 100755 --- a/util/collect_benchmarks.py +++ b/util/collect_benchmarks.py @@ -9,7 +9,7 @@ directory. """ ## Our master definition file, the benchmark project directory -MASTER_FILE=r'benchmarks.json' +MASTER_FILE=r'benchmarks/benchmarks.json' ## Our results directory RESULTS_PATH=r'results' diff --git a/util/collect_tests.py b/util/collect_tests.py index c56d8c8b..4d860ca7 100755 --- a/util/collect_tests.py +++ b/util/collect_tests.py @@ -15,7 +15,7 @@ files to identify them as benchmark components. """ ## Our benchmark definition file, stored in the benchmark root directory -BENCHMARK_FILE=r'{}/benchmark.json' +BENCHMARK_FILE=r'benchmarks/{}/benchmark.json' ## Our benchmark results directory RESULTS_PATH=r'results/{}' diff --git a/util/compile_analyses.py b/util/compile_analyses.py new file mode 100755 index 00000000..153f2ea2 --- /dev/null +++ b/util/compile_analyses.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 + +""" +Compile all root analysis scripts under +benchmarks/<BENCHMARK>/analysis/*.cxx + +Doing this step here rather than during the main benchmark script has +multiple advantages: + 1. Get feedback on syntax errors early on, without wasting compute resources + 2. Avoid race conditions for large benchmarks run in parallel + 3. Make it easier to properly handle the root build directory, as + this has to exist prior to our attempt to compile, else all will + fail (this is probably an old bug in root...) + +Analysis scripts are expected to have extension 'cxx' and be located in the analysis +subdirectory +""" + +## Our analysis path and file extension for glob +ANALYSIS_PATH=r'benchmarks/{}/analysis' +ANALYSIS_EXT = r'cxx' + +import argparse +import os +from pathlib import Path + +## Exceptions for this module +class Error(Exception): + '''Base class for exceptions in this module.''' + pass + +class PathNotFoundError(Exception): + '''Path does not exist. + + Attributes: + path: the path name + message: error message + ''' + def __init__(self, path): + self.file = file + self.message = 'No such directory: {}'.format(file) +class NoAnalysesFoundError(Exception): + '''Did not find any analysis scripts to complile + + Attributes: + path: the analysis path + message: error message + ''' + def __init__(self, path): + self.file = file + self.message = 'No analysis found (extension \'{}\' in path: {}'.format(file, + ANALYSIS_EXT) + +class CompilationError(Exception): + '''Raised when we failed to compile an analysis script + + Attributes: + file: analysis file name + path: analysis path + message: error message + ''' + def __init__(self, file): + self.file = file + self.message = "Analysis '{}' failed to compile".format(file) + +parser = argparse.ArgumentParser() +parser.add_argument( + 'benchmark', + help='A benchmarks for which to compile the analysis scripts.') + +def compile_analyses(benchmark): + '''Compile all analysis scripts for a benchmark.''' + print("Compiling all analyis scripts for '{}'".format(benchmark)) + + ## Ensure our build directory exists + _init_build_dir(benchmark) + + ## Get a list of all analysis scripts + _compile_all(benchmark) + + ## All done! + print('All analyses for', benchmark, 'compiled successfully') + +def _init_build_dir(benchmark): + '''Initialize our ROOT build directory (if using one).''' + print(' --> Initializing ROOT build directory ...') + build_prefix = os.getenv('ROOT_BUILD_DIR') + if build_prefix is None: + print(' --> ROOT_BUILD_DIR not set, no action needed.') + return + ## deduce the root build directory + pwd = os.getenv('PWD') + build_dir = '{}/{}/{}'.format(build_prefix, pwd, ANALYSIS_PATH.format(benchmark)) + print(" --> Ensuring directory '{}' exists".format(build_dir)) + os.system('mkdir -p {}'.format(build_dir)) + +def _compile_all(benchmark): + '''Compile all analysis for this benchmark.''' + print(' --> Compiling analysis scripts') + anadir = Path(ANALYSIS_PATH.format(benchmark)) + if not anadir.exists(): + raise PathNotFoundError(anadir) + ana_list = [] + for file in anadir.glob('*.{}'.format(ANALYSIS_EXT)): + ana_list.append(file) + print(' --> Compiling:', file, flush=True) + err = os.system(_compile_cmd(file)) + if err: + raise CompilationError(file) + if len(ana_list) == 0: + raise NoAnalysesFoundError(anadir) + +def _compile_cmd(file): + '''Return a one-line shell command to compile an analysis script.''' + return r'bash -c "root -q -b -e \".L {}+\""'.format(file) + +if __name__ == "__main__": + args = parser.parse_args() + compile_analyses(args.benchmark) diff --git a/util/exception.hh b/util/exception.hh deleted file mode 100644 index d97ef27c..00000000 --- a/util/exception.hh +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef UTIL_EXCEPTION -#define UTIL_EXCEPTION - -#include <exception> -#include <string> - -namespace eic::util { -class Exception : public std::exception { -public: - Exception(std::string_view msg, std::string_view type = "exception") - : msg_{msg}, type_{type} {} - - virtual const char* what() const throw() { return msg_.c_str(); } - virtual const char* type() const throw() { return type_.c_str(); } - virtual ~Exception() throw() {} - -private: - std::string msg_; - std::string type_; -}; -} // namespace eic::util - -#endif diff --git a/util/parse_cmd.sh b/util/parse_cmd.sh index 9bf2f553..04028d89 100755 --- a/util/parse_cmd.sh +++ b/util/parse_cmd.sh @@ -11,9 +11,11 @@ ## - REQUIRE_DECAY: require the --decay flag to be set ## ============================================================================= +## Commented out because this should be taken care of by the +## calling script to not enforce a fixed directory structure. ## make sure we launch this script from the project root directory -PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/.. -pushd ${PROJECT_ROOT} +#PROJECT_ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"/.. +#pushd ${PROJECT_ROOT} ## ============================================================================= ## Step 1: Process the command line arguments -- GitLab