Skip to content

Commit

Permalink
Implement functionalities related to the macro search path
Browse files Browse the repository at this point in the history
Closes #127

+ Implements ui methods to modify macro search path
+ Adds --macro-path CLI argument
+ Adds .macro_path method to run_manager
+ Adds tests
+ Introduces implicit macro path "macs" in the client program
+ Introduces implicit macro path pointing to the nix store in the
  client app
  • Loading branch information
gonzaponte committed Sep 16, 2023
2 parents feb4d4c + 629ae71 commit cd50d65
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 9 deletions.
2 changes: 2 additions & 0 deletions nain4/src/n4_run_manager.hh
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ private:
set_physics& apply_command (const G4String& command ) { ui.apply (command ); return *this; }
set_physics& apply_early_macro(const G4String& filename) { ui.run_macro(filename); return *this; }
set_physics& apply_cli_early_macro( ) { ui.run_early_macro() ; return *this; }
set_physics& macro_path (const G4String& path ) { ui.prepend_path(path) ; return *this; }

using fn_type = std::function<G4VUserPhysicsList* ()>;
NEXT_STATE_BASIC(set_geometry, physics, G4VUserPhysicsList)
NEXT_CONSTRUCT (set_geometry, physics)
Expand Down
20 changes: 15 additions & 5 deletions nain4/src/n4_ui.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,20 @@ unsigned parse_beam_on(const std::string& arg) {

argparse::ArgumentParser define_args(const std::string& program_name, int argc, char** argv) {
argparse::ArgumentParser args{program_name};
args.add_argument("--beam-on" , "-n", "-b").metavar("N-EVENTS").help("run simulation with given number of events");
args.add_argument("--early-macro", "-e" ).metavar("FILENAME").help("execute before run manager instantiation");
args.add_argument( "--late-macro", "-l" ).metavar("FILENAME").help("execute after run manager instantiation");
args.add_argument( "--vis-macro", "-g" ).metavar("FILENAME").help("switch from batch mode to GUI, executing this macro");
args.add_argument("--beam-on" , "-n", "-b").metavar("N-EVENTS" ).help("run simulation with given number of events");
args.add_argument("--early-macro", "-e" ).metavar("FILENAME" ).help("execute before run manager instantiation");
args.add_argument( "--late-macro", "-l" ).metavar("FILENAME" ).help("execute after run manager instantiation");
args.add_argument( "--vis-macro", "-g" ).metavar("FILENAME" ).help("switch from batch mode to GUI, executing this macro");
args.add_argument("--macro-path", "-m" ).metavar("MACRO-PATHS").help("Add directories to Geant4 macro search path")
.nargs(argparse::nargs_pattern::at_least_one)
.append();

try {
args.parse_args(argc, argv);
} catch(const std::runtime_error& err) {
std::cerr << err.what() << std::endl;
std::cerr << args;
std::exit(EXIT_FAILURE);
throw err;
}

return args;
Expand All @@ -60,6 +63,13 @@ ui::ui(const std::string& program_name, int argc, char** argv, bool warn_empty_r
late_macro = args.present( "--late-macro");
vis_macro = args.present( "--vis-macro");

// Here we use std::string because G4String does not work
auto macro_paths = args.get<std::vector<std::string>>("--macro-path");
for (auto& path : macro_paths) {
prepend_path(path);
}
g4_ui.ParseMacroSearchPath();

if (warn_empty_run && ! (n_events.has_value() ^ vis_macro.has_value())) {
std::cerr << "'" + program_name + "' is not going to do anything interesting without some command-line arguments.\n\n";
std::cerr << args << std::endl;
Expand Down
3 changes: 3 additions & 0 deletions nain4/src/n4_ui.hh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ public:
void run_late_macro() { if ( late_macro.has_value()) { run_macro( late_macro.value()); } }
void run_vis_macro() { if ( vis_macro.has_value()) { run_macro( vis_macro.value()); } }

void set_path(G4String const& path) { g4_ui.SetMacroSearchPath(path) ;}
void prepend_path(G4String const& path) { set_path(path + ":" + g4_ui.GetMacroSearchPath( ));}

private:
argparse::ArgumentParser args;

Expand Down
52 changes: 52 additions & 0 deletions nain4/test/test-run-manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#include <catch2/catch_approx.hpp>
#include <catch2/generators/catch_generators.hpp>
#include <catch2/catch_test_macros.hpp>
#include <catch2/matchers/catch_matchers_contains.hpp>
#include <stdexcept>

using Catch::Approx;

Expand Down Expand Up @@ -153,3 +155,53 @@ TEST_CASE("nain run_manager exactly_one_world_volumes", "[nain][run_manager]") {
.actions(do_nothing)
.run();
}

TEST_CASE("test macropath with values", "[nain][run_manager][macropath]") {
auto hush = n4::silence{std::cout};

char *argv[] = { (char*)"progname-aaa"
, (char*)"--macro-path"
, (char*)"path-aaa"
, (char*)"--macro-path"
, (char*)"path-bbb"
, (char*)"path-ccc"
, NULL
};

auto rm = n4::run_manager::create().ui("progname", 6, argv, false);

auto search_path = G4UImanager::GetUIpointer() -> GetMacroSearchPath();
std::cerr << search_path << std::endl;

CHECK(search_path.find("path-aaa") != std::string::npos);
CHECK(search_path.find("path-bbb") != std::string::npos);
CHECK(search_path.find("path-ccc") != std::string::npos);
}


TEST_CASE("test without macropath", "[nain][run_manager][macropath]") {
auto hush = n4::silence{std::cout};

char *argv[] = {(char*)"progname-aaa", NULL};

auto rm = n4::run_manager::create().ui("progname", 1, argv, false);

auto search_path = G4UImanager::GetUIpointer() -> GetMacroSearchPath();
std::cerr << "XXX" << search_path << "XXX" << std::endl;

CHECK(search_path == "");
}


TEST_CASE("test macropath without value", "[nain][run_manager][macropath]") {
auto hush = n4::silence{std::cout};

char *argv[] = {(char*)"progname-aaa", (char*)"--macro-path", NULL};

using Catch::Matchers::Contains;
// We tried
// REQUIRE_THROWS_WITH( n4::run_manager::create().ui("progname", 2, argv, false)
// , Contains("Too few arguments") && Contains("--macro-path"));
// and variations on the there but nothing worked sensibly.
REQUIRE_THROWS_AS(n4::run_manager::create().ui("progname", 2, argv, false), std::runtime_error);
}
3 changes: 2 additions & 1 deletion templates/basic/flake/outputs.nix
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@
export G4ABLADATA="${g4-data.G4ABLA}/share/Geant4-11.0.4/data/G4ABLA3.1"
export G4INCLDATA="${g4-data.G4INCL}/share/Geant4-11.0.4/data/G4INCL1.0"
export G4ENSDFSTATEDATA="${g4-data.G4ENSDFSTATE}/share/Geant4-11.0.4/data/G4ENSDFSTATE2.3"
exec CHANGEME-my-n4-prog "$@"
exec CHANGEME-my-n4-prog --macro-path ${self}/macs $*
'';
in { type = "app"; program = "${CHANGEME-wrap-my-package}/bin/CHANGEME-my-app"; };

Expand Down
6 changes: 3 additions & 3 deletions templates/basic/src/n4app.cc
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,9 @@ int main(int argc, char* argv[]) {
// ANCHOR: create_run_manager
n4::run_manager::create()
.ui("my-program-name", argc, argv)

.macro_path("macs")
.apply_command("/my/straw_radius 0.5 m")
.apply_early_macro("macs/early-hard-wired.mac")
.apply_early_macro("early-hard-wired.mac")
.apply_cli_early_macro() // CLI --early-macro executed at this point
// .apply_command(...) // also possible after apply_early_macro

Expand All @@ -130,7 +130,7 @@ int main(int argc, char* argv[]) {
.actions(create_actions(my, n_event))

.apply_command("/my/particle e-")
.apply_late_macro("macs/late-hard-wired.mac")
.apply_late_macro("late-hard-wired.mac")
.apply_cli_late_macro() // CLI --late-macro executed at this point
// .apply_command(...) // also possible after apply_late_macro

Expand Down

0 comments on commit cd50d65

Please sign in to comment.