Replace static trajectoryanalysismoduledata methods with instance methods
authorKevin Boyd <kevin44boyd@gmail.com>
Mon, 12 Apr 2021 18:02:11 +0000 (11:02 -0700)
committerPaul Bauer <paul.bauer.q@gmail.com>
Tue, 13 Apr 2021 10:44:13 +0000 (10:44 +0000)
This paves the way for multiple concurrent frames analyzing
selections in parallel, via individual analysismoduledata objects

src/gromacs/trajectoryanalysis/analysismodule.cpp
src/gromacs/trajectoryanalysis/analysismodule.h
src/gromacs/trajectoryanalysis/modules/angle.cpp
src/gromacs/trajectoryanalysis/modules/distance.cpp
src/gromacs/trajectoryanalysis/modules/freevolume.cpp
src/gromacs/trajectoryanalysis/modules/msd.cpp
src/gromacs/trajectoryanalysis/modules/pairdist.cpp
src/gromacs/trajectoryanalysis/modules/rdf.cpp
src/gromacs/trajectoryanalysis/modules/sasa.cpp
src/gromacs/trajectoryanalysis/modules/select.cpp
src/gromacs/trajectoryanalysis/modules/trajectory.cpp

index 263fa1cbe88be0e3acb6e1cb4ca933f3b369d97b..af144432152559b621956703d82ee03f15a8ffd6 100644 (file)
@@ -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.
 
 #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<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();
 }
 
 
index 76da72fea88125991048c6ceb30e71db3d52c011..e78232f954300ec8ff11ef1af5e0106ead948c8d 100644 (file)
@@ -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
index 1e994f904dcbf10a002c2487f89e6b7f97f094d0..e94d5afd13c6cd1ec6766d66998eb2e73cc84c18 100644 (file)
@@ -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);
 
index 53cc64ddd5ca55dc779493529f6f7396842e4bfe..604a37ea7c36d8326c6aa6cad29c921aab1ade6d 100644 (file)
@@ -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);
 
index 8ed32b3746fcf170a6fe49f1d532794808f81364..d049a45483fe109f9a776af416d43db37ba08ead 100644 (file)
@@ -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<real> dist;
 
     GMX_RELEASE_ASSERT(nullptr != pbc, "You have no periodic boundary conditions");
index f1f6674f53ce6c77eb3c5f92942b8fd5b665e142..52a89476efae0db5990208cfa80052461d3b3bf0 100644 (file)
@@ -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<const RVec> coords = msdData.coordinateManager_.buildCoordinates(sel, pbc);
index 8f3112822bdab90f7b76404d3cf38d8ab24a7303..7721100cc7f33c0402f32fe70e83da64b6b7e177 100644 (file)
@@ -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<PairDistanceModuleData*>(pdata);
     std::vector<real>&      distArray  = frameData.distArray_;
     std::vector<int>&       countArray = frameData.countArray_;
index 6df3a9dc00ecad32657cc514e8de8aa60a6eff9e..fb14250fc6eac44d14e6d114ad2c46e4d66df78f 100644 (file)
@@ -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<RdfModuleData*>(pdata);
     const bool           bSurface  = !frameData.surfaceDist2_.empty();
 
index 7f282ffd94c9da4a1f9895ace1f6a286608f9d3c..360e68c7a351ca8269afff1489b84b625489d227 100644 (file)
@@ -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<SasaModuleData*>(pdata);
 
     const bool bResAt    = !frameData.res_a_.empty();
index 8298b482ff5c35b6e45c998920248950550cd7ec..0ec05b077fb132179a70f2e75c101b2be004980e 100644 (file)
@@ -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)
index 6960504ebb6bcefe05bc85fa0461ce5383bb58fe..4575a42a299138843e6981bc6e03bee558bae611 100644 (file)
@@ -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)
     {