This file is indexed.

/usr/include/gromacs/trajectoryanalysis/analysismodule.h is in libgromacs-dev 2018.1-1.

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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
/*
 * This file is part of the GROMACS molecular simulation package.
 *
 * Copyright (c) 2010,2011,2012,2013,2014,2015, 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.
 */
/*! \file
 * \brief
 * Declares gmx::TrajectoryAnalysisModule and
 * gmx::TrajectoryAnalysisModuleData.
 *
 * \author Teemu Murtola <teemu.murtola@gmail.com>
 * \inpublicapi
 * \ingroup module_trajectoryanalysis
 */
#ifndef GMX_TRAJECTORYANALYSIS_ANALYSISMODULE_H
#define GMX_TRAJECTORYANALYSIS_ANALYSISMODULE_H

#include <memory>
#include <string>
#include <vector>

#include "gromacs/selection/selection.h" // For gmx::SelectionList
#include "gromacs/utility/classhelpers.h"

struct t_pbc;
struct t_trxframe;

namespace gmx
{

class AbstractAnalysisData;
class AnalysisData;
class AnalysisDataHandle;
class AnalysisDataParallelOptions;
class IOptionsContainer;
class Options;
class SelectionCollection;
class TopologyInformation;
class TrajectoryAnalysisModule;
class TrajectoryAnalysisSettings;

/*! \brief
 * Base class for thread-local data storage during trajectory analysis.
 *
 * Thread-local storage of data handles and selections is implemented in this
 * class; TrajectoryAnalysisModule instances can access the thread-local values
 * in their TrajectoryAnalysisModule::analyzeFrame() method using dataHandle()
 * and parallelSelection().
 *
 * \see TrajectoryAnalysisModule::startFrames()
 * \see TrajectoryAnalysisModule::analyzeFrame()
 * \see TrajectoryAnalysisModule::finishFrames()
 *
 * \inpublicapi
 * \ingroup module_trajectoryanalysis
 */
class TrajectoryAnalysisModuleData
{
    public:
        virtual ~TrajectoryAnalysisModuleData();

        /*! \brief
         * Performs any finishing actions after all frames have been processed.
         *
         * \throws  unspecified Implementation may throw exceptions to indicate
         *      errors.
         *
         * This function is called immediately before the destructor, after
         * TrajectoryAnalysisModule::finishFrames().
         * Derived classes should implement any final operations that need to
         * be done after successful analysis.
         * All implementations should call finishDataHandles().
         */
        virtual void finish() = 0;

        /*! \brief
         * Returns a data handle for a given dataset.
         *
         * \param[in] data  Analysis data object.
         * \returns   Data handle for \p data stored in this thread-local data.
         *
         * \p data should have previously been registered with
         * TrajectoryAnalysisModule::registerAnalysisDataset().
         * If \p data has zero columns in all data sets, the returned data
         * handle is invalid.
         *
         * Does not throw.
         */
        AnalysisDataHandle dataHandle(const AnalysisData &data);
        /*! \brief
         * Returns a selection that corresponds to the given selection.
         *
         * \param[in] selection Global selection object.
         * \returns   Selection object corresponding to this thread-local data.
         *
         * \p selection is the selection object that was obtained from
         * SelectionOption.  The return value is the corresponding selection
         * in the selection collection with which this data object was
         * constructed with.
         *
         * Does not throw.
         */
        Selection parallelSelection(const Selection &selection);
        /*! \brief
         * Returns a set of selection that corresponds to the given selections.
         *
         * \throws std::bad_alloc if out of memory.
         *
         * Works as parallelSelection(), but for a list of selections at once.
         *
         * \see parallelSelection()
         */
        SelectionList parallelSelections(const SelectionList &selections);

    protected:
        /*! \brief
         * Initializes thread-local storage for data handles and selections.
         *
         * \param[in] module     Analysis module to use for data objects.
         * \param[in] opt        Data parallelization options.
         * \param[in] selections Thread-local selection collection.
         * \throws  std::bad_alloc if out of memory.
         * \throws  unspecified Can throw any exception thrown by
         *      AnalysisData::startData().
         *
         * Calls AnalysisData::startData() on all data objects registered with
         * TrajectoryAnalysisModule::registerAnalysisDataset() in \p module.
         * The handles are accessible through dataHandle().
         */
        TrajectoryAnalysisModuleData(TrajectoryAnalysisModule          *module,
                                     const AnalysisDataParallelOptions &opt,
                                     const SelectionCollection         &selections);

