Gromacs
2025-dev-20241003-bd59e46
|
#include <gromacs/analysisdata/analysisdata.h>
Parallelizable data container for raw data.
This is the main class used to implement parallelizable data processing in analysis tools. It is used by first creating an object and setting its properties using setDataSetCount(), setColumnCount() and setMultipoint(), and attaching necessary modules using addModule() etc. Then one or more AnalysisDataHandle objects can be created using startData(). Each data handle can then be independently used to provide data frames (each frame must be provided by a single handle, but different frames can be freely mixed between the handles). The finishFrameSerial() method must be called in serial for each frame, after one of the handles has been used to provide the data for that frame. When all data has been provided, the handles are destroyed using finishData() (or AnalysisDataHandle::finishData()).
When used through the trajectory analysis framework, calls to startData(), finishFrameSerial(), and finishData() are handled by the framework.
Special note for MPI implementation: assuming that the initialization of data objects is identical in all processes, associating the data objects in different MPI processes should be possible without changes in the interface. Alternative, more robust implementation could get a unique ID as parameter to the constructor or a separate function, but would require all tools to provide it. With the current registration mechanism in TrajectoryAnalysisModule, this should be straightforward.
Classes | |
class | Impl |
Private implementation class for AnalysisData. More... | |
Public Member Functions | |
AnalysisData () | |
Creates an empty analysis data object. More... | |
void | setDataSetCount (int dataSetCount) |
Sets the number of data sets. More... | |
void | setColumnCount (int dataSet, int columnCount) |
Sets the number of columns in a data set. More... | |
void | setMultipoint (bool bMultipoint) |
Sets whether the data contains multiple points per column per frame. More... | |
int | frameCount () const override |
Returns the total number of frames in the data. More... | |
AnalysisDataHandle | startData (const AnalysisDataParallelOptions &opt) |
Creates a handle for adding data. More... | |
void | finishFrameSerial (int frameIndex) |
Performs in-order sequential processing for the next frame. More... | |
void | finishData (AnalysisDataHandle handle) |
Destroys a handle after all data has been added. More... | |
Public Member Functions inherited from gmx::AbstractAnalysisData | |
bool | isMultipoint () const |
Whether the data can have multiple points in the same column in the same frame. More... | |
int | dataSetCount () const |
Returns the number of data sets in the data object. More... | |
int | columnCount (int dataSet) const |
Returns the number of columns in a data set. More... | |
int | columnCount () const |
Returns the number of columns in the data. More... | |
AnalysisDataFrameRef | tryGetDataFrame (int index) const |
Access stored data. More... | |
AnalysisDataFrameRef | getDataFrame (int index) const |
Access stored data. More... | |
bool | requestStorage (int nframes) |
Request storage of frames. More... | |
void | addModule (const AnalysisDataModulePointer &module) |
Adds a module to process the data. More... | |
void | addColumnModule (int col, int span, const AnalysisDataModulePointer &module) |
Adds a module that processes only a subset of the columns. More... | |
void | applyModule (IAnalysisDataModule *module) |
Applies a module to process data that is ready. More... | |
Friends | |
class | AnalysisDataHandle |
Additional Inherited Members | |
Protected Member Functions inherited from gmx::AbstractAnalysisData | |
AbstractAnalysisData () | |
Initializes a new analysis data object. More... | |
void | setDataSetCount (int dataSetCount) |
Sets the number of data sets. More... | |
void | setColumnCount (int dataSet, int columnCount) |
Sets the number of columns for a data set. More... | |
void | setMultipoint (bool bMultipoint) |
Sets whether the data has multiple points per column in a frame. More... | |
AnalysisDataModuleManager & | moduleManager () |
Returns the module manager to use for calling notification methods. | |
const AnalysisDataModuleManager & | moduleManager () const |
Returns the module manager to use for calling notification methods. | |
gmx::AnalysisData::AnalysisData | ( | ) |
Creates an empty analysis data object.
std::bad_alloc | if out of memory. |
void gmx::AnalysisData::finishData | ( | AnalysisDataHandle | handle | ) |
Destroys a handle after all data has been added.
[in] | handle | Handle to destroy. |
unspecified | Any exception thrown by attached data modules in IAnalysisDataModule::dataFinished(). |
handle
must have been obtained from startData() of this object. The order of the calls with respect to the corresponding startData() calls is not important.
The handle
(and any copies) are invalid after the call.
void gmx::AnalysisData::finishFrameSerial | ( | int | frameIndex | ) |
Performs in-order sequential processing for the next frame.
[in] | frameIndex | Index of the frame that has been finished. |
unspecified | Any exception thrown by attached data modules in IAnalysisDataModule::frameFinishedSerial(). |
This method should be called sequentially for each frame, after data for that frame has been produced. It is not necessary to call this method if there is no parallelism, i.e., if only a single data handle is created and the parallelization options provided at that time do not indicate parallelism.
|
overridevirtual |
Returns the total number of frames in the data.
This function returns the number of frames that the object has produced. If requestStorage() has been successfully called, tryGetDataframe() or getDataFrame() can be used to access some or all of these frames.
Does not throw.
Derived classes should implement this to return the number of frames. The frame count should not be incremented before tryGetDataFrameInternal() can return the new frame. The frame count must be incremented before AnalysisDataModuleManager::notifyFrameFinish() is called.
Implements gmx::AbstractAnalysisData.
void gmx::AnalysisData::setColumnCount | ( | int | dataSet, |
int | columnCount | ||
) |
Sets the number of columns in a data set.
[in] | dataSet | Zero-based data set index. |
[in] | columnCount | Number of columns in the data (must be > 0). |
APIError | if modules have been added that are not compatible with the new column count. |
Must be called before startData() for each data set. Must not be called after startData() has been called. If called multiple times for a data set, the last call takes effect.
void gmx::AnalysisData::setDataSetCount | ( | int | dataSetCount | ) |
Sets the number of data sets.
[in] | dataSetCount | Number of data sets (must be > 0). |
std::bad_alloc | if out of memory. |
APIError | if modules have been added that are not compatible with the new data set count. |
Must not be called after startData() has been called. If not called, a single data set is assumed. If called multiple times, the last call takes effect.
void gmx::AnalysisData::setMultipoint | ( | bool | bMultipoint | ) |
Sets whether the data contains multiple points per column per frame.
[in] | bMultipoint | Whether the data will allow multiple points per column within a single frame. |
APIError | if modules have been added that are not compatible with the new setting. |
If this method is not called, the data is not multipoint.
Must not be called after startData() has been called.
AnalysisDataHandle gmx::AnalysisData::startData | ( | const AnalysisDataParallelOptions & | opt | ) |
Creates a handle for adding data.
[in] | opt | Options for setting how this handle will be used. |
std::bad_alloc | if out of memory. |
APIError | if any attached data module is not compatible. |
unspecified | Any exception thrown by attached data modules in IAnalysisDataModule::dataStarted(). |
The caller should retain the returned handle (or a copy of it), and pass it to finishData() after successfully adding all data. The caller should discard the returned handle if an error occurs; memory allocated for the handle will be freed when the AnalysisData object is destroyed.
The opt
options should be the same for all calls to this method, and the number of calls should match the parallelization factor defined in opt
.