Statistics for gmx-distance.
authorTeemu Murtola <teemu.murtola@gmail.com>
Tue, 20 Aug 2013 17:36:58 +0000 (20:36 +0300)
committerGerrit Code Review <gerrit@gerrit.gromacs.org>
Wed, 21 Aug 2013 12:15:39 +0000 (14:15 +0200)
Add support for calculating statistics more or less like g_bond has into
the new C++ gmx-distance tool.  The output format may not be as nice,
but one can at least get the same numbers out.

Extended the averaging analysisdata modules to handle multiple data sets
to support this, which required changing the data structure slightly
(this is the source of most modifications to existing data in XML files;
new tests/new output data of course adds additional entries).
Supporting changes in the plotting to handle missing values and errors,
and in test code to handle missing data points.

Part of #665.

Change-Id: If5f0b54d6d3eec0145625de9ab745e6ba9dc468a

27 files changed:
share/template/template.cpp
src/gromacs/analysisdata/modules/average.cpp
src/gromacs/analysisdata/modules/average.h
src/gromacs/analysisdata/modules/frameaverager.h
src/gromacs/analysisdata/modules/plot.cpp
src/gromacs/analysisdata/modules/plot.h
src/gromacs/analysisdata/tests/average.cpp
src/gromacs/analysisdata/tests/refdata/AverageModuleTest_BasicTest.xml
src/gromacs/analysisdata/tests/refdata/AverageModuleTest_CanCustomizeXAxis.xml
src/gromacs/analysisdata/tests/refdata/AverageModuleTest_HandlesDataSetAveraging.xml [new file with mode: 0644]
src/gromacs/analysisdata/tests/refdata/AverageModuleTest_HandlesMultipleDataSets.xml [new file with mode: 0644]
src/gromacs/analysisdata/tests/refdata/AverageModuleTest_HandlesMultipointData.xml
src/gromacs/analysisdata/tests/refdata/analysisdata-referencedata.xsl
src/gromacs/trajectoryanalysis/modules/distance.cpp
src/gromacs/trajectoryanalysis/modules/distance.h
src/gromacs/trajectoryanalysis/modules/freevolume.cpp
src/gromacs/trajectoryanalysis/modules/select.cpp
src/gromacs/trajectoryanalysis/tests/refdata/DistanceModuleTest_ComputesDistances.xml
src/gromacs/trajectoryanalysis/tests/refdata/DistanceModuleTest_ComputesMultipleDistances.xml
src/gromacs/trajectoryanalysis/tests/refdata/SelectModuleTest_BasicTest.xml
src/gromacs/trajectoryanalysis/tests/refdata/SelectModuleTest_HandlesMaxPDBOutput.xml
src/gromacs/trajectoryanalysis/tests/refdata/SelectModuleTest_HandlesPDBOutputWithNonPDBInput.xml
src/gromacs/trajectoryanalysis/tests/refdata/SelectModuleTest_HandlesPDBOutputWithPDBInput.xml
src/gromacs/trajectoryanalysis/tests/refdata/SelectModuleTest_HandlesSelectedPDBOutput.xml
src/gromacs/trajectoryanalysis/tests/refdata/analysisdata-referencedata.xsl
src/testutils/analysisdata-referencedata.xsl
src/testutils/mock_datamodule.cpp

index 28bbd6ee88d6b64d0d430d09763debee18b51d09..0dbedce4b1999e6cc96c58c826f09f3276edb5c3 100644 (file)
@@ -185,7 +185,7 @@ AnalysisTemplate::writeOutput()
     for (size_t g = 0; g < sel_.size(); ++g)
     {
         fprintf(stderr, "Average mean distance for '%s': %.3f nm\n",
-                sel_[g].name(), avem_->average(g));
+                sel_[g].name(), avem_->average(0, g));
     }
 }
 
index 43f65f5d922dbc73fd8f1f506c1e2a0b4c83cee3..9a19fa799665a3dce1602ddc14101ca77a149c3d 100644 (file)
@@ -43,6 +43,7 @@
 
 #include <cmath>
 
+#include <algorithm>
 #include <vector>
 
 #include "gromacs/analysisdata/dataframe.h"
@@ -60,32 +61,56 @@ namespace gmx
 class AnalysisDataAverageModule::Impl
 {
     public:
-        //! Averaging helper object.
-        AnalysisDataFrameAverager averager_;
+        Impl() : bDataSets_(false) {}
+
+        //! Averaging helper objects for each input data set.
+        std::vector<AnalysisDataFrameAverager>  averagers_;
+        //! Whether to average all columns in a data set into a single value.
+        bool                                    bDataSets_;
 };
 
 AnalysisDataAverageModule::AnalysisDataAverageModule()
     : impl_(new Impl())
 {
-    setColumnCount(2);
 }
 
 AnalysisDataAverageModule::~AnalysisDataAverageModule()
 {
 }
 
-int
-AnalysisDataAverageModule::flags() const
+void AnalysisDataAverageModule::setAverageDataSets(bool bDataSets)
 {
-    return efAllowMultipoint | efAllowMulticolumn | efAllowMissing;
+    impl_->bDataSets_ = bDataSets;
+}
+
+int AnalysisDataAverageModule::flags() const
+{
+    return efAllowMultipoint | efAllowMulticolumn | efAllowMissing
+           | efAllowMultipleDataSets;
 }
 
 void
 AnalysisDataAverageModule::dataStarted(AbstractAnalysisData *data)
 {
-    const int valueCount = data->columnCount();
-    impl_->averager_.setColumnCount(valueCount);
-    setRowCount(valueCount);
+    if (impl_->bDataSets_)
+    {
+        setColumnCount(1);
+        setRowCount(data->dataSetCount());
+        impl_->averagers_.resize(1);
+        impl_->averagers_[0].setColumnCount(data->dataSetCount());
+    }
+    else
+    {
+        setColumnCount(data->dataSetCount());
+        impl_->averagers_.resize(data->dataSetCount());
+        int rowCount = 0;
+        for (int i = 0; i < data->dataSetCount(); ++i)
+        {
+            impl_->averagers_[i].setColumnCount(data->columnCount(i));
+            rowCount = std::max(rowCount, data->columnCount(i));
+        }
+        setRowCount(rowCount);
+    }
 }
 
 void