        /*! \brief
         * Calls finishData() on all data handles.
         *
         * \throws  unspecified Can throw any exception thrown by
         *      AnalysisDataHandle::finishData().
         *
         * This function should be called from the implementation of finish()
         * in all subclasses.
         */
        void finishDataHandles();

    private:
        class Impl;

        PrivateImplPointer<Impl> impl_;
};

//! Smart pointer to manage a TrajectoryAnalysisModuleData object.
typedef std::unique_ptr<TrajectoryAnalysisModuleData>
    TrajectoryAnalysisModuleDataPointer;

/*! \brief
 * Base class for trajectory analysis modules.
 *
 * Trajectory analysis methods should derive from this class and override the
 * necessary virtual methods to implement initialization (initOptions(),
 * optionsFinished(), initAnalysis(), initAfterFirstFrame()), per-frame analysis
 * (analyzeFrame()), and final processing (finishFrames(), finishAnalysis(),
 * writeOutput()).
 *
 * For parallel analysis using threads, only a single object is constructed,
 * but the methods startFrames(), analyzeFrame() and finishFrames() are called
 * in each thread.  Frame-local data should be initialized in startFrames() and
 * stored in a class derived from TrajectoryAnalysisModuleData that is passed
 * to the other methods.  The default implementation of startFrames() can be
 * used if only data handles and selections need to be thread-local.
 *
 * To get the full benefit from this class,
 * \ref module_analysisdata "analysis data objects" and
 * \ref module_selection "selections" should be used in the implementation.
 * See the corresponding modules' documentation for details of how they work.
 *
 * Typical way of using AnalysisData in derived classes is to have the
 * AnalysisData object as a member variable and register it using
 * registerAnalysisDataset().  Analysis modules are initialized in
 * initAnalysis() and the processing chain is initialized.  If any of the
 * modules is required, e.g., for post-processing in finishAnalysis(), it can
 * be stored in a member variable.  To add data to the data object in
 * analyzeFrame(), a data handle is obtained using
 * TrajectoryAnalysisModuleData::dataHandle().
 *
 * Typical way of using selections in derived classes is to have the required
 * \ref Selection objects (or ::SelectionList objects) as member variables, and
 * add the required selection options in initOptions().  These member variables
 * can be accessed in initAnalysis() to get general information about the
 * selections.  In analyzeFrame(), these selection objects should not be used
 * directly, but instead TrajectoryAnalysisModuleData::parallelSelection()
 * should be used to obtain a selection object that works correctly also for
 * parallel analysis.
 *
 * Derived classes should use exceptions to indicate errors in the virtual
 * methods.
 *
 * \inpublicapi
 * \ingroup module_trajectoryanalysis
 */
class TrajectoryAnalysisModule
{
    public:
        virtual ~TrajectoryAnalysisModule();

