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
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
00019
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 \
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
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;
00108 u = 200e-9;
00109 Ts = 70e-3;
00110 Ca = 0;
00111 Gbar = 54e-9;
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;
00163
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
00190
00191
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
00215
00216
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;
00241
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;
00297
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
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;
00361 Erev = -80;
00362
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;
00426
00427 Erev = -80;
00428
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;
00486
00487 Erev = 55.0;
00488
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;
00536
00537 Erev = -80.0;
00538
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;
00590
00591 Erev = -35.0;
00592
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;
00666
00667 Erev = 140;
00668
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; }
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;
00735
00736 Erev = 140;
00737
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;
00789
00790 Erev = -80;
00791
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
00807
00808 #define Amembrane 34636e-12 // [m2]
00809
00810
00811 #define NUMMETHOD 1
00812
00813
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
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
00858
00859
00860
00861 Gbar = 4.3* GSCALE * 120 * Amembrane;
00862
00863 Erev = 50e-3;
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
00898
00899
00900
00901
00902 KDChannel_Traub91(void) {
00903 addGate(new KDnGate_Traub91);
00904 Ts = 1;
00905
00906
00907 Gbar = GSCALE * 100 * Amembrane;
00908 Erev = -90e-3;
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
00949 Gbar = GSCALE * 5 * Amembrane;
00950 Erev = -90e-3;
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