From 6f2b291b288083b0851824528b3ec916fe463aec Mon Sep 17 00:00:00 2001 From: Kevin Boyd Date: Mon, 12 Apr 2021 11:02:11 -0700 Subject: [PATCH] Replace static trajectoryanalysismoduledata methods with instance methods This paves the way for multiple concurrent frames analyzing selections in parallel, via individual analysismoduledata objects --- src/gromacs/trajectoryanalysis/analysismodule.cpp | 11 ++++++++--- src/gromacs/trajectoryanalysis/analysismodule.h | 4 ++-- src/gromacs/trajectoryanalysis/modules/angle.cpp | 4 ++-- src/gromacs/trajectoryanalysis/modules/distance.cpp | 2 +- src/gromacs/trajectoryanalysis/modules/freevolume.cpp | 2 +- src/gromacs/trajectoryanalysis/modules/msd.cpp | 1 - src/gromacs/trajectoryanalysis/modules/pairdist.cpp | 4 ++-- src/gromacs/trajectoryanalysis/modules/rdf.cpp | 4 ++-- src/gromacs/trajectoryanalysis/modules/sasa.cpp | 4 ++-- src/gromacs/trajectoryanalysis/modules/select.cpp | 2 +- src/gromacs/trajectoryanalysis/modules/trajectory.cpp | 2 +- 11 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/gromacs/trajectoryanalysis/analysismodule.cpp b/src/gromacs/trajectoryanalysis/analysismodule.cpp index 263fa1cbe8..af14443215 100644 --- a/src/gromacs/trajectoryanalysis/analysismodule.cpp +++ b/src/gromacs/trajectoryanalysis/analysismodule.cpp @@ -2,7 +2,7 @@ * 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. @@ -49,8 +49,10 @@ #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 { @@ -185,8 +187,11 @@ AnalysisDataHandle TrajectoryAnalysisModuleData::dataHandle(const AnalysisData& Selection TrajectoryAnalysisModuleData::parallelSelection(const Selection& selection) { - // TODO: Implement properly. - return selection; + std::optional 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(); } diff --git a/src/gromacs/trajectoryanalysis/analysismodule.h b/src/gromacs/trajectoryanalysis/analysismodule.h index 76da72fea8..e78232f954 100644 --- a/src/gromacs/trajectoryanalysis/analysismodule.h +++ b/src/gromacs/trajectoryanalysis/analysismodule.h @@ -129,7 +129,7 @@ public: * * 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. * @@ -139,7 +139,7 @@ public: * * \see parallelSelection() */ - static SelectionList parallelSelections(const SelectionList& selections); + SelectionList parallelSelections(const SelectionList& selections); protected: /*! \brief diff --git a/src/gromacs/trajectoryanalysis/modules/angle.cpp b/src/gromacs/trajectoryanalysis/modules/angle.cpp index 1e994f904d..e94d5afd13 100644 --- a/src/gromacs/trajectoryanalysis/modules/angle.cpp +++ b/src/gromacs/trajectoryanalysis/modules/angle.cpp @@ -689,8 +689,8 @@ void calc_vec(int natoms, rvec x[], t_pbc* pbc, rvec xout, rvec cout) 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); diff --git a/src/gromacs/trajectoryanalysis/modules/distance.cpp b/src/gromacs/trajectoryanalysis/modules/distance.cpp index 53cc64ddd5..604a37ea7c 100644 --- a/src/gromacs/trajectoryanalysis/modules/distance.cpp +++ b/src/gromacs/trajectoryanalysis/modules/distance.cpp @@ -325,7 +325,7 @@ void Distance::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc, Trajecto { AnalysisDataHandle distHandle = pdata->dataHandle(distances_); AnalysisDataHandle xyzHandle = pdata->dataHandle(xyz_); - const SelectionList& sel = TrajectoryAnalysisModuleData::parallelSelections(sel_); + const SelectionList& sel = pdata->parallelSelections(sel_); checkSelections(sel); diff --git a/src/gromacs/trajectoryanalysis/modules/freevolume.cpp b/src/gromacs/trajectoryanalysis/modules/freevolume.cpp index 8ed32b3746..d049a45483 100644 --- a/src/gromacs/trajectoryanalysis/modules/freevolume.cpp +++ b/src/gromacs/trajectoryanalysis/modules/freevolume.cpp @@ -305,7 +305,7 @@ void FreeVolume::initAnalysis(const TrajectoryAnalysisSettings& settings, const 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 dist; GMX_RELEASE_ASSERT(nullptr != pbc, "You have no periodic boundary conditions"); diff --git a/src/gromacs/trajectoryanalysis/modules/msd.cpp b/src/gromacs/trajectoryanalysis/modules/msd.cpp index f1f6674f53..52a89476ef 100644 --- a/src/gromacs/trajectoryanalysis/modules/msd.cpp +++ b/src/gromacs/trajectoryanalysis/modules/msd.cpp @@ -653,7 +653,6 @@ void Msd::analyzeFrame(int gmx_unused frameNumber, for (MsdGroupData& msdData : groupData_) { - //NOLINTNEXTLINE(readability-static-accessed-through-instance) const Selection& sel = pdata->parallelSelection(msdData.sel); ArrayRef coords = msdData.coordinateManager_.buildCoordinates(sel, pbc); diff --git a/src/gromacs/trajectoryanalysis/modules/pairdist.cpp b/src/gromacs/trajectoryanalysis/modules/pairdist.cpp index 8f3112822b..7721100cc7 100644 --- a/src/gromacs/trajectoryanalysis/modules/pairdist.cpp +++ b/src/gromacs/trajectoryanalysis/modules/pairdist.cpp @@ -416,8 +416,8 @@ TrajectoryAnalysisModuleDataPointer PairDistance::startFrames(const AnalysisData 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(pdata); std::vector& distArray = frameData.distArray_; std::vector& countArray = frameData.countArray_; diff --git a/src/gromacs/trajectoryanalysis/modules/rdf.cpp b/src/gromacs/trajectoryanalysis/modules/rdf.cpp index 6df3a9dc00..fb14250fc6 100644 --- a/src/gromacs/trajectoryanalysis/modules/rdf.cpp +++ b/src/gromacs/trajectoryanalysis/modules/rdf.cpp @@ -479,8 +479,8 @@ void Rdf::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc, TrajectoryAna { 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(pdata); const bool bSurface = !frameData.surfaceDist2_.empty(); diff --git a/src/gromacs/trajectoryanalysis/modules/sasa.cpp b/src/gromacs/trajectoryanalysis/modules/sasa.cpp index 7f282ffd94..360e68c7a3 100644 --- a/src/gromacs/trajectoryanalysis/modules/sasa.cpp +++ b/src/gromacs/trajectoryanalysis/modules/sasa.cpp @@ -894,8 +894,8 @@ void Sasa::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc, TrajectoryAn 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(pdata); const bool bResAt = !frameData.res_a_.empty(); diff --git a/src/gromacs/trajectoryanalysis/modules/select.cpp b/src/gromacs/trajectoryanalysis/modules/select.cpp index 8298b482ff..0ec05b077f 100644 --- a/src/gromacs/trajectoryanalysis/modules/select.cpp +++ b/src/gromacs/trajectoryanalysis/modules/select.cpp @@ -627,7 +627,7 @@ void Select::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* /* pbc */, Traj 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) diff --git a/src/gromacs/trajectoryanalysis/modules/trajectory.cpp b/src/gromacs/trajectoryanalysis/modules/trajectory.cpp index 6960504ebb..4575a42a29 100644 --- a/src/gromacs/trajectoryanalysis/modules/trajectory.cpp +++ b/src/gromacs/trajectoryanalysis/modules/trajectory.cpp @@ -253,7 +253,7 @@ void analyzeFrameImpl(int frnr, const t_trxframe& fr, AnalysisDataHandle* dh, co 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) { -- 2.22.0