        /*! \brief
         * Initializes options understood by the module.
         *
         * \param[in,out] options  Options object to add the options to.
         * \param[in,out] settings Settings to pass to and from the module.
         *
         * This method is called first after the constructor, and it should
         * add options understood by the module to \p options.  Output values
         * from options (including selections) should be stored in member
         * variables.
         *
         * In addition to initializing the options, this method can also
         * provide information about the module's requirements using the
         * \p settings object; see TrajectoryAnalysisSettings for more details.
         *
         * If settings depend on the option values provided by the user, see
         * optionsFinished().
         */
        virtual void initOptions(IOptionsContainer          *options,
                                 TrajectoryAnalysisSettings *settings) = 0;
        /*! \brief
         * Called after all option values have been set.
         *
         * \param[in,out] settings Settings to pass to and from the module.
         *
         * This method is called after option values have been assigned (but
         * interactive selection input has not yet been performed).
         *
         * If the module needs to change settings that affect topology loading
         * (can be done using the \p settings object) or selection
         * initialization (can be done using SelectionOptionInfo) based on
         * option values, this method has to be overridden.
         *
         * The default implementation does nothing.
         */
        virtual void optionsFinished(TrajectoryAnalysisSettings *settings);
        /*! \brief
         * Initializes the analysis.
         *
         * \param[in]    settings Settings to pass to and from the module.
         * \param[in]    top      Topology information.
         *
         * When this function is called, selections have been initialized based
         * on user input, and a topology has been loaded if provided by the
         * user.  For dynamic selections, the selections have been evaluated to
         * the largest possible selection, i.e., the selections passed to
         * analyzeFrame() are always a subset of the selections provided here.
         */
        virtual void initAnalysis(const TrajectoryAnalysisSettings &settings,
                                  const TopologyInformation        &top) = 0;
        /*! \brief
         * Performs additional initialization after reading the first frame.
         *
         * When this function is called, selections are the same as in
         * initAnalysis(), i.e., they have not been evaluated for the first
         * frame.
         *
         * It is necessary to override this method only if the module needs to
         * do initialization for which it requires data from the first frame.
         *
         * The default implementation does nothing.
         */
        virtual void initAfterFirstFrame(const TrajectoryAnalysisSettings &settings,
                                         const t_trxframe                 &fr);

        /*! \brief
         * Starts the analysis of frames.
         *
         * \param[in]  opt
         * \param[in]  selections  Frame-local selection collection object.
         * \returns    Data structure for thread-local data.
         *
         * This function is necessary only for threaded parallelization.
         * It is called once for each thread and should initialize a class that
         * contains any required frame-local data in the returned value.
         * The default implementation creates a basic data structure that holds
         * thread-local data handles for all data objects registered with
         * registerAnalysisDataset(), as well as the thread-local selection
         * collection.  These can be accessed in analyzeFrame() using the
         * methods in TrajectoryAnalysisModuleData.
         * If other thread-local data is needed, this function should be
         * overridden and it should create an instance of a class derived from
         * TrajectoryAnalysisModuleData.
         *
         * \see TrajectoryAnalysisModuleData
         */
        virtual TrajectoryAnalysisModuleDataPointer startFrames(
            const AnalysisDataParallelOptions &opt,
            const SelectionCollection         &selections);
        /*! \brief
         * Analyzes a single frame.
         *
         * \param[in]     frnr   Frame number, a zero-based index that
         *      uniquely identifies the frame.
         * \param[in]     fr     Current frame.
         * \param[in]     pbc    Periodic boundary conditions for \p fr.
         * \param[in,out] pdata  Data structure for frame-local data.
         *
         * This method is called once for each frame to be analyzed, and should
         * analyze the positions provided in the selections.  Data handles and
         * selections should be obtained from the \p pdata structure.
         *
         * For threaded analysis, this method is called asynchronously in
         * different threads to analyze different frames.  The \p pdata
         * structure is one of the structures created with startFrames(),
         * but no assumptions should be made about which of these data
         * structures is used.  It is guaranteed that two instances of
         * analyzeFrame() are not running concurrently with the same \p pdata
         * data structure.
         * Any access to data structures not stored in \p pdata should be
         * designed to be thread-safe.
         */
        virtual void analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
                                  TrajectoryAnalysisModuleData *pdata) = 0;
        /*! \brief
         * Finishes the analysis of frames.
         *
         * \param[in]  pdata    Data structure for thread-local data.
         *
         * This method is called once for each call of startFrames(), with the
         * data structure returned by the corresponding startFrames().
         * The \p pdata object should be destroyed by the caller after this
         * function has been called.
         *
         * You only need to override this method if you need custom
         * operations to combine data from the frame-local data structures
         * to get the final result.  In such cases, the data should be
         * aggregated in this function and stored in a member attribute.
         *
         * The default implementation does nothing.
         *
         * \see startFrames()
         */
        virtual void finishFrames(TrajectoryAnalysisModuleData *pdata);

