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 * Tests for functionality of analysis data histogram modules.
35 * These tests check that classes in histogram.h compute histograms correctly
36 * with simple input data. Also different ways of initializing the histograms
38 * Checking is done using gmx::test::AnalysisDataTestFixture and reference
39 * data. Also the input data is written to the reference data to catch
40 * out-of-date reference.
42 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
43 * \ingroup module_analysisdata
45 #include <gtest/gtest.h>
47 #include "gromacs/analysisdata/analysisdata.h"
48 #include "gromacs/analysisdata/modules/histogram.h"
50 #include "testutils/datatest.h"
55 /********************************************************************
56 * Tests for gmx::AnalysisHistogramSettings.
58 * These tests check that gmx::AnalysisHistogramSettings objects can be
59 * initialized from various types of values, and that the bin positions are
60 * computed correctly based on the input values.
63 TEST(AnalysisHistogramSettingsTest, InitializesFromBins)
65 gmx::AnalysisHistogramSettings settings(
66 gmx::histogramFromBins(1.0, 5, 0.5));
67 EXPECT_FLOAT_EQ(1.0, settings.firstEdge());
68 EXPECT_EQ(5, settings.binCount());
69 EXPECT_FLOAT_EQ(0.5, settings.binWidth());
70 EXPECT_FLOAT_EQ(3.5, settings.lastEdge());
74 TEST(AnalysisHistogramSettingsTest, InitializesFromBinsWithIntegerBins)
76 gmx::AnalysisHistogramSettings settings(
77 gmx::histogramFromBins(1.0, 5, 0.5).integerBins());
78 EXPECT_FLOAT_EQ(0.75, settings.firstEdge());
79 EXPECT_EQ(5, settings.binCount());
80 EXPECT_FLOAT_EQ(0.5, settings.binWidth());
81 EXPECT_FLOAT_EQ(3.25, settings.lastEdge());
85 TEST(AnalysisHistogramSettingsTest, InitializesFromRangeWithBinCount)
87 gmx::AnalysisHistogramSettings settings(
88 gmx::histogramFromRange(1.0, 4.0).binCount(6));
89 EXPECT_FLOAT_EQ(1.0, settings.firstEdge());
90 EXPECT_FLOAT_EQ(4.0, settings.lastEdge());
91 EXPECT_EQ(6, settings.binCount());
92 EXPECT_FLOAT_EQ(0.5, settings.binWidth());
96 TEST(AnalysisHistogramSettingsTest, InitializesFromRangeWithBinWidth)
98 gmx::AnalysisHistogramSettings settings(
99 gmx::histogramFromRange(1.0, 4.0).binWidth(0.5));
100 EXPECT_FLOAT_EQ(1.0, settings.firstEdge());
101 EXPECT_FLOAT_EQ(4.0, settings.lastEdge());
102 EXPECT_FLOAT_EQ(0.5, settings.binWidth());
103 EXPECT_EQ(6, settings.binCount());
107 TEST(AnalysisHistogramSettingsTest, InitializesFromRangeWithBinCountAndIntegerBins)
109 gmx::AnalysisHistogramSettings settings(
110 gmx::histogramFromRange(1.0, 4.0).binCount(7).integerBins());
111 EXPECT_FLOAT_EQ(0.75, settings.firstEdge());
112 EXPECT_FLOAT_EQ(4.25, settings.lastEdge());
113 EXPECT_EQ(7, settings.binCount());
114 EXPECT_FLOAT_EQ(0.5, settings.binWidth());
118 TEST(AnalysisHistogramSettingsTest, InitializesFromRangeWithBinWidthAndIntegerBins)
120 gmx::AnalysisHistogramSettings settings(
121 gmx::histogramFromRange(1.0, 4.0).binWidth(0.5).integerBins());
122 EXPECT_FLOAT_EQ(0.75, settings.firstEdge());
123 EXPECT_FLOAT_EQ(4.25, settings.lastEdge());
124 EXPECT_FLOAT_EQ(0.5, settings.binWidth());
125 EXPECT_EQ(7, settings.binCount());
129 TEST(AnalysisHistogramSettingsTest, InitializesFromRangeWithRoundedRange)
131 gmx::AnalysisHistogramSettings settings(
132 gmx::histogramFromRange(1.2, 3.8).binWidth(0.5).roundRange());
133 EXPECT_FLOAT_EQ(1.0, settings.firstEdge());
134 EXPECT_FLOAT_EQ(4.0, settings.lastEdge());
135 EXPECT_FLOAT_EQ(0.5, settings.binWidth());
136 EXPECT_EQ(6, settings.binCount());
140 /********************************************************************
141 * Tests for gmx::AnalysisDataSimpleHistogramModule.
144 typedef gmx::test::AnalysisDataTestFixture SimpleHistogramModuleTest;
146 // Input data for the tests below.
147 using gmx::test::END_OF_DATA;
148 using gmx::test::END_OF_FRAME;
149 using gmx::test::MPSTOP;
150 static const real simpleinputdata[] = {
151 1.0, 0.7, MPSTOP, 1.1, MPSTOP, 2.3, MPSTOP, 2.9, END_OF_FRAME,
152 2.0, 1.3, MPSTOP, 2.2, END_OF_FRAME,
153 3.0, 3.3, MPSTOP, 1.2, MPSTOP, 1.3, END_OF_FRAME,
157 TEST_F(SimpleHistogramModuleTest, ComputesCorrectly)
159 gmx::test::AnalysisDataTestInput input(simpleinputdata);
160 gmx::AnalysisData data;
161 data.setColumnCount(input.columnCount());
162 data.setMultipoint(true);
163 gmx::AnalysisDataSimpleHistogramModulePointer module(
164 new gmx::AnalysisDataSimpleHistogramModule(
165 gmx::histogramFromRange(1.0, 3.0).binCount(4)));
166 data.addModule(module);
168 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
169 ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
170 ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module.get()));
171 ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage",
172 &module->averager()));
173 ASSERT_NO_THROW(presentAllData(input, &data));
174 ASSERT_NO_THROW(module->averager().done());
178 TEST_F(SimpleHistogramModuleTest, ComputesCorrectlyWithAll)
180 gmx::test::AnalysisDataTestInput input(simpleinputdata);
181 gmx::AnalysisData data;
182 data.setColumnCount(input.columnCount());
183 data.setMultipoint(true);
184 gmx::AnalysisDataSimpleHistogramModulePointer module(
185 new gmx::AnalysisDataSimpleHistogramModule(
186 gmx::histogramFromRange(1.0, 3.0).binCount(4).includeAll()));
187 data.addModule(module);
189 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
190 ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
191 ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module.get()));
192 ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage",
193 &module->averager()));
194 ASSERT_NO_THROW(presentAllData(input, &data));
195 ASSERT_NO_THROW(module->averager().done());
199 /********************************************************************
200 * Tests for gmx::AnalysisDataWeightedHistogramModule.
203 typedef gmx::test::AnalysisDataTestFixture WeightedHistogramModuleTest;
205 // Input data for the tests below (both weighted and bin average modules).
206 static const real weightedinputdata[] = {
207 1.0, 0.7, 0.5, MPSTOP, 1.1, 1.0, MPSTOP, 2.3, 1.0, MPSTOP, 2.9, 2.0, END_OF_FRAME,
208 2.0, 1.3, 1.0, MPSTOP, 2.2, 3.0, END_OF_FRAME,
209 3.0, 3.3, 0.5, MPSTOP, 1.2, 2.0, MPSTOP, 1.3, 1.0, END_OF_FRAME,
213 TEST_F(WeightedHistogramModuleTest, ComputesCorrectly)
215 gmx::test::AnalysisDataTestInput input(weightedinputdata);
216 gmx::AnalysisData data;
217 data.setColumnCount(input.columnCount());
218 data.setMultipoint(true);
219 gmx::AnalysisDataWeightedHistogramModulePointer module(
220 new gmx::AnalysisDataWeightedHistogramModule(
221 gmx::histogramFromRange(1.0, 3.0).binCount(4)));
222 data.addModule(module);
224 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
225 ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
226 ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module.get()));
227 ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage",
228 &module->averager()));
229 ASSERT_NO_THROW(presentAllData(input, &data));
230 ASSERT_NO_THROW(module->averager().done());
234 TEST_F(WeightedHistogramModuleTest, ComputesCorrectlyWithAll)
236 gmx::test::AnalysisDataTestInput input(weightedinputdata);
237 gmx::AnalysisData data;
238 data.setColumnCount(input.columnCount());
239 data.setMultipoint(true);
240 gmx::AnalysisDataWeightedHistogramModulePointer module(
241 new gmx::AnalysisDataWeightedHistogramModule(
242 gmx::histogramFromRange(1.0, 3.0).binCount(4).includeAll()));
243 data.addModule(module);
245 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
246 ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
247 ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module.get()));
248 ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage",
249 &module->averager()));
250 ASSERT_NO_THROW(presentAllData(input, &data));
251 ASSERT_NO_THROW(module->averager().done());
255 /********************************************************************
256 * Tests for gmx::AnalysisDataBinAverageModule.
259 typedef gmx::test::AnalysisDataTestFixture BinAverageModuleTest;
261 TEST_F(BinAverageModuleTest, ComputesCorrectly)
263 gmx::test::AnalysisDataTestInput input(weightedinputdata);
264 gmx::AnalysisData data;
265 data.setColumnCount(input.columnCount());
266 data.setMultipoint(true);
267 gmx::AnalysisDataBinAverageModulePointer module(
268 new gmx::AnalysisDataBinAverageModule(
269 gmx::histogramFromRange(1.0, 3.0).binCount(4)));
270 data.addModule(module);
272 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
273 ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
274 ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage", module.get()));
275 ASSERT_NO_THROW(presentAllData(input, &data));
279 TEST_F(BinAverageModuleTest, ComputesCorrectlyWithAll)
281 gmx::test::AnalysisDataTestInput input(weightedinputdata);
282 gmx::AnalysisData data;
283 data.setColumnCount(input.columnCount());
284 data.setMultipoint(true);
285 gmx::AnalysisDataBinAverageModulePointer module(
286 new gmx::AnalysisDataBinAverageModule(
287 gmx::histogramFromRange(1.0, 3.0).binCount(4).includeAll()));
288 data.addModule(module);
290 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
291 ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
292 ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage", module.get()));
293 ASSERT_NO_THROW(presentAllData(input, &data));
297 /********************************************************************
298 * Tests for gmx::AbstractAverageHistogram.
300 * This class derives from gmx::AbstractAnalysisArrayData, and is tested using
301 * corresponding facilities in gmx::test::AnalysisDataTestFixture.
304 typedef gmx::test::AnalysisDataTestFixture AbstractAverageHistogramTest;
306 // Input data for average histogram tests.
307 static const real averageinputdata[] = {
308 1.0, 2.0, 1.0, END_OF_FRAME,
309 1.5, 1.0, 1.0, END_OF_FRAME,
310 2.0, 3.0, 2.0, END_OF_FRAME,
311 2.5, 4.0, 2.0, END_OF_FRAME,
312 3.0, 2.0, 1.0, END_OF_FRAME,
313 3.5, 0.0, 3.0, END_OF_FRAME,
314 4.0, 1.0, 3.0, END_OF_FRAME,
319 * Mock object for testing gmx::AbstractAverageHistogram.
321 * Exposes necessary methods from gmx::AbstractAverageHistogram to use with
322 * gmx::test::AnalysisDataTestFixture::setupArrayData().
324 class MockAverageHistogram : public gmx::AbstractAverageHistogram
327 MockAverageHistogram() {}
328 explicit MockAverageHistogram(const gmx::AnalysisHistogramSettings &settings)
329 : AbstractAverageHistogram(settings)
333 using AbstractAverageHistogram::init;
334 using AbstractAverageHistogram::setColumnCount;
335 using AbstractAverageHistogram::setRowCount;
336 using AbstractAverageHistogram::allocateValues;
337 using AbstractAverageHistogram::setValue;
341 TEST_F(AbstractAverageHistogramTest, ClonesCorrectly)
343 gmx::test::AnalysisDataTestInput input(averageinputdata);
344 MockAverageHistogram data(
345 gmx::histogramFromBins(1.0, input.frameCount(), 0.5).integerBins());
346 setupArrayData(input, &data);
348 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
349 gmx::AverageHistogramPointer copy(data.clone());
350 ASSERT_NO_THROW(addStaticCheckerModule(input, copy.get()));
351 ASSERT_NO_THROW(copy->done());
352 ASSERT_NO_THROW(data.done());
353 gmx::AverageHistogramPointer copy2(data.clone());
354 ASSERT_NO_THROW(addStaticCheckerModule(input, copy2.get()));
355 ASSERT_NO_THROW(copy2->done());
359 TEST_F(AbstractAverageHistogramTest, ResamplesAtDoubleBinWidth)
361 gmx::test::AnalysisDataTestInput input(averageinputdata);
362 MockAverageHistogram data(
363 gmx::histogramFromBins(1.0, input.frameCount(), 0.5).integerBins());
364 setupArrayData(input, &data);
366 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
367 ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
368 gmx::AverageHistogramPointer resampled(data.resampleDoubleBinWidth(false));
369 ASSERT_NO_THROW(addReferenceCheckerModule("ResampledHistogram", resampled.get()));
370 ASSERT_NO_THROW(data.done());
371 ASSERT_NO_THROW(resampled->done());
375 TEST_F(AbstractAverageHistogramTest, ResamplesAtDoubleBinWidthWithIntegerBins)
377 gmx::test::AnalysisDataTestInput input(averageinputdata);
378 MockAverageHistogram data(
379 gmx::histogramFromBins(1.0, input.frameCount(), 0.5).integerBins());
380 setupArrayData(input, &data);
382 ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
383 ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
384 gmx::AverageHistogramPointer resampled(data.resampleDoubleBinWidth(true));
385 ASSERT_NO_THROW(addReferenceCheckerModule("ResampledHistogram", resampled.get()));
386 ASSERT_NO_THROW(data.done());
387 ASSERT_NO_THROW(resampled->done());