@@ -96,7 +121,21 @@ AnalysisDataAverageModule::frameStarted(const AnalysisDataFrameHeader & /*header
 void
 AnalysisDataAverageModule::pointsAdded(const AnalysisDataPointSetRef &points)
 {
-    impl_->averager_.addPoints(points);
+    if (impl_->bDataSets_)
+    {
+        const int dataSet = points.dataSetIndex();
+        for (int i = 0; i < points.columnCount(); ++i)
+        {
+            if (points.present(i))
+            {
+                impl_->averagers_[0].addValue(dataSet, points.y(i));
+            }
+        }
+    }
+    else
+    {
+        impl_->averagers_[points.dataSetIndex()].addPoints(points);
+    }
 }
 
 void
@@ -107,26 +146,55 @@ AnalysisDataAverageModule::frameFinished(const AnalysisDataFrameHeader & /*heade
 void
 AnalysisDataAverageModule::dataFinished()
 {
-    impl_->averager_.finish();
     allocateValues();
-    for (int i = 0; i < rowCount(); ++i)
+    for (int i = 0; i < columnCount(); ++i)
     {
-        value(i, 0).setValue(impl_->averager_.average(i));
-        value(i, 1).setValue(std::sqrt(impl_->averager_.variance(i)));
+        impl_->averagers_[i].finish();
+        int j = 0;
+        for (; j < impl_->averagers_[i].columnCount(); ++j)
+        {
+            value(j, i).setValue(impl_->averagers_[i].average(j),
+                                 std::sqrt(impl_->averagers_[i].variance(j)));
+        }
+        for (; j < rowCount(); ++j)
+        {
+            value(j, i).setValue(0.0, 0.0, false);
+        }
     }
     valuesReady();
 }
 
-real
-AnalysisDataAverageModule::average(int index) const
+real AnalysisDataAverageModule::average(int dataSet, int column) const
+{
+    if (impl_->bDataSets_)
+    {
+        GMX_ASSERT(column == 0,
+                   "Column should be zero with setAverageDataSets(true)");
+        std::swap(dataSet, column);
+    }
+    return value(column, dataSet).value();
+}
+
+real AnalysisDataAverageModule::standardDeviation(int dataSet, int column) const
 {
-    return value(index, 0).value();
+    if (impl_->bDataSets_)
+    {
+        GMX_ASSERT(column == 0,
+                   "Column should be zero with setAverageDataSets(true)");
+        std::swap(dataSet, column);
+    }
+    return value(column, dataSet).error();
 }
 
-real
-AnalysisDataAverageModule::stddev(int index) const
+int AnalysisDataAverageModule::sampleCount(int dataSet, int column) const
 {
-    return value(index, 1).value();
+    if (impl_->bDataSets_)
+    {
+        GMX_ASSERT(column == 0,
+                   "Column should be zero with setAverageDataSets(true)");
+        std::swap(dataSet, column);
+    }
+    return impl_->averagers_[dataSet].sampleCount(column);
 }
 
 
index 6ef3464b4f82083c38af4c53bd99dee9fb4c0b87..e0480999ea22c09cd154cad72646007d09d2e105 100644 (file)
@@ -57,17 +57,21 @@ namespace gmx
  * Data module for independently averaging each column in input data.
  *
  * Computes the average and standard deviation independently for each column in
- * the input data.  Multipoint data and missing data points are both supported.
+ * the input data.  Multipoint data, multiple data sets, and missing data
+ * points are all supported.
  * The average is always calculated over all frames and data points for a
  * column.
- * Multiple input data sets are currently not supported.
  *
- * Output data contains a frame for each column in the input data.
- * The first column of each output frame is the average of the corresponding
- * input column.  The second output column is the standard deviation of the
- * corresponding input column.
- * average() and stddev() methods are also provided for convenient access to
- * these properties.
+ * Output data contains a column for each data set in the input data, and a
+ * frame for each column in the input data.  If different data sets have
+ * different number of columns, the frame count accomodates the largest data
+ * set.  Other columns are padded with zero values that are additionally marked
+ * as missing.
+ * Each value in the output data is the average of the corresponding
+ * input column in the corresponding input data set.  The error value for each
+ * value provides the standard deviation of the corresponding input column.
+ * average(), standardDeviation(), and sampleCount() methods are also
+ * provided for convenient access to these properties.
  *
  * The output data becomes available only after the input data has been
  * finished.
@@ -84,6 +88,20 @@ class AnalysisDataAverageModule : public AbstractAnalysisArrayData,
 
         using AbstractAnalysisArrayData::setXAxis;
 
+        /*! \brief
+         * Sets the averaging to happen over entire data sets.
+         *
+         * If \p bDataSets is false (the default), the module averages each
+         * column separately.  The output will have a column for each data set,
+         * and a row for each column.
+         *
+         * If \p bDataSets is true, the module averages all values within
+         * a single data set into a single average/standard deviation.
+         * The output will have only one column, with one row for each data
+         * set.
+         */
+        void setAverageDataSets(bool bDataSets);
+
         virtual int flags() const;
 
         virtual void dataStarted(AbstractAnalysisData *data);
@@ -92,10 +110,29 @@ class AnalysisDataAverageModule : public AbstractAnalysisArrayData,
         virtual void frameFinished(const AnalysisDataFrameHeader &header);
         virtual void dataFinished();
 
-        //! Convenience access to the average of a data column.
-        real average(int index) const;
-        //! Convenience access to the standard deviation of a data column.
-        real stddev(int index) const;
+        /*! \brief
+         * Convenience access to the average of a data column.
+         *
+         * Note that the interpretation of the parameters follows their naming:
+         * with \c setAverageDataSets(false), \p dataSet corresponds to a
+         * column in the output, but with \c setAverageDataSets(false) it
+         * corresponds to an output row.  In both cases, it selects the data
+         * set; with \c setAverageDataSets(false), \p column should always be
+         * zero as there is only one value per data set.
+         */
+        real average(int dataSet, int column) const;
+        /*! \brief
+         * Convenience access to the standard deviation of a data column.
+         *
+         * See average() for the interpretation of the parameters.
+         */
+        real standardDeviation(int dataSet, int column) const;
+        /*! \brief
+         * Access the number of samples for a data column.
+         *
+         * See average() for the interpretation of the parameters.
+         */
+        int sampleCount(int dataSet, int column) const;
 
     private:
         class Impl;
index 54c8504b2e8bd8680b50e1564c651c79d5822d76..7025b29b273afc98fb5aefa41426bda796880784 100644 (file)
@@ -77,6 +77,11 @@ class AnalysisDataFrameAverager
     public:
         AnalysisDataFrameAverager() : bFinished_(false) {}
 
+        /*! \brief
+         * Returns the number of columns in this averager.
+         */
+        int columnCount() const { return values_.size(); }
+
         /*! \brief
          * Sets the number of columns in the input data.
          *
@@ -123,7 +128,7 @@ class AnalysisDataFrameAverager
          */
         real average(int index) const
         {
-            GMX_ASSERT(index >= 0 && index <= static_cast<int>(values_.size()),
+            GMX_ASSERT(index >= 0 && index < columnCount(),
                        "Invalid column index");
             GMX_ASSERT(bFinished_,
                        "Values available only after finished() has been called");
@@ -136,7 +141,7 @@ class AnalysisDataFrameAverager
          */
         real variance(int index) const
         {
-            GMX_ASSERT(index >= 0 && index <= static_cast<int>(values_.size()),
+            GMX_ASSERT(index >= 0 && index < columnCount(),
                        "Invalid column index");
             GMX_ASSERT(bFinished_,
                        "Values available only after finished() has been called");
index e69db362bc702ef47f1f10fb831174b8dc7a5e6c..c716bed0000ff8d87b3b918cbacad7df32433b42 100644 (file)
@@ -119,7 +119,8 @@ class AbstractPlotModule::Impl
         FILE                     *fp_;
 
         bool                      bPlain_;
-        bool                      gOmitX_;
+        bool                      bOmitX_;
+        bool                      bErrorsAsSeparateColumn_;
         std::string               title_;
         std::string               subtitle_;
         std::string               xlabel_;
@@ -131,8 +132,8 @@ class AbstractPlotModule::Impl
 };
 
 AbstractPlotModule::Impl::Impl(const AnalysisDataPlotSettings &settings)
-    : settings_(settings), fp_(NULL), bPlain_(false), gOmitX_(false),
-      xscale_(1.0)
+    : settings_(settings), fp_(NULL), bPlain_(false), bOmitX_(false),
+      bErrorsAsSeparateColumn_(false), xscale_(1.0)
 {
     strcpy(xformat_, "%11.3f");
     strcpy(yformat_, " %8.3f");
@@ -203,10 +204,17 @@ AbstractPlotModule::setPlainOutput(bool bPlain)
 }
 
 
+void
+AbstractPlotModule::setErrorsAsSeparateColumn(bool bSeparate)
+{
+    impl_->bErrorsAsSeparateColumn_ = bSeparate;
+}
+
+
 void
 AbstractPlotModule::setOmitX(bool bOmitX)
 {
-    impl_->gOmitX_ = bOmitX;
+    impl_->bOmitX_ = bOmitX;
 }
 
 
@@ -292,7 +300,8 @@ AbstractPlotModule::setYFormat(int width, int precision, char format)
 int
 AbstractPlotModule::flags() const
 {
-    return efAllowMulticolumn | efAllowMultipoint | efAllowMultipleDataSets;
+    return efAllowMissing | efAllowMulticolumn | efAllowMultipoint
+           | efAllowMultipleDataSets;
 }
 
 
@@ -352,7 +361,7 @@ AbstractPlotModule::frameStarted(const AnalysisDataFrameHeader &frame)
     {
         return;
     }
-    if (!impl_->gOmitX_)
+    if (!impl_->bOmitX_)
     {
         std::fprintf(impl_->fp_, impl_->xformat_, frame.x() * impl_->xscale_);
     }
@@ -385,10 +394,16 @@ AbstractPlotModule::isFileOpen() const
 
 
 void
-AbstractPlotModule::writeValue(real value) const
+AbstractPlotModule::writeValue(const AnalysisDataValue &value) const
 {
     GMX_ASSERT(isFileOpen(), "File not opened, but write attempted");
-    std::fprintf(impl_->fp_, impl_->yformat_, value);
+    const real y = value.isSet() ? value.value() : 0.0;
+    std::fprintf(impl_->fp_, impl_->yformat_, y);
+    if (impl_->bErrorsAsSeparateColumn_)
+    {
+        const real dy = value.isSet() ? value.error() : 0.0;
+        std::fprintf(impl_->fp_, impl_->yformat_, dy);
+    }
 }
 //! \endcond
 
@@ -416,7 +431,7 @@ AnalysisDataPlotModule::pointsAdded(const AnalysisDataPointSetRef &points)
     }
     for (int i = 0; i < points.columnCount(); ++i)
     {
-        writeValue(points.y(i));
+        writeValue(points.values()[i]);
     }
 }
 
@@ -502,13 +517,14 @@ AnalysisDataVectorPlotModule::pointsAdded(const AnalysisDataPointSetRef &points)
         {
             if (bWrite_[i])
             {
-                writeValue(points.y(i + d));
+                writeValue(points.values()[i + d]);
             }
         }
         if (bWrite_[DIM])
         {
-            rvec y = { points.y(i), points.y(i + 1), points.y(i + 2) };
-            writeValue(norm(y));
+            const rvec        y = { points.y(i), points.y(i + 1), points.y(i + 2) };
+            AnalysisDataValue value(norm(y));
+            writeValue(value);
         }
     }
 }
