NEST main@caf0ae8
 
Loading...
Searching...
No Matches
astrocyte_lr_1994.h
Go to the documentation of this file.
1/*
2 * astrocyte_lr_1994.h
3 *
4 * This file is part of NEST.
5 *
6 * Copyright (C) 2004 The NEST Initiative
7 *
8 * NEST is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * NEST is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with NEST. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23#ifndef ASTROCYTE_LR_1994_H
24#define ASTROCYTE_LR_1994_H
25
26#include "config.h"
27
28#ifdef HAVE_GSL
29
30// C includes:
31#include <gsl/gsl_errno.h>
32#include <gsl/gsl_matrix.h>
33#include <gsl/gsl_odeiv.h>
34#include <gsl/gsl_sf_exp.h>
35
36// Includes from nestkernel:
37#include "archiving_node.h"
38#include "connection.h"
39#include "event.h"
40#include "nest_types.h"
41#include "node.h"
42#include "recordables_map.h"
43#include "ring_buffer.h"
45
46namespace nest
47{
48
59extern "C" int astrocyte_lr_1994_dynamics( double, const double*, double*, void* );
60
61/* BeginUserDocs: astrocyte
62
63Short description
64+++++++++++++++++
65
66An astrocyte model based on Li & Rinzel (1994)
67
68Description
69+++++++++++
70
71``astrocyte_lr_1994`` is a model of astrocytic calcium dynamics. The model was
72first proposed by Li & Rinzel (1994) :footcite:p:`Li1994` and it is based on earlier work of De
73Young & Kaiser (1992) :footcite:p:`DeYoung1992`. The input and output of the model are implemented
74according to Nadkarni & Jung (2003) :footcite:p:`Nadkarni2003`.
75
76The model has three dynamic state variables: the concentration of inositol
771,4,5-trisphosphate in the astrocyte (:math:`\mathrm{[IP3]}`), the calcium
78concentration in the astrocytic cytosol (:math:`\mathrm{[Ca^{2+}]}`), and the
79fraction of IP3 receptors on the astrocytic endoplasmic reticulum (ER) that are
80not yet inactivated by calcium (:math:`h_\mathrm{IP3R}`).
81
82In this model, excitatory synaptic inputs to the astrocyte trigger IP3
83generation and change in calcium dynamics in the astrocyte. This might induce an
84astrocytic output in the form of a slow inward current (SIC), which is dependent
85on its calcium dynamics, to its target neurons. The input and output are based
86on the equations in :footcite:p:`Nadkarni2003` but with adaptations, as described in the following.
87
88Spike input
89-----------
90
91The astrocyte receives inputs from excitatory (glutamatergic)
92synapses. The synaptic inputs directly affect IP3 concentration according to the
93following equation:
94
95.. math::
96
97 \frac{d[\mathrm{IP3}]}{dt} =
98 \frac{[\mathrm{IP3}]_0 - [\mathrm{IP3}]}{\tau_\mathrm{IP3}} + \Delta_\mathrm{IP3} \cdot J_\mathrm{syn}(t)
99
100In the absence of inputs, :math:`\mathrm{[IP3]}` decays to its baseline value
101(:math:`[\mathrm{IP3}]_0`) with the time constant (:math:`\tau_\mathrm{IP3}`). Each time when an
102astrocyte receives an excitatory synaptic input, it triggers an instantaneous
103increase of :math:`\mathrm{[IP3]}`. In this implementation, the inputs are spike events
104sent from neurons or generators. The summed synaptic weight the astrocyte receives at time
105:math:`t` is given by :math:`J_\mathrm{syn}(t)`. The parameter
106:math:`\Delta_\mathrm{IP3}` scales the impact of synaptic inputs on the
107IP3 dynamics.
108
109Calcium current input
110---------------------
111
112In this implementation, a current input to the astrocyte is directly
113added to its cytosolic calcium concentration. Generators that send out currents
114can be connected to astrocytes to directly generate fluctuations in cytosolic
115calcium:
116
117.. math::
118
119 \frac{d[\mathrm{Ca^{2+}}]}{dt} =
120 J_\mathrm{channel} - J_\mathrm{pump} + J_\mathrm{leak} + J_\mathrm{noise}
121
122Here, :math:`\mathrm{[Ca^{2+}]}` is the cytosolic calcium concentration, and
123:math:`J_\mathrm{noise}` is the current input. :math:`J_\mathrm{channel}`,
124:math:`J_\mathrm{pump}`, :math:`J_\mathrm{leak}` are the calcium fluxes defined
125as in :footcite:p:`Nadkarni2003`.
126
127Output
128------
129
130If the astrocyte receives excitatory synaptic inputs, it might
131output SIC to its target neurons. This current depends on the cytosolic
132calcium concentration. This dependency is modeled according to the expressions
133first proposed in [3]:
134
135.. math::
136
137 I_\mathrm{SIC} = \mathrm{SIC_{scale}} \cdot \mathrm{H}\left(\mathrm{ln}(y)\right) \cdot \mathrm{ln}(y)
138
139where
140
141.. math::
142
143 y = \left( \mathrm{[Ca^{2+}]} - \mathrm{SIC_{th}} \right)/\mathrm{nM}
144
145When the cytosolic calcium concentration of the astrocyte exceeds the threshold
146value (:math:`\mathrm{SIC_{th}}`), a SIC output (:math:`I_\mathrm{SIC}`) is
147generated. This thresholding is modeled as a Heaviside function
148(:math:`\mathrm{H(\cdot)}`). In this implementation, the SIC threshold
149:math:`\mathrm{SIC_{th}}` as well as the scaling constant
150:math:`\mathrm{SIC_{scale}}` are treated as model parameters that can be set
151together with other parameters. Nadkarni & Jung (2003) :footcite:p:`Nadkarni2003` proposed values for
152these parameters by fitting the equation for SIC to an experimental data set.
153
154The output is implemented as SICEvent sent from the astrocyte to its target
155neurons through the ``sic_connection``.
156
157For the reference implementation of this model, see the
158`astrocyte_model_implementation <../model_details/astrocyte_model_implementation.ipynb>`_ notebook.
159
160See also :footcite:p:`Li1994`, :footcite:p:`DeYoung1992`, :footcite:p:`Nadkarni2003`.
161
162Parameters
163++++++++++
164
165The following parameters can be set in the status Dictionary.
166
167======== ========= =============================================================
168**Dynamic state variables**
169--------------------------------------------------------------------------------
170IP3 µM Inositol 1,4,5-trisphosphate concentration in the astrocytic
171 cytosol
172Ca_astro µM Calcium concentration in the astrocytic cytosol
173h_IP3R unitless Fraction of IP3 receptors on the astrocytic ER that are not
174 yet inactivated by calcium
175======== ========= =============================================================
176
177=============== ========= =====================================================
178**Parameters**
179-------------------------------------------------------------------------------
180Ca_tot µM Total free astrocytic calcium concentration in terms
181 of cytosolic volume
182IP3_0 µM Baseline value of astrocytic IP3 concentration
183Kd_IP3_1 µM First astrocytic IP3R dissociation constant of IP3
184Kd_IP3_2 µM Second astrocytic IP3R dissociation constant of IP3
185Kd_act µM Astrocytic IP3R dissociation constant of calcium
186 (activation)
187Kd_inh µM Astrocytic IP3R dissociation constant of calcium
188 (inhibition)
189Km_SERCA µM Half-activation constant of astrocytic SERCA pump
190SIC_scale unitless Parameter determining the scale of astrocytic SIC
191 output
192SIC_th µM Threshold that determines the minimal level of
193 astrocytic cytosolic calcium sufficient to induce
194 SIC
195delta_IP3 µM Parameter determining the increase in astrocytic IP3
196 concentration induced by synaptic input
197k_IP3R 1/(µM*ms) Astrocytic IP3R binding constant for calcium
198 inhibition
199rate_IP3R 1/ms Maximum rate of calcium release via astrocytic IP3R
200rate_L 1/ms Rate constant of calcium leak from astrocytic ER to
201 cytosol
202rate_SERCA µM/ms Maximum rate of calcium uptake by astrocytic SERCA
203 pump
204ratio_ER_cyt unitless Ratio between astrocytic ER and cytosol volumes
205tau_IP3 ms Time constant of the exponential decay of astrocytic
206 IP3
207=============== ========= =====================================================
208
209References
210++++++++++
211
212.. footbibliography::
213
214Sends
215+++++
216
217SICEvent
218
219Receives
220++++++++
221
222SpikeEvent, DataLoggingRequest
223
224See also
225++++++++
226
227aeif_cond_alpha_astro, sic_connection
228
229Examples using this model
230+++++++++++++++++++++++++
231
232.. listexamples:: astrocyte_lr_1994
233
234EndUserDocs */
235
236void register_astrocyte_lr_1994( const std::string& name );
237
238class astrocyte_lr_1994 : public Node
239{
240
241public:
242 astrocyte_lr_1994();
243 astrocyte_lr_1994( const astrocyte_lr_1994& );
244 ~astrocyte_lr_1994() override;
245
251 using Node::handle;
252 using Node::handles_test_event;
253 using Node::sends_secondary_event;
254
255
256 void handle( SpikeEvent& ) override;
257 void handle( CurrentEvent& ) override;
258 void handle( DataLoggingRequest& ) override;
259
260 size_t handles_test_event( SpikeEvent&, size_t ) override;
261 size_t handles_test_event( CurrentEvent&, size_t ) override;
262 size_t handles_test_event( DataLoggingRequest&, size_t ) override;
263
264 void
265 sends_secondary_event( SICEvent& ) override
266 {
267 }
268
269 void get_status( Dictionary& ) const override;
270 void set_status( const Dictionary& ) override;
271
272private:
273 void init_buffers_() override;
274 void pre_run_hook() override;
275
279 // bool update_( Time const&, const long, const long, const bool );
280
281 void update( Time const&, const long, const long ) override;
282
283 // END Boilerplate function declarations ----------------------------
284
285 // Friends --------------------------------------------------------
286
287 // make dynamics function quasi-member
288 friend int astrocyte_lr_1994_dynamics( double, const double*, double*, void* );
289
290 // The next two classes need to be friend to access the State_ class/member
291 friend class RecordablesMap< astrocyte_lr_1994 >;
292 friend class UniversalDataLogger< astrocyte_lr_1994 >;
293
294 // ----------------------------------------------------------------
295
297 struct Parameters_
298 {
299 // parameters based on Nadkarni & Jung (2003)
300 double Ca_tot_;
301 double IP3_0_;
302 double Kd_IP3_1_;
303 double Kd_IP3_2_;
304 double Kd_act_;
305 double Kd_inh_;
306 double Km_SERCA_;
307 double SIC_scale_;
308 double SIC_th_;
310 double delta_IP3_;
312 double k_IP3R_;
313 double rate_IP3R_;
314 double rate_L_;
315 double rate_SERCA_;
316 double ratio_ER_cyt_;
317 double tau_IP3_;
318
319 Parameters_();
320
321 void get( Dictionary& ) const;
322 void set( const Dictionary&, Node* node );
323 };
324
325public:
326 // ----------------------------------------------------------------
327
332 struct State_
333 {
334
341 enum StateVecElems
342 {
343 IP3 = 0,
344 Ca_astro, // 1
345 h_IP3R, // 2
346 STATE_VEC_SIZE
347 };
348
350 double y_[ STATE_VEC_SIZE ];
351
352 State_( const Parameters_& );
353 State_( const State_& );
354
355 State_& operator=( const State_& );
356
357 void get( Dictionary& ) const;
358 void set( const Dictionary&, const Parameters_&, Node* );
359 };
360
361 // ----------------------------------------------------------------
362
366 struct Buffers_
367 {
368 Buffers_( astrocyte_lr_1994& );
369 Buffers_( const Buffers_&, astrocyte_lr_1994& );
370
372 UniversalDataLogger< astrocyte_lr_1994 > logger_;
373
375 RingBuffer spike_exc_;
376 RingBuffer currents_;
377
379 gsl_odeiv_step* s_;
380 gsl_odeiv_control* c_;
381 gsl_odeiv_evolve* e_;
382 gsl_odeiv_system sys_;
383
384 // Since IntergrationStep_ is initialized with step_, and the resolution
385 // cannot change after nodes have been created, it is safe to place both
386 // here.
387 double step_;
388 double IntegrationStep_;
389
397 double J_noise_;
398
399 // values to be sent by SIC event
400 std::vector< double > sic_values;
401 };
402
403 // ----------------------------------------------------------------
404
405 // Access functions for UniversalDataLogger -------------------------------
406
408 template < State_::StateVecElems elem >
409 double
410 get_y_elem_() const
411 {
412 return S_.y_[ elem ];
413 }
414
415 // ----------------------------------------------------------------
416
417 Parameters_ P_;
418 State_ S_;
419 Buffers_ B_;
420
422 static RecordablesMap< astrocyte_lr_1994 > recordablesMap_;
423};
424
425
426inline size_t
427astrocyte_lr_1994::handles_test_event( SpikeEvent&, size_t receptor_type )
428{
429 if ( receptor_type != 0 )
430 {
431 throw UnknownReceptorType( receptor_type, get_name() );
432 }
433 return 0;
434}
435
436inline size_t
437astrocyte_lr_1994::handles_test_event( CurrentEvent&, size_t receptor_type )
438{
439 if ( receptor_type != 0 )
440 {
441 throw UnknownReceptorType( receptor_type, get_name() );
442 }
443 return 0;
444}
445
446inline size_t
447astrocyte_lr_1994::handles_test_event( DataLoggingRequest& dlr, size_t receptor_type )
448{
449 if ( receptor_type != 0 )
450 {
451 throw UnknownReceptorType( receptor_type, get_name() );
452 }
453 return B_.logger_.connect_logging_device( dlr, recordablesMap_ );
454}
455
456inline void
457astrocyte_lr_1994::get_status( Dictionary& d ) const
458{
459 P_.get( d );
460 S_.get( d );
461
462 d[ names::recordables ] = recordablesMap_.get_list();
463}
464
465inline void
466astrocyte_lr_1994::set_status( const Dictionary& d )
467{
468 Parameters_ ptmp = P_; // temporary copy in case of errors
469 ptmp.set( d, this ); // throws if BadProperty
470 State_ stmp = S_; // temporary copy in case of errors
471 stmp.set( d, ptmp, this ); // throws if BadProperty
472
473 // We now know that (ptmp, stmp) are consistent. We do not
474 // write them back to (P_, S_) before we are also sure that
475 // the properties to be set in the parent class are internally
476 // consistent.
477
478 // if we get here, temporaries contain consistent set of properties
479 P_ = ptmp;
480 S_ = stmp;
481}
482
483} // namespace
484
485#endif // HAVE_GSL
486#endif // ASTROCYTE_LR_1994_H
Dictionary class for interface to Python and C++ API.
Definition dictionary.h:213
const std::string Ca_astro("Ca_astro")
const std::string IP3("IP3")
const std::string recordables("recordables")
const std::string d("d")
const std::string h_IP3R("h_IP3R")
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
Declarations for base class Node.