Merge branch 'master' into pygromacs
authorAlexey Shvetsov <alexxy@omrb.pnpi.spb.ru>
Sun, 19 Jul 2015 08:31:37 +0000 (11:31 +0300)
committerAlexey Shvetsov <alexxy@omrb.pnpi.spb.ru>
Sun, 19 Jul 2015 08:31:37 +0000 (11:31 +0300)
1  2 
src/gromacs/trajectoryanalysis/cmdlinerunner.cpp

index ac7f8b50a989fece505bd565efba03883241f77b,5ac15b6281f04b4386ebe8ea77f95d6855d4a70f..912db6c9633ce7b530abc8cfa47fd645b1659da2
@@@ -81,7 -81,7 +81,7 @@@ class TrajectoryAnalysisCommandLineRunn
          void parseOptions(TrajectoryAnalysisSettings *settings,
                            TrajectoryAnalysisRunnerCommon *common,
                            SelectionCollection *selections,
 -                          int *argc, char *argv[]);
 +                          int *argc, char *argv[], bool full=true);
  
          TrajectoryAnalysisModule *module_;
          bool                      bUseDefaultGroups_;
@@@ -106,7 -106,7 +106,7 @@@ TrajectoryAnalysisCommandLineRunner::Im
          TrajectoryAnalysisSettings *settings,
          TrajectoryAnalysisRunnerCommon *common,
          SelectionCollection *selections,
 -        int *argc, char *argv[])
 +        int *argc, char *argv[], bool full)
  {
      FileNameOptionManager  fileoptManager;
      SelectionOptionManager seloptManager(selections);
  
      options.addManager(&fileoptManager);
      options.addManager(&seloptManager);
 -    options.addSubSection(&commonOptions);
 +    if (full) {
 +        options.addSubSection(&commonOptions);
 +    }
      options.addSubSection(&selectionOptions);
      options.addSubSection(&moduleOptions);
  
      module_->initOptions(&moduleOptions, settings);
 -    common->initOptions(&commonOptions);
 +    if (full) {
 +        common->initOptions(&commonOptions);
 +    }
      selections->initOptions(&selectionOptions);
  
      {
          options.finish();
      }
  
 -    common->optionsFinished(&commonOptions);
 +    if (full) {
 +        common->optionsFinished(&commonOptions);
 +    }
      module_->optionsFinished(&moduleOptions, settings);
  
      common->initIndexGroups(selections, bUseDefaultGroups_);
  
      const bool bInteractive = StandardInputStream::instance().isInteractive();
      seloptManager.parseRequestedFromStdin(bInteractive);
 -    common->doneIndexGroups(selections);
  
 +    common->doneIndexGroups(selections);
      common->initTopology(selections);
 +
      selections->compile();
  }
  
@@@ -201,20 -194,6 +201,20 @@@ TrajectoryAnalysisCommandLineRunner::ru
      const TopologyInformation &topology = common.topologyInformation();
      module->initAnalysis(settings, topology);
  
 +    TrajectoryAnalysisModule::Batch batch = module->getBatch();
 +    std::vector<SelectionCollection*> batchSelections;
 +    std::vector<Impl*> impls;
 +    for (size_t i = 0; i < batch.size(); i++) {
 +        TrajectoryAnalysisModule *bmodule = batch[i];
 +        batchSelections.push_back(new SelectionCollection());
 +        impls.push_back(new Impl(bmodule));
 +        std::vector<char*> modArgv = module->getArgv(i);
 +        int modArgc = modArgv.size();
 +        impls.back()->parseOptions(&settings, &common, batchSelections.back(), &modArgc, modArgv.data(), false);
 +
 +        batch[i]->initAnalysis(settings, topology);
 +    }
 +
      // Load first frame.
      common.initFirstFrame();
      module->initAfterFirstFrame(settings, common.frame());
      AnalysisDataParallelOptions         dataOptions;
      TrajectoryAnalysisModuleDataPointer pdata(
              module->startFrames(dataOptions, selections));
 +
 +    std::vector<AnalysisDataParallelOptions> batchOptions;
 +    std::vector<TrajectoryAnalysisModuleDataPointer> batchDataPointers;
 +    for (size_t i = 0; i < batch.size(); i++) {
 +        batch[i]->initAfterFirstFrame(settings, common.frame());
 +
 +        batchOptions.push_back(AnalysisDataParallelOptions());
 +        batchDataPointers.push_back(batch[i]->startFrames(
 +            batchOptions.back(), *batchSelections[i]));
 +    }
 +
      do
      {
          common.initFrame();
              set_pbc(ppbc, topology.ePBC(), frame.box);
          }
  
 +        for (size_t i = 0; i < batch.size(); i++) {
 +            batchSelections[i]->evaluate(&frame, ppbc);
 +            batch[i]->analyzeFrame(nframes, frame, ppbc, batchDataPointers[i].get());
 +            batch[i]->finishFrameSerial(nframes);
 +        }
          selections.evaluate(&frame, ppbc);
          module->analyzeFrame(nframes, frame, ppbc, pdata.get());
          module->finishFrameSerial(nframes);
          ++nframes;
      }
      while (common.readNextFrame());
 +    for (size_t i = 0; i < batch.size(); i++) {
 +        batch[i]->finishFrames(batchDataPointers[i].get());
 +        if (batchDataPointers[i].get() != NULL) {
 +            batchDataPointers[i]->finish();
 +        }
 +        batchDataPointers[i].reset();
 +    }
 +
      module->finishFrames(pdata.get());
      if (pdata.get() != NULL)
      {
      }
  
      // Restore the maximal groups for dynamic selections.
 +    for (size_t i = 0; i < batch.size(); i++) {
 +        batchSelections[i]->evaluateFinal(nframes);
 +        batch[i]->finishAnalysis(nframes);
 +        batch[i]->writeOutput();
 +
 +        delete batchSelections[i];
 +        delete impls[i];
 +    }
 +
      selections.evaluateFinal(nframes);
  
      module->finishAnalysis(nframes);