index bd020d5f95d13a95412fe23857483a5bbbeedf99..1f0983ba3fc273cb59259298cb59685c8058e53d 100644 (file)
@@ -54,6 +54,7 @@
 namespace gmx
 {
 
+class AnalysisDataValue;
 class Options;
 class SelectionCollection;
 
@@ -162,6 +163,10 @@ class AbstractPlotModule : public AnalysisDataModuleInterface
          * methods have any effect on the output.
          */
         void setPlainOutput(bool bPlain);
+        /*! \brief
+         * Plot errors as a separate output column after each value column.
+         */
+        void setErrorsAsSeparateColumn(bool bSeparate);
         /*! \brief
          * Omit the X coordinates from the output.
          *
@@ -240,7 +245,7 @@ class AbstractPlotModule : public AnalysisDataModuleInterface
          *
          * Must not be called if isFileOpen() returns false.
          */
-        void writeValue(real value) const;
+        void writeValue(const AnalysisDataValue &value) const;
         //! \endcond
 
     private:
index 5c48ce3f72dfbd5aec82073b7dab13d93264a85c..1528dcd07936540c316ed988d4d1d44df3094a1c 100644 (file)
@@ -183,6 +183,39 @@ TEST_F(AverageModuleTest, HandlesMultipointData)
     ASSERT_NO_THROW_GMX(presentAllData(input, &data));
 }
 
