Skip to content
This repository was archived by the owner on Mar 20, 2023. It is now read-only.

Commit 4902a9b

Browse files
committed
Calculate 1 lfp value per gid/timestep
1 parent 815ff74 commit 4902a9b

File tree

6 files changed

+45
-42
lines changed

6 files changed

+45
-42
lines changed

coreneuron/io/nrn_filehandler.hpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class FileHandler {
112112
* Read count no of mappings for section to segment
113113
*/
114114
template <typename T>
115-
int read_mapping_info(T* mapinfo, NrnThreadMappingInfo* ntmapping) {
115+
int read_mapping_info(T* mapinfo, NrnThreadMappingInfo* ntmapping, CellMapping* cmap) {
116116
int nsec, nseg, n_scan;
117117
char line_buf[max_line_length], name[max_line_length];
118118

@@ -134,13 +134,10 @@ class FileHandler {
134134
read_array<int>(&seg[0], nseg);
135135
read_array<double>(&lfp_factors[0], nseg);
136136

137-
std::cout << "=====> NEW CoreNEURON!" << std::endl;
138-
std::cout << "nseg = " << nseg << std::endl;
139-
140137
for (int i = 0; i < nseg; i++) {
141138
mapinfo->add_segment(sec[i], seg[i]);
142139
ntmapping->add_segment_id(seg[i]);
143-
ntmapping->add_segment_lfp_factor(seg[i], lfp_factors[i]);
140+
cmap->add_segment_lfp_factor(seg[i], lfp_factors[i]);
144141
}
145142
}
146143
return nseg;

coreneuron/io/nrn_setup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,7 @@ void read_phase3(NrnThread& nt, UserParams& userParams) {
941941
// read section-segment mapping for every section list
942942
for (int j = 0; j < nseclist; j++) {
943943
SecMapping* smap = new SecMapping();
944-
F.read_mapping_info(smap, ntmapping);
944+
F.read_mapping_info(smap, ntmapping, cmap);
945945
cmap->add_sec_map(smap);
946946
}
947947

coreneuron/io/nrnsection_mapping.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ struct CellMapping {
7575
/** list of section lists (like soma, axon, apic) */
7676
std::vector<SecMapping*> secmapvec;
7777

78+
/** map containing segment ids an its respective lfp factors */
79+
std::unordered_map<int, double> lfp_factors;
80+
7881
CellMapping(int g)
7982
: gid(g) {}
8083

@@ -139,6 +142,11 @@ struct CellMapping {
139142
return count;
140143
}
141144

145+
/** @brief add the lfp factor of a segment_id */
146+
void add_segment_lfp_factor(const int segment_id, double factor) {
147+
lfp_factors.insert({segment_id, factor});
148+
}
149+
142150
~CellMapping() {
143151
for (size_t i = 0; i < secmapvec.size(); i++) {
144152
delete secmapvec[i];
@@ -158,9 +166,6 @@ struct NrnThreadMappingInfo {
158166
/** list of segment ids */
159167
std::vector<int> segment_ids;
160168

161-
/** map containing segment ids an its respective lfp factors */
162-
std::unordered_map<int, double> lfp_factors;
163-
164169
std::vector<double> _lfp;
165170

166171
/** @brief number of cells */
@@ -196,11 +201,6 @@ struct NrnThreadMappingInfo {
196201
void add_segment_id(const int segment_id) {
197202
segment_ids.push_back(segment_id);
198203
}
199-
200-
/** @brief add the lfp factor of a segment_id */
201-
void add_segment_lfp_factor(const int segment_id, double factor) {
202-
lfp_factors.insert({segment_id, factor});
203-
}
204204
};
205205
} // namespace coreneuron
206206

coreneuron/io/reports/report_event.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ ReportEvent::ReportEvent(double dt,
2525
double tstart,
2626
const VarsToReport& filtered_gids,
2727
const char* name,
28-
double report_dt)
28+
double report_dt,
29+
ReportType type)
2930
: dt(dt)
3031
, tstart(tstart)
3132
, report_path(name)
3233
, report_dt(report_dt)
34+
, report_type(type)
3335
, vars_to_report(filtered_gids) {
3436
nrn_assert(filtered_gids.size());
3537
step = tstart / dt;
@@ -77,19 +79,27 @@ void ReportEvent::lfp_calc(NrnThread* nt) {
7779
// Calculate lfp only on reporting steps
7880
if (step > 0 && (static_cast<int>(step) % reporting_period) == 0) {
7981
auto* mapinfo = static_cast<NrnThreadMappingInfo*>(nt->mapping);
80-
double sum = 0.0;
8182
double* fast_imem_rhs = nt->nrn_fast_imem->nrn_sav_rhs;
82-
for (const auto& kv: mapinfo->lfp_factors) {
83-
int segment_id = kv.first;
84-
double factor = kv.second;
85-
if(std::isnan(factor)) {
86-
factor = 0.0;
87-
}
88-
std::cout << segment_id << " - " << factor << std::endl;
89-
sum += fast_imem_rhs[segment_id] * factor;
83+
84+
for (const auto& kv: vars_to_report) {
85+
int gid = kv.first;
86+
const auto& to_report = kv.second;
87+
const auto& cell_mapping = mapinfo->get_cell_mapping(gid);
88+
89+
int count = 0;
90+
double sum = 0.0;
91+
for (const auto& kv: cell_mapping->lfp_factors) {
92+
int segment_id = kv.first;
93+
double factor = kv.second;
94+
if(std::isnan(factor)) {
95+
factor = 0.0;
96+
}
97+
sum += fast_imem_rhs[segment_id] * factor;
98+
count++;
99+
}
100+
*(to_report.front().var_value) = sum;
90101
}
91-
mapinfo->_lfp[0] = sum;
92-
}mdi
102+
}
93103
}
94104

95105
/** on deliver, call ReportingLib and setup next event */
@@ -98,7 +108,9 @@ void ReportEvent::deliver(double t, NetCvode* nc, NrnThread* nt) {
98108
#pragma omp critical
99109
{
100110
summation_alu(nt);
101-
lfp_calc(nt);
111+
if (report_type == ReportType::LFPReport) {
112+
lfp_calc(nt);
113+
}
102114
// each thread needs to know its own step
103115
#ifdef ENABLE_BIN_REPORTS
104116
records_nrec(step, gids_to_report.size(), gids_to_report.data(), report_path.data());

coreneuron/io/reports/report_event.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class ReportEvent: public DiscreteEvent {
3636
double tstart,
3737
const VarsToReport& filtered_gids,
3838
const char* name,
39-
double report_dt);
39+
double report_dt,
40+
ReportType type);
4041

4142
/** on deliver, call ReportingLib and setup next event */
4243
void deliver(double t, NetCvode* nc, NrnThread* nt) override;
@@ -53,6 +54,7 @@ class ReportEvent: public DiscreteEvent {
5354
std::vector<int> gids_to_report;
5455
double tstart;
5556
VarsToReport vars_to_report;
57+
ReportType report_type;
5658
};
5759
#endif // defined(ENABLE_BIN_REPORTS) || defined(ENABLE_SONATA_REPORTS)
5860

coreneuron/io/reports/report_handler.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ void ReportHandler::create_report(double dt, double tstop, double delay) {
6060
register_custom_report(nt, m_report_config, vars_to_report);
6161
break;
6262
case LFPReport:
63-
mapinfo->_lfp.resize(12);
63+
// 1 lfp value per gid
64+
mapinfo->_lfp.resize(nt.ncell);
6465
vars_to_report = get_lfp_vars_to_report(nt, m_report_config, mapinfo->_lfp.data());
6566
is_soma_target = m_report_config.section_type == SectionType::Soma ||
6667
m_report_config.section_type == SectionType::Cell;
@@ -75,7 +76,8 @@ void ReportHandler::create_report(double dt, double tstop, double delay) {
7576
t,
7677
vars_to_report,
7778
m_report_config.output_path.data(),
78-
m_report_config.report_dt);
79+
m_report_config.report_dt,
80+
m_report_config.type);
7981
report_event->send(t, net_cvode_instance, &nt);
8082
m_report_events.push_back(std::move(report_event));
8183
}
@@ -353,25 +355,15 @@ VarsToReport ReportHandler::get_lfp_vars_to_report(const NrnThread& nt,
353355
ReportConfiguration& report,
354356
double* report_variable) const {
355357
VarsToReport vars_to_report;
356-
/*const auto* mapinfo = static_cast<NrnThreadMappingInfo*>(nt.mapping);
357-
if (!mapinfo) {
358-
std::cerr << "[LFP] Error : mapping information is missing for a Cell group "
359-
<< nt.ncell << '\n';
360-
nrn_abort(1);
361-
}*/
362358
for (int i = 0; i < nt.ncell; i++) {
363359
int gid = nt.presyns[i].gid_;
364360
if (report.target.find(gid) == report.target.end()) {
365361
continue;
366362
}
367363

368364
std::vector<VarWithMapping> to_report;
369-
// Add all electrodes to the first gid for now
370-
std::vector<int> electrode_ids = {0};
371-
for (const auto& electrode_id : electrode_ids) {
372-
double* variable = report_variable + electrode_id;
373-
to_report.push_back(VarWithMapping(electrode_id, variable));
374-
}
365+
double* variable = report_variable + i;
366+
to_report.push_back(VarWithMapping(i, variable));
375367
vars_to_report[gid] = to_report;
376368
}
377369
return vars_to_report;

0 commit comments

Comments
 (0)