source: project/release/4/nemo/trunk/examples/Golgi/Golgi_DeSouza10_fn.nemo @ 31355

Last change on this file since 31355 was 31355, checked in by Ivan Raikov, 6 years ago

nemo: fixed SK2 rate constant units

File size: 67.3 KB
Line 
1
2;; Simoes de Souza FM and De Schutter E (2011) Robustness effect of
3;; gap junctions between Golgi cells on cerebellar cortex
4;; oscillations.  Neural Systems & Circuits 1:7.
5
6(nemo-model Golgi
7
8  (
9   (input (v (unit mV))
10          (celsius (unit degC)))
11
12   (const F = 96485.309)
13   (const R = 8.31342)
14
15   (defun ktf (celsius) (1000.0 * R * (celsius + 273.15) / F ))
16
17   (defun nernst (celsius ci co z)
18     (if (ci <= 0)
19         then 1e6
20         else (if (co <= 0)
21                  then -1e6
22                  else (ktf (celsius) / z * (ln (co / ci))))
23         ))
24   
25
26   (component (type defaults)
27      (const V_t     =  -35  (unit mV))
28      (const celsius =   23  (unit degC))
29      (const Ra      = 0.01  (unit ohm.cm))
30      (output celsius V_t Ra)
31      )
32
33
34   (component (type membrane-capacitance)
35         (const c = 1 (unit uf/cm2))
36         (output c )
37         )
38
39
40   (component (type geometry) (name soma)
41         (const L = 27    (unit um))
42         (const diam = 27 (unit um))
43         (output L diam ))
44
45
46   (functor (type post-synaptic-conductance) (name AMPAfun)
47
48        ( tauA tauB e ) =
49
50        (input (w from event (unit uS)))
51
52        (const tau1 = (if ((tauA / tauB) > .9999) then (0.9999 * tauB) else tauA) (unit ms))
53        (const tau2 = tauB (unit ms))
54
55        (const tp = ((tau1 * tau2) / (tau2 - tau1) * ln (tau2 / tau1)))
56        (const scale_factor  = (1 / (neg (exp(neg (tp) / tau1)) + exp (neg (tp) / tau2))))
57
58        (transient (A) = (neg (A) / tau1) (onevent (A + (w * scale_factor))) (initial 0) (unit uS))
59        (transient (B) = (neg (B) / tau2) (onevent (B + (w * scale_factor))) (initial 0) (unit uS))
60
61        (g =  (B - A) (unit uS))
62
63        (output g e scale_factor)
64
65      )
66
67
68   (functor (type decaying-pool) (name cafun)
69
70      ( d cao cai0 beta) =
71
72      (input (ica from ion-currents))
73
74              (d (ca) =  ((neg (ica) / (2 * F * d)) * 1e4 - (beta * (ca - cai0)))
75                         (initial cai0))
76             
77              (output ca cao)
78              )
79
80
81   (functor (type decaying-pool) (name ca2fun)
82
83      ( d ca2o ca2i0 beta ) =
84
85      (input (ica2 from ion-currents))
86
87      (const valence  = 2)
88     
89      (d (ca2) =  ((neg (ica2) / (2 * F * d)) * 1e4 - (beta * (ca2 - ca2i0)))
90                  (initial ca2i0))
91     
92      (output ca2 ca2o valence)
93      )
94
95
96   (functor (type decaying-pool) (name nafun)
97
98      ( d nao0 nai0 beta ) =
99
100      (input (ina from ion-currents))
101     
102      (d (nai) =  ((neg (ina) / (2 * F * d)) * 1e4 - (beta * (nai - nai0)))
103         (initial nai0) (unit mM))
104     
105      (d (nao) =  ((ina / (2 * F * d)) * 1e4 - (beta * (nao - nao0)))
106         (initial nao0) (unit mM))
107     
108      (output nai nao)
109      )
110
111
112
113   (functor (type decaying-pool) (name kfun)
114
115      ( d ko0 ki0 beta ) =
116
117      (input (ik from ion-currents))
118
119     
120      (d (ki) =  ((neg (ik) / (2 * F * d)) * 1e4 - (beta * (ki - ki0)))
121         (initial ki0) (unit mM))
122     
123      (d (ko) =  ((ik / (2 * F * d)) * 1e4 - (beta * (ko - ko0)))
124         (initial ko0) (unit mM))
125     
126      (output ki ko)
127      )
128
129   
130   (functor (type ionic-current) (name CaHVAfun )
131
132      ( Aalpha_s Kalpha_s V0alpha_s
133        Abeta_s  Kbeta_s  V0beta_s
134        Aalpha_u Kalpha_u V0alpha_u
135        Abeta_u Kbeta_u V0beta_u
136        g ) =
137             
138      (input
139       (cai from ion-pools)
140       (cao from ion-pools))
141             
142      (component (type gate)
143
144                 ;; rate constants
145                 
146                 (Q10 = (pow (3 ((celsius - 20) / 10))))
147                 
148                 ;; rate functions
149                 
150                 (defun alpha_s (v Q10)
151                   (Q10 * Aalpha_s * exp((v - V0alpha_s) / Kalpha_s)))
152                 
153                 (defun beta_s (v Q10)
154                   (Q10 * Abeta_s * exp((v - V0beta_s) / Kbeta_s)))
155                 
156                 (defun alpha_u (v Q10)
157                   (Q10 * Aalpha_u * exp((v - V0alpha_u) / Kalpha_u)))
158                 
159                 (defun beta_u (v Q10)
160                   (Q10 * Abeta_u * exp((v - V0beta_u) / Kbeta_u)))
161
162                 (s_inf = ((alpha_s (v Q10))/(alpha_s (v Q10) + beta_s (v Q10))))
163                 (tau_s = (1 / (alpha_s (v Q10) + beta_s (v Q10)) ))
164
165                 (u_inf = ((alpha_u (v Q10))/(alpha_u (v Q10) + beta_u (v Q10)) ))
166                 (tau_u = (1 / (alpha_u (v Q10) + beta_u (v Q10)) ))
167
168                 (hh-ionic-gate
169                  (CaHVA  ;; ion name: exported variables will be of the form {ion}_{id}
170                   (initial-m  s_inf)
171                   (initial-h  u_inf)
172                   (m-power    2)
173                   (h-power    1)
174                   (m-inf      s_inf)
175                   (m-tau      tau_s)
176                   (h-inf      u_inf)
177                   (h-tau      tau_u)
178                   ))
179                 
180                 )
181             
182              (component (type pore)
183                         (const  gbar  = g)
184                         (output gbar ))
185             
186              (component (type permeating-ion) (name ca)
187                         (e = (nernst (celsius cai cao 2)) (unit mV))
188                         (output e)
189                         )
190             
191              ) ;; end CaHVA current
192
193
194   
195   (functor (type ionic-current) (name CaLVAfun )
196             
197      (
198       shift ; screening charge for Ca_o = 2 mM
199       v0_m_inf v0_h_inf k_m_inf k_h_inf
200       C_tau_m A_tau_m v0_tau_m1 v0_tau_m2 k_tau_m1 k_tau_m2
201       C_tau_h A_tau_h v0_tau_h1 v0_tau_h2 k_tau_h1 k_tau_h2
202       g
203       ) =
204
205      (input
206       (ca2i from ion-pools)
207       (ca2o from ion-pools))
208
209      (component (type gate)
210
211                         
212                 ;; rate functions
213                 
214                 (phi_m = (pow (5.0 ((celsius - 24) / 10))))
215                 (phi_h = (pow (3.0 ((celsius - 24) / 10))))
216                 
217                 (m_inf = (1.0 / ( 1 + exp ((v + shift - v0_m_inf) / k_m_inf)) ))
218                 (h_inf = (1.0 / ( 1 + exp ((v + shift - v0_h_inf) / k_h_inf)) ))
219                 
220                 (tau_m = ( (C_tau_m + A_tau_m / ( exp ((v + shift - v0_tau_m1) / k_tau_m1) +
221                                                       exp ((v + shift - v0_tau_m2) / k_tau_m2) ) ) / phi_m) )
222                 
223                 (tau_h = ( (C_tau_h + A_tau_h / ( exp ((v + shift - v0_tau_h1 ) / k_tau_h1) +
224                                                       exp ((v + shift - v0_tau_h2) / k_tau_h2) ) ) / phi_h) )
225                 
226
227                 (hh-ionic-gate
228                  (CaLVA  ;; ion name: exported variables will be of the form {ion}_{id}
229                   (initial-m  m_inf)
230                   (initial-h  h_inf)
231                   (m-power    2)
232                   (h-power    1)
233                   (m-inf      m_inf)
234                   (m-tau      tau_m)
235                   (h-inf      h_inf)
236                   (h-tau      tau_h)
237                   ))
238                 )
239     
240     
241      (component (type pore)
242                 (const  gbar  = g)
243                 (output gbar ))
244
245             
246      (component (type permeating-ion) (name ca2)
247                 (const valence = 2)
248                 (e = (nernst (celsius ca2i ca2o valence)) (unit mV))
249                 (output e valence))
250
251             
252      ) ;; end CaLVA current
253
254
255     
256   (functor (type ionic-current) (name HCN1fun)
257           
258            ( Ehalf c rA rB tCs tDs tEs tCf tDf tEf g e ) =
259             
260              (defun r (potential)
261                ((rA * potential) + rB))
262             
263              (defun tau (potential t1 t2 t3)
264                (exp (((t1 * potential) - t2) * t3)))
265             
266              (defun o_inf (potential Ehalf c)
267                (1 / (1 + exp ((potential - Ehalf) * c))))
268             
269
270              (component (type gate)
271
272                         ;; rate constants
273       
274
275                         (o_slow_inf = ((1 - r (v)) * o_inf (v Ehalf c)))
276                       
277                         (tau_s =  (tau (v tCs tDs tEs)) )
278
279                         (d (o_slow) = ((o_slow_inf - o_slow) / tau_s)
280                            (initial o_slow_inf))
281                         
282                         (output o_slow)
283
284                         )
285             
286              (component (type gate)
287
288                         (o_fast_inf = (r (v) * o_inf (v Ehalf c)))
289                       
290                         (tau_f =  (tau (v tCf tDf tEf)) )
291
292                         (d (o_fast) = ((o_fast_inf - o_fast) / tau_f)
293                            (initial o_fast_inf))
294                         
295                         (output o_fast)
296
297                         )
298             
299              (component (type pore)
300                         (gbar  = g)
301                         (output gbar))
302             
303              (component (type permeating-ion) (name non-specific)
304                         (const erev = e)
305                         (output erev ))
306             
307              )
308
309
310     
311   (functor (type ionic-current) (name HCN2fun)
312
313            ( Ehalf c rA rB tCs tDs tEs tCf tDf tEf ) =
314
315              (defun r (potential r1 r2)
316                (if (potential >= -64.70)
317                    then  0.0
318                    else (if (potential <= -108.70)
319                             then 1.0
320                             else (r1 * potential) + r2)))
321
322              (defun o_inf (potential Ehalf c)
323                (1 / (1 + exp((potential - Ehalf) * c))))
324             
325              (component (type gate)
326                         
327                         (defun tau_slow (potential t1 t2 t3)
328                           (exp (t3 * ((t1 * potential) - t2))))
329
330                         (o_slow_inf = ((1 - r (v rA rB)) * o_inf (v Ehalf c)))
331
332                         (tau_s =  (tau_slow(v tCs tDs tEs)))
333
334                         (d (o_slow) = ((o_slow_inf - o_slow) / tau_s)
335                            (initial o_slow_inf))
336
337                         (output o_slow)
338
339                         )
340             
341              (component (type gate)
342                         
343                         
344                         (defun tau_fast (potential t1 t2 t3)
345                           (exp (t3 * ((t1 * potential) - t2))))
346
347                         (o_fast_inf = (r (v rA rB) * o_inf (v Ehalf c)))
348
349                         (tau_f =  (tau_fast(v tCf tDf tEf)))
350
351                         (d (o_fast) = ((o_fast_inf - o_fast) / tau_f)
352                            (initial o_fast_inf))
353
354                         (output o_fast)
355
356                         )
357             
358              (component (type pore)
359                         (const  gbar  = g)
360                         (output gbar))
361             
362              (component (type permeating-ion) (name non-specific)
363                         (const erev = e)
364                         (output erev ))
365             
366              ) ;; end HCN2 current
367
368
369   (functor (type ionic-current) (name KAfun )
370
371            (
372             Aalpha_a Kalpha_a V0alpha_a Abeta_a Kbeta_a V0beta_a
373             Aalpha_b Kalpha_b V0alpha_b Abeta_b Kbeta_b V0beta_b
374             V0_ainf K_ainf V0_binf K_binf g
375             ) =
376
377              (input
378               (ki from ion-pools)
379               (ko from ion-pools)
380               )
381
382              (defun sigm (x y) (1 / (exp (x / y) + 1)))
383             
384              (component (type gate)
385                         
386                         
387                         (Q10 = (pow (3 ((celsius - 25.5) / 10))))
388                         
389                         ;; rate functions
390
391                         (defun alpha_a (v Q10)
392                           (Q10 * Aalpha_a * sigm((v - V0alpha_a) Kalpha_a)))
393
394                         (defun beta_a (v Q10)
395                           (Q10 * (Abeta_a / exp((v - V0beta_a) / Kbeta_a))))
396
397                         (defun alpha_b (v Q10)
398                           (Q10 * Aalpha_b * sigm((v - V0alpha_b) Kalpha_b)))
399
400                         (defun beta_b (v Q10)
401                           (Q10 * Abeta_b * sigm((v - V0beta_b) Kbeta_b)))
402
403
404                         (a_inf = (1 / (1 + exp ((v - V0_ainf) / K_ainf))))
405                         (tau_a = (1 / (alpha_a (v Q10) + beta_a (v Q10)) ))
406                         (b_inf = (1 / (1 + exp ((v - V0_binf) / K_binf))))
407                         (tau_b = (1 / (alpha_b (v Q10) + beta_b (v Q10)) ))
408
409                         (hh-ionic-gate
410                          (KA  ;; ion name: exported variables will be of the form {ion}_{id}
411                           (initial-m  (a_inf))
412                           (initial-h  (b_inf))
413                           (m-power    3)
414                           (h-power    1)
415                           (m-inf      a_inf)
416                           (m-tau      tau_a)
417                           (h-inf      b_inf)
418                           (h-tau      tau_b)
419                           ))
420
421                         )
422
423                     
424              (component (type pore)
425                         (const  gbar  = g)
426                         (output gbar ))
427
428             
429              (component (type permeating-ion) (name k)
430                         (e = (nernst (celsius ki ko 1)) (unit mV))
431                         (output e ))
432             
433              ) ;; end KA current
434
435
436
437   (functor (type ionic-current) (name KCafun )
438
439            (
440             Aalpha_c Balpha_c Kalpha_c Abeta_c Bbeta_c Kbeta_c g
441            ) =
442                       
443              (input
444               (cai from ion-pools)
445               (ki from ion-pools)
446               (ko from ion-pools)
447               )
448             
449              (component (type gate)
450
451                 ;; rate constants
452                 (Q10 = (pow (3 ((celsius - 30) / 10))))
453                 
454                 ;; rate functions
455                 (defun alpha_c (v cai Q10)
456                   (Q10 * Aalpha_c / (1 + (Balpha_c * exp(v / Kalpha_c) / cai))))
457                 
458                 (defun beta_c (v cai Q10)
459                   (Q10 * Abeta_c / (1 + (cai / (Bbeta_c * exp (v / Kbeta_c))) )))
460             
461                 (c_inf = ((alpha_c (v cai Q10)) / (alpha_c (v cai Q10) + beta_c (v cai Q10)) ))
462                 (tau_c = (1 / (alpha_c (v cai Q10) + beta_c (v cai Q10)) ))
463
464                 (hh-ionic-gate
465                  (KCa  ;; ion name: exported variables will be of the form {ion}_{id}
466                   (initial-m  c_inf)
467                   (m-power    1)
468                   (h-power    0)
469                   (m-inf      c_inf)
470                   (m-tau      tau_c)
471                   ))
472                 
473                 )
474     
475               (component (type pore)
476                          (const  gbar  = g)
477                          (output gbar ))
478               
479               
480               (component (type permeating-ion) (name k)
481                          (e = (nernst (celsius ki ko 1)) (unit mV))
482                          (output e ))
483               
484               (component (type modulating-ion) (name ca) )
485               
486               ) ;; end KCa current
487   
488
489   (functor (type ionic-current) (name KMfun )
490
491            (
492             Aalpha_n Kalpha_n V0alpha_n Abeta_n Kbeta_n V0beta_n V0_ninf B_ninf g
493             ) =
494
495               (input
496               (ki from ion-pools)
497               (ko from ion-pools)
498               )
499             
500               (component (type gate)
501
502                         ;; rate constants
503                         
504                         (Q10 = (pow (3 ((celsius - 22) / 10))))
505                         
506                         ;; rate equations
507                         (defun alpha_n (v Q10)
508                           (Q10 * Aalpha_n * exp((v - V0alpha_n) / Kalpha_n) ))
509
510                         (defun beta_n (v Q10)
511                           (Q10 * Abeta_n * exp((v - V0beta_n) / Kbeta_n) ))
512
513                         (hh-ionic-gate
514                          (KM  ;; ion name: exported variables will be of the form {ion}_{id}
515                           (initial-m  ((1 / (1 + exp((neg (v - V0_ninf)) / B_ninf)))))
516                           (m-power    1)
517                           (h-power    0)
518                           (m-tau      ((1 / (alpha_n(v Q10) + beta_n (v Q10)) )))
519                           (m-inf      ((1 / (1 + exp((neg (v - V0_ninf)) / B_ninf)))))
520                           ))
521                         )
522             
523              (component (type pore)
524                         (const  gbar  = g)
525                         (output gbar ))
526             
527              (component (type permeating-ion) (name k)
528                         (e = (nernst (celsius ki ko 1)) (unit mV))
529                         (output e ))
530             
531              ) ;; end KM current
532
533
534   (functor (type ionic-current) (name KVfun )
535
536            (
537             Aalpha_n Kalpha_n V0alpha_n Abeta_n Kbeta_n V0beta_n g
538             ) =
539
540              (input
541               (ki from ion-pools)
542               (ko from ion-pools)
543               )
544             
545              (defun linoid (x y)
546                (if ((abs (x / y)) < 1e-6)
547                    then (y * (1 - ((x / y) / 2)))
548                    else (x / (exp (x / y) - 1))
549                    ))
550
551
552              (component (type gate)
553
554
555                         ;; rate functions
556                         (Q10 = (pow (3 ((celsius - 6.3) / 10))))
557
558                         (defun alpha_n (v Q10)
559                           (Q10 * Aalpha_n * linoid ((v - V0alpha_n) Kalpha_n)))
560
561                         (defun beta_n (v Q10)
562                           (Q10 * Abeta_n * exp((v - V0beta_n) / Kbeta_n) ))
563
564                         (n_inf = ((alpha_n (v Q10)) / (alpha_n (v Q10) + beta_n (v Q10)) ))
565                         (tau_n = (1 / (alpha_n (v Q10) + beta_n (v Q10)) ))
566
567                         (hh-ionic-gate
568                          (KV  ;; ion name: exported variables will be of the form {ion}_{id}
569                           (initial-m  n_inf)
570                           (m-power    4)
571                           (h-power    0)
572                           (m-inf     (n_inf))
573                           (m-tau     (tau_n))
574                           ))
575                         )
576
577              (component (type pore)
578                         (const  gbar  = g)
579                         (output gbar ))
580             
581              (component (type permeating-ion) (name k)
582                         (e = (nernst (celsius ki ko 1)) (unit mV))
583                         (output e ))
584             
585              ) ;; end KV current
586             
587
588   
589   (functor (type ionic-current) (name SK2fun )
590
591            (
592             diff ;; Diffusion factor
593                 
594             ;; rates ca-independent
595             invc1 invc2 invc3
596             invo1 invo2 diro1 diro2
597
598             ;; rates ca-dependent
599             dirc2 dirc3 dirc4
600
601             g
602             ) =
603               
604               (input
605                (cai from ion-pools)
606                (ki from ion-pools)
607                (ko from ion-pools)
608                )
609               
610               (component (type gate)
611                         
612                          (Q10 = (pow (3 ((celsius - 23) / 10))))
613                         
614                          (invc1_t = (invc1 * Q10)  (unit /ms))
615                          (invc2_t = (invc2 * Q10)  (unit /ms))
616                          (invc3_t = (invc3 * Q10)  (unit /ms))
617                          (invo1_t = (invo1 * Q10)  (unit /ms))
618                          (invo2_t = (invo2 * Q10)  (unit /ms))
619                          (diro1_t = (diro1 * Q10)  (unit /ms))
620                          (diro2_t = (diro2 * Q10)  (unit /ms))
621                          (dirc2_t = (dirc2 * Q10)  (unit /ms))
622                          (dirc3_t = (dirc3 * Q10)  (unit /ms))
623                          (dirc4_t = (dirc4 * Q10)  (unit /ms))
624                         
625                          (dirc2_t_ca = (dirc2_t * (cai / diff) ))
626                          (dirc3_t_ca = (dirc3_t * (cai / diff) ))
627                          (dirc4_t_ca = (dirc4_t * (cai / diff) ))
628                         
629                          (reaction
630                           (SK2_z
631                            (transitions
632                             (<-> c1 c2 dirc2_t_ca invc1_t)
633                             (<-> c2 c3 dirc3_t_ca invc2_t)
634                             (<-> c3 c4 dirc4_t_ca invc3_t)
635                             (<-> c3 o1 diro1_t invo1_t)
636                             (<-> c4 o2 diro2_t invo2_t)
637                             )
638                            (conserve  ((1 = (c1 + c2 + c3 + c4 + o2 + o1))))
639                            (open o1 o2)
640                            (power 1)))
641                         
642                          (output SK2_z)
643                         
644                          )
645               
646               (component (type pore)
647                          (const  gbar  = g)
648                          (output gbar ))
649               
650               
651               (component (type permeating-ion) (name k)
652                          (e = (nernst (celsius ki ko 1)) (unit mV))
653                          (output e ))
654               
655               (component (type modulating-ion) (name ca) )
656               
657               ) ;; end SK2 current
658
659
660   (functor (type ionic-current) (name Nafun )
661
662            (
663             Aalpha_u Kalpha_u V0alpha_u Abeta_u Kbeta_u V0beta_u
664             Aalpha_v Kalpha_v V0alpha_v Abeta_v Kbeta_v V0beta_v
665             g
666             ) =
667
668              (input
669               (nai from ion-pools)
670               (nao from ion-pools)
671               )
672             
673             
674              (defun linoid (x y)
675                (if ((abs (x / y)) < 1e-6)
676                    then (y * (1 - ((x / y) / 2)))
677                    else (x / (1 - exp (x / y) ))
678                    ))
679             
680              (component (type gate)
681             
682                         (Q10 = (pow (3 ((celsius - 20) / 10))))
683
684                         ;; rate functions
685                         (defun alpha_u (v Q10)
686                           (Q10 * Aalpha_u * linoid((v - V0alpha_u) Kalpha_u) ))
687
688                         (defun beta_u (v Q10)
689                           (Q10 * Abeta_u * exp((v - V0beta_u) / Kbeta_u) ))
690
691                         (defun alpha_v (v Q10)
692                           (Q10 * Aalpha_v * exp((v - V0alpha_v) / Kalpha_v) ))
693                               
694                         (defun beta_v (v Q10)
695                           (Q10 * Abeta_v / (1 + exp((v - V0beta_v) / Kbeta_v) )))
696
697                         (u_inf = ((alpha_u (v Q10)) / (alpha_u (v Q10) + beta_u (v Q10)) ))
698                         (tau_u = (1 / (alpha_u (v Q10) + beta_u (v Q10))))
699
700                         (v_inf = ((alpha_v (v Q10)) / (alpha_v (v Q10) + beta_v (v Q10)) ))
701                         (tau_v = (1 / (alpha_v (v Q10) + beta_v (v Q10)) ))
702                         
703                         (hh-ionic-gate
704                          (Na  ;; ion name: exported variables will be of the form {ion}_{id}
705                           (initial-m  (u_inf))
706                           (initial-h  (v_inf))
707                           (m-power    3)
708                           (h-power    1)
709                           (m-inf     (u_inf))
710                           (m-tau     (tau_u))
711                           (h-inf     (v_inf))
712                           (h-tau     (tau_v))
713                           ))
714                         
715                         )
716             
717              (component (type pore)
718                         (const  gbar  = g)
719                         (output gbar ))
720
721             
722              (component (type permeating-ion) (name na)
723                         (e = (nernst (celsius nai nao 1)) (unit mV))
724                         (output e ))
725             
726              ) ;; end Na current
727
728
729   
730   (functor (type ionic-current) (name NaPfun )
731
732            (
733             Aalpha_m Kalpha_m V0alpha_m
734             Abeta_m Kbeta_m V0beta_m V0_minf B_minf
735             g e
736             ) =
737             
738              (defun linoid (x y)
739                (if ((abs (x / y)) < 1e-6)
740                    then (y * (1 - ((x / y) / 2)))
741                    else (x / (exp (x / y) - 1))
742                    ))
743
744
745              (component (type gate)
746
747                         ( Q10 = (pow (3 ((celsius - 30) / 10))))
748
749                         ;; rate functions
750
751                         (defun alpha_m (v Q10)
752                           (Q10 * Aalpha_m * linoid( ( v - V0alpha_m ) Kalpha_m) ))
753
754                         (defun beta_m (v Q10)
755                           (Q10 * Abeta_m * linoid( ( v - V0beta_m )  Kbeta_m ) ))
756
757                         (hh-ionic-gate
758                          (NaP  ;; ion name: exported variables will be of the form {ion}_{id}
759                           (initial-m  ((1 / (1 + exp ((neg (v - V0_minf)) / B_minf)))))
760                           (m-power    1)
761                           (h-power    0)
762                           (m-inf     ((1 / (1 + exp ((neg (v - V0_minf)) / B_minf)))))
763                           (m-tau     ((5 / (alpha_m (v Q10) + beta_m (v Q10)) )))
764                           ))
765                         )
766
767              (component (type pore)
768                         (const  gbar  = g)
769                         (output gbar ))
770
771              (component (type permeating-ion) (name na)
772                         (const erev = e)
773                         (output erev ))
774             
775              ) ;; end NaP current
776
777
778   
779   (functor (type ionic-current) (name NaRfun )
780
781            (
782             Aalpha_s V0alpha_s Kalpha_s Shiftalpha_s
783             Abeta_s V0beta_s Kbeta_s Shiftbeta_s
784             Aalpha_f V0alpha_f Kalpha_f
785             Abeta_f V0beta_f Kbeta_f
786             g
787             ) =
788             
789                     
790              (input
791               (nai from ion-pools)
792               (nao from ion-pools)
793               )
794
795
796               (component (type gate)
797                         
798                          (Q10 = (pow (3 ((celsius - 20) / 10))))
799                         
800                          ;; rate functions
801                          (defun alpha_s (v Q10)
802                            (Q10 * (Shiftalpha_s + ((Aalpha_s * ((v + V0alpha_s) )) / (exp ((v + V0alpha_s) / Kalpha_s) - 1)))))
803
804                         (defun beta_s (v Q10)
805                           (let ((x1 ((v + V0beta_s) / Kbeta_s)))
806                             (Q10 * (Shiftbeta_s + Abeta_s * ((v + V0beta_s) / (exp((if (x1 > 200) then 200 else x1)) - 1))))))
807
808                         (defun alpha_f (v Q10)
809                           (Q10 * Aalpha_f * exp( ( v - V0alpha_f ) / Kalpha_f)))
810
811                         (defun beta_f (v Q10)
812                           (Q10 * Abeta_f * exp( ( v - V0beta_f ) / Kbeta_f )  ))
813
814                         (s_inf = ((alpha_s (v Q10)) / (alpha_s (v Q10) + beta_s (v Q10)) ))
815                         (tau_s = (1 / (alpha_s (v Q10) + beta_s (v Q10)) ))
816                         (f_inf = ((alpha_f (v Q10)) / (alpha_f (v Q10) + beta_f (v Q10)) ))
817                         (tau_f = (1 / (alpha_f (v Q10) + beta_f (v Q10)) ))
818
819                         (hh-ionic-gate
820                          (NaR  ;; ion name: exported variables will be of the form {ion}_{id}
821                           (initial-m  (s_inf))
822                           (initial-h  (f_inf))
823                           (m-power    1)
824                           (h-power    1)
825                           (m-inf     (s_inf))
826                           (m-tau     (tau_s))
827                           (h-inf     (f_inf))
828                           (h-tau     (tau_f))
829
830                           ))
831                         )
832
833              (component (type pore)
834                         (const  gbar  = g)
835                         (output gbar ))
836
837              (component (type permeating-ion) (name na)
838                         (e = (nernst (celsius nai nao 1)) (unit mV))
839                         (output e ))
840             
841              ) ;; end NaR current
842
843
844     
845   (functor (type ionic-current) (name Lkgfun)
846
847            (g e) =
848             
849            (component (type pore)
850                       (const  gbar  = g)
851                       (output gbar))
852           
853            (component (type permeating-ion) (name non-specific)
854                       (const erev = e)
855                       (output erev ))
856           
857            ) ;; end leak current
858
859
860   (component (name ca) =
861
862      cafun (
863              (const  d       = .2    (unit um))
864              (const  cao     = 2.    (unit mM))
865              (const  cai0    = 50e-6 (unit mM))
866              (const  beta    = 1.3   (unit /ms))
867            ))
868
869
870   (component (name ca2) =
871
872      ca2fun (
873              (const  d       = .2     (unit um))
874              (const  ca2o     = 2.    (unit mM))
875              (const  ca2i0    = 50e-6 (unit mM))
876              (const  beta    = 1.3    (unit /ms))
877              ))
878
879
880   (component (name na) =
881     
882      nafun (
883            (const  d       = 0.2   (unit um))
884            (const  nao0    = 140.0 (unit mM))
885            (const  nai0    = 5.0   (unit mM))
886            (const  beta    = 0.075 (unit /ms))
887            ))
888
889     
890   (component (name k) =
891
892      kfun (
893            (const  d       = 0.2   (unit um))
894            (const  ko0     = 5.0   (unit mM))
895            (const  ki0     = 140.0 (unit mM))
896            (const  beta    = 0.075 (unit /ms))
897            ))
898
899   (component (name AMPA) =
900
901     AMPAfun (
902
903        (const tauA = 0.03 (unit ms)) ;; rise time
904        (const tauB = 0.5 (unit ms)) ;; decay time
905
906        (const  e = 0 (unit mV))
907
908      ))
909
910
911   
912   (component (name CaHVA ) =
913     
914      CaHVAfun (
915                 
916                 (const Aalpha_s  = 0.04944 (unit /ms))
917                 (const Kalpha_s  = 15.87301587302 (unit mV))
918                 (const V0alpha_s = -29.06 (unit mV))
919                 
920                 (const Abeta_s  = 0.08298 (unit /ms))
921                 (const Kbeta_s  = -25.641 (unit mV))
922                 (const V0beta_s = -18.66  (unit mV))
923                 
924                 (const Aalpha_u  = 0.0013  (unit /ms))
925                 (const Kalpha_u  = -18.183 (unit mV))
926                 (const V0alpha_u = -48     (unit mV))
927                 
928                 (const Abeta_u   = 0.0013  (unit /ms))
929                 (const Kbeta_u   = 83.33   (unit mV))
930                 (const V0beta_u  = -48     (unit mV))
931
932                 (const  g  = 460e-6 (unit S/cm2))
933                 )
934             
935              ) ;; end CaHVA current
936
937
938   
939   (component (name CaLVA ) =
940
941      CaLVAfun (
942                 (const shift   = 2 (unit mV)) ; screening charge for Ca_o = 2 mM
943                 
944                 (const v0_m_inf = -50  (unit mV))
945                 (const v0_h_inf = -78  (unit mV))
946                 (const k_m_inf  = -7.4 (unit mV))
947                 (const k_h_inf  = 5.0  (unit mV))
948       
949                 (const C_tau_m   = 3)
950                 (const A_tau_m   = 1.0)
951                 (const v0_tau_m1 = -25  (unit mV))
952                 (const v0_tau_m2 = -100 (unit mV))
953                 (const k_tau_m1  = 10   (unit mV))
954                 (const k_tau_m2 = -15   (unit mV))
955                 
956                 (const C_tau_h   = 85)
957                 (const A_tau_h   = 1.0  (unit mV))
958                 (const v0_tau_h1 = -46  (unit mV))
959                 (const v0_tau_h2 = -405 (unit mV))
960                 (const k_tau_h1  = 4    (unit mV))
961                 (const k_tau_h2  = -50  (unit mV))
962
963                 (const  g  = 2.5e-4 (unit S/cm2))
964                 )
965      ) ;; end CaLVA current
966   
967     
968   (component (name HCN1)  =
969             
970              HCN1fun (
971
972                       (const Ehalf = -72.49 (unit mV))
973                       (const c     = 0.11305 (unit /mV))
974             
975                       (const rA = 0.002096 (unit /mV))
976                       (const rB = 0.97596 )
977                       
978                       (const tCs = 0.01451)
979                       (const tDs = -4.056 (unit mV))
980                       (const tEs = 2.302585092 (unit /mV))
981
982                       (const tCf = 0.01371)
983                       (const tDf = -3.368      (unit mV))
984                       (const tEf = 2.302585092 (unit /mV))
985
986                       (const  g  = 5e-5 (unit S/cm2))
987
988                       (const e = -20 (unit mV))
989                      )
990             
991              ) ;; end HCN1 current
992
993
994     
995   (component (name HCN2) =
996
997              HCN2fun (
998                       
999                       (const Ehalf = -81.95 (unit mV))
1000                       (const c     = 0.1661 (unit /mV))
1001                       
1002                       ;; rate constants
1003                       
1004                       (const rA = -0.0227 (unit /mV))
1005                       (const rB = -1.4694 )
1006
1007                       (const tCs = 0.0152 )
1008                       (const tDs = -5.2944 (unit mV))
1009                       (const tEs = 2.3026  (unit /mV))
1010
1011                       (const tCf = 0.0269)
1012                       (const tDf = -5.6111 (unit mV))
1013                       (const tEf = 2.3026  (unit /mV))
1014
1015                       (const  g  = 8e-5 (unit S/cm2))
1016                       (const e = -20 (unit mV))
1017
1018                       )
1019
1020              ) ;; end HCN2 current
1021             
1022
1023   (component (name KA ) =
1024             
1025              KAfun (
1026                     
1027                     (const Aalpha_a  = 0.8147    (unit /ms))
1028                     (const Kalpha_a  = -23.32708 (unit mV))
1029                     (const V0alpha_a = -9.17203  (unit mV))
1030                     (const Abeta_a   = 0.1655    (unit /ms))
1031                     (const Kbeta_a   = 19.47175  (unit mV))
1032                     (const V0beta_a  = -18.27914 (unit mV))
1033                     
1034                     (const Aalpha_b  = 0.0368    (unit /ms))
1035                     (const Kalpha_b  = 12.8433   (unit mV))
1036                     (const V0alpha_b = -111.33209 (unit mV))
1037                     (const Abeta_b   = 0.0345    (unit /ms))
1038                     (const Kbeta_b   = -8.90123  (unit mV))
1039                     (const V0beta_b  = -49.9537  (unit mV))
1040                     
1041                     (const V0_ainf = -38 (unit mV))
1042                     (const  K_ainf = -17 (unit mV))
1043                     
1044                     (const V0_binf   = -78.8 (unit mV))
1045                     (const K_binf    = 8.4   (unit mV))
1046                     
1047                     (const  g  = 0.008 (unit S/cm2))
1048                     )
1049
1050              ) ;; end KA current
1051
1052   
1053
1054   (component (name KCa ) =
1055
1056              KCafun (
1057                 
1058                      (const Aalpha_c = 7 (unit /ms))
1059                      (const Balpha_c = 1.5e-3 (unit mM))
1060                     
1061                      (const Kalpha_c =  -11.765 (unit mV))
1062                     
1063                      (const Abeta_c = 1.0 (unit /ms))
1064                      (const Bbeta_c = 0.15e-3 (unit mM))
1065                     
1066                      (const Kbeta_c = -11.765 (unit mV))
1067
1068                      (const  g  = 0.003 (unit S/cm2))
1069                      )
1070      ) ;; end KCa current
1071   
1072
1073
1074   (component (name KM ) =
1075
1076              KMfun (
1077                     (const Aalpha_n = 0.0033 (unit /ms))
1078
1079                     (const Kalpha_n  = 40  (unit mV))
1080                     (const V0alpha_n = -30 (unit mV))
1081                     (const Abeta_n   = 0.0033 (unit /ms))
1082                     
1083                     (const Kbeta_n  = -20 (unit mV))
1084                     (const V0beta_n = -30 (unit mV))
1085                     (const V0_ninf  = -35 (unit mV))
1086                     (const B_ninf   = 6   (unit mV))
1087             
1088                     (const  g  = 0.001 (unit S/cm2))
1089       
1090                     )
1091             
1092              ) ;; end KM current
1093
1094   
1095
1096   (component (name KV ) =
1097
1098              KVfun (
1099
1100                     (const Aalpha_n  = -0.01 (unit /mV-ms))
1101                     (const Kalpha_n  = -10   (unit mV))
1102                     (const V0alpha_n = -26   (unit mV))
1103                     (const Abeta_n   = 0.125 (unit /ms))
1104                     
1105                     (const Kbeta_n  = -80 (unit mV))
1106                     (const V0beta_n = -36 (unit mV))
1107
1108                     (const  g  = 0.032 (unit S/cm2))
1109
1110                     )
1111             
1112              ) ;; end KV current
1113             
1114
1115   
1116   (component (name SK2 ) =
1117
1118              SK2fun (
1119                 
1120                      (const diff = 3) ;; Diffusion factor
1121                     
1122                      ;; rates ca-independent
1123                      (const invc1 = 80e-3  (unit /ms))
1124                      (const invc2 = 80e-3  (unit /ms))
1125                      (const invc3 = 200e-3 (unit /ms))
1126                     
1127                      (const invo1 = 1      (unit /ms))
1128                      (const invo2 = 100e-3 (unit /ms))
1129                      (const diro1 = 160e-3 (unit /ms))
1130                      (const diro2 = 1.2    (unit /ms))
1131                     
1132                      ;; rates ca-dependent
1133                      (const dirc2 = 200 (unit /mM-ms))
1134                      (const dirc3 = 160 (unit /mM-ms))
1135                      (const dirc4 = 80  (unit /mM-ms))
1136                 
1137                      (const  g  = 0.038 (unit S/cm2))
1138
1139                      )
1140
1141              ) ;; end SK2 current
1142
1143   
1144   (component (name Na ) =
1145
1146              Nafun (
1147                     
1148                     (const Aalpha_u  = 0.3 (unit /mV-ms))
1149                     (const Kalpha_u  = -10 (unit mV))
1150                     (const V0alpha_u = -25 (unit mV))
1151                     
1152                     (const Abeta_u  = 12      (unit /ms))
1153                     (const Kbeta_u  = -18.182 (unit mV))
1154                     (const V0beta_u = -50     (unit mV))
1155                     
1156                     (const Aalpha_v  = 0.21 (unit /ms))
1157                     (const Kalpha_v  = -3.333 (unit mV))
1158                     (const V0alpha_v = -50    (unit mV))
1159                     
1160                     (const Abeta_v  = 3   (unit /ms))
1161                     (const Kbeta_v  = -5  (unit mV))
1162                     (const V0beta_v = -17 (unit mV))
1163
1164                     (const  g  = 0.048 (unit S/cm2))
1165                     )
1166             
1167              ) ;; end Na current
1168
1169
1170   
1171   (component (name NaP ) = NaPfun
1172
1173              (
1174               (const Aalpha_m  = -0.91)
1175               (const Kalpha_m  = -5)
1176               (const V0alpha_m = -40)
1177               (const Abeta_m     = 0.62)
1178               (const Kbeta_m   = 5)
1179               (const V0beta_m  = -40)
1180               (const V0_minf   = -43)
1181               (const B_minf    = 5)
1182
1183               (const g = 0.00019)
1184
1185               (const e = 87.39)
1186               )
1187              ) ;; end NaP current
1188
1189   
1190   (component (name NaR ) =
1191             
1192              NaRfun (
1193                      (const Aalpha_s     = -0.00493 (unit /ms))
1194                      (const V0alpha_s    = -4.48754 (unit mV))
1195                      (const Kalpha_s     = -6.81881 (unit mV))
1196                      (const Shiftalpha_s = 0.00008  (unit /ms))
1197                     
1198                      (const Abeta_s     = 0.01558   (unit /ms))
1199                      (const V0beta_s    = 43.97494  (unit mV))
1200                      (const Kbeta_s     = 0.10818   (unit mV))
1201                      (const Shiftbeta_s = 0.04752   (unit /ms))
1202                     
1203                      (const Aalpha_f  = 0.31836   (unit /ms))
1204                      (const V0alpha_f = -80       (unit mV))
1205                      (const Kalpha_f  = -62.52621 (unit mV))
1206                     
1207                      (const Abeta_f  = 0.01014    (unit /ms))
1208                      (const V0beta_f = -83.3332   (unit mV))
1209                      (const Kbeta_f  = 16.05379   (unit mV))
1210
1211                      (const  g  = 0.0017 (unit S/cm2))
1212
1213                      )
1214              ) ;; end Nar current
1215             
1216     
1217   (component (name Lkg) =
1218
1219              Lkgfun (
1220                      (const g  = (21e-6))
1221                      (const e = -55)
1222                      )
1223              ) ;; end leak current
1224
1225
1226   )
1227
1228   ;; Following are templates for various driver scripts used to run this model
1229   (
1230    ("template.hoc" () 
1231#<<EOF
1232/*******Cerebellar Golgi Cell Model **********
1233
1234Developers:    Sergio Solinas & Egidio D'Angelo
1235Code contributors:  Thierry Neius, Shyam Diwakar, Lia Forti
1236Data Analysis: Sergio Solinas
1237
1238Work Progress: April 2004 - May 2007
1239
1240Developed At:  Università Degli Studi Di Pavia
1241               Dipartimento Di Scienze Fisiologiche
1242               Pavia - Italia
1243               
1244Model Published in:
1245             Sergio M. Solinas, Lia Forti, Elisabetta Cesana,
1246             Jonathan Mapelli, Erik De Schutter and Egidio D`Angelo (2008)
1247             Computational reconstruction of pacemaking and intrinsic
1248             electroresponsiveness in cerebellar golgi cells
1249             Frontiers in Cellular Neuroscience 2:2
1250
1251
1252********************************************/
1253
1254// In this configuration the ion channels
1255// were not corrected for the Liquid Junction potential.
1256// The ion reversal potential were corrected in agreement
1257// with the voltage shift.
1258// See Table 1 Solinas et al. 2008 Frontiers Neurosci 2:2
1259
1260begintemplate GoC
1261public soma,axon,elec,seal,dend
1262public SpikeTrain, RT_Vm, EL_Vm
1263
1264create soma
1265create axon
1266create elec,seal
1267create dend[3]
1268
1269objref SpikeTrain, netcon, nil
1270objref RT_Vm, EL_Vm
1271
1272proc init() {
1273
1274    RT_Vm = new Vector()
1275    EL_Vm = new Vector()
1276    create soma
1277    soma {
1278        nseg = 1
1279        diam = 27 // 22 pF Dieudonne98
1280        L = 27
1281        Ra = 100 // From Roth&Hausser2000
1282        celsius = 23
1283       
1284        insert Golgi_Lkg
1285       
1286        insert Golgi_Na
1287        insert Golgi_NaR
1288        insert Golgi_NaP
1289       
1290        insert Golgi_CaHVA
1291        insert Golgi_CaLVA
1292               
1293        insert Golgi_KV
1294        insert Golgi_KM
1295        insert Golgi_KA
1296
1297        insert Golgi_KCa
1298        insert Golgi_SK2
1299       
1300        insert Golgi_HCN1
1301        insert Golgi_HCN2
1302
1303        insert Golgi_ca
1304        insert Golgi_ca2
1305       
1306        cai0_ca_ion = 50e-6
1307        ca2i0_ca2_ion = cai0_ca_ion
1308       
1309        cai0_Golgi_Ca = cai0_ca_ion
1310        ca2i0_Golgi_Ca2 = cai0_ca_ion
1311       
1312        cai = cai0_ca_ion
1313        ca2i = cai
1314        ca2o = cao
1315       
1316        ena =  87.39
1317        ek  = -84.69
1318
1319        SpikeTrain = new Vector()
1320        netcon = new NetCon(&v(0.5),nil)
1321        netcon.threshold=-20
1322        netcon.record(SpikeTrain)
1323       
1324        RT_Vm.record(&v(0.5))
1325    }
1326   
1327    create dend[3]
1328    for i=0,2 {
1329        dend[i] {
1330            nseg = 10
1331            diam = 3
1332            L = 113
1333            Ra = 100
1334            celsius = 23
1335           
1336            insert Golgi_Lkg
1337        }
1338        connect dend[i](0), soma(1)     
1339    }
1340   
1341   
1342    create axon
1343    axon {
1344        nseg = 100
1345        diam = 2.4 // gives 90 pF to get to the 145 pF Forti06
1346        L = 1200
1347        Ra = 100
1348        celsius = 23
1349       
1350        insert Golgi_Lkg
1351    }
1352   
1353    connect axon(0), soma(0)
1354   
1355    create elec,seal
1356    elec {
1357        nseg = 1
1358        diam = 3
1359        L = 1000
1360        Ra = 36
1361        cm = 0.0015
1362        celsius = 23
1363        EL_Vm.record(&v(0.5))
1364
1365    }
1366       
1367    seal {
1368        nseg = 1
1369        diam = 3
1370        L = 1
1371        Ra = 1
1372        cm = 0.0001
1373        celsius = 23
1374       
1375    }
1376       
1377    connect seal(1), soma(1)
1378    connect elec(1), seal(0)
1379
1380}
1381
1382                   
1383endtemplate GoC
1384EOF
1385)
1386    ("reduced_template.hoc" () 
1387#<<EOF
1388/*******Cerebellar Golgi Cell Model **********
1389
1390Reduced single-compartment cerebellar Golgi cell model
1391
1392Developers:    Sergio Solinas & Egidio D'Angelo
1393Code contributors:  Thierry Neius, Shyam Diwakar, Lia Forti
1394Data Analysis: Sergio Solinas
1395
1396Work Progress: April 2004 - May 2007
1397
1398Developed At:  Università Degli Studi Di Pavia
1399               Dipartimento Di Scienze Fisiologiche
1400               Pavia - Italia
1401               
1402Model Published in:
1403             Sergio M. Solinas, Lia Forti, Elisabetta Cesana,
1404             Jonathan Mapelli, Erik De Schutter and Egidio D`Angelo (2008)
1405             Computational reconstruction of pacemaking and intrinsic
1406             electroresponsiveness in cerebellar golgi cells
1407             Frontiers in Cellular Neuroscience 2:2
1408
1409
1410********************************************/
1411
1412// In this configuration the ion channels
1413// were not corrected for the Liquid Junction potential.
1414// The ion reversal potential were corrected in agreement
1415// with the voltage shift.
1416// See Table 1 Solinas et al. 2008 Frontiers Neurosci 2:2
1417
1418begintemplate GoC
1419public soma,axon,elec,seal,dend
1420public SpikeTrain, RT_Vm, EL_Vm
1421
1422create soma
1423
1424objref SpikeTrain, netcon, nil
1425objref RT_Vm, EL_Vm
1426
1427proc init() {
1428
1429    RT_Vm = new Vector()
1430    EL_Vm = new Vector()
1431    create soma
1432    soma {
1433        nseg = 1
1434        diam = 27 // 22 pF Dieudonne98
1435        L = 27
1436        Ra = 100 // From Roth&Hausser2000
1437        celsius = 23
1438       
1439        insert Golgi_Lkg
1440       
1441        insert Golgi_Na
1442        insert Golgi_NaR
1443        insert Golgi_NaP
1444       
1445        insert Golgi_CaHVA
1446        insert Golgi_CaLVA
1447               
1448        insert Golgi_KV
1449        insert Golgi_KM
1450        insert Golgi_KA
1451
1452        insert Golgi_KCa
1453        insert Golgi_SK2
1454       
1455        insert Golgi_HCN1
1456        insert Golgi_HCN2
1457
1458        insert Golgi_ca
1459        insert Golgi_ca2
1460       
1461        cai0_ca_ion = 50e-6
1462        ca2i0_ca2_ion = cai0_ca_ion
1463       
1464        cai0_Golgi_Ca = cai0_ca_ion
1465        ca2i0_Golgi_Ca2 = cai0_ca_ion
1466       
1467        cai = cai0_ca_ion
1468        ca2i = cai
1469        ca2o = cao
1470       
1471        ena =  87.39
1472        ek  = -84.69
1473
1474        SpikeTrain = new Vector()
1475        netcon = new NetCon(&v(0.5),nil)
1476        netcon.threshold=-20
1477        netcon.record(SpikeTrain)
1478       
1479        RT_Vm.record(&v(0.5))
1480    }
1481}
1482
1483                   
1484endtemplate GoC
1485EOF
1486)
1487
1488    ("protocol.hoc" () 
1489#<<EOF
1490load_file("nrngui.hoc")
1491load_file("Golgi_protocol.ses")
1492
1493// Load the Golgi cell template
1494xopen("Golgi_template.hoc")
1495objref goc
1496goc = new GoC()
1497
1498
1499prelength = 1000
1500mainlength = 6000
1501
1502
1503//**********************************************************************
1504proc simulate() { local preDT, mainDT, logsize  localobj logfile, tlog, Vlog, iklog, inalog, icalog, ica2log
1505   
1506    mainDT = 0.025
1507    preDT = 0.025
1508   
1509    dt = preDT
1510    tstop = prelength
1511    run()
1512   
1513   
1514    if ( stoprun == 1) return
1515   
1516    dt = mainDT
1517    continuerun(prelength + mainlength)
1518    if ( stoprun == 1) return
1519   
1520    logfile=$o1
1521    tlog=$o2
1522    Vlog=$o3
1523    iklog=$o4
1524    inalog=$o5
1525    icalog=$o6
1526    ica2log=$o7
1527   
1528    logsize = tlog.size()
1529   
1530    for i=0,tlog.size()-1 {
1531        logfile.printf("%g %g %g %g %g\n", tlog.x[i], Vlog.x[i], iklog.x[i], inalog.x[i], icalog.x[i], ica2log.x[i])
1532    }
1533
1534}
1535
1536
1537//*************User-Interface*******************************************
1538
1539nrnsecmenu(0.5, 1)
1540
1541xpanel("Spontaneous firing")
1542xvalue("Time for Initialization", "prelength")
1543xvalue("Main duration", "mainlength")
1544
1545xvalue("dt", "dt")
1546xvalue("t", "t")
1547xlabel("")
1548xbutton("Start", "simulate()")
1549xbutton("Stop", "stoprun = 1")
1550xpanel()
1551
1552vec_sizes = (prelength+mainlength)/dt + 1       // recorded traces are all this size
1553
1554
1555objref  iklog
1556iklog = new Vector(vec_sizes)
1557iklog.record (&goc.soma.ik(0.5))
1558
1559objref  inalog
1560inalog = new Vector(vec_sizes)
1561inalog.record (&goc.soma.ina(0.5))
1562
1563objref  icalog
1564icalog = new Vector(vec_sizes)
1565icalog.record (&goc.soma.ica(0.5))
1566
1567objref  ica2log
1568ica2log = new Vector(vec_sizes)
1569ica2log.record (&goc.soma.ica2(0.5))
1570
1571objref  Vlog
1572Vlog = new Vector(vec_sizes)
1573Vlog.record (&goc.soma.v(0.5))
1574
1575objref tlog
1576tlog = new Vector(vec_sizes,0)
1577tlog.record (&t)
1578
1579objref logfile
1580logfile = new File()
1581logfile.wopen ( "Golgi_protocol.dat" )
1582
1583simulate(logfile,tlog,Vlog,iklog,inalog,icalog,ica2log)
1584logfile.close()
1585
1586
1587quit()
1588EOF
1589)
1590
1591    ("reduced_protocol.hoc" () 
1592#<<EOF
1593load_file("nrngui.hoc")
1594load_file("Golgi_protocol.ses")
1595
1596// Load the Golgi cell template
1597xopen("Golgi_reduced_template.hoc")
1598objref goc
1599goc = new GoC()
1600
1601
1602prelength = 1000
1603mainlength = 6000
1604
1605
1606//**********************************************************************
1607proc simulate() { local preDT, mainDT, logsize  localobj logfile, tlog, Vlog, iklog, inalog, icalog, ica2log
1608   
1609    mainDT = 0.025
1610    preDT = 0.025
1611   
1612    dt = preDT
1613    tstop = prelength
1614    run()
1615   
1616   
1617    if ( stoprun == 1) return
1618   
1619    dt = mainDT
1620    continuerun(prelength + mainlength)
1621    if ( stoprun == 1) return
1622   
1623    logfile=$o1
1624    tlog=$o2
1625    Vlog=$o3
1626    iklog=$o4
1627    inalog=$o5
1628    icalog=$o6
1629    ica2log=$o7
1630   
1631    logsize = tlog.size()
1632   
1633    for i=0,tlog.size()-1 {
1634        logfile.printf("%g %g %g %g %g\n", tlog.x[i], Vlog.x[i], iklog.x[i], inalog.x[i], icalog.x[i], ica2log.x[i])
1635    }
1636
1637}
1638
1639
1640//*************User-Interface*******************************************
1641
1642nrnsecmenu(0.5, 1)
1643
1644xpanel("Spontaneous firing")
1645xvalue("Time for Initialization", "prelength")
1646xvalue("Main duration", "mainlength")
1647
1648xvalue("dt", "dt")
1649xvalue("t", "t")
1650xlabel("")
1651xbutton("Start", "simulate()")
1652xbutton("Stop", "stoprun = 1")
1653xpanel()
1654
1655vec_sizes = (prelength+mainlength)/dt + 1       // recorded traces are all this size
1656
1657
1658objref  iklog
1659iklog = new Vector(vec_sizes)
1660iklog.record (&goc.soma.ik(0.5))
1661
1662objref  inalog
1663inalog = new Vector(vec_sizes)
1664inalog.record (&goc.soma.ina(0.5))
1665
1666objref  icalog
1667icalog = new Vector(vec_sizes)
1668icalog.record (&goc.soma.ica(0.5))
1669
1670objref  ica2log
1671ica2log = new Vector(vec_sizes)
1672ica2log.record (&goc.soma.ica2(0.5))
1673
1674objref  Vlog
1675Vlog = new Vector(vec_sizes)
1676Vlog.record (&goc.soma.v(0.5))
1677
1678objref tlog
1679tlog = new Vector(vec_sizes,0)
1680tlog.record (&t)
1681
1682objref logfile
1683logfile = new File()
1684logfile.wopen ( "Golgi_reduced_protocol.dat" )
1685
1686simulate(logfile,tlog,Vlog,iklog,inalog,icalog,ica2log)
1687logfile.close()
1688
1689
1690quit()
1691EOF
1692)
1693    ("protocol.ses" () 
1694#<<EOF
1695{load_file("nrngui.hoc")}
1696objectvar save_window_, rvp_
1697objectvar scene_vector_[4]
1698objectvar ocbox_, ocbox_list_, scene_, scene_list_
1699{ocbox_list_ = new List()  scene_list_ = new List()}
1700{pwman_place(0,0,0)}
1701{
1702save_window_ = new Graph(0)
1703save_window_.size(0,5500,-80,50)
1704scene_vector_[2] = save_window_
1705{save_window_.view(0, -80, 5500, 130, 477, 9, 774.9, 232.3)}
1706graphList[0].append(save_window_)
1707save_window_.save_name("graphList[0].")
1708save_window_.addexpr("v(.5)", 1, 1, 0.8, 0.9, 2)
1709}
1710{doNotify()}
1711EOF
1712)
1713
1714    (".hoc" () 
1715#<<EOF
1716
1717create soma
1718access soma
1719
1720insert {{model_name}}
1721
1722soma {
1723        nseg = 1
1724
1725{% with diam = default(diam, 27), L = default(L, 27), celsius = default(celsius, 23) %}
1726        diam = {{diam}}
1727        L = {{L}}
1728        celsius = {{celsius}}
1729{% endwith %}
1730
1731        cm = 1
1732
1733        Ra = 100
1734    }
1735
1736
1737EOF
1738)
1739
1740    ("plot_neuron_original_iclamp.m" () 
1741#<<EOF
1742
1743CaHVA0       = load ("original/CaHVA.dat");
1744CaHVA1       = load ("nemo_nmodl_generated/CaHVA.dat");
1745
1746CaLVA0       = load ("original/CaLVA.dat");
1747CaLVA1       = load ("nemo_nmodl_generated/CaLVA.dat");
1748
1749HCN10       = load ("original/HCN1.dat");
1750HCN11       = load ("nemo_nmodl_generated/HCN1.dat");
1751
1752HCN20       = load ("original/HCN2.dat");
1753HCN21       = load ("nemo_nmodl_generated/HCN2.dat");
1754
1755KA0       = load ("original/KA.dat");
1756KA1       = load ("nemo_nmodl_generated/KA.dat");
1757
1758KCa0       = load ("original/KCa.dat");
1759KCa1       = load ("nemo_nmodl_generated/KCa.dat");
1760
1761KM0      = load ("original/KM.dat");
1762KM1      = load ("nemo_nmodl_generated/KM.dat");
1763
1764KV0      = load ("original/KV.dat");
1765KV1      = load ("nemo_nmodl_generated/KV.dat");
1766
1767SK20      = load ("original/SK2.dat");
1768SK21      = load ("nemo_nmodl_generated/SK2.dat");
1769
1770Na0      = load ("original/Na.dat");
1771Na1      = load ("nemo_nmodl_generated/Na.dat");
1772
1773NaR0      = load ("original/NaR.dat");
1774NaR1      = load ("nemo_nmodl_generated/NaR.dat");
1775
1776NaP0      = load ("original/NaP.dat");
1777NaP1      = load ("nemo_nmodl_generated/NaP.dat");
1778
1779
1780subplot(3,4,1);
1781plot(CaHVA0(:,1),CaHVA0(:,2),CaHVA1(:,1),CaHVA1(:,2),'linewidth',2);
1782title ("CaHVA current");
1783
1784subplot(3,4,2);
1785plot(CaLVA0(:,1),CaLVA0(:,2),CaLVA1(:,1),CaLVA1(:,2),'linewidth',2);
1786title ("CaLVA current");
1787
1788subplot(3,4,3);
1789plot(HCN10(:,1),HCN10(:,2),HCN11(:,1),HCN11(:,2),'linewidth',2);
1790title ("HCN1 current");
1791
1792subplot(3,4,4);
1793plot(HCN20(:,1),HCN20(:,2),HCN21(:,1),HCN21(:,2),'linewidth',2);
1794title ("HCN2 current");
1795
1796subplot(3,4,5);
1797plot(KA0(:,1),KA0(:,2),KA1(:,1),KA1(:,2),'linewidth',2);
1798title ("KA current");
1799
1800subplot(3,4,6);
1801plot(KCa0(:,1),KCa0(:,2),KCa1(:,1),KCa1(:,2),'linewidth',2);
1802title ("KCa current");
1803
1804subplot(3,4,7);
1805plot(KM0(:,1),KM0(:,2),KM1(:,1),KM1(:,2),'linewidth',2);
1806title ("KM current");
1807
1808subplot(3,4,8);
1809plot(KV0(:,1),KV0(:,2),KV1(:,1),KV1(:,2),'linewidth',2);
1810title ("KV current");
1811
1812subplot(3,4,9);
1813plot(SK20(:,1),SK20(:,2),SK21(:,1),SK21(:,2),'linewidth',2);
1814title ("SK2 current");
1815
1816subplot(3,4,10);
1817plot(Na0(:,1),Na0(:,2),Na1(:,1),Na1(:,2),'linewidth',2);
1818title ("Na current");
1819
1820subplot(3,4,11);
1821plot(NaR0(:,1),NaR0(:,2),NaR1(:,1),NaR1(:,2),'linewidth',2);
1822title ("NaR current");
1823
1824subplot(3,4,12);
1825plot(NaP0(:,1),NaP0(:,2),NaP1(:,1),NaP1(:,2),'linewidth',2);
1826title ("NaP current");
1827
1828print  ("NEURON_Original_Iclamp.eps", "-depsc");
1829EOF
1830)
1831
1832
1833
1834    ("plot_neuron_original_vclamp.m" () 
1835#<<EOF
1836
1837CaHVA0       = load ("original/CaHVA.dat");
1838CaHVA1       = load ("nemo_nmodl_generated/CaHVA.dat");
1839
1840CaLVA0       = load ("original/CaLVA.dat");
1841CaLVA1       = load ("nemo_nmodl_generated/CaLVA.dat");
1842
1843HCN10       = load ("original/HCN1.dat");
1844HCN11       = load ("nemo_nmodl_generated/HCN1.dat");
1845
1846HCN20       = load ("original/HCN2.dat");
1847HCN21       = load ("nemo_nmodl_generated/HCN2.dat");
1848
1849KA0       = load ("original/KA.dat");
1850KA1       = load ("nemo_nmodl_generated/KA.dat");
1851
1852KCa0       = load ("original/KCa.dat");
1853KCa1       = load ("nemo_nmodl_generated/KCa.dat");
1854
1855KM0      = load ("original/KM.dat");
1856KM1      = load ("nemo_nmodl_generated/KM.dat");
1857
1858KV0      = load ("original/KV.dat");
1859KV1      = load ("nemo_nmodl_generated/KV.dat");
1860
1861SK20      = load ("original/SK2.dat");
1862SK21      = load ("nemo_nmodl_generated/SK2.dat");
1863
1864Na0      = load ("original/Na.dat");
1865Na1      = load ("nemo_nmodl_generated/Na.dat");
1866
1867NaR0      = load ("original/NaR.dat");
1868NaR1      = load ("nemo_nmodl_generated/NaR.dat");
1869
1870NaP0      = load ("original/NaP.dat");
1871NaP1      = load ("nemo_nmodl_generated/NaP.dat");
1872
1873
1874subplot(3,4,1);
1875plot(CaHVA0(:,1),CaHVA0(:,2),CaHVA1(:,1),CaHVA1(:,2),'linewidth',2);
1876title ("CaHVA current");
1877
1878subplot(3,4,2);
1879plot(CaLVA0(:,1),CaLVA0(:,2),CaLVA1(:,1),CaLVA1(:,2),'linewidth',2);
1880title ("CaLVA current");
1881
1882subplot(3,4,3);
1883plot(HCN10(:,1),HCN10(:,2),HCN11(:,1),HCN11(:,2),'linewidth',2);
1884title ("HCN1 current");
1885
1886subplot(3,4,4);
1887plot(HCN20(:,1),HCN20(:,2),HCN21(:,1),HCN21(:,2),'linewidth',2);
1888title ("HCN2 current");
1889
1890subplot(3,4,5);
1891plot(KA0(:,1),KA0(:,2),KA1(:,1),KA1(:,2),'linewidth',2);
1892title ("KA current");
1893
1894subplot(3,4,6);
1895plot(KCa0(:,1),KCa0(:,2),KCa1(:,1),KCa1(:,2),'linewidth',2);
1896title ("KCa current");
1897
1898subplot(3,4,7);
1899plot(KM0(:,1),KM0(:,2),KM1(:,1),KM1(:,2),'linewidth',2);
1900title ("KM current");
1901
1902subplot(3,4,8);
1903plot(KV0(:,1),KV0(:,2),KV1(:,1),KV1(:,2),'linewidth',2);
1904title ("KV current");
1905
1906subplot(3,4,9);
1907plot(SK20(:,1),SK20(:,2),SK21(:,1),SK21(:,2),'linewidth',2);
1908title ("SK2 current");
1909
1910subplot(3,4,10);
1911plot(Na0(:,1),Na0(:,2),Na1(:,1),Na1(:,2),'linewidth',2);
1912title ("Na current");
1913
1914subplot(3,4,11);
1915plot(NaR0(:,1),NaR0(:,2),NaR1(:,1),NaR1(:,2),'linewidth',2);
1916title ("NaR current");
1917
1918subplot(3,4,12);
1919plot(NaP0(:,1),NaP0(:,2),NaP1(:,1),NaP1(:,2),'linewidth',2);
1920title ("NaP current");
1921
1922print  ("NEURON_Original_Vclamp.eps", "-depsc");
1923
1924EOF
1925)
1926
1927    ("nestmodule_bootstrap.sh" () 
1928#<<EOF
1929#!/bin/sh
1930
1931echo "Bootstrapping Golgi module..."
1932
1933if test -d autom4te.cache ; then
1934# we must remove this cache, because it
1935# may screw up things if configure is run for
1936# different platforms.
1937  echo "  -> Removing old automake cache ..."
1938  rm -rf autom4te.cache
1939fi
1940
1941echo "  -> Running aclocal ..."
1942aclocal
1943
1944echo "  -> Running libtoolize ..."
1945if [ `uname -s` = Darwin ] ; then
1946# libtoolize is glibtoolize on OSX
1947  LIBTOOLIZE=glibtoolize
1948else 
1949  LIBTOOLIZE=libtoolize
1950fi
1951
1952libtool_major=`$LIBTOOLIZE --version | head -n1 | cut -d\) -f2 | cut -d\. -f1`
1953$LIBTOOLIZE --force --copy --ltdl
1954
1955echo "  -> Re-running aclocal ..."
1956if test $libtool_major -le 2; then
1957  aclocal --force
1958else
1959  aclocal --force -I $(pwd)/libltdl/m4
1960fi
1961
1962echo "  -> Running autoconf ..."
1963autoconf
1964
1965# autoheader must run before automake
1966echo "  -> Running autoheader ..."
1967autoheader
1968
1969echo "  -> Running automake ..."
1970automake --foreign --add-missing --force-missing --copy
1971
1972echo "Done."
1973
1974EOF
1975)
1976
1977    ("nestmodule_configure.ac" () 
1978#<<EOF
1979AC_PREREQ(2.52)
1980
1981AC_INIT(golgimodule, 1.0, raikov@oist.jp)
1982
1983# These variables are exported to include/config.h
1984GOLGIMODULE_MAJOR=1
1985GOLGIMODULE_MINOR=0
1986GOLGIMODULE_PATCHLEVEL=0
1987
1988# Exporting source and build directories requires full path names.
1989# Thus we have to expand.
1990# Here, we are in top build dir, since source dir must exist, we can just
1991# move there and call pwd
1992if test "x$srcdir" = x ; then
1993  PKGSRCDIR=`pwd`
1994else
1995  PKGSRCDIR=`cd $srcdir && pwd`
1996fi
1997PKGBUILDDIR=`pwd`
1998
1999# If this is not called, install-sh will be put into .. by bootstrap.sh
2000# moritz, 06-26-06
2001AC_CONFIG_AUX_DIR(.)
2002
2003AM_INIT_AUTOMAKE(nest, $GOLGIMODULE_VERSION)
2004
2005# obtain host system type; HEP 2004-12-20
2006AC_CANONICAL_HOST
2007
2008# ------------------------------------------------------------------------
2009# Handle options
2010#
2011# NOTE: No programs/compilations must be run in this section;
2012#       otherwise CFLAGS and CXXFLAGS may take on funny default
2013#       values.
2014#       HEP 2004-12-20
2015# ------------------------------------------------------------------------
2016
2017# nest-config
2018NEST_CONFIG=`which nest-config`
2019AC_ARG_WITH(nest,[  --with-nest=script  nest-config script including path],
2020[
2021  if test "$withval" != yes; then
2022    NEST_CONFIG=$withval
2023  else
2024    AC_MSG_ERROR([--with-nest-config expects the nest-config script as argument. See README for details.])
2025  fi
2026])
2027
2028# -------------------------------------------
2029# END Handle options
2030# -------------------------------------------
2031
2032# sundials-config
2033SUNDIALS_CONFIG=`which sundials-config`
2034AC_ARG_WITH(sundials,[  --with-sundials=script  sundials-config script including path],
2035[
2036  if test "$withval" != yes; then
2037    SUNDIALS_CONFIG=$withval
2038#  else
2039#    AC_MSG_ERROR([--with-sundials-config expects the sundials-config script as argument. See README for details.])
2040  fi
2041])
2042
2043
2044# does nest-config work
2045AC_MSG_CHECKING([for nest-config ])
2046AC_CHECK_FILE($NEST_CONFIG, HAVE_NEST=yes,
2047              AC_MSG_ERROR([No usable nest-config was found. You may want to use --with-nest-config.]))
2048AC_MSG_RESULT(found)
2049
2050AC_MSG_CHECKING([for sundials-config ])
2051AC_CHECK_FILE($SUNDIALS_CONFIG, HAVE_SUNDIALS=yes,
2052              AC_MSG_WARN([No usable sundials-config was found. You may want to use --with-sundials-config.]))
2053AC_MSG_RESULT(found)
2054
2055# the following will crash if nest-config does not run
2056# careful, lines below must not break
2057AC_MSG_CHECKING([for NEST directory information ])
2058NEST_PREFIX=`$NEST_CONFIG --prefix`
2059NEST_CPPFLAGS=`$NEST_CONFIG --cflags`
2060NEST_COMPILER=`$NEST_CONFIG --compiler`
2061if test $prefix = NONE; then prefix=`$NEST_CONFIG --prefix`; fi
2062AC_MSG_RESULT($NEST_CPPFLAGS)
2063
2064
2065AC_MSG_CHECKING([for SUNDIALS preprocessor flags ])
2066SUNDIALS_CPPFLAGS="`$SUNDIALS_CONFIG -m cvode -t s -l c -s cppflags`"
2067AC_MSG_RESULT($SUNDIALS_CPPFLAGS)
2068
2069AC_MSG_CHECKING([for SUNDIALS linker options ])
2070SUNDIALS_LDFLAGS="`$SUNDIALS_CONFIG -m cvode -t s -l c -s libs` -lblas -llapack"
2071AC_MSG_RESULT($SUNDIALS_LDFLAGS)
2072
2073# Set the platform-dependent compiler flags based on the canonical
2074# host string.  These flags are placed in AM_{C,CXX}FLAGS.  If
2075# {C,CXX}FLAGS are given as environment variables, then they are
2076# appended to the set of automatically chosen flags.  After
2077# {C,CXX}FLAGS have been read out, they must be cleared, since
2078# system-dependent defaults will otherwise be placed into the
2079# Makefiles.  HEP 2004-12-20.
2080
2081# Before we can determine the proper compiler flags, we must know
2082# which compiler we are using.  Since the pertaining AC macros run the
2083# compiler and set CFLAGS, CXXFLAGS to system-dependent values, we
2084# need to save command line/enviroment settings of these variables
2085# first. AC_AIX must run before the compiler is run, so we must run it
2086# here.
2087# HEP 2004-12-21
2088
2089GOLGIMODULE_SAVE_CXXFLAGS=$CXXFLAGS
2090
2091# Must first check if we are on AIX
2092AC_AIX
2093
2094# Check for C++ compiler, looking for the same compiler
2095# used with NEST
2096AC_PROG_CXX([ $NEST_COMPILER ])
2097
2098# the following is makeshift, should have the macro set proper
2099# GOLGIMODULE_SET_CXXFLAGS
2100AM_CXXFLAGS=$GOLGIMODULE_SAVE_CXXFLAGS
2101CXXFLAGS=
2102
2103## Configure C environment
2104
2105AC_PROG_LD
2106AC_PROG_INSTALL
2107
2108AC_LIBLTDL_CONVENIENCE     ## put libltdl into a convenience library
2109AC_PROG_LIBTOOL            ## use libtool
2110AC_CONFIG_SUBDIRS(libltdl) ## also configure subdir containing libltdl
2111
2112#-- Set the language to C++
2113AC_LANG_CPLUSPLUS
2114
2115#-- Look for programs needed in the Makefile
2116AC_PROG_CXXCPP
2117AM_PROG_LIBTOOL
2118AC_PATH_PROGS([MAKE],[gmake make],[make])
2119
2120# ---------------------------------------------------------------
2121# Configure directories to be built
2122# ---------------------------------------------------------------
2123
2124PKGDATADIR=$datadir/$PACKAGE
2125PKGDOCDIR=$datadir/doc/$PACKAGE
2126
2127# set up directories from which to build help
2128# second line replaces space with colon as separator
2129HELPDIRS="$PKGSRCDIR $PKGSRCDIR/sli"
2130HELPDIRS=`echo $HELPDIRS | tr " " ":"`
2131
2132#-- Replace these variables in *.in
2133AC_SUBST(HAVE_NEST)
2134AC_SUBST(NEST_CONFIG)
2135AC_SUBST(NEST_CPPFLAGS)
2136AC_SUBST(NEST_COMPILER)
2137AC_SUBST(NEST_PREFIX)
2138AC_SUBST(HELPDIRS)
2139AC_SUBST(PKGSRCDIR)
2140AC_SUBST(PKGBUILDDIR)
2141AC_SUBST(PKGDATADIR)
2142AC_SUBST(PKGDOCDIR)
2143AC_SUBST(KERNEL)
2144AC_SUBST(HOST)
2145AC_SUBST(SED)
2146AC_SUBST(LD)
2147AC_SUBST(host_os)
2148AC_SUBST(host_cpu)
2149AC_SUBST(host_vendor)
2150AC_SUBST(AS)
2151AC_SUBST(CXX)
2152AC_SUBST(AR)
2153AC_SUBST(ARFLAGS)
2154AC_SUBST(CXX_AR)
2155AC_SUBST(AM_CXXFLAGS)
2156AC_SUBST(AM_CFLAGS)
2157AC_SUBST(MAKE)
2158AC_SUBST(MAKE_FLAGS)
2159AC_SUBST(INCLTDL)
2160AC_SUBST(LIBLTDL)
2161AC_SUBST(SUNDIALS_CONFIG)
2162AC_SUBST(SUNDIALS_CPPFLAGS)
2163AC_SUBST(SUNDIALS_LDFLAGS)
2164
2165AM_CONFIG_HEADER(golgimodule_config.h:golgimodule_config.h.in)
2166AC_CONFIG_FILES(Makefile)
2167
2168# -----------------------------------------------
2169# Create output
2170# -----------------------------------------------
2171AC_OUTPUT
2172
2173
2174# -----------------------------------------------
2175# Report, after output at end of configure run
2176# Must come after AC_OUTPUT, so that it is
2177# displayed after libltdl has been configured
2178# -----------------------------------------------
2179
2180echo
2181echo "-------------------------------------------------------"
2182echo "Golgi module Configuration Summary"
2183echo "-------------------------------------------------------"
2184echo
2185echo "C++ compiler        : $CXX"
2186echo "C++ compiler flags  : $AM_CXXFLAGS"
2187echo "NEST compiler flags : $NEST_CPPFLAGS"
2188echo "SUNDIALS compiler flags : $SUNDIALS_CPPFLAGS"
2189echo "SUNDIALS linker flags : $SUNDIALS_LDFLAGS"
2190
2191# these variables will still contain '${prefix}'
2192# we want to have the versions where this is resolved, too:
2193eval eval eval  PKGDOCDIR_AS_CONFIGURED=$PKGDOCDIR
2194eval eval eval  PKGDATADIR_AS_CONFIGURED=$PKGDATADIR
2195
2196echo
2197echo "-------------------------------------------------------"
2198echo
2199echo "You can build and install Golgi module now, using"
2200echo "  make"
2201echo "  make install"
2202echo
2203echo "Golgi module will be installed to:"
2204echo -n "  "; eval eval echo "$libdir"
2205echo
2206
2207EOF
2208)
2209
2210    ("nestmodule_makefile.am" () 
2211#<<EOF
2212
2213# Automake file for external dynamic modules for NEST
2214#
2215# Hans Ekkehard Plesser, April 2008
2216# Automake file for the Developer Module
2217#
2218# libgolgimodule is built as a normal, installable library.
2219# It will be installed to $prefix/lib by make install.
2220#
2221# Headers from this directory are not to be installed upon
2222# make install. They are therefore included in _SOURCES.
2223
2224
2225libdir= @libdir@/nest
2226
2227lib_LTLIBRARIES=      golgimodule.la libgolgimodule.la
2228
2229golgimodule_la_CXXFLAGS= @AM_CXXFLAGS@
2230golgimodule_la_SOURCES=  golgimodule.cpp      golgimodule.h      \
2231                      Golgi.cpp Golgi.h
2232golgimodule_la_LDFLAGS=  -module
2233
2234libgolgimodule_la_CXXFLAGS= $(golgimodule_la_CXXFLAGS) -DLINKED_MODULE
2235libgolgimodule_la_SOURCES=  $(golgimodule_la_SOURCES)
2236
2237MAKEFLAGS= @MAKE_FLAGS@
2238
2239AM_CPPFLAGS= @NEST_CPPFLAGS@ \
2240             @SUNDIALS_CPPFLAGS@ \
2241             @INCLTDL@     
2242
2243AM_LDFLAGS = @SUNDIALS_LDFLAGS@
2244
2245.PHONY: install-slidoc
2246
2247nobase_pkgdata_DATA=\
2248        golgimodule.sli
2249
2250install-slidoc:
2251        NESTRCFILENAME=/dev/null $(DESTDIR)$(NEST_PREFIX)/bin/sli --userargs="@HELPDIRS@" $(NEST_PREFIX)/share/nest/sli/install-help.sli
2252
2253install-data-hook: install-exec install-slidoc
2254
2255EXTRA_DIST= sli
2256
2257EOF
2258)
2259
2260    ("nestmodule.cpp" () 
2261#<<EOF
2262/*
2263 *  golgimodule.cpp
2264 *  This file is part of NEST.
2265 *
2266 *  Copyright (C) 2008 by
2267 *  The NEST Initiative
2268 *
2269 *  See the file AUTHORS for details.
2270 *
2271 *  Permission is granted to compile and modify
2272 *  this file for non-commercial use.
2273 *  See the file LICENSE for details.
2274 *
2275 */
2276
2277// include necessary NEST headers
2278//#include "config.h"
2279#include "network.h"
2280#include "model.h"
2281#include "dynamicloader.h"
2282#include "genericmodel.h"
2283#include "generic_connector.h"
2284#include "booldatum.h"
2285#include "integerdatum.h"
2286#include "tokenarray.h"
2287#include "exceptions.h"
2288#include "sliexceptions.h"
2289#include "nestmodule.h"
2290
2291// include headers with your own stuff
2292#include "golgimodule.h"
2293#include "Golgi.h"
2294
2295// -- Interface to dynamic module loader ---------------------------------------
2296
2297/*
2298 * The dynamic module loader must be able to find your module.
2299 * You make the module known to the loader by defining an instance of your
2300 * module class in global scope. This instance must have the name
2301 *
2302 * <modulename>_LTX_mod
2303 *
2304 * The dynamicloader can then load modulename and search for symbol "mod" in it.
2305 */
2306 
2307golginest::GolgiModule golgimodule_LTX_mod;
2308
2309// -- DynModule functions ------------------------------------------------------
2310
2311golginest::GolgiModule::GolgiModule()
2312  {
2313#ifdef LINKED_MODULE
2314     // register this module at the dynamic loader
2315     // this is needed to allow for linking in this module at compile time
2316     // all registered modules will be initialized by the main app's dynamic loader
2317     nest::DynamicLoaderModule::registerLinkedModule(this);
2318#endif     
2319   }
2320
2321golginest::GolgiModule::~GolgiModule()
2322   {
2323   }
2324
2325   const std::string golginest::GolgiModule::name(void) const
2326   {
2327     return std::string("Golgi Module"); // Return name of the module
2328   }
2329
2330   const std::string golginest::GolgiModule::commandstring(void) const
2331   {
2332     return std::string("");
2333   }
2334
2335   /* BeginDocumentation
2336      Name: StepPatternConnect - Connect sources and targets with a stepping pattern
2337     
2338      Synopsis:
2339      [sources] source_step [targets] target_step synmod StepPatternConnect -> n_connections
2340     
2341      Parameters:
2342      [sources]     - Array containing GIDs of potential source neurons
2343      source_step   - Make connection from every source_step'th neuron
2344      [targets]     - Array containing GIDs of potential target neurons
2345      target_step   - Make connection to every target_step'th neuron
2346      synmod        - The synapse model to use (literal, must be key in synapsedict)
2347      n_connections - Number of connections made
2348     
2349      Description:
2350      This function subsamples the source and target arrays given with steps
2351      source_step and target_step, beginning with the first element in each array,
2352      and connects the selected nodes.
2353     
2354      Example:
2355      /first_src 0 /network_size get def
2356      /last_src /iaf_neuron 20 Create def  % nodes  1 .. 20
2357      /src [first_src last_src] Range def
2358      /last_tgt /iaf_neuron 10 Create def  % nodes 21 .. 30
2359      /tgt [last_src 1 add last_tgt] Range def
2360     
2361      src 6 tgt 4 /drop_odd_spike StepPatternConnect
2362 
2363      This connects nodes [1, 7, 13, 19] as sources to nodes [21, 25,
2364      29] as targets using synapses of type drop_odd_spike, and
2365      returning 12 as the number of connections.  The following
2366      command will print the connections (you must paste the SLI
2367      command as one long line):
2368
2369      src { /s Set << /source s /synapse_type /static_synapse >> FindConnections { GetStatus /target get } Map dup length 0 gt { cout s <- ( -> ) <- exch <-- endl } if ; } forall
2370      1 -> [21 25 29]
2371      7 -> [21 25 29]
2372      13 -> [21 25 29]
2373      19 -> [21 25 29]
2374     
2375      Remark:
2376      This function is only provided as an example for how to write your own
2377      interface function.
2378     
2379      Author:
2380      Hans Ekkehard Plesser
2381     
2382      SeeAlso:
2383      Connect, ConvergentConnect, DivergentConnect
2384   */
2385   void golginest::GolgiModule::StepPatternConnect_Vi_i_Vi_i_lFunction::execute(SLIInterpreter *i) const
2386   {
2387     // Check if we have (at least) five arguments on the stack.
2388     i->assert_stack_load(5);
2389
2390     // Retrieve source, source step, target, target step from the stack
2391     const TokenArray sources = getValue<TokenArray> (i->OStack.pick(4)); // bottom
2392     const long src_step      = getValue<long>       (i->OStack.pick(3));
2393     const TokenArray targets = getValue<TokenArray> (i->OStack.pick(2));
2394     const long tgt_step      = getValue<long>       (i->OStack.pick(1)); 
2395     const Name synmodel_name = getValue<std::string>(i->OStack.pick(0)); // top
2396     
2397     // Obtain synapse model index
2398     const Token synmodel
2399       = nest::NestModule::get_network().get_synapsedict().lookup(synmodel_name);
2400     if ( synmodel.empty() )
2401       throw nest::UnknownSynapseType(synmodel_name.toString());
2402     const nest::index synmodel_id = static_cast<nest::index>(synmodel);
2403
2404     // Build a list of targets with the given step
2405     TokenArray selected_targets;
2406     for ( size_t t = 0 ; t < targets.size() ; t += tgt_step )
2407       selected_targets.push_back(targets[t]);
2408     
2409     // Now connect all appropriate sources to this list of targets
2410     size_t Nconn = 0;  // counts connections
2411     for ( size_t s = 0 ; s < sources.size() ; s += src_step )
2412     {
2413       // We must first obtain the GID of the source as integer
2414       const nest::long_t sgid = getValue<nest::long_t>(sources[s]);
2415
2416       // nest::network::divergent_connect() requires weight and delay arrays. We want to use
2417       // default values from the synapse model, so we pass empty arrays.
2418       nest::NestModule::get_network().divergent_connect(sgid, selected_targets,
2419                                                         TokenArray(), TokenArray(),
2420                                                         synmodel_id);
2421       Nconn += selected_targets.size();
2422     }
2423
2424     // We get here only if none of the operations above throws and exception.
2425     // Now we can safely remove the arguments from the stack and push Nconn
2426     // as our result.
2427     i->OStack.pop(5);
2428     i->OStack.push(Nconn);
2429     
2430     // Finally, we pop the call to this functions from the execution stack.
2431     i->EStack.pop();
2432   }
2433
2434  //-------------------------------------------------------------------------------------
2435
2436  void golginest::GolgiModule::init(SLIInterpreter *i, nest::Network*)
2437  {
2438    /* Register a neuron or device model.
2439       Give node type as template argument and the name as second argument.
2440       The first argument is always a reference to the network.
2441       Return value is a handle for later unregistration.
2442    */
2443       nest::register_model<nest::Golgi>(nest::NestModule::get_network(),
2444                                            "Golgi");
2445
2446
2447    /* Register a SLI function.
2448       The first argument is the function name for SLI, the second a pointer to
2449       the function object. If you do not want to overload the function in SLI,
2450       you do not need to give the mangled name. If you give a mangled name, you
2451       should define a type trie in the golgimodule-init.sli file.
2452    */
2453    i->createcommand("StepPatternConnect_Vi_i_Vi_i_l",
2454                     &stepPatternConnect_Vi_i_Vi_i_lFunction);
2455
2456  }  // GolgiModule::init()
2457
2458 
2459
2460EOF
2461)
2462
2463    ("nestmodule.h" () 
2464#<<EOF
2465/*
2466 *  golgimodule.h
2467 *
2468 *  This file is part of NEST.
2469 *
2470 *  Copyright (C) 2008 by
2471 *  The NEST Initiative
2472 *
2473 *  See the file AUTHORS for details.
2474 *
2475 *  Permission is granted to compile and modify
2476 *  this file for non-commercial use.
2477 *  See the file LICENSE for details.
2478 *
2479 */
2480
2481#ifndef GOLGIMODULE_H
2482#define GolgiMODULE_H
2483
2484#include "dynmodule.h"
2485#include "slifunction.h"
2486
2487namespace nest
2488{
2489  class Network;
2490}
2491
2492// Put your stuff into your own namespace.
2493namespace golginest {
2494 
2495/**
2496 * Class defining your model.
2497 * @note For each model, you must define one such class, with a unique name.
2498 */
2499class GolgiModule : public DynModule
2500{
2501public:
2502
2503  // Interface functions ------------------------------------------
2504 
2505  /**
2506   * @note The constructor registers the module with the dynamic loader.
2507   *       Initialization proper is performed by the init() method.
2508   */
2509  GolgiModule();
2510 
2511  /**
2512   * @note The destructor does not do much in modules. Proper "downrigging"
2513   *       is the responsibility of the unregister() method.
2514   */
2515  ~GolgiModule();
2516
2517  /**
2518   * Initialize module by registering models with the network.
2519   * @param SLIInterpreter* SLI interpreter
2520   * @param nest::Network*  Network with which to register models
2521   * @note  Parameter Network is needed for historical compatibility
2522   *        only.
2523   */
2524  void init(SLIInterpreter*, nest::Network*);
2525
2526  /**
2527   * Return the name of your model.
2528   */
2529  const std::string name(void) const;
2530 
2531  /**
2532   * Return the name of a sli file to execute when golgimodule is loaded.
2533   * This mechanism can be used to define SLI commands associated with your
2534   * module, in particular, set up type tries for functions you have defined.
2535   */
2536  const std::string commandstring(void) const;
2537     
2538public:
2539 
2540  // Classes implementing your functions -----------------------------
2541 
2542  /**
2543   * Implement a function for a step-pattern-based connection.
2544   * @note What this function does is described in the SLI documentation
2545   *       in the cpp file.
2546   * @note The mangled name indicates this function expects the following
2547   *       arguments on the stack (bottom first): vector of int, int,
2548   *       vector of int, int.
2549   * @note You must define a member object in your module class
2550   *       of the function class. execute() is later invoked on this
2551   *       member.
2552   */
2553  class StepPatternConnect_Vi_i_Vi_i_lFunction: public SLIFunction
2554     {
2555     public:
2556       void execute(SLIInterpreter *) const;
2557     };
2558
2559     StepPatternConnect_Vi_i_Vi_i_lFunction stepPatternConnect_Vi_i_Vi_i_lFunction;
2560  };
2561} // namespace golginest
2562
2563#endif
2564
2565EOF
2566)
2567
2568
2569    ("golgimodule.sli" () 
2570#<<EOF
2571/*
2572 * Initialization file for GolgiModule.
2573 * Run automatically when GolgiModule is loaded.
2574 */
2575
2576M_DEBUG (golgimodule.sli) (Initializing SLI support for GolgiModule.) message
2577
2578/StepPatternConnect [ /arraytype /integertype /arraytype /integertype /literaltype ]
2579{
2580  StepPatternConnect_Vi_i_Vi_i_l
2581} def
2582
2583EOF
2584)
2585
2586
2587    ("testrun.sli" () 
2588#<<EOF
2589/dt 0.025 def
2590
2591ResetKernel
25920
2593 <<
2594   /resolution  dt
2595 >> SetStatus
2596
2597(golgimodule) Install
2598/neuron /Golgi Create def
2599/neuron_params << /V_m -65.0 >> def
2600neuron neuron_params SetStatus
2601
2602/stepinput /step_current_generator Create def
2603/vlog /voltmeter Create def
2604/vlog_parameters << /interval dt /to_file true /to_memory false >> def
2605vlog vlog_parameters SetStatus
2606
2607stepinput neuron Connect
2608vlog neuron Connect
2609
2610/step_current_parameters << /amplitude_times [0.0 1000.0 2000.0 3000.0 4000.0 5000.0] /amplitude_values [0.0 1.0 2.0 3.0 4.0 0.0]  >> def
2611stepinput step_current_parameters SetStatus
2612
26136000.0 Simulate
2614
2615EOF
2616)
2617
2618))
Note: See TracBrowser for help on using the repository browser.