21 stack<DataHolder*> blockStack;
24 OMDTreeVisitor() : currConf(
nullptr) {}
26 Globals* walkTree(antlr4::tree::ParseTree* tree) {
28 blockStack.push(currConf);
36 blockStack.top()->validate();
43 std::string
id = ctx->ID()->getText();
44 visitConstant(ctx->constant(),
id);
49 void visitConstant(OMDParser::ConstantContext *ctx,
const std::string&
id) {
50 if (ctx->intConst()) {
51 int ival = getIntConst(ctx->intConst());
52 blockStack.top()->assign(
id, ival);
53 }
else if (ctx->floatConst()) {
54 RealType dval = getFloatConst(ctx->floatConst());
55 blockStack.top()->assign(
id, dval);
56 }
else if (ctx->TRUE()) {
57 blockStack.top()->assign(
id,
true);
58 }
else if (ctx->FALSE()) {
59 blockStack.top()->assign(
id,
false);
60 }
else if (ctx->ID()) {
61 std::string str = ctx->ID()->getText();
62 blockStack.top()->assign(
id, str);
63 }
else if (ctx->StringLiteral()) {
64 std::string s = ctx->StringLiteral()->getText();
65 s = s.substr(1, s.length()-2);
66 blockStack.top()->assign(
id, s);
67 }
else if (ctx->vectorConst()) {
68 std::vector<RealType> dvec = getDoubleNumberTuple(
69 ctx->vectorConst()->doubleNumberTuple());
70 blockStack.top()->assign(
id, dvec);
75 virtual antlrcpp::Any visitComponentblock(OMDParser::ComponentblockContext *ctx)
override {
76 Component* currComponent =
new Component();
77 blockStack.push(currComponent);
81 blockStack.top()->validate();
83 currConf->addComponent(currComponent);
88 virtual antlrcpp::Any visitZconstraintblock(OMDParser::ZconstraintblockContext *ctx)
override {
89 ZConsStamp* currZConsStamp =
new ZConsStamp();
90 blockStack.push(currZConsStamp);
94 blockStack.top()->validate();
96 currConf->addZConsStamp(currZConsStamp);
101 virtual antlrcpp::Any visitRestraintblock(OMDParser::RestraintblockContext *ctx)
override {
102 RestraintStamp* currRestraintStamp =
new RestraintStamp();
103 blockStack.push(currRestraintStamp);
107 blockStack.top()->validate();
109 currConf->addRestraintStamp(currRestraintStamp);
114 virtual antlrcpp::Any visitFlucqblock(OMDParser::FlucqblockContext *ctx)
override {
115 FluctuatingChargeParameters* flucQpars =
new FluctuatingChargeParameters();
116 blockStack.push(flucQpars);
120 blockStack.top()->validate();
122 currConf->addFluctuatingChargeParameters(flucQpars);
127 virtual antlrcpp::Any visitRnemdblock(OMDParser::RnemdblockContext *ctx)
override {
128 RNEMD::RNEMDParameters* rnemdPars =
new RNEMD::RNEMDParameters();
129 blockStack.push(rnemdPars);
133 blockStack.top()->validate();
135 currConf->addRNEMDParameters(rnemdPars);
140 virtual antlrcpp::Any visitLightblock(OMDParser::LightblockContext *ctx)
override {
141 Perturbations::LightParameters* lightPars =
new Perturbations::LightParameters();
142 blockStack.push(lightPars);
146 blockStack.top()->validate();
148 currConf->addLightParameters(lightPars);
153 virtual antlrcpp::Any visitVelocityfieldblock(OMDParser::VelocityfieldblockContext *ctx)
override {
154 Perturbations::VelocityFieldParameters* vfPars =
new Perturbations::VelocityFieldParameters();
155 blockStack.push(vfPars);
159 blockStack.top()->validate();
161 currConf->addVelocityFieldParameters(vfPars);
166 virtual antlrcpp::Any visitMinimizerblock(OMDParser::MinimizerblockContext *ctx)
override {
167 MinimizerParameters* minimizerPars =
new MinimizerParameters();
168 blockStack.push(minimizerPars);
172 blockStack.top()->validate();
174 currConf->addMinimizerParameters(minimizerPars);
179 virtual antlrcpp::Any visitMoleculeblock(OMDParser::MoleculeblockContext *ctx)
override {
180 MoleculeStamp* currMoleculeStamp =
new MoleculeStamp();
181 blockStack.push(currMoleculeStamp);
184 blockStack.top()->validate();
186 currConf->addMoleculeStamp(currMoleculeStamp);
191 virtual antlrcpp::Any visitSequencestring(OMDParser::SequencestringContext *ctx)
override {
192 std::string
id =
"sequence";
193 visitConstant(ctx->constant(),
id);
198 virtual antlrcpp::Any visitFragmentblock(OMDParser::FragmentblockContext *ctx)
override {
199 FragmentStamp* currFragmentStamp =
new FragmentStamp();
200 blockStack.push(currFragmentStamp);
204 blockStack.top()->validate();
206 currConf->addFragmentStamp(currFragmentStamp);
211 virtual antlrcpp::Any visitAtomblock(OMDParser::AtomblockContext *ctx)
override {
212 int index = getIntConst(ctx->intConst());
213 AtomStamp* currAtomStamp =
new AtomStamp(index);
214 blockStack.push(currAtomStamp);
218 blockStack.top()->validate();
220 MoleculeStamp* currMoleculeStamp =
static_cast<MoleculeStamp*
>(blockStack.top());
221 currMoleculeStamp->addAtomStamp(currAtomStamp);
226 virtual antlrcpp::Any visitAtomstatement(OMDParser::AtomstatementContext *ctx)
override {
227 AtomStamp* currAtomStamp =
static_cast<AtomStamp*
>(blockStack.top());
229 if (ctx->assignment()) {
230 visitAssignment(ctx->assignment());
232 else if (ctx->POSITION()) {
233 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
234 currAtomStamp->setPosition(dvec);
236 else if (ctx->ORIENTATION()) {
237 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
238 currAtomStamp->setOrientation(dvec);
240 else if (ctx->CHARGE()) {
241 RealType rval = getFloatConst(ctx->floatConst());
242 currAtomStamp->overrideCharge(rval);
248 virtual antlrcpp::Any visitBondblock(OMDParser::BondblockContext *ctx)
override {
249 BondStamp* currBondStamp =
new BondStamp();
250 blockStack.push(currBondStamp);
254 blockStack.top()->validate();
256 MoleculeStamp* currMoleculeStamp =
static_cast<MoleculeStamp*
>(blockStack.top());
257 currMoleculeStamp->addBondStamp(currBondStamp);
262 virtual antlrcpp::Any visitBondstatement(OMDParser::BondstatementContext *ctx)
override {
263 BondStamp* currBondStamp =
static_cast<BondStamp*
>(blockStack.top());
265 if (ctx->assignment()) {
266 visitAssignment(ctx->assignment());
268 else if (ctx->MEMBERS()) {
269 std::vector<int> ivec = getIntTuple(ctx->inttuple());
270 currBondStamp->setMembers(ivec);
272 else if (ctx->FIXED()) {
273 RealType rval = getFloatConst(ctx->floatConst());
274 currBondStamp->overrideType(
"Fixed", rval);
276 else if (ctx->HARMONIC()) {
277 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
278 currBondStamp->overrideType(
"Harmonic", dvec);
280 else if (ctx->CUBIC()) {
281 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
282 currBondStamp->overrideType(
"Cubic", dvec);
284 else if (ctx->QUARTIC()) {
285 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
286 currBondStamp->overrideType(
"Quartic", dvec);
288 else if (ctx->POLYNOMIAL()) {
289 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
290 currBondStamp->overrideType(
"Polynomial", dvec);
292 else if (ctx->MORSE()) {
293 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
294 currBondStamp->overrideType(
"Morse", dvec);
300 virtual antlrcpp::Any visitBendblock(OMDParser::BendblockContext *ctx)
override {
301 BendStamp* currBendStamp =
new BendStamp();
302 blockStack.push(currBendStamp);
306 blockStack.top()->validate();
308 MoleculeStamp* currMoleculeStamp =
static_cast<MoleculeStamp*
>(blockStack.top());
309 currMoleculeStamp->addBendStamp(currBendStamp);
314 virtual antlrcpp::Any visitBendstatement(OMDParser::BendstatementContext *ctx)
override {
315 BendStamp* currBendStamp =
static_cast<BendStamp*
>(blockStack.top());
317 if (ctx->assignment()) {
318 visitAssignment(ctx->assignment());
320 else if (ctx->MEMBERS()) {
321 std::vector<int> ivec = getIntTuple(ctx->inttuple());
322 currBendStamp->setMembers(ivec);
324 else if (ctx->HARMONIC()) {
325 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
326 currBendStamp->overrideType(
"Harmonic", dvec);
328 else if (ctx->GHOSTBEND()) {
329 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
330 currBendStamp->overrideType(
"GhostBend", dvec);
332 else if (ctx->UREYBRADLEY()) {
333 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
334 currBendStamp->overrideType(
"UreyBradley", dvec);
336 else if (ctx->CUBIC()) {
337 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
338 currBendStamp->overrideType(
"Cubic", dvec);
340 else if (ctx->QUARTIC()) {
341 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
342 currBendStamp->overrideType(
"Quartic", dvec);
344 else if (ctx->POLYNOMIAL()) {
345 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
346 currBendStamp->overrideType(
"Polynomial", dvec);
348 else if (ctx->COSINE()) {
349 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
350 currBendStamp->overrideType(
"Cosine", dvec);
356 virtual antlrcpp::Any visitTorsionblock(OMDParser::TorsionblockContext *ctx)
override {
357 TorsionStamp* currTorsionStamp =
new TorsionStamp();
358 blockStack.push(currTorsionStamp);
362 blockStack.top()->validate();
364 MoleculeStamp* currMoleculeStamp =
static_cast<MoleculeStamp*
>(blockStack.top());
365 currMoleculeStamp->addTorsionStamp(currTorsionStamp);
370 virtual antlrcpp::Any visitTorsionstatement(OMDParser::TorsionstatementContext *ctx)
override {
371 TorsionStamp* currTorsionStamp =
static_cast<TorsionStamp*
>(blockStack.top());
373 if (ctx->assignment()) {
374 visitAssignment(ctx->assignment());
376 else if (ctx->MEMBERS()) {
377 std::vector<int> ivec = getIntTuple(ctx->inttuple());
378 currTorsionStamp->setMembers(ivec);
380 else if (ctx->GHOSTTORSION()) {
381 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
382 currTorsionStamp->overrideType(
"GhostTorsion", dvec);
384 else if (ctx->CUBIC()) {
385 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
386 currTorsionStamp->overrideType(
"Cubic", dvec);
388 else if (ctx->QUARTIC()) {
389 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
390 currTorsionStamp->overrideType(
"Quartic", dvec);
392 else if (ctx->POLYNOMIAL()) {
393 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
394 currTorsionStamp->overrideType(
"Polynomial", dvec);
396 else if (ctx->CHARMM()) {
397 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
398 currTorsionStamp->overrideType(
"Charmm", dvec);
400 else if (ctx->OPLS()) {
401 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
402 currTorsionStamp->overrideType(
"Opls", dvec);
404 else if (ctx->TRAPPE()) {
405 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
406 currTorsionStamp->overrideType(
"Trappe", dvec);
408 else if (ctx->HARMONIC()) {
409 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
410 currTorsionStamp->overrideType(
"Harmonic", dvec);
416 virtual antlrcpp::Any visitInversionblock(OMDParser::InversionblockContext *ctx)
override {
417 InversionStamp* currInversionStamp =
new InversionStamp();
418 blockStack.push(currInversionStamp);
422 blockStack.top()->validate();
424 MoleculeStamp* currMoleculeStamp =
static_cast<MoleculeStamp*
>(blockStack.top());
425 currMoleculeStamp->addInversionStamp(currInversionStamp);
430 virtual antlrcpp::Any visitInversionstatement(OMDParser::InversionstatementContext *ctx)
override {
431 InversionStamp* currInversionStamp =
static_cast<InversionStamp*
>(blockStack.top());
433 if (ctx->assignment()) {
434 visitAssignment(ctx->assignment());
436 else if (ctx->CENTER()) {
437 int icent = getIntConst(ctx->intConst());
438 currInversionStamp->setCenter(icent);
440 else if (ctx->SATELLITES()) {
441 std::vector<int> ivec = getIntTuple(ctx->inttuple());
442 currInversionStamp->setSatellites(ivec);
444 else if (ctx->AMBERIMPROPER()) {
445 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
446 currInversionStamp->overrideType(
"AmberImproper", dvec);
448 else if (ctx->IMPROPERCOSINE()) {
449 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
450 currInversionStamp->overrideType(
"ImproperCosine", dvec);
452 else if (ctx->HARMONIC()) {
453 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
454 currInversionStamp->overrideType(
"Harmonic", dvec);
456 else if (ctx->CENTRALATOMHEIGHT()) {
457 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
458 currInversionStamp->overrideType(
"CentralAtomHeight", dvec);
460 else if (ctx->DREIDING()) {
461 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
462 currInversionStamp->overrideType(
"Dreiding", dvec);
468 virtual antlrcpp::Any visitRigidbodyblock(OMDParser::RigidbodyblockContext *ctx)
override {
469 int index = getIntConst(ctx->intConst());
470 RigidBodyStamp* currRigidBodyStamp =
new RigidBodyStamp(index);
471 blockStack.push(currRigidBodyStamp);
475 blockStack.top()->validate();
477 MoleculeStamp* currMoleculeStamp =
static_cast<MoleculeStamp*
>(blockStack.top());
478 currMoleculeStamp->addRigidBodyStamp(currRigidBodyStamp);
483 virtual antlrcpp::Any visitRigidbodystatement(OMDParser::RigidbodystatementContext *ctx)
override {
484 RigidBodyStamp* currRigidBodyStamp =
static_cast<RigidBodyStamp*
>(blockStack.top());
486 if (ctx->assignment()) {
487 visitAssignment(ctx->assignment());
489 else if (ctx->MEMBERS()) {
490 std::vector<int> ivec = getIntTuple(ctx->inttuple());
491 currRigidBodyStamp->setMembers(ivec);
497 virtual antlrcpp::Any visitCutoffgroupblock(OMDParser::CutoffgroupblockContext *ctx)
override {
498 CutoffGroupStamp* currCutoffGroupStamp =
new CutoffGroupStamp();
499 blockStack.push(currCutoffGroupStamp);
503 blockStack.top()->validate();
505 MoleculeStamp* currMoleculeStamp =
static_cast<MoleculeStamp*
>(blockStack.top());
506 currMoleculeStamp->addCutoffGroupStamp(currCutoffGroupStamp);
511 virtual antlrcpp::Any visitCutoffgroupstatement(OMDParser::CutoffgroupstatementContext *ctx)
override {
512 CutoffGroupStamp* currCutoffGroupStamp =
static_cast<CutoffGroupStamp*
>(blockStack.top());
514 if (ctx->assignment()) {
515 visitAssignment(ctx->assignment());
517 else if (ctx->MEMBERS()) {
518 std::vector<int> ivec = getIntTuple(ctx->inttuple());
519 currCutoffGroupStamp->setMembers(ivec);
525 virtual antlrcpp::Any visitConstraintblock(OMDParser::ConstraintblockContext *ctx)
override {
526 ConstraintStamp* currConstraintStamp =
new ConstraintStamp();
527 blockStack.push(currConstraintStamp);
532 MoleculeStamp* currMoleculeStamp =
static_cast<MoleculeStamp*
>(blockStack.top());
533 currMoleculeStamp->addConstraintStamp(currConstraintStamp);
538 virtual antlrcpp::Any visitConstraintstatement(OMDParser::ConstraintstatementContext *ctx)
override {
539 ConstraintStamp* currConstraintStamp =
static_cast<ConstraintStamp*
>(blockStack.top());
541 if (ctx->assignment()) {
542 visitAssignment(ctx->assignment());
544 else if (ctx->MEMBERS()) {
545 std::vector<int> ivec = getIntTuple(ctx->inttuple());
546 currConstraintStamp->setMembers(ivec);
552 virtual antlrcpp::Any visitNodesblock(OMDParser::NodesblockContext *ctx)
override {
553 NodesStamp* currNodesStamp =
new NodesStamp();
554 blockStack.push(currNodesStamp);
558 blockStack.top()->validate();
560 FragmentStamp* currFragmentStamp =
static_cast<FragmentStamp*
>(blockStack.top());
561 currFragmentStamp->addNodesStamp(currNodesStamp);
566 virtual antlrcpp::Any visitNodesstatement(OMDParser::NodesstatementContext *ctx)
override {
567 NodesStamp* currNodesStamp =
static_cast<NodesStamp*
>(blockStack.top());
569 if (ctx->assignment()) {
570 visitAssignment(ctx->assignment());
572 else if (ctx->MEMBERS()) {
573 std::vector<int> ivec = getIntTuple(ctx->inttuple());
574 currNodesStamp->setMembers(ivec);
582 int getIntConst(OMDParser::IntConstContext *ctx) {
583 if (ctx->NUM_INT()) {
584 return lexi_cast<int>(ctx->NUM_INT()->getText());
585 }
else if (ctx->NUM_LONG()) {
586 return lexi_cast<int>(ctx->NUM_LONG()->getText());
591 RealType getFloatConst(OMDParser::FloatConstContext *ctx) {
592 if (ctx->NUM_FLOAT()) {
593 return lexi_cast<RealType>(ctx->NUM_FLOAT()->getText());
594 }
else if (ctx->NUM_DOUBLE()) {
595 return lexi_cast<RealType>(ctx->NUM_DOUBLE()->getText());
600 RealType getDoubleNumber(OMDParser::DoubleNumberContext *ctx) {
601 if (ctx->intConst()) {
602 return static_cast<RealType
>(getIntConst(ctx->intConst()));
603 }
else if (ctx->floatConst()) {
604 return getFloatConst(ctx->floatConst());
609 std::vector<RealType> getDoubleNumberTuple(OMDParser::DoubleNumberTupleContext *ctx) {
610 std::vector<RealType> dvec;
611 for (
auto dn : ctx->doubleNumber()) {
612 dvec.push_back(getDoubleNumber(dn));
617 std::vector<int> getIntTuple(OMDParser::InttupleContext *ctx) {
618 std::vector<int> ivec;
619 for (
auto ic : ctx->intConst()) {
620 ivec.push_back(getIntConst(ic));