+TEST_F(AverageModuleTest, HandlesMultipleDataSets)
+{
+    const AnalysisDataTestInput &input = MultiDataSetInputData::get();
+    gmx::AnalysisData            data;
+    ASSERT_NO_THROW_GMX(setupDataObject(input, &data));
+
+    gmx::AnalysisDataAverageModulePointer module(
+            new gmx::AnalysisDataAverageModule);
+    data.addModule(module);
+
+    ASSERT_NO_THROW_GMX(addStaticCheckerModule(input, &data));
+    ASSERT_NO_THROW_GMX(addReferenceCheckerModule("InputData", &data));
+    ASSERT_NO_THROW_GMX(addReferenceCheckerModule("Average", module.get()));
+    ASSERT_NO_THROW_GMX(presentAllData(input, &data));
+}
+
+TEST_F(AverageModuleTest, HandlesDataSetAveraging)
+{
+    const AnalysisDataTestInput &input = MultiDataSetInputData::get();
+    gmx::AnalysisData            data;
+    ASSERT_NO_THROW_GMX(setupDataObject(input, &data));
+
+    gmx::AnalysisDataAverageModulePointer module(
+            new gmx::AnalysisDataAverageModule);
+    module->setAverageDataSets(true);
+    data.addModule(module);
+
+    ASSERT_NO_THROW_GMX(addStaticCheckerModule(input, &data));
+    ASSERT_NO_THROW_GMX(addReferenceCheckerModule("InputData", &data));
+    ASSERT_NO_THROW_GMX(addReferenceCheckerModule("Average", module.get()));
+    ASSERT_NO_THROW_GMX(presentAllData(input, &data));
+}
+
 TEST_F(AverageModuleTest, CanCustomizeXAxis)
 {
     const AnalysisDataTestInput &input = SimpleInputData::get();
index be4664895814a9f28c24345c4b44afa8bb845d32..4943ebb1d1ac06e949cf99c086442e5cfdefa7fb 100644 (file)
     <DataFrame Name="Frame0">
       <Real Name="X">0.000000</Real>
       <DataValues>
-        <Int Name="Count">2</Int>
-        <DataValue>
-          <Real Name="Value">1.000000</Real>
-        </DataValue>
+        <Int Name="Count">1</Int>
         <DataValue>
           <Real Name="Value">1.000000</Real>
+          <Real Name="Error">1.000000</Real>
         </DataValue>
       </DataValues>
     </DataFrame>
     <DataFrame Name="Frame1">
       <Real Name="X">1.000000</Real>
       <DataValues>
-        <Int Name="Count">2</Int>
+        <Int Name="Count">1</Int>
         <DataValue>
           <Real Name="Value">0.666667</Real>
-        </DataValue>
-        <DataValue>
-          <Real Name="Value">0.577350</Real>
+          <Real Name="Error">0.577350</Real>
         </DataValue>
       </DataValues>
     </DataFrame>
     <DataFrame Name="Frame2">
       <Real Name="X">2.000000</Real>
       <DataValues>
-        <Int Name="Count">2</Int>
-        <DataValue>
-          <Real Name="Value">1.000000</Real>
-        </DataValue>
+        <Int Name="Count">1</Int>
         <DataValue>
           <Real Name="Value">1.000000</Real>
+          <Real Name="Error">1.000000</Real>
         </DataValue>
       </DataValues>
     </DataFrame>
index 88acc657263fc1fcc439d7ea784d77f4db067d29..5e642ffaa9964b5234720c81c182d7b00f245a7a 100644 (file)
     <DataFrame Name="Frame0">
       <Real Name="X">0.500000</Real>
       <DataValues>
-        <Int Name="Count">2</Int>
-        <DataValue>
-          <Real Name="Value">1.000000</Real>
-        </DataValue>
+        <Int Name="Count">1</Int>
         <DataValue>
           <Real Name="Value">1.000000</Real>
+          <Real Name="Error">1.000000</Real>
         </DataValue>
       </DataValues>
     </DataFrame>
     <DataFrame Name="Frame1">
       <Real Name="X">1.000000</Real>
       <DataValues>
-        <Int Name="Count">2</Int>
+        <Int Name="Count">1</Int>
         <DataValue>
           <Real Name="Value">0.666667</Real>
-        </DataValue>
-        <DataValue>
-          <Real Name="Value">0.577350</Real>
+          <Real Name="Error">0.577350</Real>
         </DataValue>
       </DataValues>
     </DataFrame>
     <DataFrame Name="Frame2">
       <Real Name="X">1.500000</Real>
       <DataValues>
-        <Int Name="Count">2</Int>
-        <DataValue>
-          <Real Name="Value">1.000000</Real>
-        </DataValue>
+        <Int Name="Count">1</Int>
         <DataValue>
           <Real Name="Value">1.000000</Real>
+          <Real Name="Error">1.000000</Real>
         </DataValue>
       </DataValues>
     </DataFrame>
diff --git a/src/gromacs/analysisdata/tests/refdata/AverageModuleTest_HandlesDataSetAveraging.xml b/src/gromacs/analysisdata/tests/refdata/AverageModuleTest_HandlesDataSetAveraging.xml
new file mode 100644 (file)
index 0000000..9a1b60d
--- /dev/null
@@ -0,0 +1,135 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <AnalysisData Name="InputData">
+    <DataFrame Name="Frame0">
+      <Real Name="X">1.000000</Real>
+      <DataValues>
+        <Int Name="Count">3</Int>
+        <Int Name="DataSet">0</Int>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">0</Int>
+        <Int Name="FirstColumn">0</Int>
+        <Int Name="LastColumn">1</Int>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">1</Int>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">1</Int>
+        <Int Name="DataSet">1</Int>
+        <Int Name="FirstColumn">1</Int>
+        <Int Name="LastColumn">1</Int>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+    <DataFrame Name="Frame1">
+      <Real Name="X">2.000000</Real>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">0</Int>
+        <Int Name="FirstColumn">0</Int>
+        <Int Name="LastColumn">1</Int>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">1</Int>
+        <Int Name="DataSet">0</Int>
+        <Int Name="FirstColumn">2</Int>
+        <Int Name="LastColumn">2</Int>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">1</Int>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+    <DataFrame Name="Frame2">
+      <Real Name="X">3.000000</Real>
+      <DataValues>
+        <Int Name="Count">3</Int>
+        <Int Name="DataSet">0</Int>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">1</Int>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+  </AnalysisData>
+  <AnalysisData Name="Average">
+    <DataFrame Name="Frame0">
+      <Real Name="X">0.000000</Real>
+      <DataValues>
+        <Int Name="Count">1</Int>
+        <DataValue>
+          <Real Name="Value">0.909091</Real>
+          <Real Name="Error">0.831209</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+    <DataFrame Name="Frame1">
+      <Real Name="X">1.000000</Real>
+      <DataValues>
+        <Int Name="Count">1</Int>
+        <DataValue>
+          <Real Name="Value">1.142857</Real>
+          <Real Name="Error">0.899735</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+  </AnalysisData>
+</ReferenceData>
diff --git a/src/gromacs/analysisdata/tests/refdata/AverageModuleTest_HandlesMultipleDataSets.xml b/src/gromacs/analysisdata/tests/refdata/AverageModuleTest_HandlesMultipleDataSets.xml
new file mode 100644 (file)
index 0000000..95a24e3
--- /dev/null
@@ -0,0 +1,158 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <AnalysisData Name="InputData">
+    <DataFrame Name="Frame0">
+      <Real Name="X">1.000000</Real>
+      <DataValues>
+        <Int Name="Count">3</Int>
+        <Int Name="DataSet">0</Int>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">0</Int>
+        <Int Name="FirstColumn">0</Int>
+        <Int Name="LastColumn">1</Int>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">1</Int>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">1</Int>
+        <Int Name="DataSet">1</Int>
+        <Int Name="FirstColumn">1</Int>
+        <Int Name="LastColumn">1</Int>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+    <DataFrame Name="Frame1">
+      <Real Name="X">2.000000</Real>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">0</Int>
+        <Int Name="FirstColumn">0</Int>
+        <Int Name="LastColumn">1</Int>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">1</Int>
+        <Int Name="DataSet">0</Int>
+        <Int Name="FirstColumn">2</Int>
+        <Int Name="LastColumn">2</Int>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">1</Int>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+    <DataFrame Name="Frame2">
+      <Real Name="X">3.000000</Real>
+      <DataValues>
+        <Int Name="Count">3</Int>
+        <Int Name="DataSet">0</Int>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+      </DataValues>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <Int Name="DataSet">1</Int>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">2.000000</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+  </AnalysisData>
+  <AnalysisData Name="Average">
+    <DataFrame Name="Frame0">
+      <Real Name="X">0.000000</Real>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+          <Real Name="Error">0.816497</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">1.000000</Real>
+          <Real Name="Error">1.000000</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+    <DataFrame Name="Frame1">
+      <Real Name="X">1.000000</Real>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <DataValue>
+          <Real Name="Value">0.500000</Real>
+          <Real Name="Error">0.577350</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">1.250000</Real>
+          <Real Name="Error">0.957427</Real>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+    <DataFrame Name="Frame2">
+      <Real Name="X">2.000000</Real>
+      <DataValues>
+        <Int Name="Count">2</Int>
+        <DataValue>
+          <Real Name="Value">1.333333</Real>
+          <Real Name="Error">1.154701</Real>
+        </DataValue>
+        <DataValue>
+          <Real Name="Value">0.000000</Real>
+          <Real Name="Error">0.000000</Real>
+          <Bool Name="Present">false</Bool>
+        </DataValue>
+      </DataValues>
+    </DataFrame>
+  </AnalysisData>
+</ReferenceData>
index faa59f3f9f494f1210e7f668451c3a5b6297b48d..88fdb356697c279bde518228c97c223a7fa32c33 100644 (file)
     <DataFrame Name="Frame0">
       <Real Name="X">0.000000</Real>
       <DataValues>
-        <Int Name="Count">2</Int>
+        <Int Name="Count">1</Int>
         <DataValue>
           <Real Name="Value">1.333333</Real>
-        </DataValue>
-        <DataValue>
-          <Real Name="Value">0.816497</Real>
+          <Real Name="Error">0.816497</Real>
         </DataValue>
       </DataValues>
     </DataFrame>
     <DataFrame Name="Frame1">
       <Real Name="X">1.000000</Real>
       <DataValues>
-        <Int Name="Count">2</Int>
+        <Int Name="Count">1</Int>
         <DataValue>
           <Real Name="Value">0.500000</Real>
-        </DataValue>
-        <DataValue>
-          <Real Name="Value">0.577350</Real>
+          <Real Name="Error">0.577350</Real>
         </DataValue>
       </DataValues>
     </DataFrame>
     <DataFrame Name="Frame2">
       <Real Name="X">2.000000</Real>
       <DataValues>
-        <Int Name="Count">2</Int>
+        <Int Name="Count">1</Int>
         <DataValue>
           <Real Name="Value">1.000000</Real>
-        </DataValue>
-        <DataValue>
-          <Real Name="Value">1.414214</Real>
+          <Real Name="Error">1.414214</Real>
         </DataValue>
       </DataValues>
     </DataFrame>
index 99060e985b9a4c5cfd7c47479aec0ef3bf6a147e..9223385238c2e5c31edd3d1071226396511a3791 100644 (file)
@@ -54,6 +54,14 @@ and use the copy_xsl.sh script to copy it to relevant locations.
     </table>
 </xsl:template>
 
+<xsl:template match="DataValue[Bool[@Name='Present']='false']">
+    (
+    <xsl:value-of select="Real[@Name='Value']"/>
+    <xsl:if test="Real[@Name='Error']">
+        &#177; <xsl:value-of select="Real[@Name='Error']"/>
+    </xsl:if>
+    )
+</xsl:template>
 <xsl:template match="DataValue">
     <xsl:value-of select="Real[@Name='Value']"/>
     <xsl:if test="Real[@Name='Error']">
index bc5c7a1e758e6fdbce4e316c3638b5eb8a5a1969..9fbadd034b7b7af12455bdf997ab62f75ce95546 100644 (file)
@@ -69,6 +69,11 @@ Distance::Distance()
     : TrajectoryAnalysisModule(name, shortDescription),
       meanLength_(0.1), lengthDev_(1.0), binWidth_(0.001)
 {
+    summaryStatsModule_.reset(new AnalysisDataAverageModule());
+    summaryStatsModule_->setAverageDataSets(true);
+    distances_.addModule(summaryStatsModule_);
+    allStatsModule_.reset(new AnalysisDataAverageModule());
+    distances_.addModule(allStatsModule_);
     averageModule_.reset(new AnalysisDataFrameAverageModule());
     distances_.addModule(averageModule_);
     histogramModule_.reset(new AnalysisDataSimpleHistogramModule());
@@ -76,6 +81,8 @@ Distance::Distance()
 
     registerAnalysisDataset(&distances_, "dist");
     registerAnalysisDataset(&xyz_, "xyz");
+    registerBasicDataset(summaryStatsModule_.get(), "stats");
+    registerBasicDataset(allStatsModule_.get(), "allstats");
     registerBasicDataset(averageModule_.get(), "average");
     registerBasicDataset(&histogramModule_->averager(), "histogram");
 }
@@ -103,6 +110,8 @@ Distance::initOptions(Options *options, TrajectoryAnalysisSettings * /*settings*
         "[TT]-oh[tt] writes a histogram of the distances for each selection.",
         "The location of the histogram is set with [TT]-len[tt] and",
         "[TT]-tol[tt]. Bin width is set with [TT]-binw[tt].",
+        "[TT]-oallstat[tt] writes out the average and standard deviation for",
+        "each individual distance, calculated over the frames."
     };
 
     options->setDescription(concatenateStrings(desc));
@@ -119,6 +128,9 @@ Distance::initOptions(Options *options, TrajectoryAnalysisSettings * /*settings*
     options->addOption(FileNameOption("oh").filetype(eftPlot).outputFile()
                            .store(&fnHistogram_).defaultBasename("disthist")
                            .description("Histogram of the distances"));
+    options->addOption(FileNameOption("oallstat").filetype(eftPlot).outputFile()
+                           .store(&fnAllStats_).defaultBasename("diststat")
+                           .description("Statistics for individual distances"));
     // TODO: Consider what is the best way to support dynamic selections.
     // Again, most of the code already supports it, but it needs to be
     // considered how should -oall work, and additional checks should be added.
@@ -227,6 +239,20 @@ Distance::initAnalysis(const TrajectoryAnalysisSettings &settings,
         // TODO: Add legends
         histogramModule_->averager().addModule(plotm);
     }
+
+    if (!fnAllStats_.empty())
+    {
+        AnalysisDataPlotModulePointer plotm(
+                new AnalysisDataPlotModule(settings.plotSettings()));
+        plotm->setFileName(fnAllStats_);
+        plotm->setErrorsAsSeparateColumn(true);
+        plotm->setTitle("Statistics for individual distances");
+        plotm->setXLabel("Distance index");
+        plotm->setYLabel("Average/standard deviation (nm)");
+        // TODO: Add legends
+        // TODO: Consider whether this output format is the best possible.
+        allStatsModule_->addModule(plotm);
+    }
 }
 
 
@@ -281,9 +307,18 @@ Distance::finishAnalysis(int /*nframes*/)
 void
 Distance::writeOutput()
 {
-    // TODO: Print bond length statistics
-    //fprintf(stderr, "Average distance: %f\n", avem_->average(0));
-    //fprintf(stderr, "Std. deviation:   %f\n", avem_->stddev(0));
+    SelectionList::const_iterator sel;
+    int                           index;
+    for (sel = sel_.begin(), index = 0; sel != sel_.end(); ++sel, ++index)
+    {
+        printf("%s:\n", sel->name());
+        printf("  Number of samples:  %d\n",
+               summaryStatsModule_->sampleCount(index, 0));
+        printf("  Average distance:   %-6.3f nm\n",
+               summaryStatsModule_->average(index, 0));
+        printf("  Standard deviation: %-6.3f nm\n",
+               summaryStatsModule_->standardDeviation(index, 0));
+    }
 }
 
 } // namespace analysismodules
