{
AverageHistogramPointer dest(new StaticAverageHistogram());
copyContents(this, dest.get());
+ dest->settings_ = settings_;
return dest;
}
}
}
+void
+AbstractAverageHistogram::makeCumulative()
+{
+ for (int c = 0; c < columnCount(); ++c)
+ {
+ double sum = 0;
+ for (int i = 0; i < rowCount(); ++i)
+ {
+ sum += value(i, c).value();
+ // Clear the error, as we don't cumulate that.
+ value(i, c).clear();
+ value(i, c).setValue(sum);
+ }
+ }
+ setXAxis(settings().firstEdge() + settings().binWidth(),
+ settings().binWidth());
+}
+
void
AbstractAverageHistogram::scaleSingle(int index, real factor)
*
* This class can represent multiple histograms in one object: each column in
* the data is an independent histogram.
+ * The X values correspond to center of the bins, except for a cumulative
+ * histogram made with makeCumulative().
*
* \inpublicapi
* \ingroup module_analysisdata
AverageHistogramPointer clone() const;
//! Normalizes the histogram such that the integral over it is one.
void normalizeProbability();
+ /*! \brief
+ * Makes the histograms cumulative by summing up each bin to all bins
+ * after it.
+ *
+ * The X values in the data are adjusted such that they match the right
+ * edges of bins instead of bin centers.
+ */
+ void makeCumulative();
//! Scales a single histogram by a uniform scaling factor.
void scaleSingle(int index, real factor);
//! Scales all histograms by a uniform scaling factor.
}
+TEST_F(AbstractAverageHistogramTest, ComputesCumulativeHistogram)
+{
+ const AnalysisDataTestInput &input = AverageInputData::get();
+ MockAverageHistogram data(
+ gmx::histogramFromBins(1.0, input.frameCount(), 0.5).integerBins());
+ setupArrayData(input, &data);
+
+ ASSERT_NO_THROW_GMX(addStaticCheckerModule(input, &data));
+ ASSERT_NO_THROW_GMX(addReferenceCheckerModule("InputData", &data));
+ ASSERT_NO_THROW_GMX(data.done());
+
+ gmx::AverageHistogramPointer cumulative(data.clone());
+ cumulative->makeCumulative();
+ ASSERT_NO_THROW_GMX(addReferenceCheckerModule("CumulativeHistogram", cumulative.get()));
+ ASSERT_NO_THROW_GMX(cumulative->done());
+}
+
+
TEST_F(AbstractAverageHistogramTest, ResamplesAtDoubleBinWidth)
{
const AnalysisDataTestInput &input = AverageInputData::get();
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <AnalysisData Name="InputData">
+ <DataFrame Name="Frame0">
+ <Real Name="X">1</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">2</Real>
+ <Real Name="Error">1</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame1">
+ <Real Name="X">1.5</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">1</Real>
+ <Real Name="Error">1</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame2">
+ <Real Name="X">2</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">3</Real>
+ <Real Name="Error">2</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame3">
+ <Real Name="X">2.5</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">4</Real>
+ <Real Name="Error">2</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame4">
+ <Real Name="X">3</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">2</Real>
+ <Real Name="Error">1</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame5">
+ <Real Name="X">3.5</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">0</Real>
+ <Real Name="Error">3</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame6">
+ <Real Name="X">4</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">1</Real>
+ <Real Name="Error">3</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ </AnalysisData>
+ <AnalysisData Name="CumulativeHistogram">
+ <DataFrame Name="Frame0">
+ <Real Name="X">1.25</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">2</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame1">
+ <Real Name="X">1.75</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">3</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame2">
+ <Real Name="X">2.25</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">6</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame3">
+ <Real Name="X">2.75</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">10</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame4">
+ <Real Name="X">3.25</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">12</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame5">
+ <Real Name="X">3.75</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">12</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ <DataFrame Name="Frame6">
+ <Real Name="X">4.25</Real>
+ <DataValues>
+ <Int Name="Count">1</Int>
+ <DataValue>
+ <Real Name="Value">13</Real>
+ </DataValue>
+ </DataValues>
+ </DataFrame>
+ </AnalysisData>
+</ReferenceData>