Skip to content

Commit 8ba4f66

Browse files
authored
BRAYNS-639 Bypass libsonata for node selection in spike reports. (#1261)
1 parent 3ffd194 commit 8ba4f66

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

brayns/parameters/SimulationParameters.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,16 @@
2121

2222
#include "SimulationParameters.h"
2323

24+
#include <stdexcept>
25+
2426
namespace brayns
2527
{
2628
void SimulationParameters::reset()
2729
{
28-
setFrame(0);
29-
setDt(0.);
3030
setStartFrame(0);
3131
setEndFrame(0);
32+
setDt(0.);
33+
setFrame(0);
3234
}
3335

3436
void SimulationParameters::setStartFrame(const uint32_t startFrame) noexcept
@@ -51,8 +53,12 @@ uint32_t SimulationParameters::getEndFrame() const noexcept
5153
return _endFrame;
5254
}
5355

54-
void SimulationParameters::setFrame(const uint32_t value) noexcept
56+
void SimulationParameters::setFrame(const uint32_t value)
5557
{
58+
if (value < _startFrame || value > _endFrame)
59+
{
60+
throw std::out_of_range("Simulation frame out of range");
61+
}
5662
_flag.update(_current, value);
5763
}
5864

brayns/parameters/SimulationParameters.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class SimulationParameters : public AbstractParameters
7777
*
7878
* @param value uint32_t Current frame index.
7979
*/
80-
void setFrame(const uint32_t value) noexcept;
80+
void setFrame(const uint32_t value);
8181

8282
/**
8383
* @brief Returns the current frame.

plugins/CircuitExplorer/io/sonataloader/reports/SonataSpikeData.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
#include "SonataSpikeData.h"
2020

21+
#include <ranges>
22+
#include <unordered_set>
23+
2124
#include <brayns/utils/MathTypes.h>
2225

2326
namespace sonataloader
@@ -61,12 +64,17 @@ std::string SonataSpikeData::getTimeUnit() const noexcept
6164

6265
std::vector<float> SonataSpikeData::getFrame(double timestamp) const
6366
{
64-
auto limit = static_cast<float>(getEndTime()) - 0.01f;
65-
auto frame = brayns::math::clamp(static_cast<float>(timestamp), 0.f, limit);
66-
auto frameStart = frame - _interval;
67-
auto frameEnd = frame + _interval;
67+
auto frameStart = brayns::math::clamp(timestamp - _interval, _start, _end);
68+
auto frameEnd = brayns::math::clamp(timestamp + _interval, _start, _end);
69+
70+
auto spikes = _population.get({}, frameStart, frameEnd);
71+
72+
auto values = _selection.flatten();
73+
auto selection = std::unordered_set<bbp::sonata::Selection::Value>(values.begin(), values.end());
6874

69-
auto spikes = _population.get(_selection, frameStart, frameEnd);
75+
auto notSelected = [&](const auto &spike) { return !selection.contains(spike.first); };
76+
auto [first, last] = std::ranges::remove_if(spikes, notSelected);
77+
spikes.erase(first, last);
7078

7179
auto data = std::vector<float>(_mapping.size(), 0.f);
7280

@@ -83,7 +91,7 @@ std::vector<float> SonataSpikeData::getFrame(double timestamp) const
8391
}
8492

8593
auto index = it->second;
86-
data[index] = _calculator.compute(spikeTime, frame);
94+
data[index] = _calculator.compute(spikeTime, static_cast<float>(timestamp));
8795
}
8896

8997
return data;

tests/unit/brayns/engine/TestSystems.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ TEST_CASE("Systems")
149149

150150
auto parameters = brayns::ParametersManager(0, nullptr);
151151
auto &simulation = parameters.getSimulationParameters();
152+
simulation.setEndFrame(102);
152153
simulation.setFrame(101);
153154

154155
CHECK(!components.has<uint32_t>());

0 commit comments

Comments
 (0)