From 0a39c1cd0218e5a7ffe8f581e1b7a35af1df8039 Mon Sep 17 00:00:00 2001
From: Simon Oehrl <oehrl@vr.rwth-aachen.de>
Date: Mon, 29 Jun 2020 16:57:07 +0200
Subject: [PATCH] Adapted container for use with external scripts

---
 Dockerfile                                    | 12 +--
 {examples => example}/brunel_simulation.py    |  4 +-
 examples/run_brunel_simulation.sh.in          |  5 --
 insite-nest-module.tar                        |  0
 CMakeLists.txt => src/CMakeLists.txt          |  4 +-
 data_storage.cpp => src/data_storage.cpp      |  0
 data_storage.hpp => src/data_storage.hpp      |  0
 http_server.cpp => src/http_server.cpp        |  0
 http_server.hpp => src/http_server.hpp        |  0
 insitemodule.cpp => src/insitemodule.cpp      |  0
 insitemodule.h => src/insitemodule.h          |  0
 neuron_info.hpp => src/neuron_info.hpp        |  0
 .../recording_backend_insite.cpp              | 80 +++++++++++++++++++
 .../recording_backend_insite.h                |  0
 src/scripts/run_simulation.sh.in              | 24 ++++++
 {sli => src/sli}/example.sli                  |  0
 {sli => src/sli}/insitemodule-init.sli        |  0
 .../sli}/test_recording_backend_socket.sli    |  0
 18 files changed, 115 insertions(+), 14 deletions(-)
 rename {examples => example}/brunel_simulation.py (98%)
 delete mode 100755 examples/run_brunel_simulation.sh.in
 delete mode 100644 insite-nest-module.tar
 rename CMakeLists.txt => src/CMakeLists.txt (99%)
 rename data_storage.cpp => src/data_storage.cpp (100%)
 rename data_storage.hpp => src/data_storage.hpp (100%)
 rename http_server.cpp => src/http_server.cpp (100%)
 rename http_server.hpp => src/http_server.hpp (100%)
 rename insitemodule.cpp => src/insitemodule.cpp (100%)
 rename insitemodule.h => src/insitemodule.h (100%)
 rename neuron_info.hpp => src/neuron_info.hpp (100%)
 rename recording_backend_insite.cpp => src/recording_backend_insite.cpp (81%)
 rename recording_backend_insite.h => src/recording_backend_insite.h (100%)
 create mode 100755 src/scripts/run_simulation.sh.in
 rename {sli => src/sli}/example.sli (100%)
 rename {sli => src/sli}/insitemodule-init.sli (100%)
 rename {sli => src/sli}/test_recording_backend_socket.sli (100%)

diff --git a/Dockerfile b/Dockerfile
index 9359d20..c945045 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -40,16 +40,18 @@ RUN cmake \
     /libpqxx
 RUN ninja && ninja install
 
-COPY . /insite
-WORKDIR /insite-build
+COPY src /insite-module
+WORKDIR /insite-module-build
 RUN cmake \
     -G Ninja \
     -Dwith-nest=/nest-install/bin/nest-config \
     -DCMAKE_BUILD_TYPE=Release \
-    /insite
+    /insite-module
 RUN ninja && ninja install
 ENV PGPASSWORD=postgres
 
+COPY example /example
+
 EXPOSE 8000
-ENTRYPOINT "/insite-build/run_brunel_simulation.sh"
-CMD 1000 2500 2
\ No newline at end of file
+ENTRYPOINT ["/insite-module-build/run_simulation.sh"]
+CMD ["/example/brunel_simulation.py"]
\ No newline at end of file
diff --git a/examples/brunel_simulation.py b/example/brunel_simulation.py
similarity index 98%
rename from examples/brunel_simulation.py
rename to example/brunel_simulation.py
index 6dc936c..c37d0c9 100644
--- a/examples/brunel_simulation.py
+++ b/example/brunel_simulation.py
@@ -74,7 +74,7 @@ startbuild = time.time()
 
 dt = 0.1  # the resolution in ms
 simtime = float(sys.argv[1]) if len(
-    sys.argv) > 1 else 10000.0  # Simulation time in ms
+    sys.argv) > 1 else 100.0  # Simulation time in ms
 delay = 1.5  # synaptic delay in ms
 
 
@@ -91,7 +91,7 @@ epsilon = 0.1  # connection probability
 # recorded from
 
 order = int(sys.argv[2]) if len(
-    sys.argv) > 2 else 2500 # Should be square, otherwise the position grid becomes invalid
+    sys.argv) > 2 else 25 # Should be square, otherwise the position grid becomes invalid
 NE = 4 * order  # number of excitatory neurons
 NI = 1 * order  # number of inhibitory neurons
 N_neurons = NE + NI  # number of neurons in total
