void TrajectoryAnalysisCommandLineRunner::writeHelp(const CommandLineHelpContext &context) { // TODO: This method duplicates some code from run(). // See how to best refactor it to share the common code. SelectionCollection selections; TrajectoryAnalysisSettings settings; TrajectoryAnalysisRunnerCommon common(&settings); SelectionOptionManager seloptManager(&selections); Options options(NULL, NULL); Options moduleOptions(impl_->module_->name(), impl_->module_->description()); Options commonOptions("common", "Common analysis control"); Options selectionOptions("selection", "Common selection control"); options.addManager(&seloptManager); options.addSubSection(&commonOptions); options.addSubSection(&selectionOptions); options.addSubSection(&moduleOptions); impl_->module_->initOptions(&moduleOptions, &settings); common.initOptions(&commonOptions); selections.initOptions(&selectionOptions); CommandLineHelpWriter(options) .setShowDescriptions(true) .setTimeUnitString(settings.timeUnitManager().timeUnitAsString()) .writeHelp(context); }
void Angle::initAnalysis(const TrajectoryAnalysisSettings &settings, const TopologyInformation &top) { checkSelections(sel1_, sel2_); angles_.setColumnCount(sel1_[0].posCount() / natoms1_); if (g2type_ == "t0") { vt0_.resize(sel1_.size()); for (size_t g = 0; g < sel1_.size(); ++g) { vt0_[g] = new rvec[sel1_[g].posCount() / natoms1_]; } } if (!fnAverage_.empty()) { AnalysisDataPlotModulePointer plotm( new AnalysisDataPlotModule(settings.plotSettings())); plotm->setFileName(fnAverage_); plotm->setTitle("Average angle"); plotm->setXAxisIsTime(); plotm->setYLabel("Angle (degrees)"); // TODO: Add legends averageModule_->addModule(plotm); } if (!fnAll_.empty()) { AnalysisDataPlotModulePointer plotm( new AnalysisDataPlotModule(settings.plotSettings())); plotm->setFileName(fnAll_); plotm->setTitle("Angle"); plotm->setXAxisIsTime(); plotm->setYLabel("Angle (degrees)"); // TODO: Add legends? (there can be a massive amount of columns) angles_.addModule(plotm); } }
void AnalysisTemplate::initAnalysis(const TrajectoryAnalysisSettings &settings, const TopologyInformation & /*top*/) { nb_.setCutoff(cutoff_); data_.setColumnCount(0, sel_.size()); avem_.reset(new AnalysisDataAverageModule()); data_.addModule(avem_); if (!fnDist_.empty()) { AnalysisDataPlotModulePointer plotm( new AnalysisDataPlotModule(settings.plotSettings())); plotm->setFileName(fnDist_); plotm->setTitle("Average distance"); plotm->setXAxisIsTime(); plotm->setYLabel("Distance (nm)"); data_.addModule(plotm); } }
void Distance::initAnalysis(const TrajectoryAnalysisSettings &settings, const TopologyInformation & /*top*/) { if (sel_[0].posCount() != 1) { GMX_THROW(InvalidInputError("The first selection does not define a single position")); } if (sel_[1].posCount() != 1) { GMX_THROW(InvalidInputError("The second selection does not define a single position")); } data_.addModule(avem_); AnalysisDataPlotModulePointer plotm_(new AnalysisDataPlotModule()); plotm_->setSettings(settings.plotSettings()); plotm_->setFileName(fnDist_); plotm_->setTitle("Distance"); plotm_->setXAxisIsTime(); plotm_->setYLabel("Distance (nm)"); data_.addModule(plotm_); }
int TrajectoryAnalysisCommandLineRunner::run(int argc, char *argv[]) { TrajectoryAnalysisModule *module = impl_->module_; SelectionCollection selections; selections.setDebugLevel(impl_->debugLevel_); TrajectoryAnalysisSettings settings; TrajectoryAnalysisRunnerCommon common(&settings); impl_->parseOptions(&settings, &common, &selections, &argc, argv); const TopologyInformation &topology = common.topologyInformation(); module->initAnalysis(settings, topology); // Load first frame. common.initFirstFrame(); module->initAfterFirstFrame(settings, common.frame()); t_pbc pbc; t_pbc *ppbc = settings.hasPBC() ? &pbc : NULL; int nframes = 0; AnalysisDataParallelOptions dataOptions; TrajectoryAnalysisModuleDataPointer pdata( module->startFrames(dataOptions, selections)); do { common.initFrame(); t_trxframe &frame = common.frame(); if (ppbc != NULL) { set_pbc(ppbc, topology.ePBC(), frame.box); } selections.evaluate(&frame, ppbc); module->analyzeFrame(nframes, frame, ppbc, pdata.get()); module->finishFrameSerial(nframes); ++nframes; } while (common.readNextFrame()); module->finishFrames(pdata.get()); if (pdata.get() != NULL) { pdata->finish(); } pdata.reset(); if (common.hasTrajectory()) { fprintf(stderr, "Analyzed %d frames, last time %.3f\n", nframes, common.frame().time); } else { fprintf(stderr, "Analyzed topology coordinates\n"); } // Restore the maximal groups for dynamic selections. selections.evaluateFinal(nframes); module->finishAnalysis(nframes); module->writeOutput(); return 0; }