From a4f8f2c59e191dd122890eb260838f651efe4c84 Mon Sep 17 00:00:00 2001
From: Remy Prechelt <prechelt@hawaii.edu>
Date: Fri, 5 Feb 2021 21:32:53 -1000
Subject: [PATCH] Move writer implementation into inline file.

---
 .../writers/ObservationPlaneWriterParquet.inl | 54 +++++++++++++++++++
 .../writers/ObservationPlaneWriterParquet.hpp | 48 ++++-------------
 2 files changed, 64 insertions(+), 38 deletions(-)
 create mode 100644 corsika/detail/modules/writers/ObservationPlaneWriterParquet.inl

diff --git a/corsika/detail/modules/writers/ObservationPlaneWriterParquet.inl b/corsika/detail/modules/writers/ObservationPlaneWriterParquet.inl
new file mode 100644
index 000000000..814d5ac0b
--- /dev/null
+++ b/corsika/detail/modules/writers/ObservationPlaneWriterParquet.inl
@@ -0,0 +1,54 @@
+/*
+ * (c) Copyright 2021 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#pragma once
+
+namespace corsika {
+
+  ObservationPlaneWriterParquet::ObservationPlaneWriterParquet()
+      : ParquetStreamer(){};
+
+  void ObservationPlaneWriterParquet::startOfLibrary(
+      std::filesystem::path const& directory) {
+
+    // setup the streamer
+    initStreamer((directory / "particles.parquet").string());
+
+    // build the schema
+    addField("pdg", parquet::Repetition::REQUIRED, parquet::Type::INT32,
+             parquet::ConvertedType::INT_32);
+    addField("energy", parquet::Repetition::REQUIRED, parquet::Type::DOUBLE,
+             parquet::ConvertedType::NONE);
+    addField("x", parquet::Repetition::REQUIRED, parquet::Type::DOUBLE,
+             parquet::ConvertedType::NONE);
+    addField("y", parquet::Repetition::REQUIRED, parquet::Type::DOUBLE,
+             parquet::ConvertedType::NONE);
+    addField("radius", parquet::Repetition::REQUIRED, parquet::Type::DOUBLE,
+             parquet::ConvertedType::NONE);
+
+    // and build the streamer
+    buildStreamer();
+  }
+
+  void ObservationPlaneWriterParquet::endOfShower() { ++shower_; }
+
+  void ObservationPlaneWriterParquet::endOfLibrary() { closeStreamer(); }
+
+  void ObservationPlaneWriterParquet::write(Code const& pid,
+                                            units::si::HEPEnergyType const& energy,
+                                            units::si::LengthType const& x,
+                                            units::si::LengthType const& y,
+                                            units::si::LengthType const& radius) {
+    using namespace units::si;
+
+    // write the next row - we must write `shower_` first.
+    (*writer_) _ << shower_ << static_cast<int>(get_PDG(pid)) << energy / 1_eV << x / 1_m
+                 << y / 1_m << radius / 1_m << parquet::EndRow;
+  }
+
+} // namespace corsika
diff --git a/corsika/modules/writers/ObservationPlaneWriterParquet.hpp b/corsika/modules/writers/ObservationPlaneWriterParquet.hpp
index 25a961ac2..217b57032 100644
--- a/corsika/modules/writers/ObservationPlaneWriterParquet.hpp
+++ b/corsika/modules/writers/ObservationPlaneWriterParquet.hpp
@@ -23,48 +23,25 @@ namespace corsika {
      *
      * @param name    The name of this output.
      */
-    ObservationPlaneWriterParquet()
-        : ParquetStreamer(){};
+    ObservationPlaneWriterParquet();
 
     /**
-     * Called at the start of each run.
+     * Called at the start of each library.
      */
-    void startOfRun(std::filesystem::path const& directory) final override {
-
-      // setup the streamer
-      initStreamer((directory / "particles.parquet").string());
-
-      // build the schema
-      addField("pdg", parquet::Repetition::REQUIRED, parquet::Type::INT32,
-               parquet::ConvertedType::INT_32);
-      addField("energy", parquet::Repetition::REQUIRED, parquet::Type::DOUBLE,
-               parquet::ConvertedType::NONE);
-      addField("x", parquet::Repetition::REQUIRED, parquet::Type::DOUBLE,
-               parquet::ConvertedType::NONE);
-      addField("y", parquet::Repetition::REQUIRED, parquet::Type::DOUBLE,
-               parquet::ConvertedType::NONE);
-      addField("radius", parquet::Repetition::REQUIRED, parquet::Type::DOUBLE,
-               parquet::ConvertedType::NONE);
-
-      // and build the streamer
-      buildStreamer();
-    }
+    void startOfLibrary(std::filesystem::path const& directory) final override;
 
     /**
-     * Called at the end of each event/shower.
+     * Called at the end of each shower.
      */
-    void endOfEvent() final override { ++event_; }
+    void endOfShower() final override;
 
     /**
-     * Called at the end of each run.
+     * Called at the end of each library.
      *
      * This must also increment the run number since we override
      * the default behaviour of BaseOutput.
      */
-    void endOfRun() final override {
-      closeStreamer();
-      ++run_;
-    }
+    void endOfLibrary() final override;
 
   protected:
     /**
@@ -72,15 +49,10 @@ namespace corsika {
      */
     void write(Code const& pid, units::si::HEPEnergyType const& energy,
                units::si::LengthType const& x, units::si::LengthType const& y,
-               units::si::LengthType const& radius) {
-      using namespace units::si;
-
-      // write the next row
-      // NOTE: we must write run_ and then event_ first
-      (*writer_) << run_ << event_ << static_cast<int>(get_PDG(pid)) << energy / 1_eV
-                 << x / 1_m << y / 1_m << radius / 1_m << parquet::EndRow;
-    }
+               units::si::LengthType const& radius);
 
   }; // class ObservationPlaneWriterParquet
 
 } // namespace corsika
+
+#include <corsika/details/modules/writers/ObservationPlaneWriterParquet.inl>
-- 
GitLab