diff --git a/examples/run_brunel_simulation.sh.in b/examples/run_brunel_simulation.sh.in
deleted file mode 100755
index be009df..0000000
--- a/examples/run_brunel_simulation.sh.in
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-source @NEST_INSTALL_PREFIX@/bin/nest_vars.sh
-export LD_LIBRARY_PATH=$NEST_MODULE_PATH:/usr/local/lib/:$LD_LIBRARY_PATH
-# python3 @CMAKE_SOURCE_DIR@/examples/brunel_simulation.py $1 $2 # Uncomment this to run normally
-time mpirun -n $3 --mca btl_vader_single_copy_mechanism none --allow-run-as-root -x PYTHONPATH python3 @CMAKE_SOURCE_DIR@/examples/brunel_simulation.py $1 $2
\ No newline at end of file
diff --git a/insite-nest-module.tar b/insite-nest-module.tar
deleted file mode 100644
index e69de29..0000000
diff --git a/CMakeLists.txt b/src/CMakeLists.txt
similarity index 99%
rename from CMakeLists.txt
rename to src/CMakeLists.txt
index 3ee9ac4..9b1cccc 100644
--- a/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -343,8 +343,8 @@ if ( ( NOT CMAKE_CROSSCOMPILING )
 endif ()
 
 configure_file(
-  ${CMAKE_SOURCE_DIR}/examples/run_brunel_simulation.sh.in
-  ${CMAKE_BINARY_DIR}/run_brunel_simulation.sh
+  ${CMAKE_SOURCE_DIR}/scripts/run_simulation.sh.in
+  ${CMAKE_BINARY_DIR}/run_simulation.sh
   @ONLY
 )
 
diff --git a/data_storage.cpp b/src/data_storage.cpp
similarity index 100%
rename from data_storage.cpp
rename to src/data_storage.cpp
diff --git a/data_storage.hpp b/src/data_storage.hpp
similarity index 100%
rename from data_storage.hpp
rename to src/data_storage.hpp
diff --git a/http_server.cpp b/src/http_server.cpp
similarity index 100%
rename from http_server.cpp
rename to src/http_server.cpp
diff --git a/http_server.hpp b/src/http_server.hpp
similarity index 100%
rename from http_server.hpp
rename to src/http_server.hpp
diff --git a/insitemodule.cpp b/src/insitemodule.cpp
similarity index 100%
rename from insitemodule.cpp
rename to src/insitemodule.cpp
diff --git a/insitemodule.h b/src/insitemodule.h
similarity index 100%
rename from insitemodule.h
rename to src/insitemodule.h
diff --git a/neuron_info.hpp b/src/neuron_info.hpp
similarity index 100%
rename from neuron_info.hpp
rename to src/neuron_info.hpp
diff --git a/recording_backend_insite.cpp b/src/recording_backend_insite.cpp
similarity index 81%
rename from recording_backend_insite.cpp
rename to src/recording_backend_insite.cpp
index 63a5992..68ac4a5 100644
--- a/recording_backend_insite.cpp
+++ b/src/recording_backend_insite.cpp
@@ -37,6 +37,86 @@ RecordingBackendInsite::RecordingBackendInsite()
     : data_storage_("tgest"),
       database_connection_("postgresql://postgres@" + ReadDatabaseHost()),
       http_server_("http://0.0.0.0:" + get_port_string(), &data_storage_, "postgresql://postgres@" + ReadDatabaseHost()) {
+
+  if (nest::kernel().mpi_manager.get_rank() == 0) {
+    pqxx::work txn(database_connection_);
+
+    txn.exec(R"db_query(
+DROP TABLE IF EXISTS nest_simulation_node CASCADE;
+DROP TABLE IF EXISTS nest_multimeter CASCADE;
+DROP TABLE IF EXISTS nest_neuron CASCADE;
+DROP TABLE IF EXISTS nest_neuron_multimeter CASCADE;
+
+CREATE TABLE nest_simulation_node (
+  id                      SERIAL PRIMARY KEY NOT NULL UNIQUE,
+  address                 VARCHAR(50),
+  current_simulation_time FLOAT
+);
+
+CREATE TABLE nest_multimeter (
+  id         INT PRIMARY KEY NOT NULL UNIQUE,
+  attributes VARCHAR(50) ARRAY
+);
+
+CREATE TABLE nest_neuron (
+  id                 INT PRIMARY KEY NOT NULL UNIQUE,
+  simulation_node_id INT,  
+  population_id      INT,
+  position           FLOAT[],
+  FOREIGN KEY (simulation_node_id) REFERENCES nest_simulation_node (id)
+);
+
+CREATE TABLE nest_neuron_multimeter (
+  neuron_id     INT NOT NULL,
+  multimeter_id INT NOT NULL,
+  PRIMARY KEY (neuron_id,multimeter_id),
+  FOREIGN KEY (neuron_id) REFERENCES nest_neuron (id),
+  FOREIGN KEY (multimeter_id) REFERENCES nest_multimeter (id)
+);
+
+DROP TABLE IF EXISTS arbor_simulation_node CASCADE;
+DROP TABLE IF EXISTS arbor_cell CASCADE;
+DROP TABLE IF EXISTS arbor_cell_property CASCADE;
+DROP TABLE IF EXISTS arbor_attribute CASCADE;
+DROP TABLE IF EXISTS arbor_probe CASCADE;
+
+CREATE TABLE arbor_simulation_node (
+  id                       INT PRIMARY KEY NOT NULL UNIQUE,
+  address                  VARCHAR(50),
+  current_simulation_time  FLOAT
+);
+
+CREATE TABLE arbor_cell (
+  id INT PRIMARY KEY NOT NULL UNIQUE
+);
+
+CREATE TABLE arbor_cell_property (
+  cell_id  INT NOT NULL,
+	property VARCHAR(50) NOT NULL,
+	PRIMARY KEY (cell_id, property),
+	FOREIGN KEY (cell_id) REFERENCES arbor_cell (id)
+);
+
+CREATE TABLE arbor_attribute (
+  id   INT PRIMARY KEY NOT NULL UNIQUE,
+  name VARCHAR(50) NOT NULL
+);
+
+CREATE TABLE arbor_probe (
+  id               INT PRIMARY KEY NOT NULL UNIQUE,
+  cell_id          INT NOT NULL,  
+  segment_id 		   INT NOT NULL,
+	position   		   FLOAT,
+	attribute_id	   INT NOT NULL,
+	simulation_node_id INT,
+  FOREIGN KEY (simulation_node_id) REFERENCES arbor_simulation_node (id),
+	FOREIGN KEY (cell_id) REFERENCES arbor_cell (id),
+	FOREIGN KEY (attribute_id) REFERENCES arbor_attribute (id)
+);
+    )db_query");
+    txn.commit();
+  }
+
   pqxx::work txn(database_connection_);
   simulation_node_id_ = txn.exec1(
                                "INSERT INTO nest_simulation_node (address) "
diff --git a/recording_backend_insite.h b/src/recording_backend_insite.h
similarity index 100%
rename from recording_backend_insite.h
rename to src/recording_backend_insite.h
diff --git a/src/scripts/run_simulation.sh.in b/src/scripts/run_simulation.sh.in
new file mode 100755
index 0000000..2acb1db
--- /dev/null
+++ b/src/scripts/run_simulation.sh.in
@@ -0,0 +1,24 @@
+#!/bin/bash
+# Usage: run_simulation.sh file_path mpi_nodes
+
+source @NEST_INSTALL_PREFIX@/bin/nest_vars.sh
+export LD_LIBRARY_PATH=$NEST_MODULE_PATH:/usr/local/lib/:$LD_LIBRARY_PATH
+
+if [ "$#" -eq 1 ]; then
+    python3 $1
+elif [ "$#" -eq 2 ]; then
+    mpirun -n $2 --mca btl_vader_single_copy_mechanism none --allow-run-as-root -x PYTHONPATH python3 $1
+else
+    echo "$0 $*"
+    echo "Usage: $0 file_path [mpi_nodes]"
+fi
+
+# ls /nest-simulation
+# if [ -f "/nest-simulation/simulation.py" ]; then
+#     echo "/nest-simulation/simulation.py exists"
+# else
+#     echo "/nest-simulation/simulation.py does not exist"
+# fi
+
+#  # Uncomment this to run normally
+# time  @CMAKE_SOURCE_DIR@/examples/brunel_simulation.py $1 $2
\ No newline at end of file
diff --git a/sli/example.sli b/src/sli/example.sli
similarity index 100%
rename from sli/example.sli
rename to src/sli/example.sli
diff --git a/sli/insitemodule-init.sli b/src/sli/insitemodule-init.sli
similarity index 100%
rename from sli/insitemodule-init.sli
rename to src/sli/insitemodule-init.sli
diff --git a/sli/test_recording_backend_socket.sli b/src/sli/test_recording_backend_socket.sli
similarity index 100%
rename from sli/test_recording_backend_socket.sli
rename to src/sli/test_recording_backend_socket.sli
-- 
GitLab