Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

specific_ion_channels.h

00001 #ifndef __SPECIFIC_ION_CHANNELS_H_
00002 #define __SPECIFIC_ION_CHANNELS_H_
00003 
00004 #include "viongate.h"
00005 #include "conciongate.h"
00006 #include "activechannel.h"
00007 #include "activecachannel.h"
00008 #include "csimerror.h"
00009 
00010 // parameters for voltage range transformations
00011 #define V_REST_BIOL_MV   (-70)    // [mV] (general in publications used unit)
00012 #define V_THRESH_BIOL_MV (-40)    // [mV]
00013 #define V_REST_SIM    (0.0)   // [V]  (in general all simulation parameters are in SI units)
00014 #define V_THRESH_SIM  (15e-3) // [V]
00015 
00016 #define A_MEMBRANE (0.01e-2) // [cm2]
00017 
00018 /* Transform biological Erev value to model voltage range */
00019 /* Note that in the ActiveChannel constructor actual Neuron voltages are unknown */ 
00020 #define TRANSFORM_EREV Erev = ((Erev - V_REST_BIOL_MV)*(V_THRESH_SIM - V_REST_SIM)/(V_THRESH_BIOL_MV-V_REST_BIOL_MV) + V_REST_SIM);
00021 
00022 
00023 #define TRANSFORM_V    /* Transform model voltage value to biological voltage range */ \
00024                        V = (V - *Vresting)*(V_THRESH_BIOL_MV - V_REST_BIOL_MV)/(*VmScale) + V_REST_BIOL_MV
00025 
00026 #define TSCALE 1000 // Don't be irritated later in the text: the unit of tau is [sec] and the TSCALE is usually compensated by 1e-6 instead if 1e-3 
00027 #define VSCALE 1000
00028 
00029 //============================================================
00030 
00031 #define CASCALE 1.1180e+07
00032 
00034 #define IONGATE_CA_MIN 0.0
00035 
00037 #define IONGATE_CA_MAX 1000e-9
00038 
00040 #define IONGATE_CA_INC 5.0e-10
00041 
00042 #define IONGATE_CA_TABLE_SIZE      ((int)((IONGATE_CA_MAX - IONGATE_CA_MIN) / IONGATE_CA_INC + 1))
00043 
00045 // Could only be connected to CaChannel_Yamada98 class, where the ca mechanism is included
00046 class CaGate_Yamada98 : public VIonGate {
00047 
00048   DO_REGISTERING
00049 
00050 public:
00051   CaGate_Yamada98(void) { k=2; Ca=0; Ts=1; C1=0; C2=0; }
00052 
00053   virtual ~CaGate_Yamada98(void) { if (getC1()) { free(getC1()); setC1(0); }
00054                                    if (getC2()) { free(getC2()); setC2(0); }}
00055 
00056   virtual double tau(double C) { return Ts/( pow(CASCALE*C,2) + 2.5); }
00057 
00058   virtual double infty(double C)  { return pow(CASCALE*C,2)/( pow(CASCALE*C,2) + 2.5); }
00059 
00060   virtual double pInfty(MembranePatchSimple *) { return 0;}
00061 
00062   virtual void reset(void);
00063 
00064   virtual void setCa(double *C) { Ca = C; }
00065 
00066   virtual int updateInternal(void);
00067 
00068   virtual int advance(void);
00069 
00070   virtual int addIncoming(Advancable *Incoming);
00071 
00073   double Ts;
00074 
00075 protected:
00076 
00078   double *Ca;
00079 
00080   virtual double *getC1(void) { return C1; }
00081   virtual double *getC2(void) { return C2; }
00082   virtual void setC1(double *p) { C1=p; }
00083   virtual void setC2(double *p) { C2=p; }
00084 
00086   double *C1;
00087 
00089   double *C2;
00090 };
00091 
00092 //== Channels used by James Maciokas / Reno ==========================================================
00093 
00095 // Ca mechanism is included in the channel class not the neuron class.
00096 class CaChannel_Yamada98 : public ActiveChannel {
00097 
00098   DO_REGISTERING
00099 
00100 public:
00101 
00102   CaChannel_Yamada98(void) {
00103     Erev = -5e-6 * VSCALE; // assumed resting potential Vresting = 0
00104     u = 200e-9;   // Mol
00105     Ts = 70e-3;   // Sec
00106     Ca = 0;       // Mol
00107     Gbar = 54e-9; // S
00108   }
00109 
00110   virtual void membraneSpikeNotify(double ) { Ca = Ca + u; };
00111 
00112   virtual void reset(void);
00113 
00114   virtual int updateInternal(void);
00115 
00116   virtual int advance(void);
00117 
00119   float u;
00120 
00122   float Ts;
00123 
00125   double Ca;
00126 
00127 protected:
00128 
00130   float C1;
00131 };
00132 
00133 
00135 class MmGate_Wang98 : public VIonGate {
00136 public:
00137   MmGate_Wang98(void) { k=1; }
00138   double tau(double V) { return TSCALE * exp(+( VSCALE * (V - *Vresting) - 12.3)/9.15) / 3800; }
00139   double infty(double V)  { return 1/(1 + exp(-( VSCALE * (V - *Vresting) - 13)/4.4)); }
00140 
00141   IONGATE_TABLES(MmGate_Wang98);
00142 };
00143 
00144 
00145 
00147 class MChannel_Wang98 : public ActiveChannel {
00148 
00149   DO_REGISTERING
00150 
00151 public:
00152 
00153   MChannel_Wang98(void) {
00154     addGate(new MmGate_Wang98);
00155 
00156     Erev = -80; // [mV] biological value
00157     // Transform to model voltage range
00158     TRANSFORM_EREV;
00159   }
00160 
00161   virtual ~MChannel_Wang98(void) {
00162     for(int i=0;i<nGates;i++)
00163       delete gates[i];
00164   }
00165 };
00166 
00168 class AmGate_Hoffman97 : public VIonGate {
00169 public:
00170   AmGate_Hoffman97(void) { k=1; }
00171 
00172 
00173   double tau(double V){ return TSCALE*0.2e-6; }
00174   double infty(double V) { TRANSFORM_V;
00175                            return 1/(1+exp(-(V-11)/18)); }
00176 
00177 /* Directly transformed parameters
00178   double tau(double ) { return TSCALE*0.2e-6; }
00179   double infty(double V)  { return 1/(1 + exp(-( VSCALE * (V - *Vresting) - 40.5)/9)); }
00180 */
00181   IONGATE_TABLES(AmGate_Hoffman97);
00182 };
00183 
00184 
00186 class AhGate_Hoffman97 : public VIonGate {
00187 public:
00188   AhGate_Hoffman97(void) { k=1; }
00189 
00190   double tau(double V) { TRANSFORM_V;
00191                          return (V < -20) ? 5e-3 : 1e-3 * (5+2.6*(V+20)/10); }
00192   double infty(double V) { TRANSFORM_V;
00193                            return 1/(1+exp((V+56)/8)); }
00194 
00195 
00196 /* Directly transformed parameters
00197   double tau(double ) { return TSCALE*5e-6; }
00198   double infty(double V)  { return 1/(1 + exp(( VSCALE * (V - *Vresting) - 7)/4)); }
00199 */
00200   IONGATE_TABLES(AhGate_Hoffman97);
00201 };
00202 
00203 
00204 
00206 class AChannel_Hoffman97 : public ActiveChannel {
00207 
00208   DO_REGISTERING
00209 
00210 public:
00211 
00212   AChannel_Hoffman97(void) {
00213     addGate(new AmGate_Hoffman97);
00214     addGate(new AhGate_Hoffman97);
00215 
00216     Erev = -80; // [mV] biological value
00217     // Transform to model voltage range
00218     TRANSFORM_EREV;
00219   }
00220 
00221   virtual ~AChannel_Hoffman97(void) {
00222     for(int i=0;i<nGates;i++)
00223       delete gates[i];
00224   }
00225 };
00226 
00228 class SICmGate_Maciokas02 : public VIonGate {
00229 public:
00230   SICmGate_Maciokas02(void) { k=1; }
00231 
00232   double tau(double ) { return TSCALE*0.2e-6; }
00233   double infty(double V)  { return 1/(1 + exp(-( VSCALE * (V - *Vresting) - 20)/2.5)); }
00234 
00235   IONGATE_TABLES(SICmGate_Maciokas02);
00236 };
00237 
00239 class SIChGate_Maciokas02 : public VIonGate {
00240 public:
00241   SIChGate_Maciokas02(void) { k=1; }
00242 
00243   double tau(double ) { return TSCALE*5e-6; }
00244   double infty(double V)  { return 1/(1 + exp(( VSCALE * (V - *Vresting) - 15)/2.5)); }
00245 
00246   IONGATE_TABLES(SIChGate_Maciokas02);
00247 };
00248 
00250 class SICChannel_Maciokas02 : public ActiveChannel {
00251 
00252   DO_REGISTERING
00253 
00254 public:
00255 
00256   SICChannel_Maciokas02(void) {
00257     addGate(new SICmGate_Maciokas02);
00258     addGate(new SIChGate_Maciokas02);
00259 
00260     Erev = -80; // [mV] biological value
00261     // Transform to model voltage range
00262     TRANSFORM_EREV;
00263   }
00264 
00265   virtual ~SICChannel_Maciokas02(void) {
00266     for(int i=0;i<nGates;i++)
00267       delete gates[i];
00268   }
00269 };
00270 
00271 
00272 
00273 //== Channels of neocortical pyramidal neurons from the SenseLab ModelDB archiv ========
00274 
00275 
00276 
00278 class AnGate_Korngreen02 : public VIonGate {
00279 public:
00280   AnGate_Korngreen02(void) { k=2;}
00281 
00282   double tau(double V) { TRANSFORM_V;
00283                          return (V < -50) ? 1e-3 * (1.25+175.03*exp(V*0.026)) : 1e-3 * (1.25+13*exp(-V*0.026)); }
00284   double infty(double V) { TRANSFORM_V;
00285                            return 1/(1+exp(-(V+14)/14.6)); }
00286 
00287   IONGATE_TABLES(AnGate_Korngreen02);
00288 };
00289 
00291 class AlGate_Korngreen02 : public VIonGate {
00292 public:
00293   AlGate_Korngreen02(void) { k=1; }
00294 
00295   double tau(double V) { TRANSFORM_V;
00296                          return 1e-3 * (360+(1010+24*(V+55))*exp(-pow((V+75)/48,2))); }
00297   double infty(double V)  { TRANSFORM_V;
00298                             return 1/(1+exp((V+54)/11)); }
00299 
00300   IONGATE_TABLES(AlGate_Korngreen02);
00301 };
00302 
00303 
00305 class AChannel_Korngreen02 : public ActiveChannel {
00306 
00307   DO_REGISTERING
00308 
00309 public:
00310 
00311   AChannel_Korngreen02(void) {
00312     addGate(new AnGate_Korngreen02);
00313     addGate(new AlGate_Korngreen02);
00314     Ts = 1;
00315     Gbar = 8e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00316     Erev = -80;  // (original -90) [mV] biological value
00317     // Transform biological Erev value to model voltage range
00318     TRANSFORM_EREV;
00319   }
00320 
00321   virtual ~AChannel_Korngreen02(void) {
00322     for(int i=0;i<nGates;i++)
00323       delete gates[i];
00324   }
00325 
00326   virtual int updateInternal(void);
00327 
00329   double Ts;
00330 };
00331 
00332 
00334 class KnGate_Korngreen02 : public VIonGate {
00335 public:
00336   KnGate_Korngreen02(void) { k=4;}
00337 
00338   double tau(double V) { TRANSFORM_V;
00339                          return 1e-3 * (0.34 + 0.92*exp(-pow((V+71)/59,2))); }
00340   double infty(double V) { TRANSFORM_V;
00341                            return 1/(1+exp(-(V+47)/29)); }
00342 
00343   IONGATE_TABLES(KnGate_Korngreen02);
00344 };
00345 
00347 class KlGate_Korngreen02 : public VIonGate {
00348 public:
00349   KlGate_Korngreen02(void) { k=1; }
00350 
00351   double tau(double V) { TRANSFORM_V;
00352                          return 1e-3 * (8 + 49*exp(-pow((V+73)/23,2))); }
00353   double infty(double V)  { TRANSFORM_V;
00354                             return 1/(1+exp((V+66)/10)); }
00355 
00356   IONGATE_TABLES(KlGate_Korngreen02);
00357 };
00358 
00359 
00361 class KChannel_Korngreen02 : public ActiveChannel {
00362 
00363   DO_REGISTERING
00364 
00365 public:
00366 
00367   KChannel_Korngreen02(void) {
00368     addGate(new KnGate_Korngreen02);
00369     addGate(new KlGate_Korngreen02);
00370     Ts = 1;
00371     Gbar = 8e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00372 
00373     Erev = -80;  // (original -90) [mV] biological value
00374     // Transform biological Erev value to model voltage range
00375     TRANSFORM_EREV;
00376   }
00377 
00378   virtual ~KChannel_Korngreen02(void) {
00379     for(int i=0;i<nGates;i++)
00380       delete gates[i];
00381   }
00382 
00383   virtual int updateInternal(void);
00384 
00386   double Ts;
00387 };
00388 
00389 
00393 class NPmGate_McCormick92 : public VIonGate {
00394 public:
00395   NPmGate_McCormick92(void) { k=1; }
00396 
00397   double alpha(double V) { TRANSFORM_V;
00398                          return 1e3 * (0.091*(V+48)/(1.0-exp(-(V+48.0)/5.0))); }
00399   double beta(double V) { TRANSFORM_V;
00400                          return 1e3 * (-0.062*(V+48.0)/(1.0-exp((V+48.0)/5.0))); }
00401   double infty(double V)  { TRANSFORM_V;
00402                             return 1.0/(1.0+exp(-(49.0+V)/5)); }
00403 
00404   IONGATE_TABLES(NPmGate_McCormick92);
00405 };
00406 
00407 
00411 class NPChannel_McCormick02 : public ActiveChannel {
00412 
00413   DO_REGISTERING
00414 
00415 public:
00416 
00417   NPChannel_McCormick02(void) {
00418     addGate(new NPmGate_McCormick92);
00419     Ts = 1;
00420     Gbar = 2.2e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00421 
00422     Erev = 55.0;  // [mV] biological value
00423     // Transform biological Erev value to model voltage range
00424     TRANSFORM_EREV;
00425   }
00426 
00427   virtual ~NPChannel_McCormick02(void) {
00428     for(int i=0;i<nGates;i++)
00429       delete gates[i];
00430   }
00431 
00432   virtual int updateInternal(void);
00433 
00435   double Ts;
00436 };
00437 
00438 
00440 class MnGate_Mainen96 : public VIonGate {
00441 public:
00442   MnGate_Mainen96(void) { k=1; }
00443 
00444   double alpha(double V) { TRANSFORM_V;
00445                          return 1e3 * (0.001*(V+30)/(1-exp(-(V+30)/9))); }
00446   double beta(double V) { TRANSFORM_V;
00447                          return 1e3 * (-0.001*(V+30)/(1-exp((V+30)/9))); }
00448 
00449   IONGATE_TABLES(MnGate_Mainen96);
00450 };
00451 
00452 
00454 class MChannel_Mainen96 : public ActiveChannel {
00455 
00456   DO_REGISTERING
00457 
00458 public:
00459 
00460   MChannel_Mainen96(void) {
00461     addGate(new MnGate_Mainen96);
00462     Ts = 1;
00463     Gbar = 1e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00464 
00465     Erev = -80.0;  // (original -90) [mV] biological value
00466     // Transform biological Erev value to model voltage range
00467     TRANSFORM_EREV;
00468   }
00469 
00470   virtual ~MChannel_Mainen96(void) {
00471     for(int i=0;i<nGates;i++)
00472       delete gates[i];
00473   }
00474 
00475   virtual int updateInternal(void);
00476 
00478   double Ts;
00479 };
00480 
00481 #define CELSIUS 30
00482 
00484 class HnGate_Stuart98 : public VIonGate {
00485 public:
00486   HnGate_Stuart98(void) { k=1; }
00487 
00488   double alpha(double V) { return  exp(1e-3*3*(V+88)*9.648e4/(8.315*(273.16+CELSIUS))); }
00489   double beta(double V) { return  exp(1e-3*3*0.4*(V+88)*9.648e4/(8.315*(273.16+CELSIUS))); }
00490   double tau(double V) { TRANSFORM_V;
00491                          return 1e-3 * (beta(V)/(0.00057+0.00057*alpha(V))); }
00492   double infty(double V) { TRANSFORM_V;
00493                          return  1/(1+alpha(V)); }
00494 
00495   IONGATE_TABLES(HnGate_Stuart98);
00496 };
00497 
00498 
00500 class HChannel_Stuart98 : public ActiveChannel {
00501 
00502   DO_REGISTERING
00503 
00504 public:
00505 
00506   HChannel_Stuart98(void) {
00507     addGate(new HnGate_Stuart98);
00508     Ts = 1;
00509     Gbar = 3e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00510 
00511     Erev = -35.0;  // [mV] biological value
00512     // Transform biological Erev value to model voltage range
00513     TRANSFORM_EREV;
00514   }
00515 
00516   virtual ~HChannel_Stuart98(void) {
00517     for(int i=0;i<nGates;i++)
00518       delete gates[i];
00519   }
00520 
00521   virtual int updateInternal(void);
00522 
00524   double Ts;
00525 };
00526 
00527 #define SECH(_V_)  2/(exp(2*_V_)+exp(-2*_V_))
00528 
00531 class HVACAuGate_Brown93 : public VIonGate {
00532 public:
00533   HVACAuGate_Brown93(void) { k=2;}
00534 
00535   double tau(double V) { TRANSFORM_V;
00536                          return 1e-3 * (1.25*SECH(-0.031*(V+37.1))); }
00537   double infty(double V) { TRANSFORM_V;
00538                            return 1/(1+exp(-(V+24.6)/11.3)); }
00539 
00540   IONGATE_TABLES(HVACAuGate_Brown93);
00541 };
00542 
00545 class HVACAvGate_Brown93 : public VIonGate {
00546 public:
00547   HVACAvGate_Brown93(void) { k=1; }
00548 
00549   double tau(double V) { TRANSFORM_V;
00550                          return 1e-3 * 420; }
00551   double infty(double V)  { TRANSFORM_V;
00552                             return 1/(1+exp((V+12.6)/18.9)); }
00553 
00554   IONGATE_TABLES(HVACAvGate_Brown93);
00555 };
00556 
00557 
00560 class HVACAChannel_Brown93 : public ActiveCaChannel {
00561 
00562   DO_REGISTERING
00563 
00564 public:
00565 
00566   HVACAChannel_Brown93(void) {
00567     addGate(new HVACAuGate_Brown93);
00568     addGate(new HVACAvGate_Brown93);
00569     Ts = 1;
00570     Gbar = 0.3e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00571 
00572     Erev = 140;  // [mV] biological value
00573     // Transform biological Erev value to model voltage range
00574     TRANSFORM_EREV;
00575   }
00576 
00577   virtual ~HVACAChannel_Brown93(void) {
00578     for(int i=0;i<nGates;i++)
00579       delete gates[i];
00580   }
00581 
00582   virtual int updateInternal(void);
00583 
00585   double Ts;
00586 };
00587 
00588 
00590 class CALmGate_Destexhe98 : public VIonGate {
00591 public:
00592   CALmGate_Destexhe98(void) { k=2;}
00593 
00594   double tau(double V) { TRANSFORM_V;
00595                          return 1e-3 * 0.1; } /* Originally 0 */
00596   double infty(double V) { TRANSFORM_V;
00597                            return 1.0/(1+exp(-(V+57)/6.2)); }
00598 
00599   IONGATE_TABLES(CALmGate_Destexhe98);
00600 };
00601 
00603 class CALhGate_Destexhe98 : public VIonGate {
00604 public:
00605   CALhGate_Destexhe98(void) { k=1; }
00606 
00607   double tau(double V) { TRANSFORM_V;
00608                          return 1e-3 * (30.8 + (211.4 + exp((V+113.2)/5))/(1+exp((V+84)/3.2))); }
00609   double infty(double V)  { TRANSFORM_V;
00610                             return 1.0/(1+exp((V+81)/4.0)); }
00611 
00612   IONGATE_TABLES(CALhGate_Destexhe98);
00613 };
00614 
00615 
00617 class CALChannel_Destexhe98 : public ActiveChannel {
00618 
00619   DO_REGISTERING
00620 
00621 public:
00622 
00623   CALChannel_Destexhe98(void) {
00624     addGate(new CALmGate_Destexhe98);
00625     addGate(new CALhGate_Destexhe98);
00626     Ts = 1;
00627     Gbar = 2e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00628 
00629     Erev = 140;  // [mV] biological value
00630     // Transform biological Erev value to model voltage range
00631     TRANSFORM_EREV;
00632   }
00633 
00634   virtual ~CALChannel_Destexhe98(void) {
00635     for(int i=0;i<nGates;i++)
00636       delete gates[i];
00637   }
00638 
00639   virtual int updateInternal(void);
00640 
00642   double Ts;
00643 };
00644 
00645 
00647 class KCAnGate_Mainen96 : public ConcIonGate {
00648 public:
00649   KCAnGate_Mainen96(void) { k=1; ConcType=CA;}
00650 
00651 
00653   double alpha(double C) { return 0.01*C*1e3; }
00655   double beta(double ) { return 0.02; }
00656 
00657   double tau(double C) { return 1e-3/(alpha(C) + beta(C)); }
00658   double infty(double C) { return alpha(C)/(alpha(C) + beta(C)); }
00659 
00660   IONGATE_TABLES(KCAnGate_Mainen96);
00661 };
00662 
00663 
00665 class KCAChannel_Mainen96 : public ActiveChannel {
00666 
00667    DO_REGISTERING
00668 
00669 public:
00670 
00671   KCAChannel_Mainen96(void) {
00672     addGate(new KCAnGate_Mainen96);
00673     Ts = 1;
00674     Gbar = 1e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00675 
00676     Erev = -80;  // (original -90) [mV] biological value
00677     // Transform biological Erev value to model voltage range
00678     TRANSFORM_EREV;
00679   }
00680 
00681   virtual ~KCAChannel_Mainen96(void) {
00682     for(int i=0;i<nGates;i++)
00683       delete gates[i];
00684   }
00685 
00686   virtual int updateInternal(void);
00687 
00689   double Ts;
00690 };
00691 
00692 
00693 
00694 //== Channels used by Destexhe take from Traub et al. and Mainen et al. ==========================================================
00695 
00696 #define Amembrane 34636e-12 // [m2]
00697 
00698 // #define NUMMETHOD 0
00699 #define NUMMETHOD 1
00700 
00701 // #define GSCALE 0.4
00702 #define GSCALE 1
00703 #define ABSCALE 1e3
00704 #define TADJM  2.9529 //  = 2.3 ^ ((CELSIUS-23)/10), CELSIUS = 36
00705 #define VT   -63 + 1e-5  // [mV], -58 mV needed for Vthresh adjustment
00706 // #define VT   -58 + 1e-5  // [mV], -58 mV needed for Vthresh adjustment
00707 
00709 class NAmGate_Traub91 : public VIonGate {
00710 public:
00711   NAmGate_Traub91(void) { k=3;  nummethod = NUMMETHOD;}
00712 
00713   double alpha(double V) { V = V*1e3;
00714                          return ABSCALE*-0.32 * (V - VT - 13)/(exp(-(V-VT-13)/4)-1); }
00715   double beta(double V) { V = V*1e3;
00716                          return ABSCALE*0.28*(V-VT-40)/(exp((V-VT-40)/5)-1); }
00717 
00718   IONGATE_TABLES(NAmGate_Traub91);
00719 };
00720 
00722 class NAhGate_Traub91 : public VIonGate {
00723 public:
00724   NAhGate_Traub91(void) { k=1;  nummethod = NUMMETHOD;}
00725 
00726   double alpha(double V) { V = V*1e3;
00727                          return ABSCALE*0.128 * exp(-(V-VT+10-17)/18); }
00728   double beta(double V) { V = V*1e3;
00729                          return ABSCALE*4 / (1+exp(-(V-VT+10-40)/5)); }
00730 
00731   IONGATE_TABLES(NAhGate_Traub91);
00732 };
00733 
00734 class NAChannel_Traub91 : public ActiveChannel {
00735 
00736   DO_REGISTERING
00737 
00738 public:
00739 
00740 
00741   NAChannel_Traub91(void) {
00742     addGate(new NAmGate_Traub91);
00743     addGate(new NAhGate_Traub91);
00744     Ts = 1;
00745 //    Gbar = GSCALE * 30 * Amembrane; // [S/m2]*[m2]
00746 //    Gbar = GSCALE * 360 * Amembrane; // [S/m2]*[m2]
00747 
00748 //    Gbar = GSCALE * 120 * Amembrane; // [S/m2]*[m2]
00749     Gbar = 4.3* GSCALE * 120 * Amembrane; // [S/m2]*[m2]
00750 //    Gbar = 1.67* GSCALE * 120 * Amembrane; // [S/m2]*[m2]
00751     Erev = 50e-3;  // [mV]
00752   }
00753 
00754   virtual ~NAChannel_Traub91(void) {
00755     for(int i=0;i<nGates;i++)
00756       delete gates[i];
00757   }
00758 
00759   virtual int updateInternal(void);
00760 
00762   double Ts;
00763 };
00764 
00765 
00767 class KDnGate_Traub91 : public VIonGate {
00768 public:
00769   KDnGate_Traub91(void) { k=4;  nummethod = NUMMETHOD;}
00770 
00771   double alpha(double V) { V = V*1e3;
00772                          return ABSCALE*-0.032*(V-VT-15)/(exp(-(V-VT-15)/5)-1); }
00773   double beta(double V) { V = V*1e3;
00774                          return ABSCALE*0.5*exp(-(V-VT-10)/40); }
00775 
00776   IONGATE_TABLES(KDnGate_Traub91);
00777 };
00778 
00779 class KDChannel_Traub91 : public ActiveChannel {
00780 
00781   DO_REGISTERING
00782 
00783 public:
00784 
00785   // original model has Vrest = -80 mV, Vwork = -65 mV, Vthresh = -55 mV
00786   // shift V by +10 results in Vrest = -70 mV, Vwork = -55 mV, Vthresh = -45 mV
00787   // what is approx. the above defined biological working range needed for parameter rescaling
00788 
00789 
00790   KDChannel_Traub91(void) {
00791     addGate(new KDnGate_Traub91);
00792     Ts = 1;
00793 //    Gbar = GSCALE * 50 * Amembrane; // [S/m2]*[m2]
00794 //    Gbar = GSCALE * 70 * Amembrane; // [S/m2]*[m2]
00795     Gbar = GSCALE * 100 * Amembrane; // [S/m2]*[m2]
00796     Erev = -90e-3; // [mV]
00797   }
00798 
00799   virtual ~KDChannel_Traub91(void) {
00800     for(int i=0;i<nGates;i++)
00801       delete gates[i];
00802   }
00803 
00804   virtual int updateInternal(void);
00805 
00807   double Ts;
00808 };
00809 
00810 
00811 
00812 
00814 class MpGate_Mainen96orig : public VIonGate {
00815 public:
00816   MpGate_Mainen96orig(void) { k=1; nummethod = NUMMETHOD;}
00817 
00818   double alpha(double V) { V = V*1e3;
00819                          return TADJM*ABSCALE*0.0001*(V+30)/(1-exp(-(V+30)/9)); }
00820   double beta(double V) { V = V*1e3;
00821                          return TADJM*ABSCALE*-0.0001*(V+30)/(1-exp((V+30)/9)); }
00822 
00823   IONGATE_TABLES(MpGate_Mainen96orig);
00824 };
00825 
00826 class MChannel_Mainen96orig : public ActiveChannel {
00827 
00828   DO_REGISTERING
00829 
00830 public:
00831 
00832 
00833   MChannel_Mainen96orig(void) {
00834     addGate(new MpGate_Mainen96orig);
00835     Ts = 1;
00836 //    Gbar = 0  * Amembrane; // [S/m2]*[m2]
00837     Gbar = GSCALE * 5 * Amembrane; // [S/m2]*[m2]
00838     Erev = -90e-3; // [V]
00839   }
00840 
00841   virtual ~MChannel_Mainen96orig(void) {
00842     for(int i=0;i<nGates;i++)
00843       delete gates[i];
00844   }
00845 
00846   virtual int updateInternal(void);
00847 
00849   double Ts;
00850 };
00851 
00852 
00853 
00854 
00855 #endif
00856 
00857 
00858