Improve gmx sasa tests and clean up -or handling
authorTeemu Murtola <teemu.murtola@gmail.com>
Mon, 10 Aug 2015 19:06:10 +0000 (22:06 +0300)
committerGerrit Code Review <gerrit@gerrit.gromacs.org>
Mon, 12 Oct 2015 08:16:39 +0000 (10:16 +0200)
Use the new xvg testing machinery to test the X axes of -oa and -or
(this was broken before a recent fix in release-5-0), as well as the
legends in all the xvg files.  Add one test that creates non-uniform
axes for the -oa and -or plots.

Simplify the code that produces the -or X axis by removing one state
variable.  Fix assertion in arraydata.cpp that was supposed to prevent
the original bug of incorrect axis initialization.

Make the reference data xslt files show the xvg data as HTML.
Improve handling of xvg values by preserving the string representation
from the xvg file in the reference data, which makes the HTML output
nicer and makes the xvg comparison work better when the precision of the
code changes.

Change-Id: I2cbe9646fddef705c8825c9c82de869d3205892c

15 files changed:
src/gromacs/analysisdata/arraydata.cpp
src/gromacs/analysisdata/tests/refdata/common-referencedata.xsl
src/gromacs/selection/tests/refdata/common-referencedata.xsl
src/gromacs/trajectoryanalysis/modules/sasa.cpp
src/gromacs/trajectoryanalysis/tests/refdata/SasaModuleTest_BasicTest.xml
src/gromacs/trajectoryanalysis/tests/refdata/SasaModuleTest_HandlesSelectedResidues.xml [new file with mode: 0644]
src/gromacs/trajectoryanalysis/tests/refdata/common-referencedata.xsl
src/gromacs/trajectoryanalysis/tests/sasa.cpp
src/gromacs/utility/stringutil.h
src/testutils/common-referencedata.xsl
src/testutils/refdata-checkers.h
src/testutils/refdata.cpp
src/testutils/refdata.h
src/testutils/xvgtest.cpp
src/testutils/xvgtest.h

index 60d4c89cfd906f28eed43237355de96d97c0ca90..60a5b172d52191624e7c9217a7f6ecfd24abea26 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -104,7 +104,7 @@ AbstractAnalysisArrayData::setRowCount(int rowCount)
     GMX_RELEASE_ASSERT(rowCount > 0, "Invalid number of rows");
     GMX_RELEASE_ASSERT(!isAllocated(),
                        "Cannot change row count after data has been allocated");
