From 8e2d2be85ebcfd78f485509ab2a52fcdf488ea5c Mon Sep 17 00:00:00 2001
From: Simon Oehrl <oehrl@vr.rwth-aachen.de>
Date: Tue, 24 Mar 2020 11:50:22 +0100
Subject: [PATCH] Change position to array

---
 recording_backend_insite.cpp | 88 +++++++++++++++++++++---------------
 1 file changed, 51 insertions(+), 37 deletions(-)

diff --git a/recording_backend_insite.cpp b/recording_backend_insite.cpp
index c76ce06..1fe1114 100644
--- a/recording_backend_insite.cpp
+++ b/recording_backend_insite.cpp
@@ -23,11 +23,14 @@ RecordingBackendInsite::RecordingBackendInsite()
       database_connection_("postgresql://postgres@database") {
   pqxx::work txn(database_connection_);
   simulation_node_id_ = txn.exec1(
-    "INSERT INTO nest_simulation_node (address) " 
-    "VALUES ('http://insite-nest-module:" + get_port_string() + "') "
-    "RETURNING id;"
-  )[0].as<int>();
-  std::cout << "Simulation node registered to database. Node ID: " << simulation_node_id_ << std::endl;
+                               "INSERT INTO nest_simulation_node (address) "
+                               "VALUES ('http://insite-nest-module:" +
+                               get_port_string() +
+                               "') "
+                               "RETURNING id;")[0]
+                            .as<int>();
+  std::cout << "Simulation node registered to database. Node ID: "
+            << simulation_node_id_ << std::endl;
   txn.commit();
 }
 
