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] (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
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 // 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
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
00093
00095
00096 class CaChannel_Yamada98 : public ActiveChannel {
00097
00098 DO_REGISTERING
00099
00100 public:
00101
00102 CaChannel_Yamada98(void) {
00103 Erev = -5e-6 * VSCALE;
00104 u = 200e-9;
00105 Ts = 70e-3;
00106 Ca = 0;
00107 Gbar = 54e-9;
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;
00157
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
00178
00179
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
00197
00198
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;
00217
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;
00261
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
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;
00316 Erev = -80;
00317
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;
00372
00373 Erev = -80;
00374
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;
00421
00422 Erev = 55.0;
00423
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;
00464
00465 Erev = -80.0;
00466
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;
00510
00511 Erev = -35.0;
00512
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;
00571
00572 Erev = 140;
00573
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; }
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;
00628
00629 Erev = 140;
00630
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;
00675
00676 Erev = -80;
00677
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
00695
00696 #define Amembrane 34636e-12 // [m2]
00697
00698
00699 #define NUMMETHOD 1
00700
00701
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
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
00746
00747
00748
00749 Gbar = 4.3* GSCALE * 120 * Amembrane;
00750
00751 Erev = 50e-3;
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
00786
00787
00788
00789
00790 KDChannel_Traub91(void) {
00791 addGate(new KDnGate_Traub91);
00792 Ts = 1;
00793
00794
00795 Gbar = GSCALE * 100 * Amembrane;
00796 Erev = -90e-3;
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
00837 Gbar = GSCALE * 5 * Amembrane;
00838 Erev = -90e-3;
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