1818#include < vector>
1919
2020#include " coreneuron/io/reports/nrnreport.hpp"
21+ #include " coreneuron/utils/nrn_assert.h"
2122#include " coreneuron/utils/utils.hpp"
2223
2324namespace coreneuron {
@@ -73,8 +74,15 @@ struct CellMapping {
7374 /* * list of section lists (like soma, axon, apic) */
7475 std::vector<std::shared_ptr<SecMapping>> sec_mappings;
7576
76- /* * map containing segment ids an its respective lfp factors */
77- std::unordered_map<int , std::vector<double >> lfp_factors;
77+ /* * segment ids for lfp factors (one per compartment with LFP data) */
78+ std::vector<int > lfp_segment_ids;
79+
80+ /* * flat array of lfp factors: stride = num_electrodes, indexed as [i * stride + e] */
81+ std::vector<double > lfp_factors_flat;
82+
83+ /* * Electrode offsets per LFP report (CSR-style, size = num_reports + 1).
84+ * offsets[i]..offsets[i+1] gives the electrode range for report i. */
85+ std::vector<size_t > electrode_offsets;
7886
7987 CellMapping (int g)
8088 : gid(g) {}
@@ -99,13 +107,9 @@ struct CellMapping {
99107 });
100108 }
101109
102- /* * @brief return the number of electrodes in the lfp_factors map **/
103- int num_electrodes () const {
104- int num_electrodes = 0 ;
105- if (!lfp_factors.empty ()) {
106- num_electrodes = lfp_factors.begin ()->second .size ();
107- }
108- return num_electrodes;
110+ /* * @brief return the total number of electrodes **/
111+ size_t num_electrodes () const {
112+ return electrode_offsets.empty () ? 0 : electrode_offsets.back ();
109113 }
110114
111115 /* * @brief number of section lists */
@@ -148,8 +152,18 @@ struct CellMapping {
148152 }
149153
150154 /* * @brief add the lfp electrode factors of a segment_id */
151- void add_segment_lfp_factor (const int segment_id, std::vector<double >& factors) {
152- lfp_factors.insert ({segment_id, factors});
155+ void add_segment_lfp_factor (const int segment_id,
156+ std::vector<double >::const_iterator begin,
157+ std::vector<double >::const_iterator end) {
158+ const size_t n = std::distance (begin, end);
159+ if (n == 0 ) {
160+ return ;
161+ }
162+ const auto curr_n_electrodes = num_electrodes ();
163+ // All segments must have the same number of electrode factors
164+ nrn_assert (curr_n_electrodes == 0 || n == curr_n_electrodes);
165+ lfp_segment_ids.push_back (segment_id);
166+ lfp_factors_flat.insert (lfp_factors_flat.end (), begin, end);
153167 }
154168};
155169
0 commit comments