        /*! \brief
         * Postprocesses data after frames have been read.
         *
         * \param[in]  nframes  Total number of frames processed.
         *
         * This function is called after all finishFrames() calls have been
         * called.
         * \p nframes will equal the number of calls to analyzeFrame() that
         * have occurred.
         */
        virtual void finishAnalysis(int nframes) = 0;
        /*! \brief
         * Writes output into files and/or standard output/error.
         *
         * All output from the module, excluding data written out for each
         * frame during analyzeFrame(), should be confined into this function.
         * This function is guaranteed to be called only after
         * finishAnalysis().
         */
        virtual void writeOutput() = 0;

        /*! \brief
         * Returns the number of datasets provided by the module.
         *
         * Does not throw.
         */
        int datasetCount() const;
        /*! \brief
         * Returns a vector with the names of datasets provided by the module.
         *
         * Does not throw.
         */
        const std::vector<std::string> &datasetNames() const;
        /*! \brief
         * Returns a pointer to the data set \p index.
         *
         * \param[in] index  Data set to query for.
         * \returns   Reference to the requested data set.
         * \throws    APIError if \p index is not valid.
         *
         * \p index should be >= 0 and < datasetCount().
         *
         * The return value is not const to allow callers to add modules to the
         * data sets. However, the AbstractAnalysisData interface does not
         * provide any means to alter the data, so the module does not need to
         * care about external modifications.
         */
        AbstractAnalysisData &datasetFromIndex(int index) const;
        /*! \brief
         * Returns a pointer to the data set with name \p name
         *
         * \param[in] name  Data set to query for.
         * \returns   Reference to the requested data set.
         * \throws    APIError if \p name is not valid.
         *
         * \p name should be one of the names returned by datasetNames().
         *
         * The return value is not const to allow callers to add modules to the
         * data sets. However, the AbstractAnalysisData interface does not
         * provide any means to alter the data, so the module does not need to
         * care about external modifications.
         */
        AbstractAnalysisData &datasetFromName(const char *name) const;
        /*! \brief
         * Processes data in AnalysisData objects in serial for each frame.
         *
         * \param[in] frameIndex  Index of the frame that has been finished.
         *
         * This method is called by the framework in order for each frame,
         * after the analysis for that frame has been finished.  These calls
         * always execute in serial and in sequential frame order, even during
         * parallel analysis where multiple analyzeFrame() calls may be
         * executing concurrently.
         *
         * \see AnalysisData::finishFrameSerial()
         */
        void finishFrameSerial(int frameIndex);

    protected:
        /*! \brief
         * Initializes the dataset registration mechanism.
         *
         * \throws    std::bad_alloc if out of memory.
         */
        TrajectoryAnalysisModule();

        /*! \brief
         * Registers a dataset that exports data.
         *
         * \param     data  Data object to register.
         * \param[in] name  Name to register the dataset with.
         * \throws    std::bad_alloc if out of memory.
         *
         * Registers \p data as a dataset that provides output from the
         * analysis module.  Callers for the module can access the dataset
         * with datasetFromName() using \p name as an AbstractAnalysisData
         * object.  This allows them to add their own data modules to do extra
         * processing.
         *
         * \p name must be unique across all calls within the same
         * TrajectoryAnalysisModule instance.
         */
        void registerBasicDataset(AbstractAnalysisData *data, const char *name);
        /*! \brief
         * Registers a parallelized dataset that exports data.
         *
         * \param     data  AnalysisData object to register.
         * \param[in] name  Name to register the dataset with.
         * \throws    std::bad_alloc if out of memory.
         *
         * This method works as registerBasicDataset(), but additionally allows
         * data handles for \p data to be accessed using
         * TrajectoryAnalysisData.
         *
         * \see registerBasicDataset()
         */
        void registerAnalysisDataset(AnalysisData *data, const char *name);

    private:
        class Impl;

        PrivateImplPointer<Impl> impl_;

        /*! \brief
         * Needed to access the registered analysis data sets.
         */
        friend class TrajectoryAnalysisModuleData;
};

//! Smart pointer to manage a TrajectoryAnalysisModule.
typedef std::unique_ptr<TrajectoryAnalysisModule>
    TrajectoryAnalysisModulePointer;

} // namespace gmx

#endif