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"
42 #include "gromacs/analysisdata/analysisdata.h"
43 #include "gromacs/selection/selection.h"
44 #include "gromacs/utility/exceptions.h"
45 #include "gromacs/utility/gmxassert.h"
47 #include "analysismodule-impl.h"
52 /********************************************************************
53 * TrajectoryAnalysisModuleData::Impl
56 TrajectoryAnalysisModuleData::Impl::Impl(
57 TrajectoryAnalysisModule *module,
58 const AnalysisDataParallelOptions &opt,
59 const SelectionCollection &selections)
60 : _selections(selections)
62 TrajectoryAnalysisModule::Impl::AnalysisDatasetContainer::const_iterator i;
63 for (i = module->_impl->_analysisDatasets.begin();
64 i != module->_impl->_analysisDatasets.end(); ++i)
66 _handles.insert(std::make_pair(i->second, i->second->startData(opt)));
70 TrajectoryAnalysisModuleData::Impl::~Impl()
75 /********************************************************************
76 * TrajectoryAnalysisModuleData
79 TrajectoryAnalysisModuleData::TrajectoryAnalysisModuleData(
80 TrajectoryAnalysisModule *module,
81 const AnalysisDataParallelOptions &opt,
82 const SelectionCollection &selections)
83 : _impl(new Impl(module, opt, selections))
88 TrajectoryAnalysisModuleData::~TrajectoryAnalysisModuleData()
93 void TrajectoryAnalysisModuleData::finishDataHandles()
95 // FIXME: Call finishData() for all handles even if one throws
96 Impl::HandleContainer::iterator i;
97 for (i = _impl->_handles.begin(); i != _impl->_handles.end(); ++i)
99 i->second.finishData();
101 _impl->_handles.clear();
106 TrajectoryAnalysisModuleData::dataHandle(const AnalysisData &data)
108 Impl::HandleContainer::const_iterator i = _impl->_handles.find(&data);
109 GMX_RELEASE_ASSERT(i != _impl->_handles.end(),
110 "Data handle requested on unknown dataset");
115 Selection TrajectoryAnalysisModuleData::parallelSelection(const Selection &selection)
117 // TODO: Implement properly.
123 TrajectoryAnalysisModuleData::parallelSelections(const SelectionList &selections)
125 // TODO: Consider an implementation that does not allocate memory every time.
126 SelectionList newSelections;
127 newSelections.reserve(selections.size());
128 SelectionList::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 TrajectoryAnalysisModuleDataPointer
182 TrajectoryAnalysisModule::startFrames(const AnalysisDataParallelOptions &opt,
183 const SelectionCollection &selections)
185 return TrajectoryAnalysisModuleDataPointer(
186 new TrajectoryAnalysisModuleDataBasic(this, opt, selections));
190 void TrajectoryAnalysisModule::finishFrames(TrajectoryAnalysisModuleData * /*pdata*/)
195 int TrajectoryAnalysisModule::datasetCount() const
197 return _impl->_datasetNames.size();
201 const std::vector<std::string> &TrajectoryAnalysisModule::datasetNames() const
203 return _impl->_datasetNames;
207 AbstractAnalysisData &TrajectoryAnalysisModule::datasetFromIndex(int index) const
209 if (index < 0 || index >= datasetCount())
211 GMX_THROW(APIError("Out of range data set index"));
213 Impl::DatasetContainer::const_iterator item
214 = _impl->_datasets.find(_impl->_datasetNames[index]);
215 GMX_RELEASE_ASSERT(item != _impl->_datasets.end(),
216 "Inconsistent data set names");
217 return *item->second;
221 AbstractAnalysisData &TrajectoryAnalysisModule::datasetFromName(const char *name) const
223 Impl::DatasetContainer::const_iterator item = _impl->_datasets.find(name);
224 if (item == _impl->_datasets.end())
226 GMX_THROW(APIError("Unknown data set name"));
228 return *item->second;
232 void TrajectoryAnalysisModule::registerBasicDataset(AbstractAnalysisData *data,
235 // TODO: Strong exception safety should be possible to implement.
236 GMX_RELEASE_ASSERT(_impl->_datasets.find(name) == _impl->_datasets.end(),
237 "Duplicate data set name registered");
238 _impl->_datasets[name] = data;
239 _impl->_datasetNames.push_back(name);
243 void TrajectoryAnalysisModule::registerAnalysisDataset(AnalysisData *data,
246 // TODO: Strong exception safety should be possible to implement.
247 registerBasicDataset(data, name);
248 _impl->_analysisDatasets[name] = data;