* This file is part of the GROMACS molecular simulation package.
*
* Copyright (c) 2010-2018, The GROMACS development team.
- * Copyright (c) 2019,2020, by the GROMACS development team, led by
+ * Copyright (c) 2019,2020,2021, 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.
#include "gromacs/analysisdata/analysisdata.h"
#include "gromacs/selection/selection.h"
+#include "gromacs/selection/selectioncollection.h"
#include "gromacs/utility/exceptions.h"
#include "gromacs/utility/gmxassert.h"
+#include "gromacs/utility/stringutil.h"
namespace gmx
{
Selection TrajectoryAnalysisModuleData::parallelSelection(const Selection& selection)
{
- // TODO: Implement properly.
- return selection;
+ std::optional<Selection> sel = impl_->selections_.selection(selection.name());
+ // Selections should never be missing in an analysis module, so this is an internal consistency check.
+ GMX_RELEASE_ASSERT(sel.has_value(),
+ gmx::formatString("invalid selection %s", selection.name()).c_str());
+ return sel.value();
}
*
* Does not throw.
*/
- static Selection parallelSelection(const Selection& selection);
+ Selection parallelSelection(const Selection& selection);
/*! \brief
* Returns a set of selection that corresponds to the given selections.
*
*
* \see parallelSelection()
*/
- static SelectionList parallelSelections(const SelectionList& selections);
+ SelectionList parallelSelections(const SelectionList& selections);
protected:
/*! \brief
void Angle::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc, TrajectoryAnalysisModuleData* pdata)
{
AnalysisDataHandle dh = pdata->dataHandle(angles_);
- const SelectionList& sel1 = TrajectoryAnalysisModuleData::parallelSelections(sel1_);
- const SelectionList& sel2 = TrajectoryAnalysisModuleData::parallelSelections(sel2_);
+ const SelectionList& sel1 = pdata->parallelSelections(sel1_);
+ const SelectionList& sel2 = pdata->parallelSelections(sel2_);
checkSelections(sel1, sel2);
{
AnalysisDataHandle distHandle = pdata->dataHandle(distances_);
AnalysisDataHandle xyzHandle = pdata->dataHandle(xyz_);
- const SelectionList& sel = TrajectoryAnalysisModuleData::parallelSelections(sel_);
+ const SelectionList& sel = pdata->parallelSelections(sel_);
checkSelections(sel);
void FreeVolume::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc, TrajectoryAnalysisModuleData* pdata)
{
AnalysisDataHandle dh = pdata->dataHandle(data_);
- const Selection& sel = TrajectoryAnalysisModuleData::parallelSelection(sel_);
+ const Selection& sel = pdata->parallelSelection(sel_);
gmx::UniformRealDistribution<real> dist;
GMX_RELEASE_ASSERT(nullptr != pbc, "You have no periodic boundary conditions");
for (MsdGroupData& msdData : groupData_)
{
- //NOLINTNEXTLINE(readability-static-accessed-through-instance)
const Selection& sel = pdata->parallelSelection(msdData.sel);
ArrayRef<const RVec> coords = msdData.coordinateManager_.buildCoordinates(sel, pbc);
void PairDistance::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc, TrajectoryAnalysisModuleData* pdata)
{
AnalysisDataHandle dh = pdata->dataHandle(distances_);
- const Selection& refSel = TrajectoryAnalysisModuleData::parallelSelection(refSel_);
- const SelectionList& sel = TrajectoryAnalysisModuleData::parallelSelections(sel_);
+ const Selection& refSel = pdata->parallelSelection(refSel_);
+ const SelectionList& sel = pdata->parallelSelections(sel_);
PairDistanceModuleData& frameData = *static_cast<PairDistanceModuleData*>(pdata);
std::vector<real>& distArray = frameData.distArray_;
std::vector<int>& countArray = frameData.countArray_;
{
AnalysisDataHandle dh = pdata->dataHandle(pairDist_);
AnalysisDataHandle nh = pdata->dataHandle(normFactors_);
- const Selection& refSel = TrajectoryAnalysisModuleData::parallelSelection(refSel_);
- const SelectionList& sel = TrajectoryAnalysisModuleData::parallelSelections(sel_);
+ const Selection& refSel = pdata->parallelSelection(refSel_);
+ const SelectionList& sel = pdata->parallelSelections(sel_);
RdfModuleData& frameData = *static_cast<RdfModuleData*>(pdata);
const bool bSurface = !frameData.surfaceDist2_.empty();
AnalysisDataHandle aah = pdata->dataHandle(atomArea_);
AnalysisDataHandle rah = pdata->dataHandle(residueArea_);
AnalysisDataHandle vh = pdata->dataHandle(volume_);
- const Selection& surfaceSel = TrajectoryAnalysisModuleData::parallelSelection(surfaceSel_);
- const SelectionList& outputSel = TrajectoryAnalysisModuleData::parallelSelections(outputSel_);
+ const Selection& surfaceSel = pdata->parallelSelection(surfaceSel_);
+ const SelectionList& outputSel = pdata->parallelSelections(outputSel_);
SasaModuleData& frameData = *static_cast<SasaModuleData*>(pdata);
const bool bResAt = !frameData.res_a_.empty();
AnalysisDataHandle cdh = pdata->dataHandle(cdata_);
AnalysisDataHandle idh = pdata->dataHandle(idata_);
AnalysisDataHandle mdh = pdata->dataHandle(mdata_);
- const SelectionList& sel = TrajectoryAnalysisModuleData::parallelSelections(sel_);
+ const SelectionList& sel = pdata->parallelSelections(sel_);
sdh.startFrame(frnr, fr.time);
for (size_t g = 0; g < sel.size(); ++g)
void Trajectory::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* /* pbc */, TrajectoryAnalysisModuleData* pdata)
{
AnalysisDataHandle dh = pdata->dataHandle(xdata_);
- const SelectionList& sel = TrajectoryAnalysisModuleData::parallelSelections(sel_);
+ const SelectionList& sel = pdata->parallelSelections(sel_);
analyzeFrameImpl(frnr, fr, &dh, sel, [](const SelectionPosition& pos) { return pos.x(); });
if (fr.bV)
{