void TrajectoryAnalysisRunnerCommon::initOptions(Options *options) { TrajectoryAnalysisSettings &settings = impl_->settings_; // Add options for help. options->addOption(BooleanOption("h").store(&impl_->bHelp_) .description("Print help and quit")); options->addOption(BooleanOption("hidden").store(&impl_->bShowHidden_) .hidden() .description("Show hidden options")); options->addOption(BooleanOption("quiet").store(&impl_->bQuiet_) .hidden() .description("Hide options in normal run")); // Add common file name arguments. options->addOption(FileNameOption("f") .filetype(eftTrajectory).inputFile() .store(&impl_->trjfile_) .defaultBasename("traj") .description("Input trajectory or single configuration")); options->addOption(FileNameOption("s") .filetype(eftTopology).inputFile() .store(&impl_->topfile_) .defaultBasename("topol") .description("Input structure")); options->addOption(FileNameOption("n") .filetype(eftIndex).inputFile() .store(&impl_->ndxfile_) .defaultBasename("index") .description("Extra index groups")); options->addOption(SelectionFileOption("sf")); // Add options for trajectory time control. options->addOption(DoubleOption("b").store(&impl_->startTime_).timeValue() .description("First frame (%t) to read from trajectory")); options->addOption(DoubleOption("e").store(&impl_->endTime_).timeValue() .description("Last frame (%t) to read from trajectory")); options->addOption(DoubleOption("dt").store(&impl_->deltaTime_).timeValue() .description("Only use frame if t MOD dt == first time (%t)")); // Add time unit option. settings.impl_->timeUnitManager.addTimeUnitOption(options, "tu"); // Add plot options. settings.impl_->plotSettings.addOptions(options); // Add common options for trajectory processing. if (!settings.hasFlag(TrajectoryAnalysisSettings::efNoUserRmPBC)) { options->addOption(BooleanOption("rmpbc").store(&settings.impl_->bRmPBC) .description("Make molecules whole for each frame")); } if (!settings.hasFlag(TrajectoryAnalysisSettings::efNoUserPBC)) { options->addOption(BooleanOption("pbc").store(&settings.impl_->bPBC) .description("Use periodic boundary conditions for distance calculation")); } }
void TrajectoryAnalysisRunnerCommon::initOptions(IOptionsContainer *options, TimeUnitBehavior *timeUnitBehavior) { TrajectoryAnalysisSettings &settings = impl_->settings_; // Add common file name arguments. options->addOption(FileNameOption("f") .filetype(eftTrajectory).inputFile() .store(&impl_->trjfile_) .defaultBasename("traj") .description("Input trajectory or single configuration")); options->addOption(FileNameOption("s") .filetype(eftTopology).inputFile() .store(&impl_->topfile_) .defaultBasename("topol") .description("Input structure")); // Add options for trajectory time control. options->addOption(DoubleOption("b") .store(&impl_->startTime_).storeIsSet(&impl_->bStartTimeSet_) .timeValue() .description("First frame (%t) to read from trajectory")); options->addOption(DoubleOption("e") .store(&impl_->endTime_).storeIsSet(&impl_->bEndTimeSet_) .timeValue() .description("Last frame (%t) to read from trajectory")); options->addOption(DoubleOption("dt") .store(&impl_->deltaTime_).storeIsSet(&impl_->bDeltaTimeSet_) .timeValue() .description("Only use frame if t MOD dt == first time (%t)")); // Add time unit option. timeUnitBehavior->setTimeUnitFromEnvironment(); timeUnitBehavior->addTimeUnitOption(options, "tu"); timeUnitBehavior->setTimeUnitStore(&impl_->settings_.impl_->timeUnit); options->addOption(SelectionOption("fgroup") .store(&impl_->trajectoryGroup_) .onlySortedAtoms().onlyStatic() .description("Atoms stored in the trajectory file " "(if not set, assume first N atoms)")); // Add plot options. settings.impl_->plotSettings.initOptions(options); // Add common options for trajectory processing. if (!settings.hasFlag(TrajectoryAnalysisSettings::efNoUserRmPBC)) { options->addOption(BooleanOption("rmpbc").store(&settings.impl_->bRmPBC) .description("Make molecules whole for each frame")); } if (!settings.hasFlag(TrajectoryAnalysisSettings::efNoUserPBC)) { options->addOption(BooleanOption("pbc").store(&settings.impl_->bPBC) .description("Use periodic boundary conditions for distance calculation")); } }
void initTestUtils(const char *dataPath, const char *tempPath, int *argc, char ***argv) { gmx::initForCommandLine(argc, argv); try { ::testing::InitGoogleMock(argc, *argv); if (dataPath != NULL) { TestFileManager::setInputDataDirectory(dataPath); } if (tempPath != NULL) { TestFileManager::setGlobalOutputTempDirectory(tempPath); } bool bHelp = false; Options options(NULL, NULL); // TODO: A single option that accepts multiple names would be nicer. // Also, we recognize -help, but GTest doesn't, which leads to a bit // unintuitive behavior. options.addOption(BooleanOption("h").store(&bHelp) .description("Print GROMACS-specific unit test options")); options.addOption(BooleanOption("help").store(&bHelp).hidden()); options.addOption(BooleanOption("?").store(&bHelp).hidden()); // TODO: Consider removing this option from test binaries that do not need it. initReferenceData(&options); TestOptionsRegistry::getInstance().initOptions(&options); try { CommandLineParser(&options).parse(argc, *argv); options.finish(); } catch (const UserInputError &) { printHelp(options); throw; } if (bHelp) { printHelp(options); } setFatalErrorHandler(NULL); initMPIOutput(); } catch (const std::exception &ex) { printFatalErrorMessage(stderr, ex); std::exit(processExceptionAtExit(ex)); } }
void CommandLineCommonOptionsHolder::initOptions() { options_.addOption(BooleanOption("h").store(&bHelp_) .description("Print help and quit")); options_.addOption(BooleanOption("hidden").store(&bHidden_) .hidden() .description("Show hidden options in help")); options_.addOption(BooleanOption("quiet").store(&bQuiet_) .description("Do not print common startup info or quotes")); options_.addOption(BooleanOption("version").store(&bVersion_) .description("Print extended version information and quit")); options_.addOption(BooleanOption("copyright").store(&bCopyright_) .description("Print copyright information on startup")); options_.addOption(IntegerOption("nice").store(&niceLevel_) .description("Set the nicelevel (default depends on command)")); options_.addOption(BooleanOption("backup").store(&bBackup_) .description("Write backups if output files exist")); options_.addOption(BooleanOption("fpexcept").store(&bFpexcept_) .hidden().description("Enable floating-point exceptions")); options_.addOption(IntegerOption("debug").store(&debugLevel_) .hidden().defaultValueIfSet(1) .description("Write file with debug information, " "1: short (default), 2: also x and f")); }
//! \cond internal void initTestUtils(const char *dataPath, const char *tempPath, bool usesMpi, bool usesHardwareDetection, int *argc, char ***argv) { #if !defined NDEBUG && \ !((defined __clang__ || (defined(__GNUC__) && !defined(__ICC) && __GNUC__ == 7)) \ && defined __OPTIMIZE__) gmx_feenableexcept(); #endif const CommandLineProgramContext &context = initForCommandLine(argc, argv); try { if (!usesMpi && gmx_node_num() > 1) { // We cannot continue, since some tests might be using // MPI_COMM_WORLD, which could deadlock if we would only // continue with the master rank here. if (gmx_node_rank() == 0) { fprintf(stderr, "NOTE: You are running %s on %d MPI ranks, " "but it is does not contain MPI-enabled tests. " "The test will now exit.\n", context.programName(), gmx_node_num()); } finalizeForCommandLine(); std::exit(1); } if (usesHardwareDetection) { callAddGlobalTestEnvironment(); } g_testContext = gmx::compat::make_unique<TestProgramContext>(context); setProgramContext(g_testContext.get()); // Use the default finder that does not respect GMXLIB, since the tests // generally can only get confused by a different set of data files. setLibraryFileFinder(nullptr); ::testing::InitGoogleMock(argc, *argv); if (dataPath != nullptr) { TestFileManager::setInputDataDirectory( Path::join(CMAKE_SOURCE_DIR, dataPath)); } if (tempPath != nullptr) { TestFileManager::setGlobalOutputTempDirectory(tempPath); } bool bHelp = false; std::string sourceRoot; Options options; // TODO: A single option that accepts multiple names would be nicer. // Also, we recognize -help, but GTest doesn't, which leads to a bit // unintuitive behavior. options.addOption(BooleanOption("h").store(&bHelp) .description("Print GROMACS-specific unit test options")); options.addOption(BooleanOption("help").store(&bHelp).hidden()); options.addOption(BooleanOption("?").store(&bHelp).hidden()); // TODO: Make this into a FileNameOption (or a DirectoryNameOption). options.addOption(StringOption("src-root").store(&sourceRoot) .description("Override source tree location (for data files)")); // The potential MPI test event listener must be initialized first, // because it should appear in the start of the event listener list, // before other event listeners that may generate test failures // (currently, such an event listener is used by the reference data // framework). if (usesMpi) { initMPIOutput(); } // TODO: Consider removing this option from test binaries that do not need it. initReferenceData(&options); initTestOptions(&options); try { CommandLineParser(&options).parse(argc, *argv); options.finish(); } catch (const UserInputError &) { printHelp(options); throw; } if (bHelp) { printHelp(options); } if (!sourceRoot.empty()) { g_testContext->overrideSourceRoot(sourceRoot); TestFileManager::setInputDataDirectory( Path::join(sourceRoot, dataPath)); } } catch (const std::exception &ex) { printFatalErrorMessage(stderr, ex); int retcode = processExceptionAtExitForCommandLine(ex); // TODO: It could be nice to destroy things in proper order such that // g_testContext would not contain hanging references at this point, // but in practice that should not matter. g_testContext.reset(); std::exit(retcode); } }
//! \cond internal void initTestUtils(const char *dataPath, const char *tempPath, int *argc, char ***argv) { #ifndef NDEBUG gmx_feenableexcept(); #endif const CommandLineProgramContext &context = initForCommandLine(argc, argv); try { g_testContext.reset(new TestProgramContext(context)); setProgramContext(g_testContext.get()); // Use the default finder that does not respect GMXLIB, since the tests // generally can only get confused by a different set of data files. setLibraryFileFinder(NULL); ::testing::InitGoogleMock(argc, *argv); if (dataPath != NULL) { TestFileManager::setInputDataDirectory( Path::join(CMAKE_SOURCE_DIR, dataPath)); } if (tempPath != NULL) { TestFileManager::setGlobalOutputTempDirectory(tempPath); } bool bHelp = false; std::string sourceRoot; Options options(NULL, NULL); // TODO: A single option that accepts multiple names would be nicer. // Also, we recognize -help, but GTest doesn't, which leads to a bit // unintuitive behavior. options.addOption(BooleanOption("h").store(&bHelp) .description("Print GROMACS-specific unit test options")); options.addOption(BooleanOption("help").store(&bHelp).hidden()); options.addOption(BooleanOption("?").store(&bHelp).hidden()); // TODO: Make this into a FileNameOption (or a DirectoryNameOption). options.addOption(StringOption("src-root").store(&sourceRoot) .description("Override source tree location (for data files)")); // The potential MPI test event listener must be initialized first, // because it should appear in the start of the event listener list, // before other event listeners that may generate test failures // (currently, such an event listener is used by the reference data // framework). initMPIOutput(); // TODO: Consider removing this option from test binaries that do not need it. initReferenceData(&options); initTestOptions(&options); try { CommandLineParser(&options).parse(argc, *argv); options.finish(); } catch (const UserInputError &) { printHelp(options); throw; } if (bHelp) { printHelp(options); } if (!sourceRoot.empty()) { g_testContext->overrideSourceRoot(sourceRoot); TestFileManager::setInputDataDirectory( Path::join(sourceRoot, dataPath)); } } catch (const std::exception &ex) { printFatalErrorMessage(stderr, ex); int retcode = processExceptionAtExitForCommandLine(ex); // TODO: It could be nice to destroy things in proper order such that // g_testContext would not contain hanging references at this point, // but in practice that should not matter. g_testContext.reset(); std::exit(retcode); } }
Options * Angle::initOptions(TrajectoryAnalysisSettings *settings) { static const char *const desc[] = { "g_angle computes different types of angles between vectors.", "It supports both vectors defined by two positions and normals of", "planes defined by three positions.", "The z axis or the local normal of a sphere can also be used as", "one of the vectors.", "There are also convenience options 'angle' and 'dihedral' for", "calculating bond angles and dihedrals defined by three/four", "positions.[PAR]", "The type of the angle is specified with [TT]-g1[tt] and [TT]-g2[tt].", "If [TT]-g1[tt] is [TT]angle[tt] or [TT]dihedral[tt], [TT]-g2[tt]", "should not be specified.", "In this case, one selection is required, and it should contain", "triplets or quartets of positions that define the angles to be", "calculated.", "If [TT]-g1[tt] is not [TT]angle[tt] or [TT]dihedral[tt], [TT]-g2[tt]", "should not be [TT]none[tt], and the two options define two vectors", "for the calculation. For vectors ([TT]vector[tt]), a selection with", "pairs of positions is required, and for planes ([TT]plane[tt]),", "triplets of positions are required.", "If both vectors are specified by positions, the number of vectors", "should be the same in both selections.", "[TT]-g2 sphnorm[tt] requires a reference selection that defines", "the center of the sphere.", "[TT]-g2 z[tt] does not require any selection.[PAR]", "With [TT]-split1[tt], the positions for [TT]-g1[tt] are specified", "using N separate selections with M positions each, instead of the", "default M*N positions in one selection.", "[TT]-split2[tt] does the same for [TT]-g2[tt].[PAR]", "There are two options for output:", "[TT]-o[tt] writes an xvgr file with the time and the average angle", "for each frame.", "With [TT]-all[tt], also the individual angles are written (only", "supported for static selections).", "[TT]-od[tt] can be used to dump all the individual angles,", "each on a separate line. This format is better suited for", "further processing, e.g., if angles from multiple runs are needed.", NULL }; static const char *const cGroup1TypeEnum[] = { "angle", "dihedral", "vector", "plane", NULL }; static const char *const cGroup2TypeEnum[] = { "none", "vector", "plane", "t0", "z", "sphnorm", NULL }; _options.setDescription(desc); _options.addOption(FileNameOption("o").filetype(eftPlot).writeOnly() .store(&_fnAngle).defaultValueIfSet("angle")); _options.addOption(FileNameOption("od").filetype(eftPlot).writeOnly() .store(&_fnDump).defaultValueIfSet("angdump")); _options.addOption(StringOption("g1").enumValue(cGroup1TypeEnum) .defaultEnumIndex(0).store(&_g1type) .description("Type of analysis/first vector group")); _options.addOption(StringOption("g2").enumValue(cGroup2TypeEnum) .defaultEnumIndex(0).store(&_g2type) .description("Type of second vector group")); _options.addOption(BooleanOption("split1").store(&_bSplit1) .description("Each position of first group in separate selection")); _options.addOption(BooleanOption("split2").store(&_bSplit2) .description("Each position of second group in separate selection")); _options.addOption(BooleanOption("multi").store(&_bMulti) .description("Analyze multiple sets of angles/dihedrals")); _options.addOption(BooleanOption("all").store(&_bAll) .description("Print individual angles together with the average")); _options.addOption(BooleanOption("dumpd").store(&_bDumpDist) .description("Write also distances with -od")); _options.addOption(SelectionOption("group1").multiValue().required() .dynamicOnlyWhole().storeVector(&_sel1).getAdjuster(&_sel1Adj) .description("First analysis/vector selection")); _options.addOption(SelectionOption("group2").multiValue() .dynamicOnlyWhole().storeVector(&_sel2).getAdjuster(&_sel2Adj) .description("Second analysis/vector selection")); return &_options; }