@@ -44,7 +47,7 @@ void RecordingBackendInsite::finalize() {
 void RecordingBackendInsite::enroll(const nest::RecordingDevice& device,
                                     const DictionaryDatum& params) {
   std::cout << "RecordingBackendInsite::enroll(" << device.get_label() << ")\n";
-  
+
   if (device.get_type() == nest::RecordingDevice::MULTIMETER) {
     auto id = device.get_node_id();
     multimeter_infos_.emplace(std::make_pair(id, MultimeterInfo{id, true}));
@@ -66,10 +69,9 @@ void RecordingBackendInsite::set_value_names(
     auto& multimeter = multimeter_infos_.at(device.get_node_id());
 
     std::stringstream multimeter_query;
-    multimeter_query
-      << "INSERT INTO nest_multimeter (id, attributes) "
-      << "VALUES (" << device.get_node_id() << ",\'{";
-    
+    multimeter_query << "INSERT INTO nest_multimeter (id, attributes) "
+                     << "VALUES (" << device.get_node_id() << ",\'{";
+
     bool first = true;
     for (auto& name : double_value_names) {
       const auto& name_string = name.toString();
@@ -114,18 +116,20 @@ void RecordingBackendInsite::post_step_hook() {
   {
     pqxx::work txn(database_connection_);
     txn.exec0(
-      "UPDATE nest_simulation_node " 
-      "SET current_simulation_time = " + std::to_string(latest_simulation_time_) + ""
-      "WHERE id = " + std::to_string(simulation_node_id_)
-    );
+        "UPDATE nest_simulation_node "
+        "SET current_simulation_time = " +
+        std::to_string(latest_simulation_time_) +
+        ""
+        "WHERE id = " +
+        std::to_string(simulation_node_id_));
     txn.commit();
   }
 
   if (new_neuron_infos_.size() > 0) {
     std::stringstream neuron_query;
-    neuron_query
-      << "INSERT INTO nest_neuron (id, simulation_node_id, population_id, position_x, position_y, position_z) "
-      << "VALUES ";
+    neuron_query << "INSERT INTO nest_neuron (id, simulation_node_id, "
+                    "population_id, position) "
+                 << "VALUES ";
     for (auto& neuron_info : new_neuron_infos_) {
       const bool first = neuron_info.gid == new_neuron_infos_[0].gid;
       if (!first) {
@@ -133,16 +137,26 @@ void RecordingBackendInsite::post_step_hook() {
       }
 
       uint64_t population_id = 0;
-      for (const nest::NodeIDTriple& node_id_triple : *neuron_info.gid_collection.get()) {
+      for (const nest::NodeIDTriple& node_id_triple :
+           *neuron_info.gid_collection.get()) {
         population_id ^= node_id_triple.node_id * 938831;
       }
 
-      neuron_query << "(" << neuron_info.gid << "," << simulation_node_id_ << "," << population_id % 0x800000;
-      for (const auto position_entry : neuron_info.position) {
-        neuron_query << "," << position_entry;
-      }
-      assert(neuron_info.position.size() <= 3);
-      for (auto i = 3 - neuron_info.position.size(); i != 0; --i) {
+      neuron_query << "(" << neuron_info.gid << "," << simulation_node_id_
+                   << "," << population_id % 0x800000;
+
+      const auto position_size = neuron_info.position.size();
+      if (position_size > 0) {
+        assert(position_size <= 3);
+        neuron_query << ",\'{";
+        for (size_t i = 0; i < position_size; ++i) {
+          if (i > 0) {
+            neuron_query << ",";
+          }
+          neuron_query << neuron_info.position[i];
+        }
+        neuron_query << "}\'";
+      } else {
         neuron_query << ",NULL";
       }
       neuron_query << ")";
@@ -162,19 +176,19 @@ void RecordingBackendInsite::post_step_hook() {
   // Send multimeter info
   for (auto& kvp : multimeter_infos_) {
     auto& multimeter = kvp.second;
-    if (!multimeter.needs_update)
-      continue;
+    if (!multimeter.needs_update) continue;
     multimeter.needs_update = false;
 
     if (multimeter.gids.size() > 0) {
       std::stringstream neuron_multimeter_query;
       neuron_multimeter_query
-        << "INSERT INTO nest_neuron_multimeter (neuron_id, multimeter_id) "
-        << "VALUES ";
+          << "INSERT INTO nest_neuron_multimeter (neuron_id, multimeter_id) "
+          << "VALUES ";
 
       for (const auto& neuron_id : multimeter.gids) {
         const bool first = neuron_id == multimeter.gids[0];
-        neuron_multimeter_query << (first ? "" : ",") << "(" << neuron_id << "," << multimeter.device_id << ")";
+        neuron_multimeter_query << (first ? "" : ",") << "(" << neuron_id << ","
+                                << multimeter.device_id << ")";
       }
 
       neuron_multimeter_query << " ON CONFLICT DO NOTHING;";
@@ -202,19 +216,19 @@ void RecordingBackendInsite::write(const nest::RecordingDevice& device,
 
     // If the measurement is from a GID we previously do not know, add.
     if (!binary_search(gids.begin(), gids.end(), sender_gid)) {
-      gids.insert(std::lower_bound(gids.begin(), gids.end(), sender_gid), 
-        sender_gid);
+      gids.insert(std::lower_bound(gids.begin(), gids.end(), sender_gid),
+                  sender_gid);
       multimeter.needs_update = true;
     }
 
     for (std::size_t i = 0; i < double_values.size(); ++i)
-      data_storage_.AddMultimeterMeasurement(device_id, 
-        multimeter.double_attributes[i], time_stamp, sender_gid, 
-        double_values[i]);
+      data_storage_.AddMultimeterMeasurement(
+          device_id, multimeter.double_attributes[i], time_stamp, sender_gid,
+          double_values[i]);
     for (std::size_t i = 0; i < long_values.size(); ++i)
-      data_storage_.AddMultimeterMeasurement(device_id, 
-        multimeter.long_attributes[i], time_stamp, sender_gid, 
-        double(long_values[i]));
+      data_storage_.AddMultimeterMeasurement(
+          device_id, multimeter.long_attributes[i], time_stamp, sender_gid,
+          double(long_values[i]));
   }
   latest_simulation_time_ = std::max(latest_simulation_time_, time_stamp);
 
-- 
GitLab