-    GMX_RELEASE_ASSERT(bUniformX_ || rowCount_ == 0
+    GMX_RELEASE_ASSERT(bUniformX_ || xvalue_.empty()
                        || rowCount == static_cast<int>(xvalue_.size()),
                        "X axis set with setXAxisValue() does not match the row count");
     xvalue_.resize(rowCount);
index 91c7356b87fad8afbb19763aef0d06fc50e461f4..7101052da952cba55bafc81d6e7862f3d8162e9c 100644 (file)
@@ -88,6 +88,33 @@ and use the copy_xsl.sh script to copy it to relevant locations.
     </pre>
 </xsl:template>
 
+<xsl:template match="OutputFiles/File/XvgLegend/String[@Name='XvgLegend']">
+    <pre>
+        <xsl:value-of select="substring(.,2)"/>
+    </pre>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData">
+    <xsl:choose>
+        <xsl:when test="*">
+            <table>
+                <xsl:apply-templates />
+            </table>
+        </xsl:when>
+        <xsl:otherwise>Data omitted</xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData/Sequence">
+    <tr>
+        <xsl:apply-templates select="Real"/>
+    </tr>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData/Sequence/Real">
+    <td><xsl:value-of select="."/></td>
+</xsl:template>
+
 <xsl:template match="InteractiveSession">
     <pre>
         <xsl:for-each select="*">
index 91c7356b87fad8afbb19763aef0d06fc50e461f4..7101052da952cba55bafc81d6e7862f3d8162e9c 100644 (file)
@@ -88,6 +88,33 @@ and use the copy_xsl.sh script to copy it to relevant locations.
     </pre>
 </xsl:template>
 
+<xsl:template match="OutputFiles/File/XvgLegend/String[@Name='XvgLegend']">
+    <pre>
+        <xsl:value-of select="substring(.,2)"/>
+    </pre>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData">
+    <xsl:choose>
+        <xsl:when test="*">
+            <table>
+                <xsl:apply-templates />
+            </table>
+        </xsl:when>
+        <xsl:otherwise>Data omitted</xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData/Sequence">
+    <tr>
+        <xsl:apply-templates select="Real"/>
+    </tr>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData/Sequence/Real">
+    <td><xsl:value-of select="."/></td>
+</xsl:template>
+
 <xsl:template match="InteractiveSession">
     <pre>
         <xsl:for-each select="*">
index 2be0309da6dce913b7ad16c9f1bed556146b3131..e5627ef31ca470d93938ab56691b797ecb7e999e 100644 (file)
@@ -672,17 +672,18 @@ Sasa::initAnalysis(const TrajectoryAnalysisSettings &settings,
         }
         {
             AnalysisDataAverageModulePointer avem(new AnalysisDataAverageModule);
-            int prevResind = -1;
-            int row        = 0;
+            int nextRow = 0;
             for (int i = 0; i < surfaceSel_.posCount(); ++i)
             {
-                const int atomIndex     = surfaceSel_.position(i).atomIndices()[0];
-                const int residueIndex  = atoms.atom[atomIndex].resind;
-                if (residueIndex != prevResind)
+                const int residueGroup = surfaceSel_.position(i).mappedId();
+                if (residueGroup >= nextRow)
                 {
-                    avem->setXAxisValue(row, atoms.resinfo[residueIndex].nr);
-                    prevResind = residueIndex;
-                    ++row;
+                    GMX_ASSERT(residueGroup == nextRow,
+                               "Inconsistent (non-uniformly increasing) residue grouping");
+                    const int atomIndex    = surfaceSel_.position(i).atomIndices()[0];
+                    const int residueIndex = atoms.atom[atomIndex].resind;
+                    avem->setXAxisValue(nextRow, atoms.resinfo[residueIndex].nr);
+                    ++nextRow;
                 }
             }
             residueArea_.addModule(avem);
index 316a0a367abb97cd92f5094493b3d536ac0d39a7..89576ead9cf0bd87a75c6e0c7155cdad6be0539e 100644 (file)
     </AnalysisData>
   </OutputData>
   <OutputFiles Name="Files">
-    <File Name="-o"/>
-    <File Name="-or"/>
-    <File Name="-oa"/>
-    <File Name="-tv"/>
+    <File Name="-o">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Solvent Accessible Surface"
+xaxis  label "Time (ps)"
+yaxis  label "Area (nm\S2\N)"
+TYPE xy
+s0 legend "Total"
+s1 legend "name N CA C O H"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data"/>
+    </File>
+    <File Name="-or">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Area per residue over the trajectory"
+xaxis  label "Residue"
+yaxis  label "Area (nm\S2\N)"
+TYPE xy
+s0 legend "Average (nm\S2\N)"
+s1 legend "Standard deviation (nm\S2\N)"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">5</Int>
+          <Real>1</Real>
+          <Real>2.078</Real>
+          <Real>0.000</Real>
+          <Real>0.235</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">5</Int>
+          <Real>2</Real>
+          <Real>1.569</Real>
+          <Real>0.000</Real>
+          <Real>0.307</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">5</Int>
+          <Real>3</Real>
+          <Real>0.955</Real>
+          <Real>0.000</Real>
+          <Real>0.258</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">5</Int>
+          <Real>4</Real>
+          <Real>0.394</Real>
+          <Real>0.000</Real>
+          <Real>0.075</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row4">
+          <Int Name="Length">5</Int>
+          <Real>5</Real>
+          <Real>1.979</Real>
+          <Real>0.000</Real>
+          <Real>0.166</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row5">
+          <Int Name="Length">5</Int>
+          <Real>6</Real>
+          <Real>0.781</Real>
+          <Real>0.000</Real>
+          <Real>0.060</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row6">
+          <Int Name="Length">5</Int>
+          <Real>7</Real>
+          <Real>0.818</Real>
+          <Real>0.000</Real>
+          <Real>0.100</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row7">
+          <Int Name="Length">5</Int>
+          <Real>8</Real>
+          <Real>1.213</Real>
+          <Real>0.000</Real>
+          <Real>0.201</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row8">
+          <Int Name="Length">5</Int>
+          <Real>9</Real>
+          <Real>0.855</Real>
+          <Real>0.000</Real>
+          <Real>0.301</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row9">
+          <Int Name="Length">5</Int>
+          <Real>10</Real>
+          <Real>1.239</Real>
+          <Real>0.000</Real>
+          <Real>0.515</Real>
+          <Real>0.000</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+    <File Name="-oa">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Area per atom over the trajectory"
+xaxis  label "Atom"
+yaxis  label "Area (nm\S2\N)"
+TYPE xy
+s0 legend "Average (nm\S2\N)"
+s1 legend "Standard deviation (nm\S2\N)"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">5</Int>
+          <Real>1</Real>
+          <Real>0.034</Real>
+          <Real>0.000</Real>
+          <Real>0.034</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">5</Int>
+          <Real>2</Real>
+          <Real>0.212</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">5</Int>
+          <Real>3</Real>
+          <Real>0.239</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">5</Int>
+          <Real>4</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row4">
+          <Int Name="Length">5</Int>
+          <Real>5</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row5">
+          <Int Name="Length">5</Int>
+          <Real>6</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row6">
+          <Int Name="Length">5</Int>
+          <Real>7</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row7">
+          <Int Name="Length">5</Int>
+          <Real>8</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row8">
+          <Int Name="Length">5</Int>
+          <Real>9</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row9">
+          <Int Name="Length">5</Int>
+          <Real>10</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row10">
+          <Int Name="Length">5</Int>
+          <Real>11</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row11">
+          <Int Name="Length">5</Int>
+          <Real>12</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row12">
+          <Int Name="Length">5</Int>
+          <Real>13</Real>
+          <Real>0.038</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row13">
+          <Int Name="Length">5</Int>
+          <Real>14</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row14">
+          <Int Name="Length">5</Int>
+          <Real>15</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row15">
+          <Int Name="Length">5</Int>
+          <Real>16</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row16">
+          <Int Name="Length">5</Int>
+          <Real>17</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row17">
+          <Int Name="Length">5</Int>
+          <Real>18</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row18">
+          <Int Name="Length">5</Int>
+          <Real>19</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row19">
+          <Int Name="Length">5</Int>
+          <Real>20</Real>
+          <Real>0.053</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row20">
+          <Int Name="Length">5</Int>
+          <Real>21</Real>
+          <Real>0.239</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row21">
+          <Int Name="Length">5</Int>
+          <Real>22</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row22">
+          <Int Name="Length">5</Int>
+          <Real>23</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row23">
+          <Int Name="Length">5</Int>
+          <Real>24</Real>
+          <Real>0.201</Real>
+          <Real>0.000</Real>
+          <Real>0.201</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row24">
+          <Int Name="Length">5</Int>
+          <Real>25</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row25">
+          <Int Name="Length">5</Int>
+          <Real>26</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row26">
+          <Int Name="Length">5</Int>
+          <Real>27</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row27">
+          <Int Name="Length">5</Int>
+          <Real>28</Real>
+          <Real>0.027</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row28">
+          <Int Name="Length">5</Int>
+          <Real>29</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row29">
+          <Int Name="Length">5</Int>
+          <Real>30</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row30">
+          <Int Name="Length">5</Int>
+          <Real>31</Real>
+          <Real>0.113</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row31">
+          <Int Name="Length">5</Int>
+          <Real>32</Real>
+          <Real>0.212</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row32">
+          <Int Name="Length">5</Int>
+          <Real>33</Real>
+          <Real>0.053</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row33">
+          <Int Name="Length">5</Int>
+          <Real>34</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row34">
+          <Int Name="Length">5</Int>
+          <Real>35</Real>
+          <Real>0.113</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row35">
+          <Int Name="Length">5</Int>
+          <Real>36</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row36">
+          <Int Name="Length">5</Int>
+          <Real>37</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row37">
+          <Int Name="Length">5</Int>
+          <Real>38</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row38">
+          <Int Name="Length">5</Int>
+          <Real>39</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row39">
+          <Int Name="Length">5</Int>
+          <Real>40</Real>
+          <Real>0.201</Real>
+          <Real>0.000</Real>
+          <Real>0.201</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row40">
+          <Int Name="Length">5</Int>
+          <Real>41</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row41">
+          <Int Name="Length">5</Int>
+          <Real>42</Real>
+          <Real>0.053</Real>
+          <Real>0.000</Real>
+          <Real>0.053</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row42">
+          <Int Name="Length">5</Int>
+          <Real>43</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row43">
+          <Int Name="Length">5</Int>
+          <Real>44</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row44">
+          <Int Name="Length">5</Int>
+          <Real>45</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row45">
+          <Int Name="Length">5</Int>
+          <Real>46</Real>
+          <Real>0.027</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row46">
+          <Int Name="Length">5</Int>
+          <Real>47</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row47">
+          <Int Name="Length">5</Int>
+          <Real>48</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row48">
+          <Int Name="Length">5</Int>
+          <Real>49</Real>
+          <Real>0.038</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row49">
+          <Int Name="Length">5</Int>
+          <Real>50</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row50">
+          <Int Name="Length">5</Int>
+          <Real>51</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row51">
+          <Int Name="Length">5</Int>
+          <Real>52</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row52">
+          <Int Name="Length">5</Int>
+          <Real>53</Real>
+          <Real>0.038</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row53">
+          <Int Name="Length">5</Int>
+          <Real>54</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row54">
+          <Int Name="Length">5</Int>
+          <Real>55</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row55">
+          <Int Name="Length">5</Int>
+          <Real>56</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row56">
+          <Int Name="Length">5</Int>
+          <Real>57</Real>
+          <Real>0.038</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row57">
+          <Int Name="Length">5</Int>
+          <Real>58</Real>
+          <Real>0.212</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row58">
+          <Int Name="Length">5</Int>
+          <Real>59</Real>
+          <Real>0.038</Real>
+          <Real>0.000</Real>
+          <Real>0.038</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row59">
+          <Int Name="Length">5</Int>
+          <Real>60</Real>
+          <Real>0.167</Real>
+          <Real>0.000</Real>
+          <Real>0.167</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row60">
+          <Int Name="Length">5</Int>
+          <Real>61</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row61">
+          <Int Name="Length">5</Int>
+          <Real>62</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row62">
+          <Int Name="Length">5</Int>
+          <Real>63</Real>
+          <Real>0.075</Real>
+          <Real>0.000</Real>
+          <Real>0.075</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row63">
+          <Int Name="Length">5</Int>
+          <Real>64</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row64">
+          <Int Name="Length">5</Int>
+          <Real>65</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row65">
+          <Int Name="Length">5</Int>
+          <Real>66</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row66">
+          <Int Name="Length">5</Int>
+          <Real>67</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row67">
+          <Int Name="Length">5</Int>
+          <Real>68</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row68">
+          <Int Name="Length">5</Int>
+          <Real>69</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row69">
+          <Int Name="Length">5</Int>
+          <Real>70</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row70">
+          <Int Name="Length">5</Int>
+          <Real>71</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row71">
+          <Int Name="Length">5</Int>
+          <Real>72</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row72">
+          <Int Name="Length">5</Int>
+          <Real>73</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row73">
+          <Int Name="Length">5</Int>
+          <Real>74</Real>
+          <Real>0.027</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row74">
+          <Int Name="Length">5</Int>
+          <Real>75</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row75">
+          <Int Name="Length">5</Int>
+          <Real>76</Real>
+          <Real>0.027</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row76">
+          <Int Name="Length">5</Int>
+          <Real>77</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row77">
+          <Int Name="Length">5</Int>
+          <Real>78</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row78">
+          <Int Name="Length">5</Int>
+          <Real>79</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row79">
+          <Int Name="Length">5</Int>
+          <Real>80</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row80">
+          <Int Name="Length">5</Int>
+          <Real>81</Real>
+          <Real>0.034</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row81">
+          <Int Name="Length">5</Int>
+          <Real>82</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row82">
+          <Int Name="Length">5</Int>
+          <Real>83</Real>
+          <Real>0.075</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row83">
+          <Int Name="Length">5</Int>
+          <Real>84</Real>
+          <Real>0.034</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row84">
+          <Int Name="Length">5</Int>
+          <Real>85</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row85">
+          <Int Name="Length">5</Int>
+          <Real>86</Real>
+          <Real>0.239</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row86">
+          <Int Name="Length">5</Int>
+          <Real>87</Real>
+          <Real>0.103</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row87">
+          <Int Name="Length">5</Int>
+          <Real>88</Real>
+          <Real>0.212</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row88">
+          <Int Name="Length">5</Int>
+          <Real>89</Real>
+          <Real>0.212</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row89">
+          <Int Name="Length">5</Int>
+          <Real>90</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row90">
+          <Int Name="Length">5</Int>
+          <Real>91</Real>
+          <Real>0.033</Real>
+          <Real>0.000</Real>
+          <Real>0.033</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row91">
+          <Int Name="Length">5</Int>
+          <Real>92</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row92">
+          <Int Name="Length">5</Int>
+          <Real>93</Real>
+          <Real>0.027</Real>
+          <Real>0.000</Real>
+          <Real>0.027</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row93">
+          <Int Name="Length">5</Int>
+          <Real>94</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row94">
+          <Int Name="Length">5</Int>
+          <Real>95</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row95">
+          <Int Name="Length">5</Int>
+          <Real>96</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row96">
+          <Int Name="Length">5</Int>
+          <Real>97</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row97">
+          <Int Name="Length">5</Int>
+          <Real>98</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row98">
+          <Int Name="Length">5</Int>
+          <Real>99</Real>
+          <Real>0.402</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row99">
+          <Int Name="Length">5</Int>
+          <Real>100</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row100">
+          <Int Name="Length">5</Int>
+          <Real>101</Real>
+          <Real>0.033</Real>
+          <Real>0.000</Real>
+          <Real>0.033</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row101">
+          <Int Name="Length">5</Int>
+          <Real>102</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row102">
+          <Int Name="Length">5</Int>
+          <Real>103</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row103">
+          <Int Name="Length">5</Int>
+          <Real>104</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row104">
+          <Int Name="Length">5</Int>
+          <Real>105</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row105">
+          <Int Name="Length">5</Int>
+          <Real>106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row106">
+          <Int Name="Length">5</Int>
+          <Real>107</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row107">
+          <Int Name="Length">5</Int>
+          <Real>108</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row108">
+          <Int Name="Length">5</Int>
+          <Real>109</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row109">
+          <Int Name="Length">5</Int>
+          <Real>110</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row110">
+          <Int Name="Length">5</Int>
+          <Real>111</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row111">
+          <Int Name="Length">5</Int>
+          <Real>112</Real>
+          <Real>0.038</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row112">
+          <Int Name="Length">5</Int>
+          <Real>113</Real>
+          <Real>0.134</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row113">
+          <Int Name="Length">5</Int>
+          <Real>114</Real>
+          <Real>0.201</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row114">
+          <Int Name="Length">5</Int>
+          <Real>115</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row115">
+          <Int Name="Length">5</Int>
+          <Real>116</Real>
+          <Real>0.100</Real>
+          <Real>0.000</Real>
+          <Real>0.100</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row116">
+          <Int Name="Length">5</Int>
+          <Real>117</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row117">
+          <Int Name="Length">5</Int>
+          <Real>118</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row118">
+          <Int Name="Length">5</Int>
+          <Real>119</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row119">
+          <Int Name="Length">5</Int>
+          <Real>120</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row120">
+          <Int Name="Length">5</Int>
+          <Real>121</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row121">
+          <Int Name="Length">5</Int>
+          <Real>122</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row122">
+          <Int Name="Length">5</Int>
+          <Real>123</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row123">
+          <Int Name="Length">5</Int>
+          <Real>124</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row124">
+          <Int Name="Length">5</Int>
+          <Real>125</Real>
+          <Real>0.053</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row125">
+          <Int Name="Length">5</Int>
+          <Real>126</Real>
+          <Real>0.038</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row126">
+          <Int Name="Length">5</Int>
+          <Real>127</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row127">
+          <Int Name="Length">5</Int>
+          <Real>128</Real>
+          <Real>0.053</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row128">
+          <Int Name="Length">5</Int>
+          <Real>129</Real>
+          <Real>0.027</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row129">
+          <Int Name="Length">5</Int>
+          <Real>130</Real>
+          <Real>0.151</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row130">
+          <Int Name="Length">5</Int>
+          <Real>131</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row131">
+          <Int Name="Length">5</Int>
+          <Real>132</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row132">
+          <Int Name="Length">5</Int>
+          <Real>133</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row133">
+          <Int Name="Length">5</Int>
+          <Real>134</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row134">
+          <Int Name="Length">5</Int>
+          <Real>135</Real>
+          <Real>0.201</Real>
+          <Real>0.000</Real>
+          <Real>0.201</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row135">
+          <Int Name="Length">5</Int>
+          <Real>136</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row136">
+          <Int Name="Length">5</Int>
+          <Real>137</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row137">
+          <Int Name="Length">5</Int>
+          <Real>138</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row138">
+          <Int Name="Length">5</Int>
+          <Real>139</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row139">
+          <Int Name="Length">5</Int>
+          <Real>140</Real>
+          <Real>0.075</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row140">
+          <Int Name="Length">5</Int>
+          <Real>141</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row141">
+          <Int Name="Length">5</Int>
+          <Real>142</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row142">
+          <Int Name="Length">5</Int>
+          <Real>143</Real>
+          <Real>0.027</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row143">
+          <Int Name="Length">5</Int>
+          <Real>144</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row144">
+          <Int Name="Length">5</Int>
+          <Real>145</Real>
+          <Real>0.301</Real>
+          <Real>0.000</Real>
+          <Real>0.301</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row145">
+          <Int Name="Length">5</Int>
+          <Real>146</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row146">
+          <Int Name="Length">5</Int>
+          <Real>147</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row147">
+          <Int Name="Length">5</Int>
+          <Real>148</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row148">
+          <Int Name="Length">5</Int>
+          <Real>149</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row149">
+          <Int Name="Length">5</Int>
+          <Real>150</Real>
+          <Real>0.113</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row150">
+          <Int Name="Length">5</Int>
+          <Real>151</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row151">
+          <Int Name="Length">5</Int>
+          <Real>152</Real>
+          <Real>0.212</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row152">
+          <Int Name="Length">5</Int>
+          <Real>153</Real>
+          <Real>0.053</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row153">
+          <Int Name="Length">5</Int>
+          <Real>154</Real>
+          <Real>0.113</Real>
+          <Real>0.000</Real>
+          <Real>0.113</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row154">
+          <Int Name="Length">5</Int>
+          <Real>155</Real>
+          <Real>0.402</Real>
+          <Real>0.000</Real>
+          <Real>0.402</Real>
+          <Real>0.000</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+    <File Name="-tv">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Volume and Density"
+xaxis  label "Time (ps)"
+yaxis  label ""
+TYPE xy
+s0 legend "Volume (nm\S3\N)"
+s1 legend "Density (g/l)"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data"/>
+    </File>
   </OutputFiles>
 </ReferenceData>
diff --git a/src/gromacs/trajectoryanalysis/tests/refdata/SasaModuleTest_HandlesSelectedResidues.xml b/src/gromacs/trajectoryanalysis/tests/refdata/SasaModuleTest_HandlesSelectedResidues.xml
new file mode 100644 (file)
index 0000000..cd8c447
--- /dev/null
@@ -0,0 +1,706 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <String Name="CommandLine">sasa -surface 'resnr 2 4 to 5 8'</String>
+  <OutputData Name="Data">
+    <AnalysisData Name="area">
+      <DataFrame Name="Frame0">
+        <Real Name="X">0</Real>
+        <DataValues>
+          <Int Name="Count">1</Int>
+          <DataValue>
+            <Real Name="Value">8.5078138240304089</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+    </AnalysisData>
+    <AnalysisData Name="atomarea">
+      <DataFrame Name="Frame0">
+        <Real Name="X">0</Real>
+        <DataValues>
+          <Int Name="Count">66</Int>
+          <DataValue>
+            <Real Name="Value">0.23922246309382034</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.1858252054598363</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.13273228961416877</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.10618583169133503</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.11321514525374221</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.21237166338267005</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.10618583169133503</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.1858252054598363</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.11321514525374221</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.1858252054598363</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.15927874753700255</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.15927874753700255</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.18869190875623704</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.40179713402352024</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.034174637584831476</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.2389181213055038</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.075476763502494812</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.1858252054598363</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.21237166338267005</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.075476763502494812</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.034174637584831476</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.13273228961416877</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.13273228961416877</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.10618583169133503</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.079639373768501276</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.053092915845667513</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.10618583169133503</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.13273228961416877</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.15927874753700255</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.034174637584831476</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.079639373768501276</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.075476763502494812</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.10252391275449443</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.15927874753700255</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.29201103715117133</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.17087318792415737</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.21237166338267005</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.29201103715117133</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.22643029050748442</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.1674154725098001</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.27339710067865181</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.10618583169133503</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.079639373768501276</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.079639373768501276</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.075476763502494812</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.1858252054598363</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.079639373768501276</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.15927874753700255</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.15095352700498962</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.1858252054598363</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.1858252054598363</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.1858252054598363</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.26416867225873186</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.43528022852548026</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+    </AnalysisData>
+    <AnalysisData Name="resarea">
+      <DataFrame Name="Frame0">
+        <Real Name="X">0</Real>
+        <DataValues>
+          <Int Name="Count">4</Int>
+          <DataValue>
+            <Real Name="Value">2.4896505242140847</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">0.82224315473783116</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">2.7489603307349588</Real>
+          </DataValue>
+          <DataValue>
+            <Real Name="Value">2.4469598143435354</Real>
+          </DataValue>
+        </DataValues>
+      </DataFrame>
+    </AnalysisData>
+  </OutputData>
+  <OutputFiles Name="Files">
+    <File Name="-o">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Solvent Accessible Surface"
+xaxis  label "Time (ps)"
+yaxis  label "Area (nm\S2\N)"
+TYPE xy
+s0 legend "Total"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data"/>
+    </File>
+    <File Name="-or">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Area per residue over the trajectory"
+xaxis  label "Residue"
+yaxis  label "Area (nm\S2\N)"
+TYPE xy
+s0 legend "Average (nm\S2\N)"
+s1 legend "Standard deviation (nm\S2\N)"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">3</Int>
+          <Real>2</Real>
+          <Real>2.490</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">3</Int>
+          <Real>4</Real>
+          <Real>0.822</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">3</Int>
+          <Real>5</Real>
+          <Real>2.749</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">3</Int>
+          <Real>8</Real>
+          <Real>2.447</Real>
+          <Real>0.000</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+    <File Name="-oa">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Area per atom over the trajectory"
+xaxis  label "Atom"
+yaxis  label "Area (nm\S2\N)"
+TYPE xy
+s0 legend "Average (nm\S2\N)"
+s1 legend "Standard deviation (nm\S2\N)"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">3</Int>
+          <Real>25</Real>
+          <Real>0.239</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">3</Int>
+          <Real>26</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">3</Int>
+          <Real>27</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">3</Int>
+          <Real>28</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row4">
+          <Int Name="Length">3</Int>
+          <Real>29</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row5">
+          <Int Name="Length">3</Int>
+          <Real>30</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row6">
+          <Int Name="Length">3</Int>
+          <Real>31</Real>
+          <Real>0.113</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row7">
+          <Int Name="Length">3</Int>
+          <Real>32</Real>
+          <Real>0.212</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row8">
+          <Int Name="Length">3</Int>
+          <Real>33</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row9">
+          <Int Name="Length">3</Int>
+          <Real>34</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row10">
+          <Int Name="Length">3</Int>
+          <Real>35</Real>
+          <Real>0.113</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row11">
+          <Int Name="Length">3</Int>
+          <Real>36</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row12">
+          <Int Name="Length">3</Int>
+          <Real>37</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row13">
+          <Int Name="Length">3</Int>
+          <Real>38</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row14">
+          <Int Name="Length">3</Int>
+          <Real>39</Real>
+          <Real>0.189</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row15">
+          <Int Name="Length">3</Int>
+          <Real>40</Real>
+          <Real>0.402</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row16">
+          <Int Name="Length">3</Int>
+          <Real>61</Real>
+          <Real>0.034</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row17">
+          <Int Name="Length">3</Int>
+          <Real>62</Real>
+          <Real>0.239</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row18">
+          <Int Name="Length">3</Int>
+          <Real>63</Real>
+          <Real>0.075</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row19">
+          <Int Name="Length">3</Int>
+          <Real>64</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row20">
+          <Int Name="Length">3</Int>
+          <Real>65</Real>
+          <Real>0.212</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row21">
+          <Int Name="Length">3</Int>
+          <Real>66</Real>
+          <Real>0.075</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row22">
+          <Int Name="Length">3</Int>
+          <Real>67</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row23">
+          <Int Name="Length">3</Int>
+          <Real>68</Real>
+          <Real>0.034</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row24">
+          <Int Name="Length">3</Int>
+          <Real>69</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row25">
+          <Int Name="Length">3</Int>
+          <Real>70</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row26">
+          <Int Name="Length">3</Int>
+          <Real>71</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row27">
+          <Int Name="Length">3</Int>
+          <Real>72</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row28">
+          <Int Name="Length">3</Int>
+          <Real>73</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row29">
+          <Int Name="Length">3</Int>
+          <Real>74</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row30">
+          <Int Name="Length">3</Int>
+          <Real>75</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row31">
+          <Int Name="Length">3</Int>
+          <Real>76</Real>
+          <Real>0.053</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row32">
+          <Int Name="Length">3</Int>
+          <Real>77</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row33">
+          <Int Name="Length">3</Int>
+          <Real>78</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row34">
+          <Int Name="Length">3</Int>
+          <Real>79</Real>
+          <Real>0.133</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row35">
+          <Int Name="Length">3</Int>
+          <Real>80</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row36">
+          <Int Name="Length">3</Int>
+          <Real>81</Real>
+          <Real>0.034</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row37">
+          <Int Name="Length">3</Int>
+          <Real>82</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row38">
+          <Int Name="Length">3</Int>
+          <Real>83</Real>
+          <Real>0.075</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row39">
+          <Int Name="Length">3</Int>
+          <Real>84</Real>
+          <Real>0.103</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row40">
+          <Int Name="Length">3</Int>
+          <Real>85</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row41">
+          <Int Name="Length">3</Int>
+          <Real>86</Real>
+          <Real>0.292</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row42">
+          <Int Name="Length">3</Int>
+          <Real>87</Real>
+          <Real>0.171</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row43">
+          <Int Name="Length">3</Int>
+          <Real>88</Real>
+          <Real>0.212</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row44">
+          <Int Name="Length">3</Int>
+          <Real>89</Real>
+          <Real>0.292</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row45">
+          <Int Name="Length">3</Int>
+          <Real>90</Real>
+          <Real>0.226</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row46">
+          <Int Name="Length">3</Int>
+          <Real>91</Real>
+          <Real>0.167</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row47">
+          <Int Name="Length">3</Int>
+          <Real>117</Real>
+          <Real>0.273</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row48">
+          <Int Name="Length">3</Int>
+          <Real>118</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row49">
+          <Int Name="Length">3</Int>
+          <Real>119</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row50">
+          <Int Name="Length">3</Int>
+          <Real>120</Real>
+          <Real>0.106</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row51">
+          <Int Name="Length">3</Int>
+          <Real>121</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row52">
+          <Int Name="Length">3</Int>
+          <Real>122</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row53">
+          <Int Name="Length">3</Int>
+          <Real>123</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row54">
+          <Int Name="Length">3</Int>
+          <Real>124</Real>
+          <Real>0.000</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row55">
+          <Int Name="Length">3</Int>
+          <Real>125</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row56">
+          <Int Name="Length">3</Int>
+          <Real>126</Real>
+          <Real>0.075</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row57">
+          <Int Name="Length">3</Int>
+          <Real>127</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row58">
+          <Int Name="Length">3</Int>
+          <Real>128</Real>
+          <Real>0.080</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row59">
+          <Int Name="Length">3</Int>
+          <Real>129</Real>
+          <Real>0.159</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row60">
+          <Int Name="Length">3</Int>
+          <Real>130</Real>
+          <Real>0.151</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row61">
+          <Int Name="Length">3</Int>
+          <Real>131</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row62">
+          <Int Name="Length">3</Int>
+          <Real>132</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row63">
+          <Int Name="Length">3</Int>
+          <Real>133</Real>
+          <Real>0.186</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row64">
+          <Int Name="Length">3</Int>
+          <Real>134</Real>
+          <Real>0.264</Real>
+          <Real>0.000</Real>
+        </Sequence>
+        <Sequence Name="Row65">
+          <Int Name="Length">3</Int>
+          <Real>135</Real>
+          <Real>0.435</Real>
+          <Real>0.000</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
index 91c7356b87fad8afbb19763aef0d06fc50e461f4..7101052da952cba55bafc81d6e7862f3d8162e9c 100644 (file)
@@ -88,6 +88,33 @@ and use the copy_xsl.sh script to copy it to relevant locations.
     </pre>
 </xsl:template>
 
+<xsl:template match="OutputFiles/File/XvgLegend/String[@Name='XvgLegend']">
+    <pre>
+        <xsl:value-of select="substring(.,2)"/>
+    </pre>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData">
+    <xsl:choose>
+        <xsl:when test="*">
+            <table>
+                <xsl:apply-templates />
+            </table>
+        </xsl:when>
+        <xsl:otherwise>Data omitted</xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData/Sequence">
+    <tr>
+        <xsl:apply-templates select="Real"/>
+    </tr>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData/Sequence/Real">
+    <td><xsl:value-of select="."/></td>
+</xsl:template>
+
 <xsl:template match="InteractiveSession">
     <pre>
         <xsl:for-each select="*">
index 2ab717e779029ebcf3a4d37d03df0c70516a8de9..742ba2a399cadd6819c270044877999510806aed 100644 (file)
  * Tests for functionality of the "sasa" trajectory analysis module.
  *
  * These tests test the basic functionality of the tool itself, but currently
- * the following are missing:
- *  - Tests related to -odg output.  This would require a full tpr file, and
- *    some investigation on what kind of tpr it should be to produce reasonable
- *    output.
- *  - Tests for the X axes in the area per atom/residue plots.  These could be
- *    added once better X axes are implemented.
- *  - Tests for XVG labels.  This is a limitation of the current testing
- *    framework.
+ * the tests related to -odg output are missing.  This would require a full tpr
+ * file, and some investigation on what kind of tpr it should be to produce
+ * reasonable output.
  *
  * The actual surface area algorithm is tested separately in surfacearea.cpp.
  *
@@ -60,6 +55,7 @@
 #include "testutils/cmdlinetest.h"
 #include "testutils/testasserts.h"
 #include "testutils/textblockmatchers.h"
+#include "testutils/xvgtest.h"
 
 #include "moduletest.h"
 
@@ -69,6 +65,7 @@ namespace
 using gmx::test::CommandLine;
 using gmx::test::ExactTextMatch;
 using gmx::test::NoTextMatch;
+using gmx::test::XvgMatch;
 
 /********************************************************************
  * Tests for gmx::analysismodules::Sasa.
@@ -86,16 +83,32 @@ TEST_F(SasaModuleTest, BasicTest)
         "-output", "name N CA C O H"
     };
     setTopology("lysozyme.gro");
-    setOutputFile("-o", ".xvg", NoTextMatch());
-    setOutputFile("-or", ".xvg", NoTextMatch());
-    setOutputFile("-oa", ".xvg", NoTextMatch());
-    setOutputFile("-tv", ".xvg", NoTextMatch());
+    setOutputFile("-o", ".xvg", XvgMatch().testData(false));
+    setOutputFile("-or", ".xvg", XvgMatch());
+    setOutputFile("-oa", ".xvg", XvgMatch());
+    setOutputFile("-tv", ".xvg", XvgMatch().testData(false));
     excludeDataset("dgsolv");
     setDatasetTolerance("area", gmx::test::ulpTolerance(8));
     setDatasetTolerance("volume", gmx::test::ulpTolerance(8));
     runTest(CommandLine(cmdline));
 }
 
+TEST_F(SasaModuleTest, HandlesSelectedResidues)
+{
+    const char *const cmdline[] = {
+        "sasa",
+        "-surface", "resnr 2 4 to 5 8"
+    };
+    setTopology("lysozyme.gro");
+    setOutputFile("-o", ".xvg", XvgMatch().testData(false));
+    setOutputFile("-or", ".xvg", XvgMatch());
+    setOutputFile("-oa", ".xvg", XvgMatch());
+    excludeDataset("dgsolv");
+    excludeDataset("volume");
+    setDatasetTolerance("area", gmx::test::ulpTolerance(8));
+    runTest(CommandLine(cmdline));
+}
+
 TEST_F(SasaModuleTest, WritesConnollySurfaceWithSolute)
 {
     const char *const cmdline[] = {
index 034f258013a60872ddfd2701481aaeff25d4534f..be34434bf13ef0390348e8e87fb736baf8727c15 100644 (file)
@@ -101,6 +101,20 @@ static inline bool endsWith(const std::string &str, const char *suffix)
     return endsWith(str.c_str(), suffix);
 }
 
+/*! \brief
+ * Tests whether a string contains another as a substring.
+ *
+ * \param[in] str    String to process.
+ * \param[in] substr Substring to find.
+ * \returns   true if \p str contains \p substr.
+ *
+ * Does not throw.
+ */
+static inline bool contains(const std::string &str, const char *substr)
+{
+    return str.find(substr) != std::string::npos;
+}
+
 /*!\brief Returns number of space-separated words in zero-terminated char ptr
  *
  * \param s Character pointer to zero-terminated, which will not be changed.
index 91c7356b87fad8afbb19763aef0d06fc50e461f4..7101052da952cba55bafc81d6e7862f3d8162e9c 100644 (file)
@@ -88,6 +88,33 @@ and use the copy_xsl.sh script to copy it to relevant locations.
     </pre>
 </xsl:template>
 
+<xsl:template match="OutputFiles/File/XvgLegend/String[@Name='XvgLegend']">
+    <pre>
+        <xsl:value-of select="substring(.,2)"/>
+    </pre>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData">
+    <xsl:choose>
+        <xsl:when test="*">
+            <table>
+                <xsl:apply-templates />
+            </table>
+        </xsl:when>
+        <xsl:otherwise>Data omitted</xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData/Sequence">
+    <tr>
+        <xsl:apply-templates select="Real"/>
+    </tr>
+</xsl:template>
+
+<xsl:template match="OutputFiles/File/XvgData/Sequence/Real">
+    <td><xsl:value-of select="."/></td>
+</xsl:template>
+
 <xsl:template match="InteractiveSession">
     <pre>
         <xsl:for-each select="*">
index f878f7e3777a4e31556d2393be10a64fe1341323..a4c72c945f0bdb22853a531b79cf0226bf36f6d7 100644 (file)
@@ -51,6 +51,7 @@
 #include <gtest/gtest.h>
 
 #include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/exceptions.h"
 #include "gromacs/utility/stringutil.h"
 
 #include "testutils/refdata-impl.h"
@@ -142,6 +143,34 @@ class ExactStringBlockChecker : public IReferenceDataEntryChecker
         std::string  value_;
 };
 
+//! Helper function to parse a floating-point value.
+// TODO: Move this into src/gromacs/utility/, and consolidate with similar code
+// elsewhere.
+double convertDouble(const std::string &value)
+{
+    char   *endptr;
+    double  convertedValue = std::strtod(value.c_str(), &endptr);
+    // TODO: Check for overflow
+    if (*endptr != '\0')
+    {
+        GMX_THROW(InvalidInputError("Invalid floating-point value: " + value));
+    }
+    return convertedValue;
+}
+
+//! Helper function to parse a floating-point reference data value.
+double convertDoubleReferenceValue(const std::string &value)
+{
+    try
+    {
+        return convertDouble(value);
+    }
+    catch (const InvalidInputError &ex)
+    {
+        GMX_THROW_WRAPPER_TESTEXCEPTION(ex);
+    }
+}
+
 template <typename FloatType>
 class FloatingPointChecker : public IReferenceDataEntryChecker
 {
@@ -159,12 +188,7 @@ class FloatingPointChecker : public IReferenceDataEntryChecker
         virtual ::testing::AssertionResult
         checkEntry(const ReferenceDataEntry &entry, const std::string &fullId) const
         {
-            char      *endptr;
-            FloatType  refValue = static_cast<FloatType>(std::strtod(entry.value().c_str(), &endptr));
-            if (*endptr != '\0')
-            {
-                GMX_THROW(TestException("Invalid floating-point reference value: " + entry.value()));
-            }
+            FloatType               refValue = static_cast<FloatType>(convertDoubleReferenceValue(entry.value()));
             FloatingPointDifference diff(refValue, value_);
             if (tolerance_.isWithin(diff))
             {
@@ -183,6 +207,43 @@ class FloatingPointChecker : public IReferenceDataEntryChecker
         FloatingPointTolerance  tolerance_;
 };
 
+template <typename FloatType>
+class FloatingPointFromStringChecker : public IReferenceDataEntryChecker
+{
+    public:
+        FloatingPointFromStringChecker(
+            const std::string &value, const FloatingPointTolerance &tolerance)
+            : value_(value), tolerance_(tolerance)
+        {
+        }
+
+        virtual void fillEntry(ReferenceDataEntry *entry) const
+        {
+            entry->setValue(value_);
+        }
+        virtual ::testing::AssertionResult
+        checkEntry(const ReferenceDataEntry &entry, const std::string &fullId) const
+        {
+            FloatType               value    = static_cast<FloatType>(convertDouble(value_));
+            FloatType               refValue = static_cast<FloatType>(convertDoubleReferenceValue(entry.value()));
+            FloatingPointDifference diff(refValue, value);
+            if (tolerance_.isWithin(diff))
+            {
+                return ::testing::AssertionSuccess();
+            }
+            return ::testing::AssertionFailure()
+                   << "   In item: " << fullId << std::endl
+                   << "    Actual: " << value << std::endl
+                   << " Reference: " << entry.value() << std::endl
+                   << "Difference: " << diff.toString() << std::endl
+                   << " Tolerance: " << tolerance_.toString(diff);
+        }
+
+    private:
+        std::string             value_;
+        FloatingPointTolerance  tolerance_;
+};
+
 } // namespace test
 } // namespace gmx
 
index 81f6e7bd24bdfac5dfba4e7563fb4145ea7ed779..1264fd6a41f75d88b9046281d13ba78b4c412bc7 100644 (file)
@@ -55,6 +55,7 @@
 #include "gromacs/utility/exceptions.h"
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/path.h"
+#include "gromacs/utility/real.h"
 #include "gromacs/utility/stringutil.h"
 
 #include "testutils/refdata-checkers.h"
@@ -776,6 +777,13 @@ void TestReferenceChecker::checkReal(double value, const char *id)
 }
 
 
+void TestReferenceChecker::checkRealFromString(const std::string &value, const char *id)
+{
+    FloatingPointFromStringChecker<real> checker(value, impl_->defaultTolerance_);
+    EXPECT_PLAIN(impl_->processItem(Impl::cRealNodeName, id, checker));
+}
+
+
 void TestReferenceChecker::checkVector(const int value[3], const char *id)
 {
     TestReferenceChecker compound(checkCompound(Impl::cVectorType, id));
index 1acfd9fffc4b7c0544564959b5ddd68489ca159b..ddfccc7bb2428c209dbccc9e3de2fc1e56884b6c 100644 (file)
@@ -328,6 +328,8 @@ class TestReferenceChecker
         void checkVector(const float value[3], const char *id);
         //! Check a vector of three double-precision floating point values.
         void checkVector(const double value[3], const char *id);
+        //! Check a single floating-point value from a string.
+        void checkRealFromString(const std::string &value, const char *id);
 
         /*! \name Overloaded versions of simple checker methods
          *
index 3940b4c2e720885959188a62970593986ef0e2d6..b69e0c87bb24088bb0317b1b1b9c4769dc15eb09 100644 (file)
@@ -83,51 +83,68 @@ class XvgMatcher : public ITextBlockMatcher
         XvgMatchSettings  settings_;
 };
 
+//! Helper function to identify which @ lines in xvg files should be tested.
+bool isRelevantXvgCommand(const std::string &line)
+{
+    return contains(line, " title ")
+           || contains(line, " subtitle ")
+           || contains(line, " label ")
+           || contains(line, "@TYPE ")
+           || contains(line, " legend \"");
+}
+
+//! Helper function to check a single xvg value in a sequence.
+void checkXvgDataPoint(TestReferenceChecker *checker, const std::string &value)
+{
+    checker->checkRealFromString(value, NULL);
+}
+
 }       // namespace
 
 void checkXvgFile(TextInputStream        *input,
                   TestReferenceChecker   *checker,
                   const XvgMatchSettings &settings)
 {
+    TestReferenceChecker legendChecker(checker->checkCompound("XvgLegend", "Legend"));
     TestReferenceChecker dataChecker(checker->checkCompound("XvgData", "Data"));
     dataChecker.setDefaultTolerance(settings.tolerance);
 
+    std::string legendText;
+    int         dataRowCount = 0;
     std::string line;
-    int         nrow = 0;
-
     while (input->readLine(&line))
     {
-        if (!((line.find("#") != line.npos) ||
-              (line.find("@") != line.npos)))
+        // Ignore comments, as they contain dynamic content, and very little of
+        // that would be useful to test (and in particular, not with every
+        // output file).
+        if (startsWith(line, "#"))
         {
-            std::vector<std::string> split = splitString(line);
-            std::vector<real>        row;
-
-            for (std::vector<std::string>::iterator si = split.begin();
-                 (si < split.end()); ++si)
+            continue;
+        }
+        if (startsWith(line, "@"))
+        {
+            if (isRelevantXvgCommand(line))
             {
-                const char *ptr = si->c_str();
-                char       *endptr;
-                errno = 0;
-                double      dval = std::strtod(ptr, &endptr);
-                if (errno == ERANGE)
-                {
-                    GMX_THROW(InvalidInputError("Invalid value: '" + *si
-                                                + "'; it causes an overflow/underflow"));
-                }
-                if (*ptr == '\0' || *endptr != '\0')
-                {
-                    GMX_THROW(InvalidInputError("Invalid value: '" + *si
-                                                + "'; expected a number"));
-                }
-                row.push_back(dval);
+                legendText.append(stripString(line.substr(1)));
+                legendText.append("\n");
             }
-            std::string buf = formatString("Row%d", nrow++);
-            dataChecker.checkSequence(row.begin(), row.end(), buf.c_str());
+            continue;
         }
+        if (!settings.testData)
+        {
+            break;
+        }
+        const std::vector<std::string> columns = splitString(line);
+        const std::string              id      = formatString("Row%d", dataRowCount);
+        dataChecker.checkSequence(columns.begin(), columns.end(), id.c_str(),
+                                  &checkXvgDataPoint);
+        ++dataRowCount;
+    }
+    if (settings.testData)
+    {
+        dataChecker.checkPresent(false, formatString("Row%d", dataRowCount).c_str());
     }
-    std::string buf = formatString("Row%d", nrow++);
-    dataChecker.checkPresent(false, buf.c_str());
+    legendChecker.checkTextBlock(legendText, "XvgLegend");
 }
 
 TextBlockMatcherPointer XvgMatch::createMatcher() const
index 6faecb9f19939f2a27c7ac0542be29143eec896f..6fba81d99f4b4827f6939c98013580d0b51c6824 100644 (file)
@@ -61,23 +61,28 @@ class TestReferenceChecker;
 
 struct XvgMatchSettings
 {
-    XvgMatchSettings() : tolerance(defaultRealTolerance()) {}
+    XvgMatchSettings() : tolerance(defaultRealTolerance()), testData(true)
+    {
+    }
 
     FloatingPointTolerance  tolerance;
+    bool                    testData;
 };
 
 /*! \brief
  * Adds content of xvg file to TestReferenceChecker object.
  *
- * A stream of strings is parsed. The columns
- * are analyzed with a relative tolerance provided by the input.
- * Xmgrace formatting is ignored and only multi-column data is
- * understood.
- *
- * \param[in] input       Object returning the lines of the file/data
- *                        one by one.
- * \param[in,out] checker The checker object.
+ * \param[in] input       Stream that provides the xvg content.
+ * \param[in,out] checker Checker to use.
  * \param[in] settings    Settings to use for matching.
+ *
+ * Parses an xvg file from the input stream, and checks the contents against
+ * reference data.  \p settings can be used to customize the matching.
+ * Only a single data set is supported (but multiple columns work).
+ * A subset of xmgrace formatting is also checked; static content that is
+ * nearly always the same is skipped.
+ *
+ * \see XvgMatch
  */
 void checkXvgFile(TextInputStream        *input,
                   TestReferenceChecker   *checker,
@@ -100,6 +105,17 @@ class XvgMatch : public ITextBlockMatcherSettings
             settings_.tolerance = tolerance;
             return *this;
         }
+        /*! \brief
+         * Sets whether the actual data is checked.
+         *
+         * If set to `false`, only the legends are checked.  Use this if the
+         * data is already tested using different means.
+         */
+        XvgMatch &testData(bool test)
+        {
+            settings_.testData = test;
+            return *this;
+        }
 
         virtual TextBlockMatcherPointer createMatcher() const;