CARLsim  5.0.0
CARLsim: a GPU-accelerated SNN simulator
print_snn_info.cpp
Go to the documentation of this file.
1 /* * Copyright (c) 2016 Regents of the University of California. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions
5 * are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * 3. The names of its contributors may not be used to endorse or promote
15 * products derived from this software without specific prior written
16 * permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * *********************************************************************************************** *
31 * CARLsim
32 * created by: (MDR) Micah Richert, (JN) Jayram M. Nageswaran
33 * maintained by:
34 * (MA) Mike Avery <averym@uci.edu>
35 * (MB) Michael Beyeler <mbeyeler@uci.edu>,
36 * (KDC) Kristofor Carlson <kdcarlso@uci.edu>
37 * (TSC) Ting-Shuo Chou <tingshuc@uci.edu>
38 * (HK) Hirak J Kashyap <kashyaph@uci.edu>
39 *
40 * CARLsim v1.0: JM, MDR
41 * CARLsim v2.0/v2.1/v2.2: JM, MDR, MA, MB, KDC
42 * CARLsim3: MB, KDC, TSC
43 * CARLsim4: TSC, HK
44 * CARLsim5: HK, JX, KC
45 *
46 * CARLsim available from http://socsci.uci.edu/~jkrichma/CARLsim/
47 * Ver 12/31/2016
48 */
49 
50 #include <snn.h>
52 #include <group_monitor_core.h>
53 
54 void SNN::printStatusConnectionMonitor(int connId) {
55  for (int monId=0; monId<numConnectionMonitor; monId++) {
56  if (connId==ALL || connMonCoreList[monId]->getConnectId()==connId) {
57  // print connection weights (sparse representation: show only actually connected synapses)
58  // show the first hundred connections: (pre=>post) weight
59  connMonCoreList[monId]->printSparse(ALL, 100, 4, false);
60  }
61  }
62 }
63 
64 void SNN::printStatusSpikeMonitor(int gGrpId) {
65  if (gGrpId==ALL) {
66  for (int g = 0; g < numGroups; g++) {
67  printStatusSpikeMonitor(g);
68  }
69  } else {
70  int netId = groupConfigMDMap[gGrpId].netId;
71  int lGrpId = groupConfigMDMap[gGrpId].lGrpId;
72  int monitorId = groupConfigMDMap[gGrpId].spikeMonitorId;
73 
74  if (monitorId == -1) return;
75 
76  // copy data to the manager runtime
77  fetchNeuronSpikeCount(gGrpId);
78 
79  // \TODO nSpikeCnt should really be a member of the SpikeMonitor object that gets populated if
80  // printRunSummary is true or mode==COUNT.....
81  // so then we can use spkMonObj->print(false); // showSpikeTimes==false
82  int grpSpk = 0;
83  for (int gNId = groupConfigMDMap[gGrpId].gStartN; gNId <= groupConfigMDMap[gGrpId].gEndN; gNId++)
84  grpSpk += managerRuntimeData.nSpikeCnt[gNId]; // add up all neuronal spike counts
85 
86  // infer run duration by measuring how much time has passed since the last run summary was printed
87  int runDurationMs = simTime - simTimeLastRunSummary;
88 
89  if (simTime <= simTimeLastRunSummary) {
90  KERNEL_INFO("(t=%.3fs) SpikeMonitor for group %s(%d) has %d spikes in %dms (%.2f +/- %.2f Hz)",
91  (float)(simTime / 1000.0f),
92  groupConfigMap[gGrpId].grpName.c_str(),
93  gGrpId,
94  0,
95  0,
96  0.0f,
97  0.0f);
98  } else {
99  // if some time has passed since last print
100  float meanRate = grpSpk * 1000.0f / runDurationMs / groupConfigMap[gGrpId].numN;
101  float std = 0.0f;
102  if (groupConfigMap[gGrpId].numN > 1) {
103  for (int gNId = groupConfigMDMap[gGrpId].gStartN; gNId <= groupConfigMDMap[gGrpId].gEndN; gNId++) {
104  float neurRate = managerRuntimeData.nSpikeCnt[gNId] * 1000.0f / runDurationMs;
105  std += (neurRate - meanRate) * (neurRate - meanRate);
106  }
107  std = sqrt(std / (groupConfigs[netId][lGrpId].numN - 1.0));
108  }
109 
110  KERNEL_INFO("(t=%.3fs) SpikeMonitor for group %s(%d) has %d spikes in %ums (%.2f +/- %.2f Hz)",
111  simTime / 1000.0f,
112  groupConfigMap[gGrpId].grpName.c_str(),
113  gGrpId,
114  grpSpk,
115  runDurationMs,
116  meanRate,
117  std);
118  }
119  }
120 }
121 
122 void SNN::printStatusGroupMonitor(int gGrpId) {
123  if (gGrpId == ALL) {
124  for (int g = 0; g < numGroups; g++) {
125  printStatusGroupMonitor(g);
126  }
127  } else {
128  int netId = groupConfigMDMap[gGrpId].netId;
129  int lGrpId = groupConfigMDMap[gGrpId].lGrpId;
130  int monitorId = groupConfigMDMap[gGrpId].groupMonitorId;
131 
132  if (monitorId == -1) return;
133 
134  std::vector<int> peakTimeVector = groupMonCoreList[monitorId]->getPeakTimeVector();
135  int numPeaks = peakTimeVector.size();
136 
137  // infer run duration by measuring how much time has passed since the last run summary was printed
138  int runDurationMs = simTime - simTimeLastRunSummary;
139 
140  if (simTime <= simTimeLastRunSummary) {
141  KERNEL_INFO("(t=%.3fs) GroupMonitor for group %s(%d) has %d peak(s) in %dms",
142  simTime / 1000.0f,
143  groupConfigMap[gGrpId].grpName.c_str(),
144  gGrpId,
145  0,
146  0);
147  } else {
148  // if some time has passed since last print
149  KERNEL_INFO("(t=%.3fs) GroupMonitor for group %s(%d) has %d peak(s) in %ums",
150  simTime / 1000.0f,
151  groupConfigMap[gGrpId].grpName.c_str(),
152  gGrpId,
153  numPeaks,
154  runDurationMs);
155  }
156  }
157 }
158 
159 // new print connection info, akin to printGroupInfo
160 void SNN::printConnectionInfo(short int connId) {
161  ConnectConfig connConfig = connectConfigMap[connId];
162 
163  KERNEL_INFO("Connection ID %d: %s(%d) => %s(%d)", connId, groupConfigMap[connConfig.grpSrc].grpName.c_str(),
164  connConfig.grpSrc, groupConfigMap[connConfig.grpDest].grpName.c_str(), connConfig.grpDest);
165  KERNEL_INFO(" - Type = %s", GET_FIXED_PLASTIC(connConfig.connProp)==SYN_PLASTIC?" PLASTIC":" FIXED")
166  KERNEL_INFO(" - Min weight = %8.5f", 0.0f); // \TODO
167  KERNEL_INFO(" - Max weight = %8.5f", fabs(connConfig.maxWt));
168  KERNEL_INFO(" - Initial weight = %8.5f", fabs(connConfig.initWt));
169  KERNEL_INFO(" - Min delay = %8d", connConfig.minDelay);
170  KERNEL_INFO(" - Max delay = %8d", connConfig.maxDelay);
171  KERNEL_INFO(" - Radius X = %8.2f", connConfig.connRadius.radX);
172  KERNEL_INFO(" - Radius Y = %8.2f", connConfig.connRadius.radY);
173  KERNEL_INFO(" - Radius Z = %8.2f", connConfig.connRadius.radZ);
174  KERNEL_INFO(" - Num of synapses = %d", connConfig.numberOfConnections);
175  float avgPostM = ((float)connConfig.numberOfConnections)/groupConfigMap[connConfig.grpSrc].numN;
176  float avgPreM = ((float)connConfig.numberOfConnections)/groupConfigMap[connConfig.grpDest].numN;
177  KERNEL_INFO(" - Avg numPreSynapses = %8.2f", avgPreM );
178  KERNEL_INFO(" - Avg numPostSynapses = %8.2f", avgPostM );
179 }
180 
181 // print connection info, akin to printGroupInfo
182 void SNN::printConnectionInfo(int netId, std::list<ConnectConfig>::iterator connIt) {
183 
184  KERNEL_INFO(" |-+ %s Connection Id %d: %s(%d) => %s(%d)", netId == groupConfigMDMap[connIt->grpDest].netId ? "Local" : "External", connIt->connId,
185  groupConfigMap[connIt->grpSrc].grpName.c_str(), connIt->grpSrc,
186  groupConfigMap[connIt->grpDest].grpName.c_str(), connIt->grpDest);
187  KERNEL_INFO(" |- Type = %s", GET_FIXED_PLASTIC(connIt->connProp)==SYN_PLASTIC?" PLASTIC":" FIXED")
188  KERNEL_INFO(" |- Min weight = %8.5f", 0.0f); // \TODO
189  KERNEL_INFO(" |- Max weight = %8.5f", fabs(connIt->maxWt));
190  KERNEL_INFO(" |- Initial weight = %8.5f", fabs(connIt->initWt));
191  KERNEL_INFO(" |- Min delay = %8d", connIt->minDelay);
192  KERNEL_INFO(" |- Max delay = %8d", connIt->maxDelay);
193  KERNEL_INFO(" |- Radius X = %8.2f", connIt->connRadius.radX);
194  KERNEL_INFO(" |- Radius Y = %8.2f", connIt->connRadius.radY);
195  KERNEL_INFO(" |- Radius Z = %8.2f", connIt->connRadius.radZ);
196  KERNEL_INFO(" |- Num of synapses = %d", connIt->numberOfConnections);
197  float avgPostM = ((float)connIt->numberOfConnections)/groupConfigMap[connIt->grpSrc].numN;
198  float avgPreM = ((float)connIt->numberOfConnections)/groupConfigMap[connIt->grpDest].numN;
199  KERNEL_INFO(" |- Avg numPreSynapses = %8.2f", avgPreM );
200  KERNEL_INFO(" |- Avg numPostSynapses = %8.2f", avgPostM );
201 }
202 
203 void SNN::printGroupInfo(int gGrpId) {
204  KERNEL_INFO("Group %s(%d): ", groupConfigMap[gGrpId].grpName.c_str(), gGrpId);
205  KERNEL_INFO(" - Type = %s", isExcitatoryGroup(gGrpId) ? " EXCIT" :
206  (isInhibitoryGroup(gGrpId) ? " INHIB" : (isPoissonGroup(gGrpId)?" POISSON" :
207  (isDopaminergicGroup(gGrpId) ? " DOPAM" : " UNKNOWN"))) );
208  KERNEL_INFO(" - Size = %8d", groupConfigMap[gGrpId].numN);
209  KERNEL_INFO(" - Start Id = %8d", groupConfigMDMap[gGrpId].gStartN);
210  KERNEL_INFO(" - End Id = %8d", groupConfigMDMap[gGrpId].gEndN);
211  KERNEL_INFO(" - numPostSynapses = %8d", groupConfigMDMap[gGrpId].numPostSynapses);
212  KERNEL_INFO(" - numPreSynapses = %8d", groupConfigMDMap[gGrpId].numPreSynapses);
213 
214  if (snnState == EXECUTABLE_SNN) {
215  KERNEL_INFO(" - Avg post connections = %8.5f", ((float)groupConfigMDMap[gGrpId].numPostSynapses)/groupConfigMap[gGrpId].numN);
216  KERNEL_INFO(" - Avg pre connections = %8.5f", ((float)groupConfigMDMap[gGrpId].numPreSynapses )/groupConfigMap[gGrpId].numN);
217  }
218 
219  if(groupConfigMap[gGrpId].type & POISSON_NEURON) {
220  KERNEL_INFO(" - Refractory period = %8.5f", groupConfigMDMap[gGrpId].refractPeriod);
221  }
222 
223  if (groupConfigMap[gGrpId].stpConfig.WithSTP) {
224  KERNEL_INFO(" - STP:");
225  KERNEL_INFO(" - STP_A = %8.5f", groupConfigMap[gGrpId].stpConfig.STP_A);
226  KERNEL_INFO(" - STP_U = %8.5f", groupConfigMap[gGrpId].stpConfig.STP_U);
227  KERNEL_INFO(" - STP_tau_u = %8d", (int) (1.0f/groupConfigMap[gGrpId].stpConfig.STP_tau_u_inv));
228  KERNEL_INFO(" - STP_tau_x = %8d", (int) (1.0f/groupConfigMap[gGrpId].stpConfig.STP_tau_x_inv));
229  }
230 
231  if(groupConfigMap[gGrpId].stdpConfig.WithSTDP) {
232  KERNEL_INFO(" - STDP:")
233  KERNEL_INFO(" - E-STDP TYPE = %s", groupConfigMap[gGrpId].stdpConfig.WithESTDPtype == STANDARD ? "STANDARD" :
234  (groupConfigMap[gGrpId].stdpConfig.WithESTDPtype == DA_MOD ? " DA_MOD" : " UNKNOWN"));
235  KERNEL_INFO(" - I-STDP TYPE = %s", groupConfigMap[gGrpId].stdpConfig.WithISTDPtype == STANDARD ? "STANDARD" :
236  (groupConfigMap[gGrpId].stdpConfig.WithISTDPtype == DA_MOD?" DA_MOD":" UNKNOWN"));
237  KERNEL_INFO(" - ALPHA_PLUS_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.ALPHA_PLUS_EXC);
238  KERNEL_INFO(" - ALPHA_MINUS_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.ALPHA_MINUS_EXC);
239  KERNEL_INFO(" - TAU_PLUS_INV_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.TAU_PLUS_INV_EXC);
240  KERNEL_INFO(" - TAU_MINUS_INV_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.TAU_MINUS_INV_EXC);
241  KERNEL_INFO(" - BETA_LTP = %8.5f", groupConfigMap[gGrpId].stdpConfig.BETA_LTP);
242  KERNEL_INFO(" - BETA_LTD = %8.5f", groupConfigMap[gGrpId].stdpConfig.BETA_LTD);
243  KERNEL_INFO(" - LAMBDA = %8.5f", groupConfigMap[gGrpId].stdpConfig.LAMBDA);
244  KERNEL_INFO(" - DELTA = %8.5f", groupConfigMap[gGrpId].stdpConfig.DELTA);
245  }
246 }
247 
248 void SNN::printGroupInfo(int netId, std::list<GroupConfigMD>::iterator grpIt) {
249  int gGrpId = grpIt->gGrpId;
250  KERNEL_INFO(" |-+ %s Group %s(G:%d,L:%d): ", netId == grpIt->netId ? "Local" : "External", groupConfigMap[grpIt->gGrpId].grpName.c_str(), grpIt->gGrpId, grpIt->lGrpId);
251  KERNEL_INFO(" |- Type = %s", isExcitatoryGroup(grpIt->gGrpId) ? " EXCIT" :
252  (isInhibitoryGroup(grpIt->gGrpId) ? " INHIB" : (isPoissonGroup(grpIt->gGrpId)?" POISSON" :
253  (isDopaminergicGroup(grpIt->gGrpId) ? " DOPAM" : " UNKNOWN"))) );
254  KERNEL_INFO(" |- Num of Neurons = %8d", groupConfigMap[grpIt->gGrpId].numN);
255  KERNEL_INFO(" |- Start Id = (G:%d,L:%d)", grpIt->gStartN, grpIt->lStartN);
256  KERNEL_INFO(" |- End Id = (G:%d,L:%d)", grpIt->gEndN, grpIt->lEndN);
257  KERNEL_INFO(" |- numPostSynapses = %8d", grpIt->numPostSynapses);
258  KERNEL_INFO(" |- numPreSynapses = %8d", grpIt->numPreSynapses);
259 
260  if (snnState == EXECUTABLE_SNN) {
261  KERNEL_INFO(" |- Avg post connections = %8.5f", ((float)grpIt->numPostSynapses) / groupConfigMap[gGrpId].numN);
262  KERNEL_INFO(" |- Avg pre connections = %8.5f", ((float)grpIt->numPreSynapses) / groupConfigMap[gGrpId].numN);
263  }
264 
265  if (groupConfigMap[gGrpId].type & POISSON_NEURON) {
266  KERNEL_INFO(" |- Refractory period = %8.5f", grpIt->refractPeriod);
267  }
268 
269  if (groupConfigMap[gGrpId].stpConfig.WithSTP) {
270  KERNEL_INFO(" |-+ STP:");
271  KERNEL_INFO(" |- STP_A = %8.5f", groupConfigMap[gGrpId].stpConfig.STP_A);
272  KERNEL_INFO(" |- STP_U = %8.5f", groupConfigMap[gGrpId].stpConfig.STP_U);
273  KERNEL_INFO(" |- STP_tau_u = %8d", (int)(1.0f / groupConfigMap[gGrpId].stpConfig.STP_tau_u_inv));
274  KERNEL_INFO(" |- STP_tau_x = %8d", (int)(1.0f / groupConfigMap[gGrpId].stpConfig.STP_tau_x_inv));
275  }
276 
277  if (groupConfigMap[gGrpId].stdpConfig.WithSTDP) {
278  KERNEL_INFO(" |-+ STDP:")
279  KERNEL_INFO(" |- E-STDP TYPE = %s", groupConfigMap[gGrpId].stdpConfig.WithESTDPtype == STANDARD ? "STANDARD" :
280  (groupConfigMap[gGrpId].stdpConfig.WithESTDPtype == DA_MOD ? " DA_MOD" : " UNKNOWN"));
281  KERNEL_INFO(" |- I-STDP TYPE = %s", groupConfigMap[gGrpId].stdpConfig.WithISTDPtype == STANDARD ? "STANDARD" :
282  (groupConfigMap[gGrpId].stdpConfig.WithISTDPtype == DA_MOD ? " DA_MOD" : " UNKNOWN"));
283  KERNEL_INFO(" |- ALPHA_PLUS_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.ALPHA_PLUS_EXC);
284  KERNEL_INFO(" |- ALPHA_MINUS_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.ALPHA_MINUS_EXC);
285  KERNEL_INFO(" |- TAU_PLUS_INV_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.TAU_PLUS_INV_EXC);
286  KERNEL_INFO(" |- TAU_MINUS_INV_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.TAU_MINUS_INV_EXC);
287  KERNEL_INFO(" |- BETA_LTP = %8.5f", groupConfigMap[gGrpId].stdpConfig.BETA_LTP);
288  KERNEL_INFO(" |- BETA_LTD = %8.5f", groupConfigMap[gGrpId].stdpConfig.BETA_LTD);
289  KERNEL_INFO(" |- LAMBDA = %8.5f", groupConfigMap[gGrpId].stdpConfig.LAMBDA);
290  KERNEL_INFO(" |- DELTA = %8.5f", groupConfigMap[gGrpId].stdpConfig.DELTA);
291  }
292 }
293 
294 void SNN::printSikeRoutingInfo() {
295  if (!spikeRoutingTable.empty()) {
296  KERNEL_INFO("***************** Spike Routing Table *************************");
297  for (std::list<RoutingTableEntry>::iterator rteItr = spikeRoutingTable.begin(); rteItr != spikeRoutingTable.end(); rteItr++)
298  KERNEL_INFO(" |-Source net:[%d] -> Destination net[%d]", rteItr->srcNetId, rteItr->destNetId);
299  }
300 }
301 
POISSON_NEURON
#define POISSON_NEURON
Definition: carlsim_definitions.h:66
connection_monitor_core.h
ConnectConfig_s::initWt
float initWt
Definition: snn_datastructures.h:126
RadiusRF::radX
double radX
Definition: carlsim_datastructures.h:373
ConnectConfig_s::grpSrc
int grpSrc
Definition: snn_datastructures.h:121
group_monitor_core.h
GroupMonitorCore::getPeakTimeVector
std::vector< int > getPeakTimeVector()
get the timestamps for peak values
Definition: group_monitor_core.cpp:126
ConnectionMonitorCore::printSparse
void printSparse(int neurPostId=ALL, int maxConn=100, int connPerLine=4, bool storeNewSnapshot=true)
Definition: connection_monitor_core.cpp:342
STDP
#define STDP(t, a, b)
Definition: snn_definitions.h:150
ConnectConfig_s::maxDelay
uint8_t maxDelay
Definition: snn_datastructures.h:123
ConnectConfig_s::grpDest
int grpDest
Definition: snn_datastructures.h:122
SNN::isPoissonGroup
bool isPoissonGroup(int gGrpId)
Definition: snn.h:623
ALL
#define ALL
CARLsim common definitions.
Definition: carlsim_definitions.h:56
ConnectConfig_s::minDelay
uint8_t minDelay
Definition: snn_datastructures.h:124
KERNEL_INFO
#define KERNEL_INFO(formatc,...)
Definition: snn_definitions.h:114
ConnectConfig_s::connProp
uint32_t connProp
Definition: snn_datastructures.h:132
DA_MOD
@ DA_MOD
dopamine-modulated STDP, nearest-neighbor
Definition: carlsim_datastructures.h:163
SYN_PLASTIC
#define SYN_PLASTIC
Definition: carlsim_definitions.h:61
GET_FIXED_PLASTIC
#define GET_FIXED_PLASTIC(a)
Definition: snn_definitions.h:208
EXECUTABLE_SNN
@ EXECUTABLE_SNN
Definition: snn_datastructures.h:82
ConnectConfig_s
The configuration of a connection.
Definition: snn_datastructures.h:120
RadiusRF::radY
double radY
Definition: carlsim_datastructures.h:373
STANDARD
@ STANDARD
standard STDP of Bi & Poo (2001), nearest-neighbor
Definition: carlsim_datastructures.h:162
SNN::isInhibitoryGroup
bool isInhibitoryGroup(int gGrpId)
Definition: snn.h:622
ConnectConfig_s::maxWt
float maxWt
Definition: snn_datastructures.h:125
snn.h
SNN
Contains all of CARLsim's core functionality.
Definition: snn.h:115
ConnectConfig_s::numberOfConnections
int numberOfConnections
Definition: snn_datastructures.h:137
RuntimeData_s::nSpikeCnt
int * nSpikeCnt
homeostatic plasticity variables
Definition: snn_datastructures.h:562
SNN::isExcitatoryGroup
bool isExcitatoryGroup(int gGrpId)
Definition: snn.h:621
SNN::getConnectId
short int getConnectId(int grpIdPre, int grpIdPost)
find connection ID based on pre-post group pair, O(N)
Definition: snn_manager.cpp:1704
GroupConfigMD_s
Definition: snn_datastructures.h:329
SNN::isDopaminergicGroup
bool isDopaminergicGroup(int gGrpId)
Definition: snn.h:624
RadiusRF::radZ
double radZ
Definition: carlsim_datastructures.h:373
ConnectConfig_s::connRadius
RadiusRF connRadius
Definition: snn_datastructures.h:128