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 * Declares gmx::AnalysisDataPlotModule for plotting data (into a file).
36 * \ingroup module_analysisdata
37 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
39 #ifndef GMX_ANALYSISDATA_MODULES_PLOT_H
40 #define GMX_ANALYSISDATA_MODULES_PLOT_H
44 #include "../datamodule.h"
45 #include "../../options/timeunitmanager.h"
46 #include "../../utility/common.h"
52 class SelectionCollection;
55 * Common settings for data plots.
58 * \ingroup module_analysisdata
60 class AnalysisDataPlotSettings
63 //! Constructs default analysis plot settings.
64 AnalysisDataPlotSettings();
66 //! Returns the selection collection set with setSelectionCollection().
67 const SelectionCollection *selectionCollection() const
71 //! Returns the time unit set with setTimeUnit().
72 TimeUnit timeUnit() const { return timeUnit_; }
74 * Returns the plot format.
76 * \todo Use a proper enum.
78 int plotFormat() const { return plotFormat_; }
81 * Set selection collection to print as comments into the output.
83 * Formatted selection text from all selections in \p selections is
84 * printed as comments in the output file.
85 * If this method is not called, no selection information is written
88 void setSelectionCollection(const SelectionCollection *selections);
90 * Sets the time unit for the plot.
92 * The value is used only if AbstractPlotModule::setXAxisIsTime() is
93 * called, in which case it is used to print the appropriate axis label
94 * and to scale the values.
95 * If not called, the default time unit is ps.
97 void setTimeUnit(TimeUnit timeUnit) { timeUnit_ = timeUnit; }
101 * Adds common options for setting plot options.
103 * \param[in,out] options Options object to which options are added.
105 void addOptions(Options *options);
108 const SelectionCollection *selections_;
114 * Abstract data module for writing data into a file.
116 * Implements features common to all plotting modules. Subclasses implement
117 * features specific to certain applications (AnalysisDataPlotModule implements
118 * straightforward plotting).
120 * By default, the data is written into an xvgr file, according to the
121 * options read from the Options object given to the constructor.
122 * For non-xvgr data, it's possible to skip all headers by calling
125 * Multipoint data is supported, in which case all the points are written to
126 * the output, in the order in which they are added to the data. A single
127 * output line corresponds to a single frame. In most cases with multipoint
128 * data, setPlainOutput() should be called since the output does not make sense
129 * as an xvgr file, but this is not enforced.
131 * \ingroup module_analysisdata
133 class AbstractPlotModule : public AnalysisDataModuleInterface
136 virtual ~AbstractPlotModule();
139 * Set the output file name.
141 * If no file name is set (or if \p fnm is NULL), no output occurs.
143 void setFileName(const std::string &fnm);
147 * If \p bPlain is true, no xvgr headers are written to the file.
148 * In this case, only setOmitX(), setXFormat(), and setYFormat()
149 * methods have any effect on the output.
151 void setPlainOutput(bool bPlain);
153 * Omit the X coordinates from the output.
155 * This method only makes sense when combined with setPlainOutput().
157 void setOmitX(bool bOmitX);
161 void setTitle(const char *title);
165 void setSubtitle(const char *subtitle);
169 void setXLabel(const char *label);
171 * Treat X axis as time.
173 * Sets the label for the axis accordingly and also scales output to
174 * take into account the correct time unit.
176 void setXAxisIsTime();
180 void setYLabel(const char *label);
182 * Add legend from an array of strings.
184 * Multiple calls to setLegend() and/or appendLegend() are added
187 void setLegend(int nsets, const char * const *setname);
189 * Add a legend string for the next data set.
191 * Multiple calls to setLegend() and/or appendLegend() are added
194 void appendLegend(const char *setname);
196 * Set field width and precision for X value output.
198 void setXFormat(int width, int prec, char fmt = 'f');
200 * Set field width and precision for Y value output.
202 void setYFormat(int width, int prec, char fmt = 'f');
204 virtual int flags() const;
206 virtual void dataStarted(AbstractAnalysisData *data);
207 virtual void frameStarted(const AnalysisDataFrameHeader &header);
208 virtual void pointsAdded(const AnalysisDataPointSetRef &points) = 0;
209 virtual void frameFinished(const AnalysisDataFrameHeader &header);
210 virtual void dataFinished();
214 explicit AbstractPlotModule(const AnalysisDataPlotSettings &settings);
216 bool isFileOpen() const;
217 void writeValue(real value) const;
223 PrivateImplPointer<Impl> _impl;
228 * Plotting module for straightforward plotting of data.
230 * See AbstractPlotModule for common plotting options.
233 * \ingroup module_analysisdata
235 class AnalysisDataPlotModule : public AbstractPlotModule
238 explicit AnalysisDataPlotModule(const AnalysisDataPlotSettings &settings);
240 virtual void pointsAdded(const AnalysisDataPointSetRef &points);
242 // Copy and assign disallowed by base.
247 * Plotting module specifically for data consisting of vectors.
249 * See AbstractPlotModule for common plotting options.
252 * \ingroup module_analysisdata
254 class AnalysisDataVectorPlotModule : public AbstractPlotModule
257 explicit AnalysisDataVectorPlotModule(const AnalysisDataPlotSettings &settings);
260 * Set whether to write X component.
262 void setWriteX(bool bWrite);
264 * Set whether to write Y component.
266 void setWriteY(bool bWrite);
268 * Set whether to write Z component.
270 void setWriteZ(bool bWrite);
272 * Set whether to write norm of the vector.
274 void setWriteNorm(bool bWrite);
276 * Set mask for what to write.
278 void setWriteMask(bool bWrite[4]);
280 virtual void pointsAdded(const AnalysisDataPointSetRef &points);
285 // Copy and assign disallowed by base.