27 #ifdef ENABLE_SONATA_REPORTS
28 #include "bbp/sonata/reports.h"
38 static bool all_spikes_return(std::vector<double>& spiketvec, std::vector<int>& spikegidvec) {
40 (*nrn2core_all_spike_vectors_return_)(spiketvec, spikegidvec);
54 }
catch (
const std::length_error& le) {
55 std::cerr <<
"Lenght error" << le.what() << std::endl;
68 std::vector<int>& isvecg,
69 std::vector<double>& osvect,
70 std::vector<int>& osvecg) {
71 osvect.resize(isvect.size());
72 osvecg.resize(isvecg.size());
74 std::vector<std::size_t> perm(isvect.size());
75 std::iota(perm.begin(), perm.end(), 0);
77 std::sort(perm.begin(), perm.end(), [&](std::size_t
i, std::size_t
j) {
78 return isvect[i] < isvect[j] || (isvect[i] == isvect[j] && isvecg[i] < isvecg[j]);
82 std::transform(perm.begin(), perm.end(), osvect.begin(), [&](std::size_t
i) {
85 std::transform(perm.begin(), perm.end(), osvecg.begin(), [&](std::size_t
i) {
93 double lmin_time = std::numeric_limits<double>::max();
94 double lmax_time = std::numeric_limits<double>::min();
99 double min_time = nrnmpi_dbl_allmin(lmin_time);
100 double max_time = nrnmpi_dbl_allmax(lmax_time);
109 bin_t = bin_t ? bin_t : 1;
112 int idx = (int) (st - min_time) / bin_t;
116 snd_dsps[
i] = snd_dsps[
i - 1] + snd_cnts[
i - 1];
121 nrnmpi_int_alltoall(&snd_cnts[0], &rcv_cnts[0], 1);
123 rcv_dsps[
i] = rcv_dsps[
i - 1] + rcv_cnts[
i - 1];
125 std::size_t new_sz = 0;
126 for (
const auto& r: rcv_cnts) {
130 std::vector<double> svt_buf(new_sz, 0.0);
131 std::vector<int> svg_buf(new_sz, 0);
150 #ifdef ENABLE_SONATA_REPORTS
154 void output_spike_populations(
const SpikesInfo& spikes_info) {
156 if (spikes_info.population_info.empty()) {
157 sonata_add_spikes_population(
"All",
165 int n_populations = spikes_info.population_info.size();
166 for (
int idx = 0; idx < n_populations; idx++) {
167 const auto& curr_pop = spikes_info.population_info[idx];
168 std::string population_name = curr_pop.first;
169 int population_offset = curr_pop.second;
170 int gid_lower = population_offset;
171 int gid_upper = std::numeric_limits<int>::max();
172 if (idx != n_populations - 1) {
173 gid_upper = spikes_info.population_info[idx + 1].second - 1;
175 std::vector<double> pop_spikevec_time;
176 std::vector<int> pop_spikevec_gid;
183 sonata_add_spikes_population(population_name.data(),
185 pop_spikevec_time.data(),
186 pop_spikevec_time.size(),
187 pop_spikevec_gid.data(),
188 pop_spikevec_gid.size());
197 static void output_spikes_parallel(
const char* outpath,
const SpikesInfo& spikes_info) {
198 std::stringstream ss;
199 ss << outpath <<
"/out.dat";
200 std::string fname = ss.str();
206 #ifdef ENABLE_SONATA_REPORTS
207 sonata_create_spikefile(outpath, spikes_info.file_name.data());
208 output_spike_populations(spikes_info);
209 sonata_write_spike_populations();
210 sonata_close_spikefile();
217 const int SPIKE_RECORD_LEN = 64;
219 size_t num_bytes = (
sizeof(char) * num_spikes * SPIKE_RECORD_LEN);
220 char* spike_data = (
char*) malloc(num_bytes);
222 if (spike_data ==
nullptr) {
223 printf(
"Error while writing spikes due to memory allocation\n");
228 strcpy(spike_data,
"");
231 char spike_entry[SPIKE_RECORD_LEN];
232 size_t spike_data_offset = 0;
233 for (
size_t i = 0;
i < num_spikes;
i++) {
234 int spike_entry_chars =
237 strcat_at_pos(spike_data, spike_data_offset, spike_entry, spike_entry_chars);
242 size_t num_chars = strlen(spike_data);
244 nrnmpi_write_file(fname, spike_data, num_chars);
251 std::stringstream ss;
252 ss << outpath <<
"/out.dat";
253 std::string fname = ss.str();
256 std::vector<double> sorted_spikevec_time(
spikevec_time.size());
257 std::vector<int> sorted_spikevec_gid(
spikevec_gid.size());
263 FILE* f = fopen(fname.c_str(),
"w");
265 std::cout <<
"WARNING: Could not open file for writing spikes." << std::endl;
269 for (std::size_t
i = 0;
i < sorted_spikevec_gid.size(); ++
i)
270 if (sorted_spikevec_gid[
i] > -1)
271 fprintf(f,
"%.8g\t%d\n", sorted_spikevec_time[
i], sorted_spikevec_gid[
i]);
284 output_spikes_parallel(outpath, spikes_info);
static void nrnmpi_dbl_alltoallv(const double *s, const int *scnt, const int *sdispl, double *r, int *rcnt, int *rdispl)
static void nrnmpi_int_alltoallv(const int *s, const int *scnt, const int *sdispl, int *r, int *rcnt, int *rdispl)
static void nrnmpi_barrier()
THIS FILE IS AUTO GENERATED DONT MODIFY IT.
static void output_spikes_serial(const char *outpath)
static void local_spikevec_sort(std::vector< double > &isvect, std::vector< int > &isvecg, std::vector< double > &osvect, std::vector< int > &osvecg)
void mk_spikevec_buffer(int sz)
std::vector< double > spikevec_time
--> Coreneuron as SpikeBuffer class
void output_spikes(const char *outpath, const SpikesInfo &spikes_info)
void validation(std::vector< std::pair< double, int >> &res)
void clear_spike_vectors()
std::vector< int > spikevec_gid
corenrn_parameters corenrn_param
Printing method.
data_handle< T > transform(data_handle< T > handle, Transform type)
bool corenrn_embedded
--> Coreneuron
int(* nrn2core_all_spike_vectors_return_)(std::vector< double > &spikevec, std::vector< int > &gidvec)
static double remove(void *v)
static bool all_spikes_return(std::vector< double > &spiketvec, std::vector< int > &spikegidvec)
Return all spike vectors to NEURON.
unsigned strcat_at_pos(char *dest, unsigned start_position, char *src, unsigned src_length)
Appends a copy of the source string to the destination string.
Utility functions for strings.
bool mpi_enable
Initialization seed for random number generator (int)