index 309a61965bcd8098422b9eb35d33062724d1756d..6fc6d7c423b2ff2d5d208f21368663be277980cc 100644 (file)
@@ -82,12 +82,15 @@ class Distance : public TrajectoryAnalysisModule
         std::string                              fnAll_;
         std::string                              fnXYZ_;
         std::string                              fnHistogram_;
+        std::string                              fnAllStats_;
         double                                   meanLength_;
         double                                   lengthDev_;
         double                                   binWidth_;
 
         AnalysisData                             distances_;
         AnalysisData                             xyz_;
+        AnalysisDataAverageModulePointer         summaryStatsModule_;
+        AnalysisDataAverageModulePointer         allStatsModule_;
         AnalysisDataFrameAverageModulePointer    averageModule_;
         AnalysisDataSimpleHistogramModulePointer histogramModule_;
 
index 8b6ced9e19cfddc319365b59ee4133e79a0ee3af..10338826d05c78a759b51a4f18384a1279f053e8 100644 (file)
@@ -347,16 +347,16 @@ void
 FreeVolume::writeOutput()
 {
     // Final results come from statistics module in analysis framework
-    double FVaver  = adata_->average(0);
-    double FVerror = adata_->stddev(0);
+    double FVaver  = adata_->average(0, 0);
+    double FVerror = adata_->standardDeviation(0, 0);
     printf("Free volume %.2f +/- %.2f %%\n", FVaver, FVerror);
 
-    double Vaver  = adata_->average(1);
-    double Verror = adata_->stddev(1);
+    double Vaver  = adata_->average(0, 1);
+    double Verror = adata_->standardDeviation(0, 1);
     printf("Total volume %.2f +/- %.2f nm^3\n", Vaver, Verror);
 
     printf("Number of molecules %d total mass %.2f Dalton\n", nmol_, mtot_);
-    double RhoAver  = mtot_ / (adata_->average(1) * 1e-24 * AVOGADRO);
+    double RhoAver  = mtot_ / (Vaver * 1e-24 * AVOGADRO);
     double RhoError = sqr(RhoAver / Vaver)*Verror;
     printf("Average molar mass: %.2f Dalton\n", mtot_/nmol_);
 
index 56137bce3a6bc64c577abdbff42df443e608d5e7..12f5ee13801d0ef647058505f17973de15d873db 100644 (file)
@@ -634,7 +634,7 @@ Select::writeOutput()
             ConstArrayRef<int>::const_iterator ai;
             for (ai = atomIndices.begin(); ai != atomIndices.end(); ++ai)
             {
-                pdbinfo[*ai].occup = occupancyModule_->average(i);
+                pdbinfo[*ai].occup = occupancyModule_->average(0, i);
             }
         }
 
