/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
+ * Copyright (c) 2010-2018, The GROMACS development team.
+ * Copyright (c) 2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
class Distance : public TrajectoryAnalysisModule
{
- public:
- Distance();
-
- void initOptions(IOptionsContainer *options,
- TrajectoryAnalysisSettings *settings) override;
- void initAnalysis(const TrajectoryAnalysisSettings &settings,
- const TopologyInformation &top) override;
-
- void analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
- TrajectoryAnalysisModuleData *pdata) override;
-
- void finishAnalysis(int nframes) override;
- void writeOutput() override;
-
- private:
- SelectionList sel_;
- std::string fnAverage_;
- std::string fnAll_;
- std::string fnXYZ_;
- std::string fnHistogram_;
- std::string fnAllStats_;
- double meanLength_;
- double lengthDev_;
- double binWidth_;
-
- AnalysisData distances_;
- AnalysisData xyz_;
- AnalysisDataAverageModulePointer summaryStatsModule_;
- AnalysisDataAverageModulePointer allStatsModule_;
- AnalysisDataFrameAverageModulePointer averageModule_;
- AnalysisDataSimpleHistogramModulePointer histogramModule_;
-
- // Copy and assign disallowed by base.
+public:
+ Distance();
+
+ void initOptions(IOptionsContainer* options, TrajectoryAnalysisSettings* settings) override;
+ void initAnalysis(const TrajectoryAnalysisSettings& settings, const TopologyInformation& top) override;
+
+ void analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc, TrajectoryAnalysisModuleData* pdata) override;
+
+ void finishAnalysis(int nframes) override;
+ void writeOutput() override;
+
+private:
+ SelectionList sel_;
+ std::string fnAverage_;
+ std::string fnAll_;
+ std::string fnXYZ_;
+ std::string fnHistogram_;
+ std::string fnAllStats_;
+ double meanLength_;
+ double lengthDev_;
+ double binWidth_;
+
+ AnalysisData distances_;
+ AnalysisData xyz_;
+ AnalysisDataAverageModulePointer summaryStatsModule_;
+ AnalysisDataAverageModulePointer allStatsModule_;
+ AnalysisDataFrameAverageModulePointer averageModule_;
+ AnalysisDataSimpleHistogramModulePointer histogramModule_;
+
+ // Copy and assign disallowed by base.
};
-Distance::Distance()
- : meanLength_(0.1), lengthDev_(1.0), binWidth_(0.001),
- summaryStatsModule_(std::make_unique<AnalysisDataAverageModule>()),
- allStatsModule_(std::make_unique<AnalysisDataAverageModule>()),
- averageModule_(std::make_unique<AnalysisDataFrameAverageModule>()),
- histogramModule_(std::make_unique<AnalysisDataSimpleHistogramModule>())
+Distance::Distance() :
+ meanLength_(0.1),
+ lengthDev_(1.0),
+ binWidth_(0.001),
+ summaryStatsModule_(std::make_unique<AnalysisDataAverageModule>()),
+ allStatsModule_(std::make_unique<AnalysisDataAverageModule>()),
+ averageModule_(std::make_unique<AnalysisDataFrameAverageModule>()),
+ histogramModule_(std::make_unique<AnalysisDataSimpleHistogramModule>())
{
summaryStatsModule_->setAverageDataSets(true);
distances_.addModule(summaryStatsModule_);
}
-void
-Distance::initOptions(IOptionsContainer *options, TrajectoryAnalysisSettings *settings)
+void Distance::initOptions(IOptionsContainer* options, TrajectoryAnalysisSettings* settings)
{
- static const char *const desc[] = {
+ static const char* const desc[] = {
"[THISMODULE] calculates distances between pairs of positions",
"as a function of time. Each selection specifies an independent set",
"of distances to calculate. Each selection should consist of pairs",
settings->setHelpText(desc);
- options->addOption(FileNameOption("oav").filetype(eftPlot).outputFile()
- .store(&fnAverage_).defaultBasename("distave")
- .description("Average distances as function of time"));
- options->addOption(FileNameOption("oall").filetype(eftPlot).outputFile()
- .store(&fnAll_).defaultBasename("dist")
- .description("All distances as function of time"));
- options->addOption(FileNameOption("oxyz").filetype(eftPlot).outputFile()
- .store(&fnXYZ_).defaultBasename("distxyz")
- .description("Distance components as function of time"));
- options->addOption(FileNameOption("oh").filetype(eftPlot).outputFile()
- .store(&fnHistogram_).defaultBasename("disthist")
- .description("Histogram of the distances"));
- options->addOption(FileNameOption("oallstat").filetype(eftPlot).outputFile()
- .store(&fnAllStats_).defaultBasename("diststat")
- .description("Statistics for individual distances"));
- options->addOption(SelectionOption("select").storeVector(&sel_)
- .required().dynamicMask().multiValue()
- .description("Position pairs to calculate distances for"));
+ options->addOption(FileNameOption("oav")
+ .filetype(eftPlot)
+ .outputFile()
+ .store(&fnAverage_)
+ .defaultBasename("distave")
+ .description("Average distances as function of time"));
+ options->addOption(FileNameOption("oall")
+ .filetype(eftPlot)
+ .outputFile()
+ .store(&fnAll_)
+ .defaultBasename("dist")
+ .description("All distances as function of time"));
+ options->addOption(FileNameOption("oxyz")
+ .filetype(eftPlot)
+ .outputFile()
+ .store(&fnXYZ_)
+ .defaultBasename("distxyz")
+ .description("Distance components as function of time"));
+ options->addOption(FileNameOption("oh")
+ .filetype(eftPlot)
+ .outputFile()
+ .store(&fnHistogram_)
+ .defaultBasename("disthist")
+ .description("Histogram of the distances"));
+ options->addOption(FileNameOption("oallstat")
+ .filetype(eftPlot)
+ .outputFile()
+ .store(&fnAllStats_)
+ .defaultBasename("diststat")
+ .description("Statistics for individual distances"));
+ options->addOption(
+ SelectionOption("select").storeVector(&sel_).required().dynamicMask().multiValue().description(
+ "Position pairs to calculate distances for"));
// TODO: Extend the histogramming implementation to allow automatic
// extension of the histograms to cover the data, removing the need for
// the first two options.
- options->addOption(DoubleOption("len").store(&meanLength_)
- .description("Mean distance for histogramming"));
- options->addOption(DoubleOption("tol").store(&lengthDev_)
- .description("Width of full distribution as fraction of [TT]-len[tt]"));
- options->addOption(DoubleOption("binw").store(&binWidth_)
- .description("Bin width for histogramming"));
+ options->addOption(
+ DoubleOption("len").store(&meanLength_).description("Mean distance for histogramming"));
+ options->addOption(
+ DoubleOption("tol").store(&lengthDev_).description("Width of full distribution as fraction of [TT]-len[tt]"));
+ options->addOption(
+ DoubleOption("binw").store(&binWidth_).description("Bin width for histogramming"));
}
/*! \brief
* Checks that selections conform to the expectations of the tool.
*/
-void checkSelections(const SelectionList &sel)
+void checkSelections(const SelectionList& sel)
{
for (size_t g = 0; g < sel.size(); ++g)
{
if (sel[g].posCount() % 2 != 0)
{
std::string message = formatString(
- "Selection '%s' does not evaluate into an even number of positions "
- "(there are %d positions)",
- sel[g].name(), sel[g].posCount());
+ "Selection '%s' does not evaluate into an even number of positions "
+ "(there are %d positions)",
+ sel[g].name(), sel[g].posCount());
GMX_THROW(InconsistentInputError(message));
}
if (sel[g].isDynamic())
{
for (int i = 0; i < sel[g].posCount(); i += 2)
{
- if (sel[g].position(i).selected() != sel[g].position(i+1).selected())
+ if (sel[g].position(i).selected() != sel[g].position(i + 1).selected())
{
- std::string message =
- formatString("Dynamic selection %d does not select "
- "a consistent set of pairs over the frames",
- static_cast<int>(g + 1));
+ std::string message = formatString(
+ "Dynamic selection %d does not select "
+ "a consistent set of pairs over the frames",
+ static_cast<int>(g + 1));
GMX_THROW(InconsistentInputError(message));
}
}
}
-void
-Distance::initAnalysis(const TrajectoryAnalysisSettings &settings,
- const TopologyInformation & /*top*/)
+void Distance::initAnalysis(const TrajectoryAnalysisSettings& settings, const TopologyInformation& /*top*/)
{
checkSelections(sel_);
}
const double histogramMin = (1.0 - lengthDev_) * meanLength_;
const double histogramMax = (1.0 + lengthDev_) * meanLength_;
- histogramModule_->init(histogramFromRange(histogramMin, histogramMax)
- .binWidth(binWidth_).includeAll());
+ histogramModule_->init(histogramFromRange(histogramMin, histogramMax).binWidth(binWidth_).includeAll());
if (!fnAverage_.empty())
{
- AnalysisDataPlotModulePointer plotm(
- new AnalysisDataPlotModule(settings.plotSettings()));
+ AnalysisDataPlotModulePointer plotm(new AnalysisDataPlotModule(settings.plotSettings()));
plotm->setFileName(fnAverage_);
plotm->setTitle("Average distance");
plotm->setXAxisIsTime();
if (!fnAll_.empty())
{
- AnalysisDataPlotModulePointer plotm(
- new AnalysisDataPlotModule(settings.plotSettings()));
+ AnalysisDataPlotModulePointer plotm(new AnalysisDataPlotModule(settings.plotSettings()));
plotm->setFileName(fnAll_);
plotm->setTitle("Distance");
plotm->setXAxisIsTime();
if (!fnXYZ_.empty())
{
- AnalysisDataPlotModulePointer plotm(
- new AnalysisDataPlotModule(settings.plotSettings()));
+ AnalysisDataPlotModulePointer plotm(new AnalysisDataPlotModule(settings.plotSettings()));
plotm->setFileName(fnXYZ_);
plotm->setTitle("Distance");
plotm->setXAxisIsTime();
if (!fnHistogram_.empty())
{
- AnalysisDataPlotModulePointer plotm(
- new AnalysisDataPlotModule(settings.plotSettings()));
+ AnalysisDataPlotModulePointer plotm(new AnalysisDataPlotModule(settings.plotSettings()));
plotm->setFileName(fnHistogram_);
plotm->setTitle("Distance histogram");
plotm->setXLabel("Distance (nm)");
if (!fnAllStats_.empty())
{
- AnalysisDataPlotModulePointer plotm(
- new AnalysisDataPlotModule(settings.plotSettings()));
+ AnalysisDataPlotModulePointer plotm(new AnalysisDataPlotModule(settings.plotSettings()));
plotm->setFileName(fnAllStats_);
plotm->setErrorsAsSeparateColumn(true);
plotm->setTitle("Statistics for individual distances");
}
-void
-Distance::analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
- TrajectoryAnalysisModuleData *pdata)
+void Distance::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc, TrajectoryAnalysisModuleData* pdata)
{
AnalysisDataHandle distHandle = pdata->dataHandle(distances_);
AnalysisDataHandle xyzHandle = pdata->dataHandle(xyz_);
- const SelectionList &sel = pdata->parallelSelections(sel_);
+ const SelectionList& sel = pdata->parallelSelections(sel_);
checkSelections(sel);
xyzHandle.selectDataSet(g);
for (int i = 0, n = 0; i < sel[g].posCount(); i += 2, ++n)
{
- const SelectionPosition &p1 = sel[g].position(i);
- const SelectionPosition &p2 = sel[g].position(i+1);
+ const SelectionPosition& p1 = sel[g].position(i);
+ const SelectionPosition& p2 = sel[g].position(i + 1);
rvec dx;
if (pbc != nullptr)
{
real dist = norm(dx);
bool bPresent = p1.selected() && p2.selected();
distHandle.setPoint(n, dist, bPresent);
- xyzHandle.setPoints(n*3, 3, dx, bPresent);
+ xyzHandle.setPoints(n * 3, 3, dx, bPresent);
}
}
distHandle.finishFrame();
}
-void
-Distance::finishAnalysis(int /*nframes*/)
+void Distance::finishAnalysis(int /*nframes*/)
{
- AbstractAverageHistogram &averageHistogram = histogramModule_->averager();
+ AbstractAverageHistogram& averageHistogram = histogramModule_->averager();
averageHistogram.normalizeProbability();
averageHistogram.done();
}
-void
-Distance::writeOutput()
+void Distance::writeOutput()
{
SelectionList::const_iterator sel;
int index;
for (sel = sel_.begin(), index = 0; sel != sel_.end(); ++sel, ++index)
{
printf("%s:\n", sel->name());
- printf(" Number of samples: %d\n",
- summaryStatsModule_->sampleCount(index, 0));
- printf(" Average distance: %-8.5f nm\n",
- summaryStatsModule_->average(index, 0));
- printf(" Standard deviation: %-8.5f nm\n",
- summaryStatsModule_->standardDeviation(index, 0));
+ printf(" Number of samples: %d\n", summaryStatsModule_->sampleCount(index, 0));
+ printf(" Average distance: %-8.5f nm\n", summaryStatsModule_->average(index, 0));
+ printf(" Standard deviation: %-8.5f nm\n", summaryStatsModule_->standardDeviation(index, 0));
}
}
-} // namespace
+} // namespace
const char DistanceInfo::name[] = "distance";
-const char DistanceInfo::shortDescription[] =
- "Calculate distances between pairs of positions";
+const char DistanceInfo::shortDescription[] = "Calculate distances between pairs of positions";
TrajectoryAnalysisModulePointer DistanceInfo::create()
{