14 #ifdef ENABLE_SONATA_REPORTS
15 #include "bbp/sonata/reports.h"
20 #ifdef ENABLE_SONATA_REPORTS
21 ReportEvent::ReportEvent(
double dt,
23 const VarsToReport& filtered_gids,
30 , report_dt(report_dt)
32 , vars_to_report(filtered_gids) {
35 reporting_period =
static_cast<int>(report_dt /
dt);
36 gids_to_report.reserve(filtered_gids.size());
37 for (
const auto& gid: filtered_gids) {
38 gids_to_report.push_back(gid.first);
40 std::sort(gids_to_report.begin(), gids_to_report.end());
48 void ReportEvent::summation_alu(
NrnThread* nt) {
49 auto& summation_report = nt->summation_report_handler_->summation_reports_[report_path];
50 const auto weighted_sum_accumulator = [](
double acc,
const auto& pair) {
53 return acc + (*pair.first) * pair.second;
57 for (
const auto& [segment_id, current_pairs]: summation_report.currents_) {
58 double sum = std::accumulate(current_pairs.begin(),
61 weighted_sum_accumulator);
63 summation_report.summation_[segment_id] = sum;
67 if (!summation_report.gid_segments_.empty()) {
68 const auto accumulator = [&summation_report](
double acc,
int segment_id) {
69 return acc + summation_report.summation_[segment_id];
71 for (
const auto& [gid, segment_ids]: summation_report.gid_segments_) {
73 std::accumulate(segment_ids.begin(), segment_ids.end(), 0.0, accumulator);
75 *(vars_to_report[gid].front().var_value) = sum_soma;
80 void ReportEvent::lfp_calc(
NrnThread* nt) {
81 auto*
mapinfo =
static_cast<NrnThreadMappingInfo*
>(nt->mapping);
82 double* fast_imem_rhs = nt->nrn_fast_imem->nrn_sav_rhs;
83 auto& summation_report = nt->summation_report_handler_->summation_reports_[report_path];
84 for (
const auto& kv: vars_to_report) {
86 const auto& to_report = kv.second;
88 int num_electrodes = cell_mapping->num_electrodes();
89 std::vector<double> lfp_values(num_electrodes, 0.0);
90 for (
const auto& kv: cell_mapping->lfp_factors) {
91 int segment_id = kv.first;
92 const auto& factors = kv.second;
94 for (
const auto& factor: factors) {
96 for (
const auto&
value: summation_report.currents_[segment_id]) {
97 double current_value = *
value.first;
98 int scale =
value.second;
99 iclamp += current_value * scale;
101 lfp_values[electrode_id] += (fast_imem_rhs[segment_id] + iclamp) * factor;
105 for (
int i = 0;
i < to_report.size();
i++) {
106 *(to_report[
i].var_value) = lfp_values[
i];
117 if ((
static_cast<int>(
step) % reporting_period) == 0) {
118 if (report_type == ReportType::Summation) {
120 }
else if (report_type == ReportType::LFP) {
125 #ifdef ENABLE_SONATA_REPORTS
126 sonata_record_node_data(
step,
127 gids_to_report.size(),
128 gids_to_report.data(),
131 send(
t +
dt, nc, nt);
136 bool ReportEvent::require_checkpoint() {
THIS FILE IS AUTO GENERATED DONT MODIFY IT.
#define nrn_assert(x)
assert()-like macro, independent of NDEBUG status
NrnMappingInfo mapinfo
mapping information
CellMapping * get_cell_mapping(int gid)
get cell mapping information for given gid if exist otherwise return NULL.
Represent main neuron object computed by single thread.