#include <vector>
#include <gmxfio.h>
-#include <smalloc.h>
#include "gromacs/analysisdata/analysisdata.h"
#include "gromacs/analysisdata/dataframe.h"
} // namespace
-/********************************************************************
- * Select::ModuleData
- */
-
-class Select::ModuleData : public TrajectoryAnalysisModuleData
-{
- public:
- ModuleData(TrajectoryAnalysisModule *module,
- const AnalysisDataParallelOptions &opt,
- const SelectionCollection &selections)
- : TrajectoryAnalysisModuleData(module, opt, selections),
- _mmap(NULL)
- {
- }
-
- virtual ~ModuleData()
- {
- if (_mmap)
- {
- gmx_ana_indexmap_deinit(_mmap);
- sfree(_mmap);
- }
- }
-
- virtual void finish()
- {
- finishDataHandles();
- }
-
- gmx_ana_indexmap_t *_mmap;
-};
-
-
/********************************************************************
* Select
*/
Select::Select()
: _options("select", "Selection information"),
_bDump(false), _bTotNorm(false), _bFracNorm(false), _bResInd(false),
- _top(NULL), _totsize(NULL)
+ _top(NULL)
{
}
// TODO: For large systems, a float may not have enough precision
_sdata.setColumnCount(_sel.size());
registerAnalysisDataset(&_sdata, "size");
- snew(_totsize, _sel.size());
+ _totsize.reserve(_sel.size());
for (size_t g = 0; g < _sel.size(); ++g)
{
- _totsize[g] = _bTotNorm ? _sel[g].posCount() : 1;
+ _totsize.push_back(_sel[g].posCount());
}
if (!_fnSize.empty())
{
}
-TrajectoryAnalysisModuleDataPointer
-Select::startFrames(const AnalysisDataParallelOptions &opt,
- const SelectionCollection &selections)
-{
- ModuleData *pdata = new ModuleData(this, opt, selections);
- snew(pdata->_mmap, 1);
- gmx_ana_indexmap_init(pdata->_mmap, pdata->parallelSelection(_sel[0]).indexGroup(),
- _top, _sel[0].type());
- return TrajectoryAnalysisModuleDataPointer(pdata);
-}
-
-
void
Select::analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
TrajectoryAnalysisModuleData *pdata)
{
- ModuleData *d = static_cast<ModuleData *>(pdata);
AnalysisDataHandle sdh = pdata->dataHandle(_sdata);
AnalysisDataHandle cdh = pdata->dataHandle(_cdata);
AnalysisDataHandle idh = pdata->dataHandle(_idata);
for (size_t g = 0; g < sel.size(); ++g)
{
real normfac = _bFracNorm ? 1.0 / sel[g].coveredFraction() : 1.0;
- normfac /= _totsize[g];
+ if (_bTotNorm)
+ {
+ normfac /= _totsize[g];
+ }
sdh.setPoint(g, sel[g].posCount() * normfac);
}
sdh.finishFrame();
}
idh.finishFrame();
- gmx_ana_indexmap_update(d->_mmap, sel[0].indexGroup(), true);
mdh.startFrame(frnr, fr.time);
- for (int b = 0; b < d->_mmap->nr; ++b)
+ int nextRefId = sel[0].position(0).refId();
+ for (int b = 0, i = 0; b < _totsize[0]; ++b)
{
- mdh.setPoint(b, d->_mmap->refid[b] == -1 ? 0 : 1);
+ mdh.setPoint(b, b == nextRefId ? 1 : 0);
+ if (b == nextRefId)
+ {
+ ++i;
+ nextRefId = sel[0].position(i).refId();
+ }
}
mdh.finishFrame();
}
#define GMX_TRAJECTORYANALYSIS_MODULES_SELECT_H
#include <string>
+#include <vector>
#include "../analysismodule.h"
#include "gromacs/analysisdata/analysisdata.h"
virtual void initAnalysis(const TrajectoryAnalysisSettings &settings,
const TopologyInformation &top);
- virtual TrajectoryAnalysisModuleDataPointer startFrames(
- const AnalysisDataParallelOptions &opt,
- const SelectionCollection &selections);
virtual void analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
TrajectoryAnalysisModuleData *pdata);
virtual void writeOutput();
private:
- class ModuleData;
-
Options _options;
SelectionList _sel;
std::string _resNumberType;
t_topology *_top;
- int *_totsize;
+ std::vector<int> _totsize;
AnalysisData _sdata;
AnalysisData _cdata;
AnalysisData _idata;
for (size_t g = 0; g < _selections.size(); ++g)
{
const Selection &sel = _selections[g];
+ int n;
+
+ fprintf(stderr, " Atoms (%d pcs):", sel.atomCount());
+ n = sel.atomCount();
+ if (_nmaxind >= 0 && n > _nmaxind)
+ {
+ n = _nmaxind;
+ }
+ ConstArrayRef<int> atoms = sel.atomIndices();
+ for (int i = 0; i < n; ++i)
+ {
+ fprintf(stderr, " %d", atoms[i]+1);
+ }
+ if (n < sel.atomCount())
+ {
+ fprintf(stderr, " ...");
+ }
+ fprintf(stderr, "\n");
- gmx_ana_index_dump(stderr, sel.indexGroup(), g, _nmaxind);
fprintf(stderr, " Positions (%d pcs):\n", sel.posCount());
- int n = sel.posCount();
+ n = sel.posCount();
if (_nmaxind >= 0 && n > _nmaxind)
{
n = _nmaxind;