Gromacs  2025-dev-20241003-bd59e46
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
List of all members | Classes | Public Member Functions | Friends

#include <gromacs/analysisdata/analysisdata.h>

+ Inheritance diagram for gmx::AnalysisData:
+ Collaboration diagram for gmx::AnalysisData:

Description

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.

Todo:
Parallel implementation is not complete.

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.

Examples:
template.cpp.

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...
 
AnalysisDataModuleManagermoduleManager ()
 Returns the module manager to use for calling notification methods.
 
const AnalysisDataModuleManagermoduleManager () const
 Returns the module manager to use for calling notification methods.
 

Constructor & Destructor Documentation

gmx::AnalysisData::AnalysisData ( )

Creates an empty analysis data object.

Exceptions
std::bad_allocif out of memory.

Member Function Documentation

void gmx::AnalysisData::finishData ( AnalysisDataHandle  handle)

Destroys a handle after all data has been added.

Parameters
[in]handleHandle to destroy.
Exceptions
unspecifiedAny 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.

Parameters
[in]frameIndexIndex of the frame that has been finished.
Exceptions
unspecifiedAny 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.

int gmx::AnalysisData::frameCount ( ) const
overridevirtual

Returns the total number of frames in the data.

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.

Parameters
[in]dataSetZero-based data set index.
[in]columnCountNumber of columns in the data (must be > 0).
Exceptions
APIErrorif 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.

Examples:
template.cpp.
void gmx::AnalysisData::setDataSetCount ( int  dataSetCount)

Sets the number of data sets.

Parameters
[in]dataSetCountNumber of data sets (must be > 0).
Exceptions
std::bad_allocif out of memory.
APIErrorif 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.

Parameters
[in]bMultipointWhether the data will allow multiple points per column within a single frame.
Exceptions
APIErrorif 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.

See Also
isMultipoint()
AnalysisDataHandle gmx::AnalysisData::startData ( const AnalysisDataParallelOptions opt)

Creates a handle for adding data.

Parameters
[in]optOptions for setting how this handle will be used.
Returns
The created handle.
Exceptions
std::bad_allocif out of memory.
APIErrorif any attached data module is not compatible.
unspecifiedAny 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.


The documentation for this class was generated from the following files: