17 #ifdef ENABLE_SONATA_REPORTS
18 #include "bbp/sonata/reports.h"
23 #ifdef ENABLE_SONATA_REPORTS
24 ReportEvent::ReportEvent(
double dt,
26 const VarsToReport& filtered_gids,
33 , report_dt(report_dt)
35 , vars_to_report(filtered_gids) {
38 reporting_period =
static_cast<int>(report_dt /
dt);
39 gids_to_report.reserve(filtered_gids.size());
40 for (
const auto& gid: filtered_gids) {
41 gids_to_report.push_back(gid.first);
43 std::sort(gids_to_report.begin(), gids_to_report.end());
51 void ReportEvent::summation_alu(
NrnThread* nt) {
52 auto& summation_report = nt->summation_report_handler_->summation_reports_[report_path];
53 const auto weighted_sum_accumulator = [](
double acc,
const auto& pair) {
56 return acc + (*pair.first) * pair.second;
60 for (
const auto& [segment_id, current_pairs]: summation_report.currents_) {
61 double sum = std::accumulate(current_pairs.begin(),
64 weighted_sum_accumulator);
66 summation_report.summation_[segment_id] = sum;
70 if (!summation_report.gid_segments_.empty()) {
71 const auto accumulator = [&summation_report](
double acc,
int segment_id) {
72 return acc + summation_report.summation_[segment_id];
74 for (
const auto& [gid, segment_ids]: summation_report.gid_segments_) {
76 std::accumulate(segment_ids.begin(), segment_ids.end(), 0.0, accumulator);
78 *(vars_to_report[gid].front().var_value) = sum_soma;
89 void ReportEvent::lfp_calc(
NrnThread* nt) {
90 auto*
mapinfo =
static_cast<NrnThreadMappingInfo*
>(nt->mapping);
91 double* fast_imem_rhs = nt->nrn_fast_imem->nrn_sav_rhs;
92 auto& summation_report = nt->summation_report_handler_->summation_reports_[report_path];
93 for (
const auto& kv: vars_to_report) {
95 const auto& electrode_outputs = kv.second;
97 const auto n_electrodes = cell_mapping->num_electrodes();
98 const auto n_segments = cell_mapping->lfp_segment_ids.
size();
99 std::vector<double> lfp_values(n_electrodes, 0.0);
100 for (
size_t i = 0;
i < n_segments;
i++) {
101 const auto segment_id = cell_mapping->lfp_segment_ids[
i];
104 const double imem = std::accumulate(summation_report.currents_[segment_id].begin(),
105 summation_report.currents_[segment_id].end(),
106 fast_imem_rhs[segment_id],
107 [](
double sum,
const auto&
value) {
108 return sum + *value.first * value.second;
112 const double* factors = &cell_mapping->lfp_factors_flat[
i * n_electrodes];
113 for (
size_t e = 0; e < n_electrodes; e++) {
114 lfp_values[e] += imem * factors[e];
119 for (
const auto& output: electrode_outputs) {
120 *(output.var_value) = lfp_values[output.id];
131 if ((
static_cast<int>(
step) % reporting_period) == 0) {
132 if (report_type == ReportType::Summation) {
134 }
else if (report_type == ReportType::LFP) {
139 #ifdef ENABLE_SONATA_REPORTS
140 sonata_record_node_data(
step,
141 gids_to_report.size(),
142 gids_to_report.data(),
145 send(
t +
dt, nc, nt);
150 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
size_t size()
number of section lists
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.