CSIM: specific_ion_channels.h Source File

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]  (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
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 
00048 class CaGate_Yamada98 : public VIonGate {
00049 
00050   DO_REGISTERING
00051 
00052 public:
00053   CaGate_Yamada98(void) { k=2; Ca=0; Ts=1; C1=0; C2=0; }
00054 
00055   virtual ~CaGate_Yamada98(void) { if (getC1()) { free(getC1()); setC1(0); }
00056                                    if (getC2()) { free(getC2()); setC2(0); }}
00057 
00058   virtual double tau(double C) { return Ts/( pow(CASCALE*C,2) + 2.5); }
00059 
00060   virtual double infty(double C)  { return pow(CASCALE*C,2)/( pow(CASCALE*C,2) + 2.5); }
00061 
00062   virtual double pInfty(MembranePatchSimple *) { return 0;}
00063 
00064   virtual void reset(void);
00065 
00066   virtual void setCa(double *C) { Ca = C; }
00067 
00068   virtual int updateInternal(void);
00069 
00070   virtual int advance(void);
00071 
00072   virtual int addIncoming(Advancable *Incoming);
00073 
00075   double Ts;
00076 
00077 protected:
00078 
00080   double *Ca;
00081 
00082   virtual double *getC1(void) { return C1; }
00083   virtual double *getC2(void) { return C2; }
00084   virtual void setC1(double *p) { C1=p; }
00085   virtual void setC2(double *p) { C2=p; }
00086 
00088   double *C1;
00089 
00091   double *C2;
00092 };
00093 
00094 //== Channels used by James Maciokas / Reno ==========================================================
00095 
00097 
00100 class CaChannel_Yamada98 : public ActiveChannel {
00101 
00102   DO_REGISTERING
00103 
00104 public:
00105 
00106   CaChannel_Yamada98(void) {
00107     Erev = -5e-6 * VSCALE; // assumed resting potential Vresting = 0
00108     u = 200e-9;   // Mol
00109     Ts = 70e-3;   // Sec
00110     Ca = 0;       // Mol
00111     Gbar = 54e-9; // S
00112   }
00113 
00114   virtual void membraneSpikeNotify(double ) { Ca = Ca + u; };
00115 
00116   virtual void reset(void);
00117 
00118   virtual int updateInternal(void);
00119 
00120   virtual int advance(void);
00121 
00123   float u;
00124 
00126   float Ts;
00127 
00129   double Ca;
00130 
00131 protected:
00132 
00134   float C1;
00135 };
00136 
00138 
00140 class MmGate_Wang98 : public VIonGate {
00141 public:
00142   MmGate_Wang98(void) { k=1; }
00143   double tau(double V) { return TSCALE * exp(+( VSCALE * (V - *Vresting) - 12.3)/9.15) / 3800; }
00144   double infty(double V)  { return 1/(1 + exp(-( VSCALE * (V - *Vresting) - 13)/4.4)); }
00145 
00146   IONGATE_TABLES(MmGate_Wang98);
00147 };
00148 
00149 
00150 
00152 
00153 class MChannel_Wang98 : public ActiveChannel {
00154 
00155   DO_REGISTERING
00156 
00157 public:
00158 
00159   MChannel_Wang98(void) {
00160     addGate(new MmGate_Wang98);
00161 
00162     Erev = -80; // [mV] biological value
00163     // Transform to model voltage range
00164     TRANSFORM_EREV;
00165   }
00166 
00167   virtual ~MChannel_Wang98(void) {
00168     for(int i=0;i<nGates;i++)
00169       delete gates[i];
00170   }
00171 };
00172 
00174 
00180 class AmGate_Hoffman97 : public VIonGate {
00181 public:
00182   AmGate_Hoffman97(void) { k=1; }
00183 
00184 
00185   double tau(double V){ return TSCALE*0.2e-6; }
00186   double infty(double V) { TRANSFORM_V;
00187                            return 1/(1+exp(-(V-11)/18)); }
00188 
00189 /* Directly transformed parameters
00190   double tau(double ) { return TSCALE*0.2e-6; }
00191   double infty(double V)  { return 1/(1 + exp(-( VSCALE * (V - *Vresting) - 40.5)/9)); }
00192 */
00193   IONGATE_TABLES(AmGate_Hoffman97);
00194 };
00195 
00196 
00198 
00204 class AhGate_Hoffman97 : public VIonGate {
00205 public:
00206   AhGate_Hoffman97(void) { k=1; }
00207 
00208   double tau(double V) { TRANSFORM_V;
00209                          return (V < -20) ? 5e-3 : 1e-3 * (5+2.6*(V+20)/10); }
00210   double infty(double V) { TRANSFORM_V;
00211                            return 1/(1+exp((V+56)/8)); }
00212 
00213 
00214 /* Directly transformed parameters
00215   double tau(double ) { return TSCALE*5e-6; }
00216   double infty(double V)  { return 1/(1 + exp(( VSCALE * (V - *Vresting) - 7)/4)); }
00217 */
00218   IONGATE_TABLES(AhGate_Hoffman97);
00219 };
00220 
00221 
00222 
00224 
00230 class AChannel_Hoffman97 : public ActiveChannel {
00231 
00232   DO_REGISTERING
00233 
00234 public:
00235 
00236   AChannel_Hoffman97(void) {
00237     addGate(new AmGate_Hoffman97);
00238     addGate(new AhGate_Hoffman97);
00239 
00240     Erev = -80; // [mV] biological value
00241     // Transform to model voltage range
00242     TRANSFORM_EREV;
00243   }
00244 
00245   virtual ~AChannel_Hoffman97(void) {
00246     for(int i=0;i<nGates;i++)
00247       delete gates[i];
00248   }
00249 };
00250 
00252 
00256 class SICmGate_Maciokas02 : public VIonGate {
00257 public:
00258   SICmGate_Maciokas02(void) { k=1; }
00259 
00260   double tau(double ) { return TSCALE*0.2e-6; }
00261   double infty(double V)  { return 1/(1 + exp(-( VSCALE * (V - *Vresting) - 20)/2.5)); }
00262 
00263   IONGATE_TABLES(SICmGate_Maciokas02);
00264 };
00265 
00267 
00271 class SIChGate_Maciokas02 : public VIonGate {
00272 public:
00273   SIChGate_Maciokas02(void) { k=1; }
00274 
00275   double tau(double ) { return TSCALE*5e-6; }
00276   double infty(double V)  { return 1/(1 + exp(( VSCALE * (V - *Vresting) - 15)/2.5)); }
00277 
00278   IONGATE_TABLES(SIChGate_Maciokas02);
00279 };
00280 
00282 
00286 class SICChannel_Maciokas02 : public ActiveChannel {
00287 
00288   DO_REGISTERING
00289 
00290 public:
00291 
00292   SICChannel_Maciokas02(void) {
00293     addGate(new SICmGate_Maciokas02);
00294     addGate(new SIChGate_Maciokas02);
00295 
00296     Erev = -80; // [mV] biological value
00297     // Transform to model voltage range
00298     TRANSFORM_EREV;
00299   }
00300 
00301   virtual ~SICChannel_Maciokas02(void) {
00302     for(int i=0;i<nGates;i++)
00303       delete gates[i];
00304   }
00305 };
00306 
00307 
00308 
00309 //== Channels of neocortical pyramidal neurons from the SenseLab ModelDB archiv ========
00310 
00311 
00312 
00314 
00317 class AnGate_Korngreen02 : public VIonGate {
00318 public:
00319   AnGate_Korngreen02(void) { k=2;}
00320 
00321   double tau(double V) { TRANSFORM_V;
00322                          return (V < -50) ? 1e-3 * (1.25+175.03*exp(V*0.026)) : 1e-3 * (1.25+13*exp(-V*0.026)); }
00323   double infty(double V) { TRANSFORM_V;
00324                            return 1/(1+exp(-(V+14)/14.6)); }
00325 
00326   IONGATE_TABLES(AnGate_Korngreen02);
00327 };
00328 
00330 
00333 class AlGate_Korngreen02 : public VIonGate {
00334 public:
00335   AlGate_Korngreen02(void) { k=1; }
00336 
00337   double tau(double V) { TRANSFORM_V;
00338                          return 1e-3 * (360+(1010+24*(V+55))*exp(-pow((V+75)/48,2))); }
00339   double infty(double V)  { TRANSFORM_V;
00340                             return 1/(1+exp((V+54)/11)); }
00341 
00342   IONGATE_TABLES(AlGate_Korngreen02);
00343 };
00344 
00345 
00347 
00350 class AChannel_Korngreen02 : public ActiveChannel {
00351 
00352   DO_REGISTERING
00353 
00354 public:
00355 
00356   AChannel_Korngreen02(void) {
00357     addGate(new AnGate_Korngreen02);
00358     addGate(new AlGate_Korngreen02);
00359     Ts = 1;
00360     Gbar = 8e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00361     Erev = -80;  // (original -90) [mV] biological value
00362     // Transform biological Erev value to model voltage range
00363     TRANSFORM_EREV;
00364   }
00365 
00366   virtual ~AChannel_Korngreen02(void) {
00367     for(int i=0;i<nGates;i++)
00368       delete gates[i];
00369   }
00370 
00371   virtual int updateInternal(void);
00372 
00374   double Ts;
00375 };
00376 
00377 
00379 
00382 class KnGate_Korngreen02 : public VIonGate {
00383 public:
00384   KnGate_Korngreen02(void) { k=4;}
00385 
00386   double tau(double V) { TRANSFORM_V;
00387                          return 1e-3 * (0.34 + 0.92*exp(-pow((V+71)/59,2))); }
00388   double infty(double V) { TRANSFORM_V;
00389                            return 1/(1+exp(-(V+47)/29)); }
00390 
00391   IONGATE_TABLES(KnGate_Korngreen02);
00392 };
00393 
00395 
00398 class KlGate_Korngreen02 : public VIonGate {
00399 public:
00400   KlGate_Korngreen02(void) { k=1; }
00401 
00402   double tau(double V) { TRANSFORM_V;
00403                          return 1e-3 * (8 + 49*exp(-pow((V+73)/23,2))); }
00404   double infty(double V)  { TRANSFORM_V;
00405                             return 1/(1+exp((V+66)/10)); }
00406 
00407   IONGATE_TABLES(KlGate_Korngreen02);
00408 };
00409 
00410 
00412 
00415 class KChannel_Korngreen02 : public ActiveChannel {
00416 
00417   DO_REGISTERING
00418 
00419 public:
00420 
00421   KChannel_Korngreen02(void) {
00422     addGate(new KnGate_Korngreen02);
00423     addGate(new KlGate_Korngreen02);
00424     Ts = 1;
00425     Gbar = 8e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00426 
00427     Erev = -80;  // (original -90) [mV] biological value
00428     // Transform biological Erev value to model voltage range
00429     TRANSFORM_EREV;
00430   }
00431 
00432   virtual ~KChannel_Korngreen02(void) {
00433     for(int i=0;i<nGates;i++)
00434       delete gates[i];
00435   }
00436 
00437   virtual int updateInternal(void);
00438 
00440   double Ts;
00441 };
00442 
00444 
00452 class NPmGate_McCormick92 : public VIonGate {
00453 public:
00454   NPmGate_McCormick92(void) { k=1; }
00455 
00456   double alpha(double V) { TRANSFORM_V;
00457                          return 1e3 * (0.091*(V+48)/(1.0-exp(-(V+48.0)/5.0))); }
00458   double beta(double V) { TRANSFORM_V;
00459                          return 1e3 * (-0.062*(V+48.0)/(1.0-exp((V+48.0)/5.0))); }
00460   double infty(double V)  { TRANSFORM_V;
00461                             return 1.0/(1.0+exp(-(49.0+V)/5)); }
00462 
00463   IONGATE_TABLES(NPmGate_McCormick92);
00464 };
00465 
00466 
00468 
00476 class NPChannel_McCormick02 : public ActiveChannel {
00477 
00478   DO_REGISTERING
00479 
00480 public:
00481 
00482   NPChannel_McCormick02(void) {
00483     addGate(new NPmGate_McCormick92);
00484     Ts = 1;
00485     Gbar = 2.2e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00486 
00487     Erev = 55.0;  // [mV] biological value
00488     // Transform biological Erev value to model voltage range
00489     TRANSFORM_EREV;
00490   }
00491 
00492   virtual ~NPChannel_McCormick02(void) {
00493     for(int i=0;i<nGates;i++)
00494       delete gates[i];
00495   }
00496 
00497   virtual int updateInternal(void);
00498 
00500   double Ts;
00501 };
00502 
00504 
00508 class MnGate_Mainen96 : public VIonGate {
00509 public:
00510   MnGate_Mainen96(void) { k=1; }
00511 
00512   double alpha(double V) { TRANSFORM_V;
00513                          return 1e3 * (0.001*(V+30)/(1-exp(-(V+30)/9))); }
00514   double beta(double V) { TRANSFORM_V;
00515                          return 1e3 * (-0.001*(V+30)/(1-exp((V+30)/9))); }
00516 
00517   IONGATE_TABLES(MnGate_Mainen96);
00518 };
00519 
00520 
00522 
00526 class MChannel_Mainen96 : public ActiveChannel {
00527 
00528   DO_REGISTERING
00529 
00530 public:
00531 
00532   MChannel_Mainen96(void) {
00533     addGate(new MnGate_Mainen96);
00534     Ts = 1;
00535     Gbar = 1e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00536 
00537     Erev = -80.0;  // (original -90) [mV] biological value
00538     // Transform biological Erev value to model voltage range
00539     TRANSFORM_EREV;
00540   }
00541 
00542   virtual ~MChannel_Mainen96(void) {
00543     for(int i=0;i<nGates;i++)
00544       delete gates[i];
00545   }
00546 
00547   virtual int updateInternal(void);
00548 
00550   double Ts;
00551 };
00552 
00553 #define CELSIUS 30
00554 
00556 
00560 class HnGate_Stuart98 : public VIonGate {
00561 public:
00562   HnGate_Stuart98(void) { k=1; }
00563 
00564   double alpha(double V) { return  exp(1e-3*3*(V+88)*9.648e4/(8.315*(273.16+CELSIUS))); }
00565   double beta(double V) { return  exp(1e-3*3*0.4*(V+88)*9.648e4/(8.315*(273.16+CELSIUS))); }
00566   double tau(double V) { TRANSFORM_V;
00567                          return 1e-3 * (beta(V)/(0.00057+0.00057*alpha(V))); }
00568   double infty(double V) { TRANSFORM_V;
00569                          return  1/(1+alpha(V)); }
00570 
00571   IONGATE_TABLES(HnGate_Stuart98);
00572 };
00573 
00574 
00576 
00580 class HChannel_Stuart98 : public ActiveChannel {
00581 
00582   DO_REGISTERING
00583 
00584 public:
00585 
00586   HChannel_Stuart98(void) {
00587     addGate(new HnGate_Stuart98);
00588     Ts = 1;
00589     Gbar = 3e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00590 
00591     Erev = -35.0;  // [mV] biological value
00592     // Transform biological Erev value to model voltage range
00593     TRANSFORM_EREV;
00594   }
00595 
00596   virtual ~HChannel_Stuart98(void) {
00597     for(int i=0;i<nGates;i++)
00598       delete gates[i];
00599   }
00600 
00601   virtual int updateInternal(void);
00602 
00604   double Ts;
00605 };
00606 
00607 #define SECH(_V_)  2/(exp(2*_V_)+exp(-2*_V_))
00608 
00610 
00616 class HVACAuGate_Brown93 : public VIonGate {
00617 public:
00618   HVACAuGate_Brown93(void) { k=2;}
00619 
00620   double tau(double V) { TRANSFORM_V;
00621                          return 1e-3 * (1.25*SECH(-0.031*(V+37.1))); }
00622   double infty(double V) { TRANSFORM_V;
00623                            return 1/(1+exp(-(V+24.6)/11.3)); }
00624 
00625   IONGATE_TABLES(HVACAuGate_Brown93);
00626 };
00627 
00629 
00635 class HVACAvGate_Brown93 : public VIonGate {
00636 public:
00637   HVACAvGate_Brown93(void) { k=1; }
00638 
00639   double tau(double V) { TRANSFORM_V;
00640                          return 1e-3 * 420; }
00641   double infty(double V)  { TRANSFORM_V;
00642                             return 1/(1+exp((V+12.6)/18.9)); }
00643 
00644   IONGATE_TABLES(HVACAvGate_Brown93);
00645 };
00646 
00647 
00649 
00655 class HVACAChannel_Brown93 : public ActiveCaChannel {
00656 
00657   DO_REGISTERING
00658 
00659 public:
00660 
00661   HVACAChannel_Brown93(void) {
00662     addGate(new HVACAuGate_Brown93);
00663     addGate(new HVACAvGate_Brown93);
00664     Ts = 1;
00665     Gbar = 0.3e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00666 
00667     Erev = 140;  // [mV] biological value
00668     // Transform biological Erev value to model voltage range
00669     TRANSFORM_EREV;
00670   }
00671 
00672   virtual ~HVACAChannel_Brown93(void) {
00673     for(int i=0;i<nGates;i++)
00674       delete gates[i];
00675   }
00676 
00677   virtual int updateInternal(void);
00678 
00680   double Ts;
00681 };
00682 
00683 
00685 
00689 class CALmGate_Destexhe98 : public VIonGate {
00690 public:
00691   CALmGate_Destexhe98(void) { k=2;}
00692 
00693   double tau(double V) { TRANSFORM_V;
00694                          return 1e-3 * 0.1; } /* Originally 0 */
00695   double infty(double V) { TRANSFORM_V;
00696                            return 1.0/(1+exp(-(V+57)/6.2)); }
00697 
00698   IONGATE_TABLES(CALmGate_Destexhe98);
00699 };
00700 
00702 
00706 class CALhGate_Destexhe98 : public VIonGate {
00707 public:
00708   CALhGate_Destexhe98(void) { k=1; }
00709 
00710   double tau(double V) { TRANSFORM_V;
00711                          return 1e-3 * (30.8 + (211.4 + exp((V+113.2)/5))/(1+exp((V+84)/3.2))); }
00712   double infty(double V)  { TRANSFORM_V;
00713                             return 1.0/(1+exp((V+81)/4.0)); }
00714 
00715   IONGATE_TABLES(CALhGate_Destexhe98);
00716 };
00717 
00718 
00720 
00724 class CALChannel_Destexhe98 : public ActiveChannel {
00725 
00726   DO_REGISTERING
00727 
00728 public:
00729 
00730   CALChannel_Destexhe98(void) {
00731     addGate(new CALmGate_Destexhe98);
00732     addGate(new CALhGate_Destexhe98);
00733     Ts = 1;
00734     Gbar = 2e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00735 
00736     Erev = 140;  // [mV] biological value
00737     // Transform biological Erev value to model voltage range
00738     TRANSFORM_EREV;
00739   }
00740 
00741   virtual ~CALChannel_Destexhe98(void) {
00742     for(int i=0;i<nGates;i++)
00743       delete gates[i];
00744   }
00745 
00746   virtual int updateInternal(void);
00747 
00749   double Ts;
00750 };
00751 
00753 
00757 class KCAnGate_Mainen96 : public ConcIonGate {
00758 public:
00759   KCAnGate_Mainen96(void) { k=1; ConcType=CA;}
00760 
00761 
00763   double alpha(double C) { return 0.01*C*1e3; }
00765   double beta(double ) { return 0.02; }
00766 
00767   double tau(double C) { return 1e-3/(alpha(C) + beta(C)); }
00768   double infty(double C) { return alpha(C)/(alpha(C) + beta(C)); }
00769 
00770   IONGATE_TABLES(KCAnGate_Mainen96);
00771 };
00772 
00773 
00775 
00779 class KCAChannel_Mainen96 : public ActiveChannel {
00780 
00781    DO_REGISTERING
00782 
00783 public:
00784 
00785   KCAChannel_Mainen96(void) {
00786     addGate(new KCAnGate_Mainen96);
00787     Ts = 1;
00788     Gbar = 1e-3*A_MEMBRANE; // [S/cm2]*[cm2]
00789 
00790     Erev = -80;  // (original -90) [mV] biological value
00791     // Transform biological Erev value to model voltage range
00792     TRANSFORM_EREV;
00793   }
00794 
00795   virtual ~KCAChannel_Mainen96(void) {
00796     for(int i=0;i<nGates;i++)
00797       delete gates[i];
00798   }
00799 
00800   virtual int updateInternal(void);
00801 
00803   double Ts;
00804 };
00805 
00806 //== Channels used by Destexhe take from Traub et al. and Mainen et al. ==========================================================
00807 
00808 #define Amembrane 34636e-12 // [m2]
00809 
00810 // #define NUMMETHOD 0
00811 #define NUMMETHOD 1
00812 
00813 // #define GSCALE 0.4
00814 #define GSCALE 1
00815 #define ABSCALE 1e3
00816 #define TADJM  2.9529 //  = 2.3 ^ ((CELSIUS-23)/10), CELSIUS = 36
00817 #define VT   -63 + 1e-5  // [mV], -58 mV needed for Vthresh adjustment
00818 // #define VT   -58 + 1e-5  // [mV], -58 mV needed for Vthresh adjustment
00819 
00821 class NAmGate_Traub91 : public VIonGate {
00822 public:
00823   NAmGate_Traub91(void) { k=3;  nummethod = NUMMETHOD;}
00824 
00825   double alpha(double V) { V = V*1e3;
00826                          return ABSCALE*-0.32 * (V - VT - 13)/(exp(-(V-VT-13)/4)-1); }
00827   double beta(double V) { V = V*1e3;
00828                          return ABSCALE*0.28*(V-VT-40)/(exp((V-VT-40)/5)-1); }
00829 
00830   IONGATE_TABLES(NAmGate_Traub91);
00831 };
00832 
00834 class NAhGate_Traub91 : public VIonGate {
00835 public:
00836   NAhGate_Traub91(void) { k=1;  nummethod = NUMMETHOD;}
00837 
00838   double alpha(double V) { V = V*1e3;
00839                          return ABSCALE*0.128 * exp(-(V-VT+10-17)/18); }
00840   double beta(double V) { V = V*1e3;
00841                          return ABSCALE*4 / (1+exp(-(V-VT+10-40)/5)); }
00842 
00843   IONGATE_TABLES(NAhGate_Traub91);
00844 };
00845 
00846 class NAChannel_Traub91 : public ActiveChannel {
00847 
00848   DO_REGISTERING
00849 
00850 public:
00851 
00852 
00853   NAChannel_Traub91(void) {
00854     addGate(new NAmGate_Traub91);
00855     addGate(new NAhGate_Traub91);
00856     Ts = 1;
00857 //    Gbar = GSCALE * 30 * Amembrane; // [S/m2]*[m2]
00858 //    Gbar = GSCALE * 360 * Amembrane; // [S/m2]*[m2]
00859 
00860 //    Gbar = GSCALE * 120 * Amembrane; // [S/m2]*[m2]
00861     Gbar = 4.3* GSCALE * 120 * Amembrane; // [S/m2]*[m2]
00862 //    Gbar = 1.67* GSCALE * 120 * Amembrane; // [S/m2]*[m2]
00863     Erev = 50e-3;  // [mV]
00864   }
00865 
00866   virtual ~NAChannel_Traub91(void) {
00867     for(int i=0;i<nGates;i++)
00868       delete gates[i];
00869   }
00870 
00871   virtual int updateInternal(void);
00872 
00874   double Ts;
00875 };
00876 
00877 
00879 class KDnGate_Traub91 : public VIonGate {
00880 public:
00881   KDnGate_Traub91(void) { k=4;  nummethod = NUMMETHOD;}
00882 
00883   double alpha(double V) { V = V*1e3;
00884                          return ABSCALE*-0.032*(V-VT-15)/(exp(-(V-VT-15)/5)-1); }
00885   double beta(double V) { V = V*1e3;
00886                          return ABSCALE*0.5*exp(-(V-VT-10)/40); }
00887 
00888   IONGATE_TABLES(KDnGate_Traub91);
00889 };
00890 
00891 class KDChannel_Traub91 : public ActiveChannel {
00892 
00893   DO_REGISTERING
00894 
00895 public:
00896 
00897   // original model has Vrest = -80 mV, Vwork = -65 mV, Vthresh = -55 mV
00898   // shift V by +10 results in Vrest = -70 mV, Vwork = -55 mV, Vthresh = -45 mV
00899   // what is approx. the above defined biological working range needed for parameter rescaling
00900 
00901 
00902   KDChannel_Traub91(void) {
00903     addGate(new KDnGate_Traub91);
00904     Ts = 1;
00905 //    Gbar = GSCALE * 50 * Amembrane; // [S/m2]*[m2]
00906 //    Gbar = GSCALE * 70 * Amembrane; // [S/m2]*[m2]
00907     Gbar = GSCALE * 100 * Amembrane; // [S/m2]*[m2]
00908     Erev = -90e-3; // [mV]
00909   }
00910 
00911   virtual ~KDChannel_Traub91(void) {
00912     for(int i=0;i<nGates;i++)
00913       delete gates[i];
00914   }
00915 
00916   virtual int updateInternal(void);
00917 
00919   double Ts;
00920 };
00921 
00922 
00923 
00924 
00926 class MpGate_Mainen96orig : public VIonGate {
00927 public:
00928   MpGate_Mainen96orig(void) { k=1; nummethod = NUMMETHOD;}
00929 
00930   double alpha(double V) { V = V*1e3;
00931                          return TADJM*ABSCALE*0.0001*(V+30)/(1-exp(-(V+30)/9)); }
00932   double beta(double V) { V = V*1e3;
00933                          return TADJM*ABSCALE*-0.0001*(V+30)/(1-exp((V+30)/9)); }
00934 
00935   IONGATE_TABLES(MpGate_Mainen96orig);
00936 };
00937 
00938 class MChannel_Mainen96orig : public ActiveChannel {
00939 
00940   DO_REGISTERING
00941 
00942 public:
00943 
00944 
00945   MChannel_Mainen96orig(void) {
00946     addGate(new MpGate_Mainen96orig);
00947     Ts = 1;
00948 //    Gbar = 0  * Amembrane; // [S/m2]*[m2]
00949     Gbar = GSCALE * 5 * Amembrane; // [S/m2]*[m2]
00950     Erev = -90e-3; // [V]
00951   }
00952 
00953   virtual ~MChannel_Mainen96orig(void) {
00954     for(int i=0;i<nGates;i++)
00955       delete gates[i];
00956   }
00957 
00958   virtual int updateInternal(void);
00959 
00961   double Ts;
00962 };
00963 
00964 #endif
00965 
00966 
00967 

 
(C) 2003, Thomas Natschläger last modified 07/10/2006