14 #include "../shell/Shell.h"
15 #include "../shell/Wildcard.h"
24 for (
unsigned int i = 0; i < 10; ++i )
38 void testAdaptorRequestField()
41 Id model = shell->
doCreate(
"Neutral",
Id(),
"model", 1 );
42 Id adaptor = shell->
doCreate(
"Adaptor", model,
"adaptor", 1 );
43 Id onepool = shell->
doCreate(
"Pool", model,
"onepool", 1 );
44 Id twopool = shell->
doCreate(
"Pool", model,
"twopool", 2 );
45 Id tenpool = shell->
doCreate(
"Pool", model,
"tenpool", 10 );
47 onepool,
"getNInit" );
49 mid = shell->
doAddMsg(
"Single", adaptor,
"requestOut",
50 ObjId( twopool, 0 ),
"getNInit" );
52 mid = shell->
doAddMsg(
"Single", adaptor,
"requestOut",
53 ObjId( twopool, 1 ),
"getNInit" );
55 mid = shell->
doAddMsg(
"OneToAll", adaptor,
"requestOut",
56 tenpool,
"getNInit" );
61 for (
unsigned int i = 0; i < 10; ++i )
63 set(
ObjId( tenpool, i ),
"nInit", (i + 1 ) * 100 );
67 assert(
doubleEq( ret, ( 1.0 + 50.0 + 5500.0 )/13.0 ) );
74 assert ( temp.size() == 13 );
75 assert( temp[0] ==
ObjId( onepool, 0 ) );
76 assert( temp[1] ==
ObjId( twopool, 0 ) );
77 assert( temp[2] ==
ObjId( twopool, 1 ) );
78 for (
int i = 0; i < 10; ++i )
79 assert( temp[i + 3] ==
ObjId( tenpool, i ) );
112 extern Id makeSquid();
114 extern Id makeSpine(
Id compt,
Id cell,
unsigned int index,
double frac,
115 double len,
double dia,
double theta );
117 Id makeSpineWithReceptor(
Id compt,
Id cell,
unsigned int index,
double frac )
120 double spineLength = 5.0e-6;
121 double spineDia = 4.0e-6;
122 Id spineCompt = makeSpine( compt, cell, index, frac,
123 spineLength, spineDia, 0.0 );
125 Id gluR = shell->
doCreate(
"SynChan", spineCompt,
"gluR", 1 );
131 ObjId( gluR ),
"channel" );
132 assert( ! mid.
bad() );
135 Id caPool = shell->
doCreate(
"CaConc", spineCompt,
"ca", 1 );
143 ObjId( caPool ),
"current" );
144 assert( ! mid.
bad() );
149 Id buildSigNeurElec( vector< Id >& spines )
152 vector< int > dims( 1, 1 );
153 double comptLength = 100e-6;
154 double comptDia = 4e-6;
155 unsigned int numSpines = 5;
157 Id nid = makeSquid();
158 Id compt(
"/n/compt" );
170 Id synInput = shell->
doCreate(
"SpikeGen", nid,
"synInput", dims.size() );
176 spines.resize( numSpines );
178 for (
unsigned int i = 0; i < numSpines; ++i ) {
179 double frac = ( 0.5 + i ) / numSpines;
180 spines[i] = makeSpineWithReceptor( compt, nid, i, frac );
182 ss <<
"/n/head" << i <<
"/gluR";
183 string name = ss.str();
185 assert( gluR !=
Id() );
187 Id syn( name +
"/synapse" );
188 assert( syn !=
Id() );
190 ObjId( syn ),
"addSpike" );
191 assert( ! mid.
bad() );
200 void buildSigNeurChem(
Id nid,
Id neuroMesh,
Id spineMesh,
Id psdMesh )
203 vector< int > dims( 1, 1 );
208 Id psdMeshEntries(
"/n/psdMesh/mesh" );
209 assert( psdMeshEntries !=
Id() );
210 Id psdGluR = shell->
doCreate(
"Pool", psdMesh,
"psdGluR", 1 );
211 ObjId mid = shell->
doAddMsg(
"Single", psdGluR,
"mesh", psdMeshEntries,
"mesh" );
212 assert( ! mid.
bad() );
217 Id spineMeshEntries(
"/n/spineMesh/mesh" );
219 Id headCa = shell->
doCreate(
"Pool", spineMesh,
"Ca" , 1);
220 mid = shell->
doAddMsg(
"Single", spineMeshEntries,
"mesh", headCa,
"mesh" );
221 assert( ! mid.
bad() );
225 Id headGluR = shell->
doCreate(
"Pool", spineMesh,
"headGluR", 1 );
226 mid = shell->
doAddMsg(
"Single", spineMeshEntries,
"mesh", headGluR,
"mesh" );
227 assert( ! mid.
bad() );
230 Id toPsd = shell->
doCreate(
"Pool", spineMesh,
"toPsd", 1 );
231 mid = shell->
doAddMsg(
"Single", spineMeshEntries,
"mesh", toPsd,
"mesh" );
232 assert( ! mid.
bad() );
235 Id toPsdInact = shell->
doCreate(
"Pool", spineMesh,
"toPsdInact", 1 );
236 mid = shell->
doAddMsg(
"Single", spineMeshEntries,
"mesh", toPsdInact,
"mesh" );
237 assert( ! mid.
bad() );
240 Id turnOnPsd = shell->
doCreate(
"Reac", spineMesh,
"turnOnPsd", 1);
241 mid = shell->
doAddMsg(
"OneToOne", turnOnPsd,
"sub", headCa,
"reac" );
242 assert( ! mid.
bad() );
243 mid = shell->
doAddMsg(
"OneToOne", turnOnPsd,
"sub", toPsdInact,
"reac" );
244 assert( ! mid.bad() );
245 mid = shell->
doAddMsg(
"OneToOne", turnOnPsd,
"prd", toPsd,
"reac" );
246 assert( ! mid.bad() );
251 Id toPsdEnz = shell->
doCreate(
"Enz", toPsd,
"enz" , 1);
252 Id toPsdEnzCplx = shell->
doCreate(
"Pool", toPsdEnz,
"cplx", 1 );
253 shell->
doAddMsg(
"Single", spineMeshEntries,
"mesh", toPsdEnzCplx,
"mesh" );
254 mid = shell->
doAddMsg(
"OneToOne", toPsdEnz,
"enz", toPsd,
"reac" );
255 assert( ! mid.bad() );
256 mid = shell->
doAddMsg(
"OneToOne", toPsdEnz,
"sub", headGluR,
"reac" );
257 assert( ! mid.bad() );
258 mid = shell->
doAddMsg(
"OneToOne", toPsdEnz,
"prd", psdGluR,
"reac" );
259 assert( ! mid.bad() );
260 mid = shell->
doAddMsg(
"OneToOne", toPsdEnz,
"cplx", toPsdEnzCplx,
"reac" );
261 assert( ! mid.bad() );
266 Id fromPsd = shell->
doCreate(
"Reac", psdMesh,
"fromPsd", 1 );
268 mid = shell->
doAddMsg(
"OneToOne", fromPsd,
"sub", psdGluR,
"reac" );
269 assert( ! mid.bad() );
270 mid = shell->
doAddMsg(
"OneToOne", fromPsd,
"prd", headGluR,
"reac" );
271 assert( ! mid.bad() );
276 Id foo(
"/n/spineMesh/toPsd/enz/cplx" );
277 assert( toPsdEnzCplx !=
Id() );
278 assert( toPsdEnzCplx == foo );
283 Id dendMeshEntries(
"/n/neuroMesh/mesh" );
285 Id dendCa = shell->
doCreate(
"Pool", neuroMesh,
"Ca", 1 );
286 mid = shell->
doAddMsg(
"Single", dendMeshEntries,
"mesh", dendCa,
"mesh" );
287 assert( ! mid.bad() );
292 Id bufCa = shell->
doCreate(
"BufPool", neuroMesh,
"bufCa", 1 );
293 mid = shell->
doAddMsg(
"Single", dendMeshEntries,
"mesh", bufCa,
"mesh" );
294 assert( ! mid.bad() );
299 Id pumpCa = shell->
doCreate(
"Reac", neuroMesh,
"pumpCa" , 1);
300 mid = shell->
doAddMsg(
"OneToOne", pumpCa,
"sub", dendCa,
"reac" );
301 assert( ! mid.bad() );
302 mid = shell->
doAddMsg(
"OneToOne", pumpCa,
"prd", bufCa,
"reac" );
303 assert( ! mid.bad() );
307 Id dendKinaseInact = shell->
doCreate(
"Pool", neuroMesh,
"inact_kinase", 1 );
308 mid = shell->
doAddMsg(
"Single", dendMeshEntries,
"mesh", dendKinaseInact,
"mesh" );
309 assert( ! mid.bad() );
312 Id dendKinase = shell->
doCreate(
"Pool", neuroMesh,
"Ca.kinase", 1 );
313 mid = shell->
doAddMsg(
"Single", dendMeshEntries,
"mesh", dendKinase,
"mesh" );
314 assert( ! mid.bad() );
318 Id dendTurnOnKinase = shell->
doCreate(
"Reac", neuroMesh,
"turnOnKinase", 1);
320 "OneToOne", dendTurnOnKinase,
"sub", dendCa,
"reac" );
322 "OneToOne", dendTurnOnKinase,
"sub", dendKinaseInact,
"reac" );
323 assert( ! mid.bad() );
325 "OneToOne", dendTurnOnKinase,
"prd", dendKinase,
"reac" );
326 assert( ! mid.bad() );
330 Id dendKinaseEnz = shell->
doCreate(
"Enz", dendKinase,
"enz" , 1);
331 Id dendKinaseEnzCplx = shell->
doCreate(
"Pool", dendKinaseEnz,
"cplx", 1 );
332 mid = shell->
doAddMsg(
"Single", dendMeshEntries,
"mesh", dendKinaseEnzCplx,
"mesh" );
333 assert( ! mid.bad() );
334 Id kChan = shell->
doCreate(
"Pool", neuroMesh,
"kChan", 1);
335 mid = shell->
doAddMsg(
"Single", dendMeshEntries,
"mesh", kChan,
"mesh" );
336 assert( ! mid.bad() );
339 Id kChan_p = shell->
doCreate(
"Pool", neuroMesh,
"kChan_p", 1);
340 mid = shell->
doAddMsg(
"Single", dendMeshEntries,
"mesh", kChan_p,
"mesh" );
341 assert( ! mid.bad() );
344 mid = shell->
doAddMsg(
"OneToOne", dendKinaseEnz,
"enz", dendKinase,
"reac" );
345 assert( ! mid.bad() );
346 mid = shell->
doAddMsg(
"OneToOne", dendKinaseEnz,
"sub", kChan,
"reac" );
347 assert( ! mid.bad() );
348 mid = shell->
doAddMsg(
"OneToOne", dendKinaseEnz,
"prd", kChan_p,
"reac" );
349 assert( ! mid.bad() );
350 mid = shell->
doAddMsg(
"OneToOne", dendKinaseEnz,
"cplx", dendKinaseEnzCplx,
"reac" );
351 assert( ! mid.bad() );
355 Id dendPhosphatase = shell->
doCreate(
"Reac", neuroMesh,
"phosphatase", 1);
356 mid = shell->
doAddMsg(
"OneToOne", dendPhosphatase,
"sub", kChan_p,
"reac" );
357 assert( ! mid.bad() );
358 mid = shell->
doAddMsg(
"OneToOne", dendPhosphatase,
"prd", kChan,
"reac" );
359 assert( ! mid.bad() );
364 Id bar(
"/n/neuroMesh/Ca.kinase/enz/cplx" );
365 assert( dendKinaseEnzCplx !=
Id() );
366 assert( dendKinaseEnzCplx == bar );
367 shell->
doAddMsg(
"Single", spineMeshEntries,
"mesh", dendKinaseEnzCplx,
"mesh" );
370 void buildSigNeurNeuroMesh(
Id nid,
Id& neuroMesh,
Id& spineMesh,
Id& psdMesh )
372 const double diffLength = 1e-6;
374 vector< int > dims( 1, 1 );
376 neuroMesh = shell->
doCreate(
"NeuroMesh", nid,
"neuroMesh", dims.size() );
380 spineMesh = shell->
doCreate(
"SpineMesh", nid,
"spineMesh", dims.size());
382 mid = shell->
doAddMsg(
"OneToOne", neuroMesh,
"spineListOut", spineMesh,
"spineList" );
383 assert( ! mid.
bad() );
384 psdMesh = shell->
doCreate(
"PsdMesh", nid,
"psdMesh", dims.size() );
385 mid = shell->
doAddMsg(
"OneToOne", neuroMesh,
"psdListOut", psdMesh,
"psdList" );
386 assert( ! mid.
bad() );
389 void makeChemInNeuroMesh()
391 double spineLength = 5.0e-6;
392 double spineDia = 4.0e-6;
393 double comptLength = 100.0e-6;
394 double comptDia = 4.0e-6;
396 Id nid = buildSigNeurElec( spines );
397 Id neuroMesh, spineMesh, psdMesh;
398 buildSigNeurNeuroMesh( nid, neuroMesh, spineMesh, psdMesh );
399 buildSigNeurChem( nid, neuroMesh, spineMesh, psdMesh );
412 const unsigned int numComptsInDend = 100;
413 const unsigned int numSpines = 5;
419 Id psdMeshEntries(
"/n/psdMesh/mesh" );
421 assert( size == numSpines );
423 assert( size == numSpines );
427 assert( size == numSpines );
430 assert(
doubleEq( vol, spineLength * spineDia * spineDia *
PI / 4.0 ) );
434 assert( size == numSpines );
441 assert( size == numSpines );
444 assert(
doubleEq( vol, thick * spineDia * spineDia *
PI / 4.0 ) );
448 assert( size == numComptsInDend );
450 assert(
doubleEq( vol, comptLength * comptDia * comptDia *
PI / (4.0 * numComptsInDend ) ) );
462 cout <<
"." << flush;
465 Id makeChemInCubeMesh()
468 vector< int > dims( 1, 1 );
469 double dendSide = 10.8e-6;
470 double spineSide = 6.8e-6;
471 double psdSide = 8.565e-7;
477 nid = shell->
doCreate(
"Neutral",
Id(),
"n", 1 );
478 Id neuroMesh = shell->
doCreate(
"CubeMesh", nid,
"neuroMesh", 1);
479 Id spineMesh = shell->
doCreate(
"CubeMesh", nid,
"spineMesh", 1);
480 Id psdMesh = shell->
doCreate(
"CubeMesh", nid,
"psdMesh", 1);
482 vector< double > coords( 9, dendSide );
490 coords.resize( 9, spineSide );
491 coords[0] = dendSide;
494 coords[3] = spineSide + dendSide;
499 coords.resize( 9, psdSide );
500 coords[0] = dendSide + spineSide;
503 coords[3] = psdSide + spineSide + dendSide;
507 buildSigNeurChem( nid, neuroMesh, spineMesh, psdMesh );
514 Id psdMeshEntries(
"/n/psdMesh/mesh" );
524 assert(
doubleEq( vol, pow( spineSide, 3.0 ) ) );
534 assert(
doubleEq( vol, pow( psdSide, 3.0 ) ) );
539 assert(
doubleEq( vol, pow( dendSide, 3.0 ) ) );
548 vol = dendSide * dendSide * dendSide;
564 assert(
doubleEq( numK, 500 / (
NA * vol ) ) );
570 assert(
doubleEq( numK, ( 0.1 + 0.4 ) / ( 0.005 *
NA * vol ) ) );
577 vol = spineSide * spineSide * spineSide;
581 assert(
doubleEq( numK, 100 / (
NA * vol ) ) );
587 assert(
doubleEq( numK, ( 1.0 + 4.0 ) / ( 0.001 *
NA * vol ) ) );
595 void testChemInCubeMesh()
598 vector< int > dims( 1, 1 );
599 Id nid = makeChemInCubeMesh();
637 Id tab = shell->
doCreate(
"Table", nid,
"tab", dims.size() );
639 Id(
"/n/psdMesh/psdGluR" ),
"get_n" );
640 assert( ! mid.
bad() );
641 Id tabCa = shell->
doCreate(
"Table", nid,
"tabCa", dims.size() );
642 mid = shell->
doAddMsg(
"Single", tabCa,
"requestData",
643 Id(
"/n/spineMesh/Ca" ),
"get_conc" );
645 assert( ! mid.
bad() );
646 Id tab2 = shell->
doCreate(
"Table", nid,
"tab2", dims.size() );
647 mid = shell->
doAddMsg(
"Single", tab2,
"requestData",
648 Id(
"/n/neuroMesh/kChan_p" ),
"get_conc" );
650 assert( ! mid.
bad() );
651 Id tab4 = shell->
doCreate(
"Table", nid,
"tab4", dims.size() );
652 mid = shell->
doAddMsg(
"Single", tab4,
"requestData",
653 Id(
"/n/neuroMesh/Ca.kinase" ),
"get_conc" );
655 assert( ! mid.
bad() );
656 Id tab3 = shell->
doCreate(
"Table", nid,
"tab3", dims.size() );
657 mid = shell->
doAddMsg(
"Single", tab3,
"requestData",
658 Id(
"/n/spineMesh/toPsd" ),
"get_conc" );
660 assert( ! mid.
bad() );
669 shell->
doUseClock(
"/n/neuroMesh/##,/n/spineMesh/##,/n/psdMesh/##",
"process", 5 );
686 Id solver = shell->
doCreate(
"GslStoich", nid,
"solver", dims.size() );
687 assert( solver !=
Id() );
692 shell->
doUseClock(
"/n/solver",
"process", 5 );
702 cout <<
"." << flush;
705 void testSigNeurElec()
708 vector< int > dims( 1, 1 );
711 Id nid = buildSigNeurElec( spines );
712 Id compt(
"/n/compt" );
729 Id tab = shell->
doCreate(
"Table", nid,
"tab", dims.size() );
731 "requestData",
ObjId( spines[2], 0 ),
"get_Vm" );
732 assert( ! mid.
bad() );
733 Id tab2 = shell->
doCreate(
"Table", nid,
"tab2", dims.size() );
735 "requestData",
ObjId( compt, 0 ),
"get_Vm" );
737 assert( ! mid.
bad() );
738 Id ca2(
"/n/head2/ca" );
739 Id tabCa = shell->
doCreate(
"Table", nid,
"tab3", dims.size() );
741 "requestData",
ObjId( ca2, 0 ),
"get_Ca" );
742 assert( ! mid.
bad() );
752 shell->
doUseClock(
"/n/compt,/n/shaft#,/n/head#",
"init", 0 );
753 shell->
doUseClock(
"/n/compt,/n/shaft#,/n/head#",
"process", 1 );
754 shell->
doUseClock(
"/n/synInput",
"process", 1 );
755 shell->
doUseClock(
"/n/compt/Na,/n/compt/K",
"process", 2 );
756 shell->
doUseClock(
"/n/head#/#",
"process", 2 );
770 Id hsolve = shell->
doCreate(
"HSolve", nid,
"hsolve", dims.size() );
771 shell->
doUseClock(
"/n/hsolve",
"process", 1 );
788 cout <<
"." << flush;
791 Id addPlot(
const string& objPath,
const string& field,
792 const string& plotname )
795 vector< int > dims( 1, 1 );
798 assert( nid !=
Id() );
800 assert( obj !=
Id() );
801 Id tab = shell->
doCreate(
"Table", nid, plotname, dims.size() );
802 ObjId mid = shell->
doAddMsg(
"Single", tab,
"requestData", obj, field );
803 assert( ! mid.
bad() );
807 Id buildAdaptorsInCubeMesh( vector< Id >& plots )
810 vector< int > dims( 1, 1 );
814 Id nid = buildSigNeurElec( spines );
818 Id compt(
"/n/compt" );
820 Id synInput(
"/n/synInput" );
822 Id Na(
"/n/compt/Na" );
826 makeChemInCubeMesh();
827 Id elecCa(
"/n/head2/ca" );
828 Id chemCa(
"/n/spineMesh/Ca" );
830 Id elecGluR(
"/n/head2/gluR" );
831 Id chemGluR(
"/n/psdMesh/psdGluR" );
833 Id elecK(
"/n/compt/K" );
834 Id chemK(
"/n/neuroMesh/kChan" );
839 Id dendCa(
"/n/neuroMesh/Ca" );
840 Id spineMesh(
"/n/spineMesh" );
841 Id diffReac = shell->
doCreate(
"Reac", spineMesh,
"diff", 1 );
842 ObjId mid = shell->
doAddMsg(
"Single", diffReac,
"sub", chemCa,
"reac");
843 assert( ! mid.
bad() );
844 mid = shell->
doAddMsg(
"Single", diffReac,
"prd", dendCa,
"reac");
845 assert( ! mid.bad() );
854 Id adaptCa = shell->
doCreate(
"Adaptor", nid,
"adaptCa", dims.size() );
856 elecCa,
"concOut", adaptCa,
"input" );
857 assert( ! mid.bad() );
865 adaptCa,
"output", chemCa,
"set_conc" );
866 assert( ! mid.bad() );
870 Id adaptGluR = shell->
doCreate(
"Adaptor", nid,
"adaptGluR", dims.size() );
872 adaptGluR,
"requestOut", chemGluR,
"get_n" );
873 assert( ! mid.bad() );
875 adaptGluR,
"output", elecGluR,
"set_Gbar" );
876 assert( ! mid.bad() );
880 Id adaptK = shell->
doCreate(
"Adaptor", nid,
"adaptK", dims.size() );
882 adaptK,
"requestOut", chemK,
"get_conc" );
883 assert( ! mid.bad() );
885 adaptK,
"output", elecK,
"set_Gbar" );
886 assert( ! mid.bad() );
894 plots.push_back( addPlot(
"/n/head1",
"get_Vm",
"spineVm1" ) );
895 plots.push_back( addPlot(
"/n/head2",
"get_Vm",
"spineVm2" ) );
898 plots.push_back( addPlot(
"/n/compt",
"get_Vm",
"dendVm" ) );
899 plots.push_back( addPlot(
"/n/head2/ca",
"get_Ca",
"spineElecCa" ) );
902 plots.push_back( addPlot(
"/n/psdMesh/psdGluR",
"get_n",
"psdGluR_N" ));
904 plots.push_back( addPlot(
"/n/head2/gluR",
"get_Ik",
"elecGluR_Ik2" ) );
907 plots.push_back( addPlot(
"/n/head2/gluR",
"get_Gk",
"elecGluR_Gk2" ) );
912 plots.push_back( addPlot(
"/n/spineMesh/toPsd",
"get_conc",
"toPsd") );
918 void testAdaptorsInCubeMesh()
921 vector< int > dims( 1, 1 );
923 Id nid = buildAdaptorsInCubeMesh( plots );
936 shell->
doUseClock(
"/n/compt,/n/shaft#,/n/head#",
"init", 0 );
937 shell->
doUseClock(
"/n/compt,/n/shaft#,/n/head#",
"process", 1 );
938 shell->
doUseClock(
"/n/synInput",
"process", 1 );
939 shell->
doUseClock(
"/n/compt/Na,/n/compt/K",
"process", 2 );
940 shell->
doUseClock(
"/n/head#/#",
"process", 2 );
941 shell->
doUseClock(
"/n/#Mesh/##",
"process", 5 );
942 shell->
doUseClock(
"/n/adapt#",
"process", 6 );
943 shell->
doUseClock(
"/n/#[ISA=Table]",
"process", 8 );
949 for ( vector< Id >::iterator i = plots.begin(); i != plots.end(); ++i )
952 i->element()->getName() );
957 Id solver = shell->
doCreate(
"GslStoich", nid,
"solver", dims.size() );
958 assert( solver !=
Id() );
963 shell->
doUseClock(
"/n/solver",
"process", 5 );
967 for ( vector< Id >::iterator i = plots.begin(); i != plots.end(); ++i )
970 i->element()->getName() );
975 Id hsolve = shell->
doCreate(
"HSolve", nid,
"hsolve", dims.size() );
976 shell->
doUseClock(
"/n/hsolve",
"process", 1 );
982 for ( vector< Id >::iterator i = plots.begin(); i != plots.end(); ++i )
985 i->element()->getName() );
990 cout <<
"." << flush;
1003 testAdaptorRequestField();
1021 #else // DO_UNIT_TEST
void doStart(double runtime, bool notify=false)
vector< ObjId > getMsgTargets(DataId srcDataId, const SrcFinfo *finfo) const
Element * element() const
Synonym for Id::operator()()
void doSetClock(unsigned int tickNum, double dt)
void testSigNeurProcess()
const double FaradayConst
static bool set(const ObjId &dest, const string &field, A arg)
Id doCreate(string type, ObjId parent, string name, unsigned int numData, NodePolicy nodePolicy=MooseBlockBalance, unsigned int preferredNode=1)
void setInputOffset(double offset)
void setScale(double scale)
void setOutputOffset(double offset)
bool doubleEq(double x, double y)
const Cinfo * cinfo() const
virtual unsigned int numData() const =0
Returns number of data entries across all nodes.
ObjId doAddMsg(const string &msgType, ObjId src, const string &srcField, ObjId dest, const string &destField)
static bool set(const ObjId &dest, const string &field, A arg)
void doUseClock(string path, string field, unsigned int tick)
static A get(const ObjId &dest, const string &field)
const Finfo * findFinfo(const string &name) const
static bool set(const ObjId &dest, const string &field, A1 arg1, A2 arg2)