Repository: CORE-GATECH-GROUP/serpent-tools

Issue:
BUG Data files not installed through pip
## Summary of issue
When installing with pip, the data files used in examples are not present.

## Code for reproducing the issue
From a fresh install using python [`venv`](https://docs.python.org/3.5/library/venv.html):
```
$ python -m venv serpentTools
$ source serpentTools/bin/activate
(serpentTools) python -m pip install serpentTools
(serpentTools) python -c "import serpentTools; serpentTools.readDataFile('demo.coe')
```
## Actual outcome including console output and error traceback if applicable
```OSError: File matching demo.coe does not exist```
## Expected outcome
This doesn't fail
## Versions

* Version  from ``serpentTools.__version__`` ``0.6.1``

* Python version - ``python --version`` ``3.7.2``

Discussion:

Patch:
diff --git a/.travis.yml b/.travis.yml
index f370223..b0f456d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,11 +3,19 @@ python:
   - "3.6"
   - "3.5"
   - "2.7"
+env:
+  - ST_INSTALL=setup
+  - ST_INSTALL=sdist
+  - ST_INSTALL=bdist_wheel
+  - ST_INSTALL=bdist_egg
 
-# install
-install:
+before_install:
   - pip install -r requirements.txt -r requirements-test.txt
-  - python setup.py install
+  - rm -rf dist
+# install matrix
+# build some distributions (source and wheel) and install from those
+install:
+  - bash scripts/travis/install.sh
 
 # use xvfb to give the plot functions something to use
 # PR 70
diff --git a/MANIFEST.in b/MANIFEST.in
index 334ac1c..bc97e1a 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -3,3 +3,4 @@ include serpentTools/_version.py
 include serpentTools/variables.yaml
 include serpentTools/data/*.m
 include serpentTools/data/*.coe
+include requirements.txt
diff --git a/docs/changelog.rst b/docs/changelog.rst
index 062242e..8301113 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -31,8 +31,6 @@ Next
   to perturbations, universes, and burnup.
 * Plotting routines now use attach to the active plot or generate
   a new plot figure if ``ax`` argument not given - :issue:`267`
-* :class:`~serpentTools.parsers.branching.BranchingReader` can
-  read coefficient files with uncertainties - :issue:`270`
 
 .. warning::
 
diff --git a/docs/defaultSettings.rst b/docs/defaultSettings.rst
index c7102ec..f3664fd 100644
--- a/docs/defaultSettings.rst
+++ b/docs/defaultSettings.rst
@@ -1,3 +1,16 @@
+.. _branching-areUncsPresent:
+
+----------------------------
+``branching.areUncsPresent``
+----------------------------
+
+True if the values in the .coe file contain uncertainties
+::
+
+  Default: False
+  Type: bool
+  
+
 .. _branching-floatVariables:
 
 ----------------------------
diff --git a/docs/examples/Settings.rst b/docs/examples/Settings.rst
index 66e3aba..852ea39 100644
--- a/docs/examples/Settings.rst
+++ b/docs/examples/Settings.rst
@@ -35,7 +35,7 @@ with the ``.keys`` method.
  
 
     dict_keys(['depletion.processTotal', 'verbosity', 'xs.getInfXS',
-    'branching.intVariables', 'serpentVersion',
+    'branching.intVariables', 'branching.areUncsPresent', 'serpentVersion',
     'sampler.raiseErrors', 'xs.getB1XS', 'xs.variableGroups', 'xs.variableExtras',
     'depletion.materialVariables', 'depletion.metadataKeys', 'sampler.freeAll',
     'sampler.allExist', 'depletion.materials', 'sampler.skipPrecheck',
@@ -206,6 +206,7 @@ However, the loader can also expand a nested dictionary structure, as
 ::
 
     branching:
+      areUncsPresent: False
       floatVariables: [Fhi, Blo]
     depletion:
       materials: [fuel*]
@@ -225,6 +226,7 @@ However, the loader can also expand a nested dictionary structure, as
     xs.variableGroups: [gc-meta, kinetics,
     xs]
     branching:
+      areUncsPresent: False
       floatVariables: [Fhi, Blo]
     depletion:
       materials: [fuel*]
@@ -238,7 +240,7 @@ However, the loader can also expand a nested dictionary structure, as
     
     >>> myConf = 'myConfig.yaml'
     >>> rc.loadYaml(myConf)
-    >>> rc['xs.getInfXS']
+    >>> rc['branching.areUncsPresent']
 
 .. parsed-literal::
  
diff --git a/examples/Branching.ipynb b/examples/Branching.ipynb
index 5b1a687..9967883 100644
--- a/examples/Branching.ipynb
+++ b/examples/Branching.ipynb
@@ -570,6 +570,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
+    "* [`branching.areUncsPresent`](http://serpent-tools.readthedocs.io/en/latest/settingsTop.html#branching-areuncspresent)\n",
     "* [`branching.floatVariables`](http://serpent-tools.readthedocs.io/en/latest/settingsTop.html#branching-floatvariables)\n",
     "* [`branching.intVariables`](http://serpent-tools.readthedocs.io/en/latest/settingsTop.html#branching-intvariables)\n",
     "* [`xs.getB1XS`](http://serpent-tools.readthedocs.io/en/latest/settingsTop.html#xs-getb1xs)\n",
diff --git a/examples/Settings.ipynb b/examples/Settings.ipynb
index 27951fb..385c525 100644
--- a/examples/Settings.ipynb
+++ b/examples/Settings.ipynb
@@ -50,7 +50,7 @@
     {
      "data": {
       "text/plain": [
-       "dict_keys(['depletion.processTotal', 'verbosity', 'xs.getInfXS', 'branching.intVariables', 'serpentVersion', 'sampler.raiseErrors', 'xs.getB1XS', 'xs.variableGroups', 'xs.variableExtras', 'depletion.materialVariables', 'depletion.metadataKeys', 'sampler.freeAll', 'sampler.allExist', 'depletion.materials', 'sampler.skipPrecheck', 'xs.reshapeScatter', 'branching.floatVariables', 'detector.names'])"
+       "dict_keys(['depletion.processTotal', 'verbosity', 'xs.getInfXS', 'branching.intVariables', 'branching.areUncsPresent', 'serpentVersion', 'sampler.raiseErrors', 'xs.getB1XS', 'xs.variableGroups', 'xs.variableExtras', 'depletion.materialVariables', 'depletion.metadataKeys', 'sampler.freeAll', 'sampler.allExist', 'depletion.materials', 'sampler.skipPrecheck', 'xs.reshapeScatter', 'branching.floatVariables', 'detector.names'])"
       ]
      },
      "execution_count": 13,
@@ -264,6 +264,7 @@
     "However, the loader can also expand a nested dictionary structure, as\n",
     "```\n",
     "branching:\n",
+    "  areUncsPresent: False\n",
     "  floatVariables: [Fhi, Blo]\n",
     "depletion:\n",
     "  materials: [fuel*]\n",
@@ -285,6 +286,7 @@
       "xs.getB1XS: True\r\n",
       "xs.variableGroups: [gc-meta, kinetics, xs]\r\n",
       "branching:\r\n",
+      "  areUncsPresent: False\r\n",
       "  floatVariables: [Fhi, Blo]\r\n",
       "depletion:\r\n",
       "  materials: [fuel*]\r\n",
@@ -325,7 +327,7 @@
    "source": [
     "myConf = 'myConfig.yaml'\n",
     "rc.loadYaml(myConf)\n",
-    "rc['xs.getInfXS']"
+    "rc['branching.areUncsPresent']"
    ]
   }
  ],
diff --git a/examples/myConfig.yaml b/examples/myConfig.yaml
index 523fa61..8953d66 100644
--- a/examples/myConfig.yaml
+++ b/examples/myConfig.yaml
@@ -2,6 +2,7 @@ xs.getInfXS: False
 xs.getB1XS: True
 xs.variableGroups: [gc-meta, kinetics, xs]
 branching:
+  areUncsPresent: False
   floatVariables: [Fhi, Blo]
 depletion:
   materials: [fuel*]
diff --git a/scripts/travis/install.sh b/scripts/travis/install.sh
new file mode 100644
index 0000000..e0960a5
--- /dev/null
+++ b/scripts/travis/install.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+# Install script that depends on $INSTALL variable
+# Options:
+# setup: install with setup.py
+# sdist: create a source distribution and install from that
+# bdist_wheel: create a wheel and install from that
+
+if [[ -z $ST_INSTALL ]]; then exit; fi
+
+set -ev
+set -o pipefail
+
+ST_VERSION=$(python setup.py version | grep Version | cut -d" " -f 2)
+echo $ST_VERSION
+
+case $ST_INSTALL in
+    'setup')
+        python setup.py install
+        ;;
+    'sdist')
+        python setup.py sdist
+        pip install dist/serpentTools-${ST_VERSION}.tar.gz
+        ;;
+    'bdist_wheel')
+        python setup.py bdist_wheel
+        easy_install dist/serpentTools-${ST_VERSION}*whl
+        ;;
+    'bdist_egg')
+        python setup.py bdist_egg
+        easy_install dist/serpentTools-${ST_VERSION}*egg
+        ;;
+    *)
+        echo No install option
+        exit 1
+esac
+                
diff --git a/serpentTools/data/demo_uncs.coe b/serpentTools/data/demo_uncs.coe
deleted file mode 100644
index 256c7d0..0000000
--- a/serpentTools/data/demo_uncs.coe
+++ /dev/null
@@ -1,14 +0,0 @@
-1 2 1 2 1
-1 nom
-3 VERSION 2.1.30 DATE 19/02/07 TIME 15:27:13
-0 1 1
-0 2
-INF_TOT 2  4.92499E-01 0.00074  1.01767E+00 0.00072
-INF_S0 4  4.66391E-01 0.00072  1.55562E-02 0.00148  1.28821E-03 0.01793  9.21487E-01 0.00091
-2 2 2 2 1
-1 hot
-3 VERSION 2.1.30 DATE 19/02/07 TIME 15:27:55
-0 1 1
-0 2
-INF_TOT 2  4.92806E-01 0.00063  1.01680E+00 0.00104
-INF_S0 4  4.66639E-01 0.00062  1.53978E-02 0.00214  1.38727E-03 0.03073  9.20270E-01 0.00112
diff --git a/serpentTools/parsers/branching.py b/serpentTools/parsers/branching.py
index 8ba6fb4..daaa8f3 100644
--- a/serpentTools/parsers/branching.py
+++ b/serpentTools/parsers/branching.py
@@ -33,12 +33,6 @@ class BranchingReader(XSReader):
         self._whereAmI = {key: None for key in
                           {'runIndx', 'coefIndx', 'buIndx', 'universe'}}
         self._totalBranches = None
-        self._hasUncs = None
-
-    @property
-    def hasUncs(self):
-        """boolean if uncertainties are present in the file"""
-        return self._hasUncs
 
     def _read(self):
         """Read the branching file and store the coefficients."""
@@ -122,10 +116,10 @@ class BranchingReader(XSReader):
                       .format(varName))
                 continue
             if self._checkAddVariable(varName):
-                if self._hasUncs:
+                if self.settings['areUncsPresent']:
                     vals, uncs = splitValsUncs(varValues)
-                    univ.addData(varName, array(vals), uncertainty=False)
-                    univ.addData(varName, array(uncs), uncertainty=True)
+                    univ.addData(varName, array(vals), uncertaity=False)
+                    univ.addData(varName, array(uncs), unertainty=True)
                 else:
                     univ.addData(varName, array(varValues), uncertainty=False)
 
@@ -135,19 +129,13 @@ class BranchingReader(XSReader):
             yield bID, b
 
     def _precheck(self):
-        """Total number of branches and check for uncertainties"""
+        """Currently, just grabs total number of coeff calcs."""
         with open(self.filePath) as fObj:
             try:
                 self._totalBranches = int(fObj.readline().split()[1])
             except Exception as ee:
                 error("COE output at {} likely malformatted or misnamed\n{}"
                       .format(self.filePath, str(ee)))
-            # skip first few lines with integer until first named value
-            for _x in range(4):
-                fObj.readline()
-            lsplt = fObj.readline().split()
-            nvals = int(lsplt[1])
-            self._hasUncs = not nvals == len(lsplt) - 2
 
     def _postcheck(self):
         """Make sure Serpent finished printing output."""
diff --git a/serpentTools/settings.py b/serpentTools/settings.py
index 7954ee5..4a2b414 100644
--- a/serpentTools/settings.py
+++ b/serpentTools/settings.py
@@ -28,6 +28,12 @@ SETTING_DOC_FMTR = """.. _{tag}:
 
 SETTING_OPTIONS_FMTR = "Options: [{}]"
 defaultSettings = {
+    'branching.areUncsPresent': {
+        'default': False,
+        'type': bool,
+        'description': "True if the values in the .coe file contain "
+                       "uncertainties"
+    },
     'branching.intVariables': {
         'default': [],
         'description': 'Name of state data variables to convert to integers '
diff --git a/setup.py b/setup.py
index e671d87..9e29d5c 100644
--- a/setup.py
+++ b/setup.py
@@ -63,6 +63,7 @@ setupArgs = {
     'package_data': {
         'serpentTools.data': ['data/{}'.format(ext) for ext in DATA_EXTS],
     },
+    'include_package_data': True,
     'cmdclass': versioneer.get_cmdclass(),
     'data_files': [
         ('serpentTools', ['serpentTools/variables.yaml', ]),


Test patch:
diff --git a/serpentTools/tests/test_branching.py b/serpentTools/tests/test_branching.py
index 9780cd4..8f60fb0 100644
--- a/serpentTools/tests/test_branching.py
+++ b/serpentTools/tests/test_branching.py
@@ -50,13 +50,12 @@ class BranchTester(_BranchTesterHelper):
                     'CMM_TRANSPXS_Z', 'CMM_DIFFCOEF', 'CMM_DIFFCOEF_X',
                     'CMM_DIFFCOEF_Y', 'CMM_DIFFCOEF_Z'}
         self.assertSetEqual(expected, self.reader.settings['variables'])
-        self.assertFalse(self.reader.hasUncs)
 
     def test_raiseError(self):
         """Verify that the reader raises an error for unexpected EOF"""
         badFile = 'bad_branching.coe'
         with open(self.file) as fObj, open(badFile, 'w') as badObj:
-            for _line in range(10):
+            for _line in range(5):
                 badObj.write(fObj.readline())
         badReader = BranchingReader(badFile)
         with self.assertRaises(EOFError):
@@ -124,53 +123,5 @@ class BranchContainerTester(_BranchTesterHelper):
             containerWithDays.addUniverse(101, 10, 1)
 
 
-class BranchWithUncsTester(unittest.TestCase):
-    """Tester that just tests a small file with uncertainties"""
-
-    BRANCH_DATA = {
-        'nom': {
-            'infTot': [
-                [4.92499E-01, 1.01767E+00],  # value
-                [0.00074, 0.00072],  # uncertainty
-            ],
-            'infS0': [
-                [0.466391, 0.0155562, 0.00128821, 0.921487],
-                [0.00072, 0.00148, 0.01793, 0.00091],
-            ],
-        },
-        'hot': {
-            'infTot': [
-                [4.92806E-1, 1.0168E00],  # value
-                [0.00063, 0.00104],  # uncertainty
-            ],
-            'infS0': [
-                [4.66639E-1, 1.53978E-02, 1.38727E-03, 9.20270E-01],
-                [0.00062, 0.00214, 0.03073, 0.00112],
-            ],
-        },
-    }
-    BRANCH_UNIVKEY = (0, 0, 0)
-
-    def setUp(self):
-        fp = getFile('demo_uncs.coe')
-        self.reader = BranchingReader(fp)
-        self.reader.read()
-
-    def test_valsWithUncs(self):
-        """Test that the branches and the uncertainties are present"""
-        self.assertTrue(self.reader.hasUncs)
-        for expKey, expSubData in iteritems(self.BRANCH_DATA):
-            self.assertTrue(expKey in self.reader.branches, msg=expKey)
-            actBranch = self.reader.branches[expKey]
-            self.assertTrue(self.BRANCH_UNIVKEY in actBranch.universes,
-                            msg=self.BRANCH_UNIVKEY)
-            univ = actBranch.universes[self.BRANCH_UNIVKEY]
-            for gcKey, gcVals in iteritems(expSubData):
-                actData = univ.get(gcKey, True)
-                for act, exp, what in zip(actData, gcVals, ['val', 'unc']):
-                    assert_allclose(act, exp, err_msg='{} {} {}'.format(
-                        expKey, gcKey, what))
-
-
 if __name__ == '__main__':
     unittest.main()
diff --git a/serpentTools/tests/test_settings.py b/serpentTools/tests/test_settings.py
index 22671b9..b4d60a2 100644
--- a/serpentTools/tests/test_settings.py
+++ b/serpentTools/tests/test_settings.py
@@ -112,6 +112,7 @@ class ConfigLoaderTester(TestCaseWithLogCapture):
     @classmethod
     def setUpClass(cls):
         cls.configSettings = {
+            'branching.areUncsPresent': True,
             'branching.floatVariables': ['Bhi', 'Tlo'],
             'verbosity': 'warning',
             'depletion.materials': ['fuel*'],
@@ -119,6 +120,8 @@ class ConfigLoaderTester(TestCaseWithLogCapture):
         }
         cls.nestedSettings = {
             'branching': {
+                'areUncsPresent':
+                    cls.configSettings['branching.areUncsPresent'],
                 'floatVariables':
                     cls.configSettings['branching.floatVariables']
             },