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

Commit 815ff74

Browse files
committed
Add lfp report type
1 parent f654226 commit 815ff74

9 files changed

+72
-1
lines changed

coreneuron/io/nrn_filehandler.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ 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+
137140
for (int i = 0; i < nseg; i++) {
138141
mapinfo->add_segment(sec[i], seg[i]);
139142
ntmapping->add_segment_id(seg[i]);

coreneuron/io/nrnsection_mapping.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ struct NrnThreadMappingInfo {
161161
/** map containing segment ids an its respective lfp factors */
162162
std::unordered_map<int, double> lfp_factors;
163163

164+
std::vector<double> _lfp;
165+
164166
/** @brief number of cells */
165167
size_t size() const {
166168
return mappingvec.size();

coreneuron/io/reports/nrnreport.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ enum ReportType {
7171
SynapseReport,
7272
IMembraneReport,
7373
SectionReport,
74-
SummationReport
74+
SummationReport,
75+
LFPReport
7576
};
7677

7778
// enumerate that defines the section type for a Section report

coreneuron/io/reports/report_configuration_parser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ std::vector<ReportConfiguration> create_report_configurations(
140140
report_type = SynapseReport;
141141
} else if (report.type_str == "summation") {
142142
report_type = SummationReport;
143+
} else if (report.type_str == "lfp") {
144+
nrn_use_fast_imem = true;
145+
report_type = LFPReport;
143146
} else {
144147
std::cerr << "Report error: unsupported type " << report.type_str << std::endl;
145148
nrn_abort(1);

coreneuron/io/reports/report_event.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "coreneuron/sim/multicore.hpp"
1111
#include "coreneuron/io/reports/nrnreport.hpp"
1212
#include "coreneuron/utils/nrn_assert.h"
13+
#include "coreneuron/io/nrnsection_mapping.hpp"
1314
#ifdef ENABLE_BIN_REPORTS
1415
#include "reportinglib/Records.h"
1516
#endif // ENABLE_BIN_REPORTS
@@ -72,12 +73,32 @@ void ReportEvent::summation_alu(NrnThread* nt) {
7273
}
7374
}
7475

76+
void ReportEvent::lfp_calc(NrnThread* nt) {
77+
// Calculate lfp only on reporting steps
78+
if (step > 0 && (static_cast<int>(step) % reporting_period) == 0) {
79+
auto* mapinfo = static_cast<NrnThreadMappingInfo*>(nt->mapping);
80+
double sum = 0.0;
81+
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;
90+
}
91+
mapinfo->_lfp[0] = sum;
92+
}mdi
93+
}
94+
7595
/** on deliver, call ReportingLib and setup next event */
7696
void ReportEvent::deliver(double t, NetCvode* nc, NrnThread* nt) {
7797
/* reportinglib is not thread safe */
7898
#pragma omp critical
7999
{
80100
summation_alu(nt);
101+
lfp_calc(nt);
81102
// each thread needs to know its own step
82103
#ifdef ENABLE_BIN_REPORTS
83104
records_nrec(step, gids_to_report.size(), gids_to_report.data(), report_path.data());

coreneuron/io/reports/report_event.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class ReportEvent: public DiscreteEvent {
4242
void deliver(double t, NetCvode* nc, NrnThread* nt) override;
4343
bool require_checkpoint() override;
4444
void summation_alu(NrnThread* nt);
45+
void lfp_calc(NrnThread* nt);
4546

4647
private:
4748
double dt;

coreneuron/io/reports/report_handler.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ void ReportHandler::create_report(double dt, double tstop, double delay) {
3535
continue;
3636
}
3737
const std::vector<int>& nodes_to_gid = map_gids(nt);
38+
auto* mapinfo = static_cast<NrnThreadMappingInfo*>(nt.mapping);
3839
VarsToReport vars_to_report;
3940
bool is_soma_target;
4041
switch (m_report_config.type) {
@@ -58,6 +59,13 @@ void ReportHandler::create_report(double dt, double tstop, double delay) {
5859
nodes_to_gid);
5960
register_custom_report(nt, m_report_config, vars_to_report);
6061
break;
62+
case LFPReport:
63+
mapinfo->_lfp.resize(12);
64+
vars_to_report = get_lfp_vars_to_report(nt, m_report_config, mapinfo->_lfp.data());
65+
is_soma_target = m_report_config.section_type == SectionType::Soma ||
66+
m_report_config.section_type == SectionType::Cell;
67+
register_section_report(nt, m_report_config, vars_to_report, is_soma_target);
68+
break;
6169
default:
6270
vars_to_report = get_synapse_vars_to_report(nt, m_report_config, nodes_to_gid);
6371
register_custom_report(nt, m_report_config, vars_to_report);
@@ -341,6 +349,34 @@ VarsToReport ReportHandler::get_synapse_vars_to_report(
341349
return vars_to_report;
342350
}
343351

352+
VarsToReport ReportHandler::get_lfp_vars_to_report(const NrnThread& nt,
353+
ReportConfiguration& report,
354+
double* report_variable) const {
355+
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+
}*/
362+
for (int i = 0; i < nt.ncell; i++) {
363+
int gid = nt.presyns[i].gid_;
364+
if (report.target.find(gid) == report.target.end()) {
365+
continue;
366+
}
367+
368+
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+
}
375+
vars_to_report[gid] = to_report;
376+
}
377+
return vars_to_report;
378+
}
379+
344380
// map GIDs of every compartment, it consist in a backward sweep then forward sweep algorithm
345381
std::vector<int> ReportHandler::map_gids(const NrnThread& nt) const {
346382
std::vector<int> nodes_gid(nt.end, -1);

coreneuron/io/reports/report_handler.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ class ReportHandler {
4444
VarsToReport get_synapse_vars_to_report(const NrnThread& nt,
4545
ReportConfiguration& report,
4646
const std::vector<int>& nodes_to_gids) const;
47+
VarsToReport get_lfp_vars_to_report(const NrnThread& nt,
48+
ReportConfiguration& report,
49+
double* report_variable) const;
4750
std::vector<int> map_gids(const NrnThread& nt) const;
4851
#endif // defined(ENABLE_BIN_REPORTS) || defined(ENABLE_SONATA_REPORTS)
4952
protected:

coreneuron/io/reports/sonata_report_handler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ void SonataReportHandler::register_custom_report(const NrnThread& nt,
4141
void SonataReportHandler::register_report(const NrnThread& nt,
4242
ReportConfiguration& config,
4343
const VarsToReport& vars_to_report) {
44+
std::cout << "Registering report " << config.output_path.data() << std::endl;
4445
sonata_create_report(config.output_path.data(),
4546
config.start,
4647
config.stop,

0 commit comments

Comments
 (0)