This file is indexed.

/usr/include/gromacs/analysisdata.h is in libgromacs-dev 5.1.2-1ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/*
 * This file is part of the GROMACS molecular simulation package.
 *
 * Copyright (c) 2010,2012,2013,2014, by the GROMACS development team, led by
 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 * and including many others, as listed in the AUTHORS file in the
 * top-level source directory and at http://www.gromacs.org.
 *
 * GROMACS is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * GROMACS is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with GROMACS; if not, see
 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
 *
 * If you want to redistribute modifications to GROMACS, please
 * consider that scientific software is very special. Version
 * control is crucial - bugs must be traceable. We will be happy to
 * consider code for inclusion in the official distribution, but
 * derived work must not be called official GROMACS. Details are found
 * in the README & COPYING files - if they are missing, get the
 * official version at http://www.gromacs.org.
 *
 * To help us fund GROMACS development, we humbly ask that you cite
 * the research papers on the package. Check out http://www.gromacs.org.
 */
/*! \defgroup module_analysisdata Parallelizable Handling of Output Data (analysisdata)
 * \ingroup group_analysismodules
 * \brief
 * Provides functionality for handling and processing output data from
 * analysis.
 *
 * <H3>Overview</H3>
 *
 * This module provides functionality to do common processing for tabular data
 * in analysis tools.  In addition to providing this common functionality, one
 * major driver for this module is to make it simple to write analysis tools
 * that process frames in parallel: the functionality in this module takes care
 * of necessary synchronization and communication such that output from the
 * frames is collected and output in the correct order.
 * See \ref page_analysisdata for an overview of the high-level functionality
 * and the terminology used.
 *
 * This module consists of two main parts.  The first is formed by the
 * gmx::AbstractAnalysisData class and classes that derive from it:
 * gmx::AnalysisData and gmx::AnalysisArrayData.  These classes are used to
 * process and store raw data as produced by the analysis tool.  They also
 * provide an interface to attach data modules that implement
 * gmx::AnalysisDataModuleInterface.
 *
 * Modules that implement gmx::AnalysisDataModuleInterface form the second part
 * of the module, and they provide functionality to do processing on the data.
 * These modules can also derive from gmx::AbstractAnalysisData, allowing other
 * modules to be attached to them to form a processing chain that best suits
 * the analysis tool.  Typically, such a processing chain ends in a plotting
 * module that writes the data into a file, but the final module can also
 * provide direct access to the processed data, allowing the analysis tool to
 * do custom postprocessing outside the module framework.
 *
 * <H3>Using Data Objects and Modules</H3>
 *
 * To use the functionality in this module, you typically declare one or more
 * AnalysisData objects and set its properties.  You then create some module
 * objects and set their properties (see the list of classes that implement
 * gmx::AnalysisDataModuleInterface) and attach them to the data objects or to
 * one another using gmx::AbstractAnalysisData::addModule().  Then you add the
 * actual data values to the gmx::AnalysisData object, which automatically
 * passes it on to the modules.
 * After all data is added, you may optionally access some results directly
 * from the module objects or from the gmx::AnalysisData object itself.
 * However, in many cases it is sufficient to initially add a plotting module
 * to the processing chain, which will then automatically write the results
 * into a file.
 *
 * For simple processing needs with a small amount of data, an
 * gmx::AnalysisArrayData class is also provided, which keeps all the data in an
 * in-memory array and allows you to manipulate the data as you wish before you
 * pass the data to the attached modules.
 *
 * <H3>Data Modules</H3>
 *
 * Modules that derive from gmx::AnalysisDataModuleInterface can operate in two
 * modes:
 *  - In _serial_ mode, the frames are presented to the module always in the
 *    order of increasing indices, even if they become ready in a different
 *    order in the attached data.
 *  - In _parallel_ mode, the frames are presented in the order that they
 *    become available in the input data, which may not be sequential.
 *    This mode allows the input data to optimize its behavior if it does not
 *    need to store and sort the frames.
 *
 * The figure below shows the sequence of callbacks that the module receives.
 * Arrows show a dependency between callbacks: the event at the start of the
 * arrow always occurs before the event at the end.  The events in the box are
 * repeated for each frame.  Dashed lines within this box show dependencies
 * between these frames:
 *  - In serial mode, all the events are called in a deterministic order, with
 *    each frame completely processed before the next starts.
 *  - In parallel mode, multiple frames can be in progress simultaneously, and
 *    the events for different frames can occur even concurrently on different
 *    threads.  However, frameFinishSerial() events will always occur in
 *    deterministic, sequential order for the frames.  Also, the number of
 *    concurrent frames is limited by the parallelization factor passed to
 *    parallelDataStarted(): only M frames after the last frame for which
 *    frameFinishSerial() has been called can be in progress
 *
 * \dot
 *     digraph datamodule_events {
 *         rankdir = LR
 *         node [ shape=box ]
 *
 *         start  [ label="dataStarted()",
 *                  URL="\ref gmx::AnalysisDataModuleInterface::dataStarted()" ]
 *         pstart [ label="parallelDataStarted()",
 *                  URL="\ref gmx::AnalysisDataModuleInterface::parallelDataStarted()" ]
 *         subgraph cluster_frame {
 *             label = "for each frame"
 *             framestart   [ label="frameStarted()",
 *                            URL="\ref gmx::AnalysisDataModuleInterface::frameStarted()" ]
 *             pointsadd    [ label="pointsAdded()",
 *                            URL="\ref gmx::AnalysisDataModuleInterface::pointsAdded()" ]
 *             framefinish  [ label="frameFinished()",
 *                            URL="\ref gmx::AnalysisDataModuleInterface::frameFinished()" ]
 *             serialfinish [ label="frameFinishedSerial()",
 *                            URL="\ref gmx::AnalysisDataModuleInterface::frameFinishedSerial()" ]
 *         }
 *         finish [ label="dataFinished()",
 *                  URL="\ref gmx::AnalysisDataModuleInterface::dataFinished()" ]
 *
 *         start -> framestart
 *         pstart -> framestart
 *         framestart -> pointsadd
 *         pointsadd -> pointsadd [ label="0..*", dir=back ]
 *         pointsadd -> framefinish
 *         framefinish -> serialfinish
 *         serialfinish -> finish
 *
 *         framestart:se -> serialfinish:sw [ dir=back, style=dashed, weight=0,
 *                                            label="serial: frame n+1\nparallel: frame n+M" ]
 *         serialfinish -> serialfinish [ dir=back, style=dashed,
 *                                        label="frame n+1" ]
 *     }
 * \enddot
 *
 * If the input data supports parallel mode, it calls parallelDataStarted().
 * If the module returns `true` from this method, then it will process the
 * frames in the parallel mode.  If the module returns `false`, it will get the
 * frames in serial order.
 * If the input data does not support parallel mode, it calls dataStarted(),
 * and the module will always get the frames in order.
 *
 * The sequence of when the module methods are called with respect to when data
 * is added to the data object depends on the type of the module and the type
 * of the data.  However, generally the modules do not need to know the details
 * of how this happens, as long as they work with the above state diagram.
 *
 * For parallel processing, the gmx::AnalysisData object itself only provides
 * the infrastructure to support all of the above, including the reordering of
 * the frames for serial processing.  However, the caller is still responsible
 * of the actual thread synchronization, and must call
 * gmx::AnalysisData::finishFrameSerial() for each frame from a suitable
 * context where the serial processing for that frame can be done.  When using
 * the data objects as part of the trajectory analysis framework
 * (\ref page_analysisframework), these calls are handled by the framework.
 *
 * \if libapi
 * <H3>Writing New Data and Module Objects</H3>
 *
 * New data modules can be implemented to perform custom operations that are
 * not supported by the modules provided in this module.  This is done by
 * creating a new class that implements gmx::AnalysisDataModuleInterface.
 * If the new module computes values that can be used as input for other
 * modules, the new class should also derive from gmx::AbstractAnalysisData, and
 * preferably use gmx::AnalysisDataStorage internally to implement storage of
 * values.  See the documentation of the mentioned classes for more details on
 * how to implement custom modules.
 * When implementing a new module, it should be considered whether it can be of
 * more general use, and if so, it should be added to this module.
 *
 * It is also possible to implement new data source objects by deriving a class
 * from gmx::AbstractAnalysisData.  This should not normally be necessary, since
 * this module provides general data source objects for most typical uses.
 * If the classes in this module are not suitable for some specific use, it
 * should be considered whether a new generic class could be added (or an
 * existing extended) instead of implementing a local custom solution.
 * \endif
 *
 * \author Teemu Murtola <teemu.murtola@gmail.com>
 */
/*! \file
 * \brief
 * Public API convenience header for analysis data handling.
 *
 * \author Teemu Murtola <teemu.murtola@gmail.com>
 * \inpublicapi
 * \ingroup module_analysisdata
 */
#ifndef GMX_ANALYSISDATA_H
#define GMX_ANALYSISDATA_H

#include "gromacs/analysisdata/analysisdata.h"
#include "gromacs/analysisdata/arraydata.h"
#include "gromacs/analysisdata/dataframe.h"
#include "gromacs/analysisdata/modules/average.h"
#include "gromacs/analysisdata/modules/displacement.h"
#include "gromacs/analysisdata/modules/histogram.h"
#include "gromacs/analysisdata/modules/lifetime.h"
#include "gromacs/analysisdata/modules/plot.h"

#endif