From 6163f7170c8261839b34ac8ab30a414343368428 Mon Sep 17 00:00:00 2001
From: Tamas Gal <tgal@km3net.de>
Date: Tue, 24 Mar 2020 11:22:07 +0100
Subject: [PATCH] Header parameters without names are now bare

---
 km3io/offline.py      |  8 ++++-
 tests/test_offline.py | 69 +++++++++++++++++++++++++------------------
 2 files changed, 47 insertions(+), 30 deletions(-)

diff --git a/km3io/offline.py b/km3io/offline.py
index 97140d3..ecf5e61 100644
--- a/km3io/offline.py
+++ b/km3io/offline.py
@@ -233,14 +233,20 @@ class Header:
 
             n_values = len(values)
             n_fields = len(fields)
+
+            if n_values == 1 and n_fields == 0:
+                self._data[attribute] = _to_num(values[0])
+                continue
+
             n_max = max(n_values, n_fields)
             values += [None] * (n_max - n_values)
             fields += ["field_{}".format(i) for i in range(n_fields, n_max)]
 
+            Constructor = namedtuple(attribute, fields)
+
             if not values:
                 continue
 
-            Constructor = namedtuple(attribute, fields)
             self._data[attribute] = Constructor(
                 **{f: _to_num(v)
                    for (f, v) in zip(fields, values)})
diff --git a/tests/test_offline.py b/tests/test_offline.py
index 9143c87..5b3a61b 100644
--- a/tests/test_offline.py
+++ b/tests/test_offline.py
@@ -22,12 +22,6 @@ class TestOfflineReader(unittest.TestCase):
 
 
 class TestHeader(unittest.TestCase):
-    def test_reading_header(self):
-        # head is the supported format
-        head = OFFLINE_NUMUCC.header
-
-        self.assertAlmostEqual(head.DAQ.livetime, 394)
-
     def test_str_header(self):
         assert "MC Header" in str(OFFLINE_NUMUCC.header)
 
@@ -36,36 +30,16 @@ class TestHeader(unittest.TestCase):
         with self.assertWarns(UserWarning):
             OFFLINE_FILE.header
 
-    def test_header(self):
-        head = {
-            'DAQ': '394',
-            'PDF': '4',
-            'can': '0 1027 888.4',
-            'undefined': '1 2 test 3.4'
-        }
-
-        header = Header(head)
-
-        assert 394 == header.DAQ.livetime
-        assert 4 == header.PDF.i1
-        assert header.PDF.i2 is None
-        assert 0 == header.can.zmin
-        assert 1027 == header.can.zmax
-        assert 888.4 == header.can.r
-        assert 1 == header.undefined.field_0
-        assert 2 == header.undefined.field_1
-        assert "test" == header.undefined.field_2
-        assert 3.4 == header.undefined.field_3
-
     def test_missing_key_definitions(self):
-        head = {'a': '1 2 3', 'b': '4'}
+        head = {'a': '1 2 3', 'b': '4', 'c': 'd'}
 
         header = Header(head)
 
         assert 1 == header.a.field_0
         assert 2 == header.a.field_1
         assert 3 == header.a.field_2
-        assert 4 == header.b.field_0
+        assert 4 == header.b
+        assert 'd' == header.c
 
     def test_missing_values(self):
         head = {'can': '1'}
@@ -86,6 +60,43 @@ class TestHeader(unittest.TestCase):
         assert 3 == header.can.r
         assert 4 == header.can.field_3
 
+    def test_header(self):
+        head = {
+            'DAQ': '394',
+            'PDF': '4',
+            'can': '0 1027 888.4',
+            'undefined': '1 2 test 3.4'
+        }
+
+        header = Header(head)
+
+        assert 394 == header.DAQ.livetime
+        assert 4 == header.PDF.i1
+        assert header.PDF.i2 is None
+        assert 0 == header.can.zmin
+        assert 1027 == header.can.zmax
+        assert 888.4 == header.can.r
+        assert 1 == header.undefined.field_0
+        assert 2 == header.undefined.field_1
+        assert "test" == header.undefined.field_2
+        assert 3.4 == header.undefined.field_3
+
+    def test_reading_header_from_sample_file(self):
+        head = OFFLINE_NUMUCC.header
+
+        assert 394 == head.DAQ.livetime
+        assert 4 == head.PDF.i1
+        assert 58 == head.PDF.i2
+        assert 0 == head.coord_origin.x
+        assert 0 == head.coord_origin.y
+        assert 0 == head.coord_origin.z
+        assert 100 == head.cut_nu.Emin
+        assert 100000000.0 == head.cut_nu.Emax
+        assert -1 == head.cut_nu.cosTmin
+        assert 1 == head.cut_nu.cosTmax
+        assert "diffuse" == head.sourcemode
+        assert 100000.0 == head.ngen
+
 
 class TestOfflineEvents(unittest.TestCase):
     def setUp(self):
-- 
GitLab