| 53 |
|
|
| 54 |
|
namespace OpenMD { |
| 55 |
|
|
| 56 |
– |
|
| 56 |
|
SelectionEvaluator::SelectionEvaluator(SimInfo* si) |
| 57 |
|
: info(si), nameFinder(info), distanceFinder(info), hullFinder(info), |
| 58 |
< |
indexFinder(info), hasSurfaceArea_(false), |
| 60 |
< |
isLoaded_(false){ |
| 58 |
> |
indexFinder(info), isLoaded_(false), hasSurfaceArea_(false) { |
| 59 |
|
nObjects.push_back(info->getNGlobalAtoms() + info->getNGlobalRigidBodies()); |
| 60 |
|
nObjects.push_back(info->getNGlobalBonds()); |
| 61 |
|
nObjects.push_back(info->getNGlobalBends()); |
| 332 |
|
|
| 333 |
|
for (mol = info->beginMolecule(mi); mol != NULL; |
| 334 |
|
mol = info->nextMolecule(mi)) { |
| 335 |
+ |
|
| 336 |
+ |
compareProperty(mol, bs, property, comparator, comparisonValue); |
| 337 |
|
|
| 338 |
|
for(atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) { |
| 339 |
|
compareProperty(atom, bs, property, comparator, comparisonValue); |
| 365 |
|
for (mol = info->beginMolecule(mi); mol != NULL; |
| 366 |
|
mol = info->nextMolecule(mi)) { |
| 367 |
|
|
| 368 |
+ |
compareProperty(mol, bs, property, comparator, comparisonValue, frame); |
| 369 |
+ |
|
| 370 |
|
for(atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) { |
| 371 |
|
compareProperty(atom, bs, property, comparator, comparisonValue, frame); |
| 372 |
|
} |
| 462 |
|
|
| 463 |
|
} |
| 464 |
|
|
| 465 |
+ |
void SelectionEvaluator::compareProperty(Molecule* mol, SelectionSet& bs, |
| 466 |
+ |
int property, int comparator, |
| 467 |
+ |
float comparisonValue) { |
| 468 |
+ |
RealType propertyValue = 0.0; |
| 469 |
+ |
Vector3d pos; |
| 470 |
+ |
|
| 471 |
+ |
switch (property) { |
| 472 |
+ |
case Token::mass: |
| 473 |
+ |
propertyValue = mol->getMass(); |
| 474 |
+ |
break; |
| 475 |
+ |
case Token::charge: |
| 476 |
+ |
{ |
| 477 |
+ |
Molecule::AtomIterator ai; |
| 478 |
+ |
Atom* atom; |
| 479 |
+ |
for (atom = mol->beginAtom(ai); atom != NULL; |
| 480 |
+ |
atom = mol->nextAtom(ai)) { |
| 481 |
+ |
propertyValue+= getCharge(atom); |
| 482 |
+ |
} |
| 483 |
+ |
} |
| 484 |
+ |
break; |
| 485 |
+ |
case Token::x: |
| 486 |
+ |
propertyValue = mol->getCom().x(); |
| 487 |
+ |
break; |
| 488 |
+ |
case Token::y: |
| 489 |
+ |
propertyValue = mol->getCom().y(); |
| 490 |
+ |
break; |
| 491 |
+ |
case Token::z: |
| 492 |
+ |
propertyValue = mol->getCom().z(); |
| 493 |
+ |
break; |
| 494 |
+ |
case Token::wrappedX: |
| 495 |
+ |
pos = mol->getCom(); |
| 496 |
+ |
info->getSnapshotManager()->getCurrentSnapshot()->wrapVector(pos); |
| 497 |
+ |
propertyValue = pos.x(); |
| 498 |
+ |
break; |
| 499 |
+ |
case Token::wrappedY: |
| 500 |
+ |
pos = mol->getCom(); |
| 501 |
+ |
info->getSnapshotManager()->getCurrentSnapshot()->wrapVector(pos); |
| 502 |
+ |
propertyValue = pos.y(); |
| 503 |
+ |
break; |
| 504 |
+ |
case Token::wrappedZ: |
| 505 |
+ |
pos = mol->getCom(); |
| 506 |
+ |
info->getSnapshotManager()->getCurrentSnapshot()->wrapVector(pos); |
| 507 |
+ |
propertyValue = pos.z(); |
| 508 |
+ |
break; |
| 509 |
+ |
case Token::r: |
| 510 |
+ |
propertyValue = mol->getCom().length(); |
| 511 |
+ |
break; |
| 512 |
+ |
default: |
| 513 |
+ |
unrecognizedMoleculeProperty(property); |
| 514 |
+ |
} |
| 515 |
+ |
|
| 516 |
+ |
bool match = false; |
| 517 |
+ |
switch (comparator) { |
| 518 |
+ |
case Token::opLT: |
| 519 |
+ |
match = propertyValue < comparisonValue; |
| 520 |
+ |
break; |
| 521 |
+ |
case Token::opLE: |
| 522 |
+ |
match = propertyValue <= comparisonValue; |
| 523 |
+ |
break; |
| 524 |
+ |
case Token::opGE: |
| 525 |
+ |
match = propertyValue >= comparisonValue; |
| 526 |
+ |
break; |
| 527 |
+ |
case Token::opGT: |
| 528 |
+ |
match = propertyValue > comparisonValue; |
| 529 |
+ |
break; |
| 530 |
+ |
case Token::opEQ: |
| 531 |
+ |
match = propertyValue == comparisonValue; |
| 532 |
+ |
break; |
| 533 |
+ |
case Token::opNE: |
| 534 |
+ |
match = propertyValue != comparisonValue; |
| 535 |
+ |
break; |
| 536 |
+ |
} |
| 537 |
+ |
|
| 538 |
+ |
if (match) |
| 539 |
+ |
bs.bitsets_[MOLECULE].setBitOn(mol->getGlobalIndex()); |
| 540 |
+ |
} |
| 541 |
+ |
|
| 542 |
+ |
void SelectionEvaluator::compareProperty(Molecule* mol, SelectionSet& bs, |
| 543 |
+ |
int property, int comparator, |
| 544 |
+ |
float comparisonValue, int frame) { |
| 545 |
+ |
RealType propertyValue = 0.0; |
| 546 |
+ |
Vector3d pos; |
| 547 |
+ |
switch (property) { |
| 548 |
+ |
case Token::mass: |
| 549 |
+ |
propertyValue = mol->getMass(); |
| 550 |
+ |
break; |
| 551 |
+ |
case Token::charge: |
| 552 |
+ |
{ |
| 553 |
+ |
Molecule::AtomIterator ai; |
| 554 |
+ |
Atom* atom; |
| 555 |
+ |
for (atom = mol->beginAtom(ai); atom != NULL; |
| 556 |
+ |
atom = mol->nextAtom(ai)) { |
| 557 |
+ |
propertyValue+= getCharge(atom,frame); |
| 558 |
+ |
} |
| 559 |
+ |
} |
| 560 |
+ |
break; |
| 561 |
+ |
case Token::x: |
| 562 |
+ |
propertyValue = mol->getCom(frame).x(); |
| 563 |
+ |
break; |
| 564 |
+ |
case Token::y: |
| 565 |
+ |
propertyValue = mol->getCom(frame).y(); |
| 566 |
+ |
break; |
| 567 |
+ |
case Token::z: |
| 568 |
+ |
propertyValue = mol->getCom(frame).z(); |
| 569 |
+ |
break; |
| 570 |
+ |
case Token::wrappedX: |
| 571 |
+ |
pos = mol->getCom(frame); |
| 572 |
+ |
info->getSnapshotManager()->getSnapshot(frame)->wrapVector(pos); |
| 573 |
+ |
propertyValue = pos.x(); |
| 574 |
+ |
break; |
| 575 |
+ |
case Token::wrappedY: |
| 576 |
+ |
pos = mol->getCom(frame); |
| 577 |
+ |
info->getSnapshotManager()->getSnapshot(frame)->wrapVector(pos); |
| 578 |
+ |
propertyValue = pos.y(); |
| 579 |
+ |
break; |
| 580 |
+ |
case Token::wrappedZ: |
| 581 |
+ |
pos = mol->getCom(frame); |
| 582 |
+ |
info->getSnapshotManager()->getSnapshot(frame)->wrapVector(pos); |
| 583 |
+ |
propertyValue = pos.z(); |
| 584 |
+ |
break; |
| 585 |
+ |
|
| 586 |
+ |
case Token::r: |
| 587 |
+ |
propertyValue = mol->getCom(frame).length(); |
| 588 |
+ |
break; |
| 589 |
+ |
default: |
| 590 |
+ |
unrecognizedMoleculeProperty(property); |
| 591 |
+ |
} |
| 592 |
+ |
|
| 593 |
+ |
bool match = false; |
| 594 |
+ |
switch (comparator) { |
| 595 |
+ |
case Token::opLT: |
| 596 |
+ |
match = propertyValue < comparisonValue; |
| 597 |
+ |
break; |
| 598 |
+ |
case Token::opLE: |
| 599 |
+ |
match = propertyValue <= comparisonValue; |
| 600 |
+ |
break; |
| 601 |
+ |
case Token::opGE: |
| 602 |
+ |
match = propertyValue >= comparisonValue; |
| 603 |
+ |
break; |
| 604 |
+ |
case Token::opGT: |
| 605 |
+ |
match = propertyValue > comparisonValue; |
| 606 |
+ |
break; |
| 607 |
+ |
case Token::opEQ: |
| 608 |
+ |
match = propertyValue == comparisonValue; |
| 609 |
+ |
break; |
| 610 |
+ |
case Token::opNE: |
| 611 |
+ |
match = propertyValue != comparisonValue; |
| 612 |
+ |
break; |
| 613 |
+ |
} |
| 614 |
+ |
if (match) |
| 615 |
+ |
bs.bitsets_[MOLECULE].setBitOn(mol->getGlobalIndex()); |
| 616 |
+ |
|
| 617 |
+ |
|
| 618 |
+ |
} |
| 619 |
|
void SelectionEvaluator::compareProperty(StuntDouble* sd, SelectionSet& bs, |
| 620 |
|
int property, int comparator, |
| 621 |
|
float comparisonValue, int frame) { |
| 692 |
|
break; |
| 693 |
|
} |
| 694 |
|
if (match) |
| 695 |
< |
bs.bitsets_[STUNTDOUBLE].setBitOn(sd->getGlobalIndex()); |
| 540 |
< |
|
| 541 |
< |
|
| 695 |
> |
bs.bitsets_[STUNTDOUBLE].setBitOn(sd->getGlobalIndex()); |
| 696 |
|
} |
| 697 |
< |
|
| 697 |
> |
|
| 698 |
> |
|
| 699 |
|
void SelectionEvaluator::withinInstruction(const Token& instruction, |
| 700 |
|
SelectionSet& bs){ |
| 701 |
|
|