@@ -665,7 +665,7 @@ Select::writeOutput()
             std::vector<int> indices;
             for (int i = 0; i < sel_[0].posCount(); ++i)
             {
-                if (occupancyModule_->average(i) > 0)
+                if (occupancyModule_->average(0, i) > 0)
                 {
                     ConstArrayRef<int>                 atomIndices = sel_[0].position(i).atomIndices();
                     ConstArrayRef<int>::const_iterator ai;
index 081d2c0b52b91e75affcf13aa10c6fa1af5775ed..502ab46e2b1db20a9d3c4f7e8ffc16997f596a03 100644 (file)
@@ -3,6 +3,58 @@
 <ReferenceData>
   <String Name="CommandLine">distance -select 'atomname S1 S2' -len 2 -binw 0.5</String>
   <OutputData Name="Data">
+    <AnalysisData Name="allstats">
+      <DataFrame Name="Frame0">
+        <Real Name="X">0.000000</Real>
+        <DataValues>
+          <Int Name="Count">1</Int>
+          <DataValue>
+            <Real Name="Value">1.000000</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+      <DataFrame Name="Frame1">
+        <Real Name="X">1.000000</Real>
+        <DataValues>
+          <Int Name="Count">1</Int>
+          <DataValue>
+            <Real Name="Value">1.000000</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+      <DataFrame Name="Frame2">
+        <Real Name="X">2.000000</Real>
+        <DataValues>
+          <Int Name="Count">1</Int>
+          <DataValue>
+            <Real Name="Value">3.162278</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+      <DataFrame Name="Frame3">
+        <Real Name="X">3.000000</Real>
+        <DataValues>
+          <Int Name="Count">1</Int>
+          <DataValue>
+            <Real Name="Value">1.000000</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+      <DataFrame Name="Frame4">
+        <Real Name="X">4.000000</Real>
+        <DataValues>
+          <Int Name="Count">1</Int>
+          <DataValue>
+            <Real Name="Value">1.000000</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+    </AnalysisData>
     <AnalysisData Name="average">
       <DataFrame Name="Frame0">
         <Real Name="X">0.000000</Real>
         </DataValues>
       </DataFrame>
     </AnalysisData>
+    <AnalysisData Name="stats">
+      <DataFrame Name="Frame0">
+        <Real Name="X">0.000000</Real>
+        <DataValues>
+          <Int Name="Count">1</Int>
+          <DataValue>
+            <Real Name="Value">1.432456</Real>
+            <Real Name="Error">0.967000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+    </AnalysisData>
     <AnalysisData Name="xyz">
       <DataFrame Name="Frame0">
         <Real Name="X">0.000000</Real>
index cfc29c5c703525daa361a2c4bbdc91f76aedc7d9..bafee7cf761b4f49a887e8f21c46825306fd713c 100644 (file)
@@ -3,6 +3,79 @@
 <ReferenceData>
   <String Name="CommandLine">distance -select 'atomname S1 S2' 'resindex 1 to 4 and atomname CB merge resindex 2 to 5 and atomname CB' -len 2 -binw 0.5</String>
   <OutputData Name="Data">
+    <AnalysisData Name="allstats">
+      <DataFrame Name="Frame0">
+        <Real Name="X">0.000000</Real>
+        <DataValues>
+          <Int Name="Count">2</Int>
+          <DataValue>
+            <Real Name="Value">1.000000</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">3.000000</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+      <DataFrame Name="Frame1">
+        <Real Name="X">1.000000</Real>
+        <DataValues>
+          <Int Name="Count">2</Int>
+          <DataValue>
+            <Real Name="Value">1.000000</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">1.414214</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+      <DataFrame Name="Frame2">
+        <Real Name="X">2.000000</Real>
+        <DataValues>
+          <Int Name="Count">2</Int>
+          <DataValue>
+            <Real Name="Value">3.162278</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">1.414214</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+      <DataFrame Name="Frame3">
+        <Real Name="X">3.000000</Real>
+        <DataValues>
+          <Int Name="Count">2</Int>
+          <DataValue>
+            <Real Name="Value">1.000000</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">1.414214</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+      <DataFrame Name="Frame4">
+        <Real Name="X">4.000000</Real>
+        <DataValues>
+          <Int Name="Count">2</Int>
+          <DataValue>
+            <Real Name="Value">1.000000</Real>
+            <Real Name="Error">0.000000</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
+            <Bool Name="Present">false</Bool>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+    </AnalysisData>
     <AnalysisData Name="average">
       <DataFrame Name="Frame0">
         <Real Name="X">0.000000</Real>
         </DataValues>
       </DataFrame>
     </AnalysisData>
+    <AnalysisData Name="stats">
+      <DataFrame Name="Frame0">
+        <Real Name="X">0.000000</Real>
+        <DataValues>
+          <Int Name="Count">1</Int>
+          <DataValue>
+            <Real Name="Value">1.432456</Real>
+            <Real Name="Error">0.967000</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+      <DataFrame Name="Frame1">
+        <Real Name="X">1.000000</Real>
+        <DataValues>
+          <Int Name="Count">1</Int>
+          <DataValue>
+            <Real Name="Value">1.810660</Real>
+            <Real Name="Error">0.792893</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+    </AnalysisData>
     <AnalysisData Name="xyz">
       <DataFrame Name="Frame0">
         <Real Name="X">0.000000</Real>
index 962856f019ae31a6017749cbd66c0a0c86cabb7d..617e4789802d820b23a18a54eebd9f13436ba68d 100644 (file)
       <DataFrame Name="Frame0">
         <Real Name="X">1.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame1">
         <Real Name="X">2.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame2">
         <Real Name="X">3.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame3">
         <Real Name="X">4.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame4">
         <Real Name="X">5.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame5">
         <Real Name="X">6.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame6">
         <Real Name="X">7.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame7">
         <Real Name="X">8.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame8">
         <Real Name="X">9.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame9">
         <Real Name="X">10.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame10">
         <Real Name="X">11.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
-          </DataValue>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame11">
         <Real Name="X">12.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame12">
         <Real Name="X">13.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame13">
         <Real Name="X">14.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame14">
         <Real Name="X">15.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
-          </DataValue>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
index e41478da2d6987b244699dfff95354a9eca29579..f4bf8cf2c7ce4a7f8d256ef25fb15e0ae6590e26 100644 (file)
       <DataFrame Name="Frame0">
         <Real Name="X">1.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame1">
         <Real Name="X">2.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame2">
         <Real Name="X">3.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame3">
         <Real Name="X">4.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame4">
         <Real Name="X">5.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame5">
         <Real Name="X">6.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame6">
         <Real Name="X">7.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame7">
         <Real Name="X">8.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame8">
         <Real Name="X">9.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
-          </DataValue>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
index b53341d8144a891ac1cb91330e9126fe692af446..e0d25925f9dafe2d663b8120e5fc13cf04e1441e 100644 (file)
       <DataFrame Name="Frame0">
         <Real Name="X">1.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame1">
         <Real Name="X">2.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame2">
         <Real Name="X">3.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame3">
         <Real Name="X">4.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame4">
         <Real Name="X">5.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame5">
         <Real Name="X">6.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame6">
         <Real Name="X">7.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame7">
         <Real Name="X">8.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame8">
         <Real Name="X">9.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
-          </DataValue>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
index 695c7276549d3025eff5d0b51b9ecb948c0e52d8..88a406a65f8402d7810c224a457d0cfa769619fc 100644 (file)
       <DataFrame Name="Frame0">
         <Real Name="X">1.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame1">
         <Real Name="X">2.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame2">
         <Real Name="X">3.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame3">
         <Real Name="X">4.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame4">
         <Real Name="X">5.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame5">
         <Real Name="X">6.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame6">
         <Real Name="X">7.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame7">
         <Real Name="X">8.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame8">
         <Real Name="X">9.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
-          </DataValue>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
index af440d331b54f8548e6dd0625dbcda9d1de4a827..030bd0d310f33a42bdecdc650a0d3914851429aa 100644 (file)
       <DataFrame Name="Frame0">
         <Real Name="X">1.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame1">
         <Real Name="X">2.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame2">
         <Real Name="X">3.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame3">
         <Real Name="X">4.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame4">
         <Real Name="X">5.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame5">
         <Real Name="X">6.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame6">
         <Real Name="X">7.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">1.000000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame7">
         <Real Name="X">8.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.500000</Real>
-          </DataValue>
-          <DataValue>
-            <Real Name="Value">0.707107</Real>
+            <Real Name="Error">0.707107</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
       <DataFrame Name="Frame8">
         <Real Name="X">9.000000</Real>
         <DataValues>
-          <Int Name="Count">2</Int>
-          <DataValue>
-            <Real Name="Value">0.000000</Real>
-          </DataValue>
+          <Int Name="Count">1</Int>
           <DataValue>
             <Real Name="Value">0.000000</Real>
+            <Real Name="Error">0.000000</Real>
           </DataValue>
         </DataValues>
       </DataFrame>
index 99060e985b9a4c5cfd7c47479aec0ef3bf6a147e..9223385238c2e5c31edd3d1071226396511a3791 100644 (file)
@@ -54,6 +54,14 @@ and use the copy_xsl.sh script to copy it to relevant locations.
     </table>
 </xsl:template>
 
+<xsl:template match="DataValue[Bool[@Name='Present']='false']">
+    (
+    <xsl:value-of select="Real[@Name='Value']"/>
+    <xsl:if test="Real[@Name='Error']">
+        &#177; <xsl:value-of select="Real[@Name='Error']"/>
+    </xsl:if>
+    )
+</xsl:template>
 <xsl:template match="DataValue">
     <xsl:value-of select="Real[@Name='Value']"/>
     <xsl:if test="Real[@Name='Error']">
index 99060e985b9a4c5cfd7c47479aec0ef3bf6a147e..9223385238c2e5c31edd3d1071226396511a3791 100644 (file)
@@ -54,6 +54,14 @@ and use the copy_xsl.sh script to copy it to relevant locations.
     </table>
 </xsl:template>
 
+<xsl:template match="DataValue[Bool[@Name='Present']='false']">
+    (
+    <xsl:value-of select="Real[@Name='Value']"/>
+    <xsl:if test="Real[@Name='Error']">
+        &#177; <xsl:value-of select="Real[@Name='Error']"/>
+    </xsl:if>
+    )
+</xsl:template>
 <xsl:template match="DataValue">
     <xsl:value-of select="Real[@Name='Value']"/>
     <xsl:if test="Real[@Name='Error']">
index 4a4cbccef16defaa1e7b70f15981f52d018196b2..ec583a25fc0c5129f0f8689b6fa8a51dbe11546c 100644 (file)
@@ -586,7 +586,8 @@ void
 MockAnalysisDataModule::setupReferenceCheck(const TestReferenceChecker &checker,
                                             AbstractAnalysisData       *source)
 {
-    impl_->flags_ |= efAllowMulticolumn | efAllowMultipoint | efAllowMultipleDataSets;
+    impl_->flags_ |= efAllowMulticolumn | efAllowMultipoint | efAllowMissing
+        | efAllowMultipleDataSets;
 
     impl_->rootChecker_.reset(new TestReferenceChecker(checker));
     // Google Mock does not support checking the order fully, because