/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013, by the GROMACS development team, led by
* David van der Spoel, Berk Hess, Erik Lindahl, and including many
* others, as listed in the AUTHORS file in the top-level source
* directory and at http://www.gromacs.org.
#include "gromacs/analysisdata/dataframe.h"
#include "gromacs/analysisdata/datastorage.h"
+#include "frameaverager.h"
+
namespace gmx
{
* AnalysisDataAverageModule
*/
+class AnalysisDataAverageModule::Impl
+{
+ public:
+ //! Averaging helper object.
+ AnalysisDataFrameAverager averager_;
+};
+
AnalysisDataAverageModule::AnalysisDataAverageModule()
+ : impl_(new Impl())
{
setColumnCount(2);
}
void
AnalysisDataAverageModule::dataStarted(AbstractAnalysisData *data)
{
- int nrows = data->columnCount();
- setRowCount(nrows);
- allocateValues();
- nsamples_.resize(nrows);
+ const int valueCount = data->columnCount();
+ impl_->averager_.setColumnCount(valueCount);
+ setRowCount(valueCount);
}
void
void
AnalysisDataAverageModule::pointsAdded(const AnalysisDataPointSetRef &points)
{
- int firstcol = points.firstColumn();
- for (int i = 0; i < points.columnCount(); ++i)
- {
- if (points.present(i))
- {
- real y = points.y(i);
- value(firstcol + i, 0) += y;
- value(firstcol + i, 1) += y * y;
- nsamples_[firstcol + i] += 1;
- }
- }
+ impl_->averager_.addPoints(points);
}
void
void
AnalysisDataAverageModule::dataFinished()
{
+ impl_->averager_.finish();
+ allocateValues();
for (int i = 0; i < rowCount(); ++i)
{
- real ave = value(i, 0) / nsamples_[i];
- real std = sqrt(value(i, 1) / nsamples_[i] - ave * ave);
- setValue(i, 0, ave);
- setValue(i, 1, std);
+ setValue(i, 0, impl_->averager_.average(i));
+ setValue(i, 1, sqrt(impl_->averager_.variance(i)));
}
valuesReady();
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013, by the GROMACS development team, led by
* David van der Spoel, Berk Hess, Erik Lindahl, and including many
* others, as listed in the AUTHORS file in the top-level source
* directory and at http://www.gromacs.org.
{
/*! \brief
- * Data module for simple averaging of columns.
+ * Data module for independently averaging each column in input data.
*
- * Output data contains a frame for each column of input data.
- * There are two columns: the average and standard deviation of
- * that column.
- * The data becomes available only after the original data has been
- * finished.
+ * Computes the average and standard deviation independently for each column in
+ * the input data. Multipoint data and missing data points are both supported.
+ * The average is always calculated over all frames and data points for a
+ * column.
*
- * Multipoint data and missing data points are both supported. The average
- * is always calculated over all data points present in a column.
+ * 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.
+ *
+ * The output data becomes available only after the input data has been
+ * finished.
*
* \inpublicapi
* \ingroup module_analysisdata
real stddev(int index) const;
private:
- std::vector<int> nsamples_;
+ class Impl;
- // Copy and assign disallowed by base.
+ PrivateImplPointer<Impl> impl_;
};
//! Smart pointer to manage an AnalysisDataAverageModule object.
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2013, by the GROMACS development team, led by
+ * David van der Spoel, Berk Hess, Erik Lindahl, and including many
+ * others, as listed in the AUTHORS file in the top-level source
+ * directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief
+ * Implements gmx::AnalysisDataFrameAverager.
+ *
+ * \author Teemu Murtola <teemu.murtola@gmail.com>
+ * \ingroup module_analysisdata
+ */
+#include "frameaverager.h"
+
+#include "gromacs/analysisdata/dataframe.h"
+#include "gromacs/utility/gmxassert.h"
+
+namespace gmx
+{
+
+void AnalysisDataFrameAverager::setColumnCount(int columnCount)
+{
+ GMX_RELEASE_ASSERT(columnCount >= 0, "Invalid column count");
+ GMX_RELEASE_ASSERT(values_.empty(),
+ "Cannot initialize multiple times");
+ values_.resize(columnCount);
+}
+
+void AnalysisDataFrameAverager::addValue(int index, real value)
+{
+ AverageItem &item = values_[index];
+ const double delta = value - item.average;
+ item.samples += 1;
+ item.average += delta / item.samples;
+ item.squaredSum += delta * (value - item.average);
+}
+
+void AnalysisDataFrameAverager::addPoints(const AnalysisDataPointSetRef &points)
+{
+ const int firstColumn = points.firstColumn();
+ GMX_ASSERT(static_cast<size_t>(firstColumn + points.columnCount()) <= values_.size(),
+ "Initialized with too few columns");
+ for (int i = 0; i < points.columnCount(); ++i)
+ {
+ if (points.present(i))
+ {
+ addValue(firstColumn + i, points.y(i));
+ }
+ }
+
+}
+
+void AnalysisDataFrameAverager::finish()
+{
+ bFinished_ = true;
+}
+
+} // namespace gmx
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2013, by the GROMACS development team, led by
+ * David van der Spoel, Berk Hess, Erik Lindahl, and including many
+ * others, as listed in the AUTHORS file in the top-level source
+ * directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief
+ * Declares gmx::AnalysisDataFrameAverager.
+ *
+ * \author Teemu Murtola <teemu.murtola@gmail.com>
+ * \ingroup module_analysisdata
+ */
+#ifndef GMX_ANALYSISDATA_MODULES_FRAMEAVERAGER_H
+#define GMX_ANALYSISDATA_MODULES_FRAMEAVERAGER_H
+
+#include <vector>
+
+#include "../../legacyheaders/types/simple.h"
+
+#include "../../utility/gmxassert.h"
+
+namespace gmx
+{
+
+class AnalysisDataPointSetRef;
+
+/*! \internal \brief
+ * Helper class for modules that average values over frames.
+ *
+ * This class implements common functionality for analysis data modules that
+ * need to average a set of values over frames. Currently, it is designed for
+ * computing averages for each input column independently, but should be
+ * relatively easy to make more general if required.
+ *
+ * This class takes care of accumulating the values and computing their
+ * variance. It allows different number of samples for each input column.
+ * Accumulation is always in double precision and uses a formula that is
+ * relatively stable numerically. For now, does nothing fancy,
+ * but provides ground for other implementation (e.g., related to
+ * parallelization) that would benefit all such modules.
+ *
+ * Methods in this class do not throw unless otherwise indicated.
+ *
+ * \ingroup module_analysisdata
+ */
+class AnalysisDataFrameAverager
+{
+ public:
+ AnalysisDataFrameAverager() : bFinished_(false) {}
+
+ /*! \brief
+ * Sets the number of columns in the input data.
+ *
+ * \throws std::bad_alloc if out of memory.
+ *
+ * Typically called from AnalysisDataModuleInterface::dataStarted().
+ *
+ * Must be called exactly once, before setting calling any other method
+ * in the class.
+ */
+ void setColumnCount(int columnCount);
+ /*! \brief
+ * Adds a single value to the average for a given column.
+ *
+ * \param[in] index Index of the column to add the value to.
+ * \param[in] value Value to add to the sample.
+ */
+ void addValue(int index, real value);
+ /*! \brief
+ * Accumulates data from a given point set into the average.
+ *
+ * Typically called from AnalysisDataModuleInterface::pointsAdded().
+ *
+ * Each call accumulates the values for those columns that are present
+ * in the point set. Can be called multiple times for a frame, and
+ * does not need to be called for every frame.
+ */
+ void addPoints(const AnalysisDataPointSetRef &points);
+ /*! \brief
+ * Finalizes the calculation of the averages and variances.
+ *
+ * Does any computation that is not done during the accumulation in
+ * addPoints(). Currently, does nothing, but provided as a placeholder
+ * for more complex implementation.
+ *
+ * Typically called from AnalysisDataModuleInterface::dataFinished().
+ */
+ void finish();
+
+ /*! \brief
+ * Returns the computed average for a given column.
+ *
+ * If called before finish(), the results are undefined.
+ */
+ real average(int index) const
+ {
+ GMX_ASSERT(index >= 0 && index <= static_cast<int>(values_.size()),
+ "Invalid column index");
+ GMX_ASSERT(bFinished_,
+ "Values available only after finished() has been called");
+ return values_[index].average;
+ }
+ /*! \brief
+ * Returns the computed (sample) variance for a given column.
+ *
+ * If called before finish(), the results are undefined.
+ */
+ real variance(int index) const
+ {
+ GMX_ASSERT(index >= 0 && index <= static_cast<int>(values_.size()),
+ "Invalid column index");
+ GMX_ASSERT(bFinished_,
+ "Values available only after finished() has been called");
+ const AverageItem &item = values_[index];
+ return item.samples > 1 ? item.squaredSum / (item.samples - 1) : 0.0;
+ }
+ /*! \brief
+ * Returns the number of samples for a given column.
+ *
+ * If called before finish(), the results are undefined.
+ */
+ int sampleCount(int index) const
+ {
+ GMX_ASSERT(index >= 0 && index <= static_cast<int>(values_.size()),
+ "Invalid column index");
+ GMX_ASSERT(bFinished_,
+ "Values available only after finished() has been called");
+ return values_[index].samples;
+ }
+
+ private:
+ struct AverageItem
+ {
+ AverageItem() : average(0.0), squaredSum(0.0), samples(0) {}
+
+ //! Average of the values so far.
+ double average;
+ //! Sum of squared deviations from the average for values so far.
+ double squaredSum;
+ //! Number of values so far.
+ int samples;
+ };
+
+ std::vector<AverageItem> values_;
+ bool bFinished_;
+};
+
+} // namespace gmx
+
+#endif
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013, by the GROMACS development team, led by
* David van der Spoel, Berk Hess, Erik Lindahl, and including many
* others, as listed in the AUTHORS file in the top-level source
* directory and at http://www.gromacs.org.
#include "gromacs/utility/exceptions.h"
#include "gromacs/utility/gmxassert.h"
+#include "frameaverager.h"
+
namespace
{
virtual void dataFinished();
private:
- //! Number of frames accumulated so far.
- int frameCount_;
+ //! Averaging helper object.
+ AnalysisDataFrameAverager averager_;
// Copy and assign disallowed by base.
};
BasicAverageHistogramModule::BasicAverageHistogramModule()
- : frameCount_(0)
{
setColumnCount(2);
}
BasicAverageHistogramModule::BasicAverageHistogramModule(
const AnalysisHistogramSettings &settings)
- : AbstractAverageHistogram(settings), frameCount_(0)
+ : AbstractAverageHistogram(settings)
{
setColumnCount(2);
}
{
GMX_RELEASE_ASSERT(rowCount() == data->columnCount(),
"Inconsistent data sizes, something is wrong in the initialization");
- allocateValues();
+ averager_.setColumnCount(rowCount());
}
void
BasicAverageHistogramModule::pointsAdded(const AnalysisDataPointSetRef &points)
{
- int firstcol = points.firstColumn();
- for (int i = 0; i < points.columnCount(); ++i)
- {
- real y = points.y(i);
- value(firstcol + i, 0) += y;
- value(firstcol + i, 1) += y * y;
- }
+ averager_.addPoints(points);
}
void
BasicAverageHistogramModule::frameFinished(const AnalysisDataFrameHeader & /*header*/)
{
- ++frameCount_;
}
void
BasicAverageHistogramModule::dataFinished()
{
+ averager_.finish();
+ allocateValues();
for (int i = 0; i < rowCount(); ++i)
{
- real ave = value(i, 0) / frameCount_;
- real std = sqrt(value(i, 1) / frameCount_ - ave * ave);
- setValue(i, 0, ave);
- setValue(i, 1, std);
+ setValue(i, 0, averager_.average(i));
+ setValue(i, 1, sqrt(averager_.variance(i)));
}
}
* AnalysisDataBinAverageModule
*/
+class AnalysisDataBinAverageModule::Impl
+{
+ public:
+ Impl() {}
+ explicit Impl(const AnalysisHistogramSettings &settings)
+ : settings_(settings)
+ {
+ }
+
+ //! Histogram settings.
+ AnalysisHistogramSettings settings_;
+ //! Averaging helper object.
+ AnalysisDataFrameAverager averager_;
+};
+
AnalysisDataBinAverageModule::AnalysisDataBinAverageModule()
+ : impl_(new Impl())
{
setColumnCount(3);
}
AnalysisDataBinAverageModule::AnalysisDataBinAverageModule(
const AnalysisHistogramSettings &settings)
- : settings_(settings)
+ : impl_(new Impl(settings))
{
setColumnCount(3);
setRowCount(settings.binCount());
void
AnalysisDataBinAverageModule::init(const AnalysisHistogramSettings &settings)
{
- settings_ = settings;
+ impl_->settings_ = settings;
setRowCount(settings.binCount());
setXAxis(settings.firstEdge() + 0.5 * settings.binWidth(),
settings.binWidth());
}
+const AnalysisHistogramSettings &
+AnalysisDataBinAverageModule::settings() const
+{
+ return impl_->settings_;
+}
+
+
int
AnalysisDataBinAverageModule::flags() const
{
void
AnalysisDataBinAverageModule::dataStarted(AbstractAnalysisData * /*data*/)
{
- allocateValues();
+ impl_->averager_.setColumnCount(rowCount());
}
{
for (int i = 1; i < points.columnCount(); ++i)
{
- real y = points.y(i);
- value(bin, 0) += y;
- value(bin, 1) += y * y;
+ impl_->averager_.addValue(bin, points.y(i));
}
- value(bin, 2) += points.columnCount() - 1;
}
}
void
AnalysisDataBinAverageModule::dataFinished()
{
+ impl_->averager_.finish();
+ allocateValues();
for (int i = 0; i < settings().binCount(); ++i)
{
- real n = value(i, 2);
- if (n > 0)
- {
- real ave = value(i, 0) / n;
- real std = sqrt(value(i, 1) / n - ave * ave);
- setValue(i, 0, ave);
- setValue(i, 1, std);
- }
+ setValue(i, 0, impl_->averager_.average(i));
+ setValue(i, 1, std::sqrt(impl_->averager_.variance(i)));
+ setValue(i, 2, impl_->averager_.sampleCount(i));
}
valuesReady();
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013, by the GROMACS development team, led by
* David van der Spoel, Berk Hess, Erik Lindahl, and including many
* others, as listed in the AUTHORS file in the top-level source
* directory and at http://www.gromacs.org.
void init(const AnalysisHistogramSettings &settings);
//! \copydoc AnalysisDataSimpleHistogramModule::settings()
- const AnalysisHistogramSettings &settings() const { return settings_; }
+ const AnalysisHistogramSettings &settings() const;
virtual int flags() const;
virtual void dataFinished();
private:
- AnalysisHistogramSettings settings_;
+ class Impl;
+
+ PrivateImplPointer<Impl> impl_;
// Copy and assign disallowed by base.
};
<Real Name="Value">1.000000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.816497</Real>
+ <Real Name="Value">1.000000</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.666667</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.471404</Real>
+ <Real Name="Value">0.577350</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.000000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.816497</Real>
+ <Real Name="Value">1.000000</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.000000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.816497</Real>
+ <Real Name="Value">1.000000</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.666667</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.471404</Real>
+ <Real Name="Value">0.577350</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.000000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.816497</Real>
+ <Real Name="Value">1.000000</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.333333</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.745356</Real>
+ <Real Name="Value">0.816497</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.577350</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.000000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">1.000000</Real>
+ <Real Name="Value">1.414214</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.250000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.433013</Real>
+ <Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
<Real Name="Value">4.000000</Real>
<Real Name="Value">2.000000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">1.000000</Real>
+ <Real Name="Value">1.414214</Real>
</DataValue>
<DataValue>
<Real Name="Value">2.000000</Real>
<Real Name="Value">1.100000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.489898</Real>
+ <Real Name="Value">0.547723</Real>
</DataValue>
<DataValue>
<Real Name="Value">5.000000</Real>
<Real Name="Value">2.000000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">1.000000</Real>
+ <Real Name="Value">1.414214</Real>
</DataValue>
<DataValue>
<Real Name="Value">2.000000</Real>
<Real Name="Value">1.250000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.750000</Real>
+ <Real Name="Value">1.060660</Real>
</DataValue>
<DataValue>
<Real Name="Value">2.000000</Real>
<Real Name="Value">1.333333</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.471404</Real>
+ <Real Name="Value">0.577350</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.666667</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.471404</Real>
+ <Real Name="Value">0.577350</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.333333</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.471405</Real>
+ <Real Name="Value">0.577350</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.666667</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.471405</Real>
+ <Real Name="Value">0.577350</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.666667</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.471404</Real>
+ <Real Name="Value">0.577350</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.666667</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.471404</Real>
+ <Real Name="Value">0.577350</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.666667</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.942809</Real>
+ <Real Name="Value">1.154701</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.333333</Real>
</DataValue>
<DataValue>
- <Real Name="Value">1.247219</Real>
+ <Real Name="Value">1.527525</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.666667</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.942809</Real>
+ <Real Name="Value">1.154701</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.833333</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.849837</Real>
+ <Real Name="Value">1.040833</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">1.333333</Real>
</DataValue>
<DataValue>
- <Real Name="Value">1.247219</Real>
+ <Real Name="Value">1.527525</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.833333</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.849837</Real>
+ <Real Name="Value">1.040833</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.012500</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.004167</Real>
+ <Real Name="Value">0.005893</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.002083</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.002083</Real>
+ <Real Name="Value">0.002946</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.002083</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.002083</Real>
+ <Real Name="Value">0.002946</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>
<Real Name="Value">0.500000</Real>
</DataValue>
<DataValue>
- <Real Name="Value">0.500000</Real>
+ <Real Name="Value">0.707107</Real>
</DataValue>
</Sequence>
</DataFrame>