diff --git a/src/fvm_cell.hpp b/src/fvm_cell.hpp index 90e7f7be0d373274aba0b4ff28b908465e674cb5..932c0a4883747d1bd5828dd4be7df2c24aac532e 100644 --- a/src/fvm_cell.hpp +++ b/src/fvm_cell.hpp @@ -133,6 +133,9 @@ public: /// returns voltage at a segment location value_type voltage(segment_location loc) const; + /// returns current at a segment location + value_type current(segment_location loc) const; + value_type time() const { return t_; } value_type probe(uint32_t i) const { @@ -484,6 +487,12 @@ T fvm_cell<T, I>::voltage(segment_location loc) const return voltage_[compartment_index(loc)]; } +template <typename T, typename I> +T fvm_cell<T, I>::current(segment_location loc) const +{ + return current_[compartment_index(loc)]; +} + template <typename T, typename I> void fvm_cell<T, I>::initialize() { diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ebebb306e1a896f1cd815751324971ea4e67cfe8..9061fb8d4698c681d3cdd38986b081f6b47df5aa 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -24,6 +24,7 @@ set(TEST_SOURCES test_optional.cpp test_parameters.cpp test_point.cpp + test_probe.cpp test_segment.cpp test_spikes.cpp test_stimulus.cpp diff --git a/tests/test_probe.cpp b/tests/test_probe.cpp new file mode 100644 index 0000000000000000000000000000000000000000..52ac4e7f62171bc556df5b0ba4e25f05b3304fa5 --- /dev/null +++ b/tests/test_probe.cpp @@ -0,0 +1,78 @@ +#include "gtest.h" + +#include "cell.hpp" +#include "fvm_cell.hpp" + +TEST(probe, instantiation) +{ + using namespace nest::mc; + + cell c1; + + segment_location loc1{0, 0}; + segment_location loc2{1, 0.6}; + + auto p1 = c1.add_probe(loc1, probeKind::membrane_voltage); + auto p2 = c1.add_probe(loc2, probeKind::membrane_current); + + // expect locally provided probe ids to be numbered sequentially from zero. + + EXPECT_EQ(0, p1); + EXPECT_EQ(1, p2); + + // expect the probes() return to be a collection with these two probes. + + auto probes = c1.probes(); + EXPECT_EQ(2u, probes.size()); + + EXPECT_EQ(loc1, probes[0].location); + EXPECT_EQ(probeKind::membrane_voltage, probes[0].kind); + + EXPECT_EQ(loc2, probes[1].location); + EXPECT_EQ(probeKind::membrane_current, probes[1].kind); +} + +TEST(probe, fvm_cell) +{ + using namespace nest::mc; + + cell bs; + + // ball-and-stick model morphology + + bs.add_soma(12.6157/2.0); + bs.add_cable(0, segmentKind::dendrite, 0.5, 0.5, 200); + bs.soma()->set_compartments(5); + + segment_location loc0{0, 0}; + segment_location loc1{1, 1}; + segment_location loc2{1, 0.5}; + + auto pv0 = bs.add_probe(loc0, probeKind::membrane_voltage); + auto pv1 = bs.add_probe(loc1, probeKind::membrane_voltage); + auto pi2 = bs.add_probe(loc2, probeKind::membrane_current); + + i_clamp stim(0, 100, 0.3); + bs.add_stimulus({1, 1}, stim); + + fvm::fvm_cell<double, int> lcell(bs); + lcell.setup_matrix(0.01); + lcell.initialize(); + + EXPECT_EQ(3u, lcell.num_probes()); + + // expect probe values and direct queries of voltage and current + // to be equal in fvm cell + + EXPECT_EQ(lcell.voltage(loc0), lcell.probe(pv0)); + EXPECT_EQ(lcell.voltage(loc1), lcell.probe(pv1)); + EXPECT_EQ(lcell.current(loc2), lcell.probe(pi2)); + + lcell.advance(0.05); + + EXPECT_EQ(lcell.voltage(loc0), lcell.probe(pv0)); + EXPECT_EQ(lcell.voltage(loc1), lcell.probe(pv1)); + EXPECT_EQ(lcell.current(loc2), lcell.probe(pi2)); +} + +