MOOSE - Multiscale Object Oriented Simulation Environment
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
CaConc.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 ** This program is part of 'MOOSE', the
3 ** Messaging Object Oriented Simulation Environment.
4 ** Copyright (C) 2003-2007 Upinder S. Bhalla. and NCBS
5 ** It is made available under the terms of the
6 ** GNU Lesser General Public License version 2.1
7 ** See the file COPYING.LIB for the full notice.
8 **********************************************************************/
9 
10 // #include <cfloat>
11 #include "header.h"
12 #include "CaConcBase.h"
13 #include "CaConc.h"
14 
15 
17 {
18  static string doc[] =
19  {
20  "Name", "CaConc \n",
21  "Author", "Upinder S. Bhalla, 2014, NCBS \n",
22  "Description", "CaConc: Calcium concentration pool. Takes current from a \n"
23  "channel and keeps track of calcium buildup and depletion by a \n"
24  "single exponential process. \n",
25  };
26 
27  static Dinfo< CaConc > dinfo;
28 
29  static Cinfo CaConcCinfo(
30  "CaConc",
32  0,
33  0,
34  &dinfo,
35  doc,
36  sizeof(doc)/sizeof(string)
37  );
38 
39  return &CaConcCinfo;
40 }
42 
44 
46  : CaConcBase(),
47  Ca_( 0.0 ),
48  CaBasal_( 0.0 ),
49  tau_( 1.0 ),
50  B_( 1.0 ),
51  c_( 0.0 ),
52  activation_( 0.0 ),
53  ceiling_( 1.0e9 ),
54  floor_( 0.0 )
55 {;}
56 
58 // Field function definitions
60 
61 void CaConc::vSetCa( const Eref& e, double Ca )
62 {
63  Ca_ = Ca;
64 }
65 double CaConc::vGetCa( const Eref& e ) const
66 {
67  return Ca_;
68 }
69 
70 void CaConc::vSetCaBasal( const Eref& e, double CaBasal )
71 {
72  CaBasal_ = CaBasal;
73 }
74 double CaConc::vGetCaBasal( const Eref& e ) const
75 {
76  return CaBasal_;
77 }
78 
79 void CaConc::vSetTau( const Eref& e, double tau )
80 {
81  tau_ = tau;
82 }
83 double CaConc::vGetTau( const Eref& e ) const
84 {
85  return tau_;
86 }
87 
88 void CaConc::vSetB( const Eref& e, double B )
89 {
90  B_ = B;
91 }
92 double CaConc::vGetB( const Eref& e ) const
93 {
94  return B_;
95 }
96 void CaConc::vSetCeiling( const Eref& e, double ceiling )
97 {
98  ceiling_ = ceiling;
99 }
100 double CaConc::vGetCeiling( const Eref& e ) const
101 {
102  return ceiling_;
103 }
104 
105 void CaConc::vSetFloor( const Eref& e, double floor )
106 {
107  floor_ = floor;
108 }
109 double CaConc::vGetFloor( const Eref& e ) const
110 {
111  return floor_;
112 }
113 
115 // Dest function definitions
117 
118 void CaConc::vReinit( const Eref& e, ProcPtr p )
119 {
120  activation_ = 0.0;
121  c_ = 0.0;
122  Ca_ = CaBasal_;
123  concOut()->send( e, Ca_ );
124 }
125 
126 void CaConc::vProcess( const Eref& e, ProcPtr p )
127 {
128  double x = exp( -p->dt / tau_ );
129  Ca_ = CaBasal_ + c_ * x + ( B_ * activation_ * tau_ ) * (1.0 - x);
130  if ( ceiling_ > 0.0 && Ca_ > ceiling_ ) {
131  Ca_ = ceiling_;
132  } else if ( Ca_ < floor_ ){
133  Ca_ = floor_;
134  }
135  c_ = Ca_ - CaBasal_;
136  concOut()->send( e, Ca_ );
137  activation_ = 0;
138 }
139 
140 
141 void CaConc::vCurrent( const Eref& e, double I )
142 {
143  activation_ += I;
144 }
145 
146 void CaConc::vCurrentFraction( const Eref& e, double I, double fraction )
147 {
148  activation_ += I * fraction;
149 }
150 
151 void CaConc::vIncrease( const Eref& e, double I )
152 {
153  activation_ += fabs( I );
154 }
155 
156 void CaConc::vDecrease( const Eref& e, double I )
157 {
158  activation_ -= fabs( I );
159 }
160 
162 // Unit tests
164 
165 #ifdef DO_UNIT_TESTS
166 void testCaConc()
167 {
168  /*
169  CaConc cc;
170  double tau = 0.10;
171  double basal = 0.0001;
172 
173  cc.setCa( basal );
174  cc.setCaBasal( basal );
175  cc.setTau( tau );
176  // Here we use a volume of 1e-15 m^3, i.e., a 10 micron cube.
177  cc.setB( 5.2e-6 / 1e-15 );
178  // Faraday constant = 96485.3415 s A / mol
179  // Use a 1 pA input current. This should give (0.5e-12/F) moles/sec
180  // influx, because Ca has valence of 2.
181  // So we get 5.2e-18 moles/sec coming in.
182  // Our volume is 1e-15 m^3
183  // So our buildup should be at 5.2e-3 moles/m^3/sec = 5.2 uM/sec
184  double curr = 1e-12;
185  // This will settle when efflux = influx
186  // dC/dt = B*Ik - C/tau = 0.
187  // so Ca = CaBasal + tau * B * Ik =
188  // 0.0001 + 0.1 * 5.2e-6 * 1e3 = 0.000626
189 
190  ProcInfo p;
191  p.dt = 0.001;
192  p.currTime = 0.0;
193  Eref sheller(Id().eref());
194  Shell * shell = reinterpret_cast<Shell*> (sheller.data());
195  Id temp = shell->doCreate("CaConc", Id(), "caconc", 1);
196  assert(temp.element()->getName() == "caconc");
197  // Id tempId = Id::nextId();
198  // Element temp( tempId, CaConc::initCinfo(), "temp", 0 );
199  Eref er( &temp, 0 );
200  cc.reinit( er, &p );
201 
202  double y;
203  double conc;
204  double delta = 0.0;
205  for ( p.currTime = 0.0; p.currTime < 0.5; p.currTime += p.dt )
206  {
207  cc.current( curr );
208  cc.process( er, &p );
209  y = basal + 526.0e-6 * ( 1.0 - exp( -p.currTime / tau ) );
210  conc = cc.getCa();
211  delta += ( y - conc ) * ( y - conc );
212  }
213  assert( delta < 1e-6 );
214  cout << "." << flush;
215  */
216 }
217 #endif
double activation_
Definition: CaConc.h:73
void vSetCa(const Eref &e, double val)
Definition: CaConc.cpp:61
double c_
Definition: CaConc.h:72
Definition: Dinfo.h:60
void vSetTau(const Eref &e, double val)
Definition: CaConc.cpp:79
void vSetB(const Eref &e, double val)
Definition: CaConc.cpp:88
double Ca_
Definition: CaConc.h:68
double vGetB(const Eref &e) const
Definition: CaConc.cpp:92
static SrcFinfo1< double > * concOut()
Definition: CaConcBase.cpp:25
double tau_
Definition: CaConc.h:70
void vIncrease(const Eref &e, double I)
Definition: CaConc.cpp:151
CaConc()
Definition: CaConc.cpp:45
void vSetCeiling(const Eref &e, double val)
Definition: CaConc.cpp:96
double floor_
Definition: CaConc.h:75
void vReinit(const Eref &, ProcPtr info)
Definition: CaConc.cpp:118
void vSetCaBasal(const Eref &e, double val)
Definition: CaConc.cpp:70
void vProcess(const Eref &, ProcPtr info)
Definition: CaConc.cpp:126
double B_
Definition: CaConc.h:71
static const Cinfo * initCinfo()
Definition: CaConc.cpp:16
double vGetCaBasal(const Eref &e) const
Definition: CaConc.cpp:74
double dt
Definition: ProcInfo.h:18
static const Cinfo * caConcCinfo
Definition: CaConc.cpp:43
void vDecrease(const Eref &e, double I)
Definition: CaConc.cpp:156
Definition: Eref.h:26
static const Cinfo * initCinfo()
Definition: CaConcBase.cpp:31
double vGetCa(const Eref &e) const
Definition: CaConc.cpp:65
void vCurrent(const Eref &e, double I)
Definition: CaConc.cpp:141
double vGetTau(const Eref &e) const
Definition: CaConc.cpp:83
void vSetFloor(const Eref &e, double val)
Definition: CaConc.cpp:105
double vGetFloor(const Eref &e) const
Definition: CaConc.cpp:109
double CaBasal_
Definition: CaConc.h:69
double ceiling_
Definition: CaConc.h:74
Definition: Cinfo.h:18
double vGetCeiling(const Eref &e) const
Definition: CaConc.cpp:100
void vCurrentFraction(const Eref &e, double I, double fraction)
Definition: CaConc.cpp:146