From f8ce75fbe30e7095d4128234171e8b54b208c01a Mon Sep 17 00:00:00 2001
From: Johannes Schumann <johannes.schumann@fau.de>
Date: Mon, 5 Apr 2021 21:52:09 +0200
Subject: [PATCH] Strip and update header

---
 km3buu/geometry.py            | 44 +++++++++++++++++++++++++++++++----
 km3buu/output.py              | 33 +++++++++-----------------
 km3buu/tests/test_geometry.py |  2 --
 3 files changed, 51 insertions(+), 28 deletions(-)

diff --git a/km3buu/geometry.py b/km3buu/geometry.py
index 81286a3..3414955 100644
--- a/km3buu/geometry.py
+++ b/km3buu/geometry.py
@@ -21,6 +21,7 @@ class DetectorVolume(ABC):
     """
     def __init__(self):
         self._volume = -1.0
+        self._coord_origin = (0., 0., 0.)
 
     @abstractmethod
     def random_pos(self):
@@ -34,16 +35,39 @@ class DetectorVolume(ABC):
         """
         pass
 
+    @abstractmethod
+    def header_entry(self):
+        """
+        Returns the header information for the detector volume geometry
+
+        Returns
+        -------
+        tuple (header_key, header_information)
+        """
+        pass
+
     @property
     def volume(self):
         """
+        Detector volume
+
         Returns
         -------
         float [m^3] 
-           The detector volume
         """
         return self._volume
 
+    @property
+    def coord_origin(self):
+        """
+        Coordinate origin
+
+        Returns
+        -------
+        tuple [m] (x, y, z)
+        """
+        return self._coord_origin
+
 
 class CanVolume(DetectorVolume):
     """
@@ -76,6 +100,11 @@ class CanVolume(DetectorVolume):
         pos_z = np.random.uniform(self._zmin, self._zmax)
         return (pos_x, pos_y, pos_z)
 
+    def header_entry(self):
+        key = "can"
+        value = "{} {} {}".format(self._zmin, self._zmax, self._radius)
+        return key, value
+
 
 class SphericalVolume(DetectorVolume):
     """
@@ -89,10 +118,10 @@ class SphericalVolume(DetectorVolume):
         Coordinate center of the sphere
         (x, y, z)
     """
-    def __init__(self, radius, center=(0, 0, 0)):
+    def __init__(self, radius, coord_origin=(0, 0, 0)):
         super().__init__()
         self._radius = radius
-        self._center = center
+        self._coord_origin = coord_origin
         self._volume = self._calc_volume()
 
     def _calc_volume(self):
@@ -106,4 +135,11 @@ class SphericalVolume(DetectorVolume):
         pos_y = r * np.sin(phi) * np.sqrt(1 - np.power(cosTheta, 2))
         pos_z = r * cosTheta
         pos = (pos_x, pos_y, pos_z)
-        return tuple(np.add(self._center, pos))
+        return tuple(np.add(self._coord_origin, pos))
+
+    def header_entry(self):
+        key = "sphere"
+        value = "radius: {} center_x: {} center_y: {} center_z: {}".format(
+            self._radius, self._coord_origin[0], self._coord_origin[1],
+            self._coord_origin[2])
+        return key, value
diff --git a/km3buu/output.py b/km3buu/output.py
index 1b89d08..23a2b77 100644
--- a/km3buu/output.py
+++ b/km3buu/output.py
@@ -92,29 +92,16 @@ ROOTTUPLE_KEY = "RootTuple"
 
 EMPTY_KM3NET_HEADER_DICT = {
     "start_run": "0",
-    "XSecFile": "",
     "drawing": "volume",
-    "detector": "",
     "depth": "2475.0",
-    "muon_desc_file": "",
     "target": "",
-    "cut_primary": "0 0 0 0",
-    "cut_seamuon": "0 0 0 0",
-    "cut_in": "0 0 0 0",
     "cut_nu": "0 0 0 0",
     "spectrum": "0",
     "can": "0 0 0",
     "flux": "0 0 0",
-    "fixedcan": "0 0 0 0 0",
-    "genvol": "0 0 0 0 0",
     "coord_origin": "0 0 0",
-    "genhencut": "0 0",
     "norma": "0 0",
-    "livetime": "0 0",
-    "seabottom": "0",
-    "DAQ": "0",
     "tgen": "0",
-    "primary": "0",
     "simul": ""
 }
 
@@ -441,8 +428,8 @@ def write_detector_file(gibuu_output,
 
     media = read_default_media_compositions()
     density = media["SeaWater"]["density"]
-    symbol = mendeleev.element(gibuu_output.Z).symbol
-    target = media["SeaWater"]["elements"][symbol]
+    element = mendeleev.element(gibuu_output.Z)
+    target = media["SeaWater"]["elements"][element.symbol]
     target_density = 1e3 * density * target[1]
     targets_per_volume = target_density * (1e3 * constants.Avogadro /
                                            target[0].atomic_weight)
@@ -452,16 +439,18 @@ def write_detector_file(gibuu_output,
     head = ROOT.Head()
     header_dct = EMPTY_KM3NET_HEADER_DICT.copy()
 
-    timestamp = datetime.now()
-    header_dct["simul"] = "KM3BUU {} {}".format(
-        version, timestamp.strftime("%Y%m%d %H%M%S"))
-    # header_dct["can"] = "{:.1f} {:.1f} {:.1f}".format(*can)
-    header_dct["tgen"] = "{:.1f}".format(livetime)
+    header_dct["target"] = element.name
+    key, value = geometry.header_entry()
+    header_dct[key] = value
+    header_dct["coord_origin"] = "{} {} {}".format(*geometry.coord_origin)
     header_dct["flux"] = "{:d} 0 0".format(nu_type)
-    # header_dct["genvol"] = "0 {:.1f} {:.1f} {:.1f} {:d}".format(
-    #     can[1], can[2], can_volume, gibuu_output.generated_events)
     header_dct["cut_nu"] = "{:.2f} {:.2f} -1 1".format(gibuu_output.energy_min,
                                                        gibuu_output.energy_max)
+    header_dct["tgen"] = "{:.1f}".format(livetime)
+    header_dct["norma"] = "0 {}".format(gibuu_output.generated_events)
+    timestamp = datetime.now()
+    header_dct["simul"] = "KM3BUU {} {}".format(
+        version, timestamp.strftime("%Y%m%d %H%M%S"))
 
     for k, v in header_dct.items():
         head.set_line(k, v)
diff --git a/km3buu/tests/test_geometry.py b/km3buu/tests/test_geometry.py
index 9ebb154..9894c47 100644
--- a/km3buu/tests/test_geometry.py
+++ b/km3buu/tests/test_geometry.py
@@ -20,8 +20,6 @@ class TestGeneralGeometry(unittest.TestCase):
         with self.assertRaises(TypeError) as ctx:
             d = DetectorVolume()
 
-        self.assertTrue('method random_pos' in str(ctx.exception))
-
 
 class TestSphere(unittest.TestCase):
     def setUp(self):
-- 
GitLab