@@@ -327,7 -273,7 +327,7 @@@ TrajectoryAnalysisCommandLineRunner::wr
      selections.initOptions(&selectionOptions);
  
      CommandLineHelpWriter(options)
-         .setShowDescriptions(true)
+         .setHelpText(settings.helpText())
          .setTimeUnitString(settings.timeUnitManager().timeUnitAsString())
          .writeHelp(context);
  }
@@@ -354,16 -300,7 +354,16 @@@ class TrajectoryAnalysisCommandLineRunn
           */
          RunnerCommandLineModule(const char *name, const char *description,
                                  ModuleFactoryMethod factory)
 -            : name_(name), description_(description), factory_(factory)
 +            : name_(name), description_(description), hasFunction_(true), factory_(factory), functor_(NULL)
 +        {
 +        }
 +
 +        /*! \brief
 +         * Overloaded constructor accepting a functor instead of function pointer.
 +         */
 +        RunnerCommandLineModule(const char *name, const char *description,
 +                                ModuleFactoryFunctor *factory)
 +            : name_(name), description_(description), hasFunction_(false), factory_(NULL), functor_(factory)
          {
          }
  
          virtual void writeHelp(const CommandLineHelpContext &context) const;
  
      private:
 -        const char             *name_;
 -        const char             *description_;
 -        ModuleFactoryMethod     factory_;
 +        const char            *name_;
 +        const char            *description_;
 +        bool                   hasFunction_;
 +        ModuleFactoryMethod    factory_;
 +        ModuleFactoryFunctor   *functor_;
  
          GMX_DISALLOW_COPY_AND_ASSIGN(RunnerCommandLineModule);
  };
@@@ -392,7 -327,7 +392,7 @@@ void TrajectoryAnalysisCommandLineRunne
  int TrajectoryAnalysisCommandLineRunner::Impl::RunnerCommandLineModule::run(
          int argc, char *argv[])
  {
 -    TrajectoryAnalysisModulePointer     module(factory_());
 +    TrajectoryAnalysisModulePointer     module(hasFunction_? factory_() : (*functor_)());
      TrajectoryAnalysisCommandLineRunner runner(module.get());
      return runner.run(argc, argv);
  }
  void TrajectoryAnalysisCommandLineRunner::Impl::RunnerCommandLineModule::writeHelp(
          const CommandLineHelpContext &context) const
  {
 -    TrajectoryAnalysisModulePointer     module(factory_());
 +    TrajectoryAnalysisModulePointer     module(hasFunction_? factory_() : (*functor_)());
      TrajectoryAnalysisCommandLineRunner runner(module.get());
      runner.writeHelp(context);
  }
@@@ -414,15 -349,6 +414,15 @@@ TrajectoryAnalysisCommandLineRunner::ru
      return CommandLineModuleManager::runAsMainSingleModule(argc, argv, &module);
  }
  
 +// static
 +int
 +TrajectoryAnalysisCommandLineRunner::runAsMain(
 +        int argc, char *argv[], ModuleFactoryFunctor *factory)
 +{
 +    Impl::RunnerCommandLineModule module(NULL, NULL, factory);
 +    return CommandLineModuleManager::runAsMainSingleModule(argc, argv, &module);
 +}
 +
  // static
  void
  TrajectoryAnalysisCommandLineRunner::registerModule(