3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
9 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11 * Copyright (c) 2001-2009, The GROMACS development team,
12 * check out http://www.gromacs.org for more information.
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * If you want to redistribute modifications, please consider that
20 * scientific software is very special. Version control is crucial -
21 * bugs must be traceable. We will be happy to consider code for
22 * inclusion in the official distribution, but derived work must not
23 * be called official GROMACS. Details are found in the README & COPYING
24 * files - if they are missing, get the official version at www.gromacs.org.
26 * To help us fund GROMACS development, we humbly ask that you cite
27 * the papers on the package - you can find them in the top README file.
29 * For more info, check our website at http://www.gromacs.org
33 * Implements classes in analysismodule.h.
35 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
36 * \ingroup module_trajectoryanalysis
38 #include "gromacs/trajectoryanalysis/analysismodule.h"
40 #include "gromacs/analysisdata/analysisdata.h"
41 #include "gromacs/fatalerror/gmxassert.h"
43 #include "analysismodule-impl.h"
48 /********************************************************************
49 * TrajectoryAnalysisModuleData::Impl
52 TrajectoryAnalysisModuleData::Impl::Impl(
53 TrajectoryAnalysisModule *module,
54 const AnalysisDataParallelOptions &opt,
55 const SelectionCollection &selections)
56 : _selections(selections)
58 TrajectoryAnalysisModule::Impl::AnalysisDatasetContainer::const_iterator i;
59 for (i = module->_impl->_analysisDatasets.begin();
60 i != module->_impl->_analysisDatasets.end(); ++i)
62 _handles[i->first] = i->second->startData(opt);
66 TrajectoryAnalysisModuleData::Impl::~Impl()
71 void TrajectoryAnalysisModuleData::Impl::finishHandles()
73 // FIXME: Call finishData() for all handles even if one throws
74 HandleContainer::const_iterator i;
75 for (i = _handles.begin(); i != _handles.end(); ++i)
77 i->second->finishData();
83 /********************************************************************
84 * TrajectoryAnalysisModuleData
87 TrajectoryAnalysisModuleData::TrajectoryAnalysisModuleData(
88 TrajectoryAnalysisModule *module,
89 const AnalysisDataParallelOptions &opt,
90 const SelectionCollection &selections)
91 : _impl(new Impl(module, opt, selections))
96 TrajectoryAnalysisModuleData::~TrajectoryAnalysisModuleData()
101 void TrajectoryAnalysisModuleData::finishDataHandles()
103 _impl->finishHandles();
107 AnalysisDataHandle *TrajectoryAnalysisModuleData::dataHandle(const char *name)
109 Impl::HandleContainer::const_iterator i = _impl->_handles.find(name);
110 GMX_RELEASE_ASSERT(i != _impl->_handles.end(),
111 "Data handle requested on unknown dataset");
112 return (i != _impl->_handles.end()) ? (*i).second : NULL;
116 Selection *TrajectoryAnalysisModuleData::parallelSelection(Selection *selection)
118 // TODO: Implement properly.
123 std::vector<Selection *>
124 TrajectoryAnalysisModuleData::parallelSelections(const std::vector<Selection *> &selections)
126 std::vector<Selection *> newSelections;
127 newSelections.reserve(selections.size());
128 std::vector<Selection *>::const_iterator i = selections.begin();
129 for ( ; i != selections.end(); ++i)
131 newSelections.push_back(parallelSelection(*i));
133 return newSelections;
137 /********************************************************************
138 * TrajectoryAnalysisModuleDataBasic
140 TrajectoryAnalysisModuleDataBasic::TrajectoryAnalysisModuleDataBasic(
141 TrajectoryAnalysisModule *module,
142 const AnalysisDataParallelOptions &opt,
143 const SelectionCollection &selections)
144 : TrajectoryAnalysisModuleData(module, opt, selections)
150 TrajectoryAnalysisModuleDataBasic::finish()
156 /********************************************************************
157 * TrajectoryAnalysisModule
160 TrajectoryAnalysisModule::TrajectoryAnalysisModule()
166 TrajectoryAnalysisModule::~TrajectoryAnalysisModule()
171 void TrajectoryAnalysisModule::initOptionsDone(TrajectoryAnalysisSettings * /*settings*/)
176 void TrajectoryAnalysisModule::initAfterFirstFrame(const t_trxframe &/*fr*/)
181 TrajectoryAnalysisModuleData *
182 TrajectoryAnalysisModule::startFrames(const AnalysisDataParallelOptions &opt,
183 const SelectionCollection &selections)
185 return new TrajectoryAnalysisModuleDataBasic(this, opt, selections);
189 void TrajectoryAnalysisModule::finishFrames(TrajectoryAnalysisModuleData * /*pdata*/)
194 int TrajectoryAnalysisModule::datasetCount() const
196 return _impl->_datasetNames.size();
200 const std::vector<std::string> &TrajectoryAnalysisModule::datasetNames() const
202 return _impl->_datasetNames;
206 AbstractAnalysisData *TrajectoryAnalysisModule::datasetFromIndex(int index) const
208 if (index < 0 || index >= datasetCount())
212 Impl::DatasetContainer::const_iterator item
213 = _impl->_datasets.find(_impl->_datasetNames[index]);
214 GMX_RELEASE_ASSERT(item != _impl->_datasets.end(),
215 "Inconsistent data set names");
220 AbstractAnalysisData *TrajectoryAnalysisModule::datasetFromName(const char *name) const
222 Impl::DatasetContainer::const_iterator item = _impl->_datasets.find(name);
223 if (item == _impl->_datasets.end())
231 void TrajectoryAnalysisModule::registerBasicDataset(AbstractAnalysisData *data,
234 GMX_RELEASE_ASSERT(datasetFromName(name) == NULL,
235 "Duplicate data set name registered");
236 _impl->_datasets[name] = data;
237 _impl->_datasetNames.push_back(name);
241 void TrajectoryAnalysisModule::registerAnalysisDataset(AnalysisData *data,
244 registerBasicDataset(data, name);
245 _impl->_analysisDatasets[name] = data;