| 448 |  | } | 
| 449 |  |  | 
| 450 |  | NonBondedInteractionType* ForceField::getNonBondedInteractionType(const std::string &at1, const std::string &at2) { | 
| 451 | + |  | 
| 452 |  | std::vector<std::string> keys; | 
| 453 |  | keys.push_back(at1); | 
| 454 |  | keys.push_back(at2); | 
| 455 | < |  | 
| 455 | > |  | 
| 456 |  | //try exact match first | 
| 457 |  | NonBondedInteractionType* nbiType = nonBondedInteractionTypeCont_.find(keys); | 
| 458 |  | if (nbiType) { | 
| 459 |  | return nbiType; | 
| 460 |  | } else { | 
| 461 | < | //if no exact match found, try wild card match | 
| 462 | < | return nonBondedInteractionTypeCont_.find(keys, wildCardAtomTypeName_); | 
| 463 | < | } | 
| 461 | > | AtomType* atype1; | 
| 462 | > | AtomType* atype2; | 
| 463 | > | std::vector<std::string> at1key; | 
| 464 | > | at1key.push_back(at1); | 
| 465 | > | atype1 = atomTypeCont_.find(at1key); | 
| 466 | > |  | 
| 467 | > | std::vector<std::string> at2key; | 
| 468 | > | at2key.push_back(at2); | 
| 469 | > | atype2 = atomTypeCont_.find(at2key); | 
| 470 | > |  | 
| 471 | > | // query atom types for their chains of responsibility | 
| 472 | > | std::vector<AtomType*> at1Chain = atype1->allYourBase(); | 
| 473 | > | std::vector<AtomType*> at2Chain = atype2->allYourBase(); | 
| 474 | > |  | 
| 475 | > | std::vector<AtomType*>::iterator i; | 
| 476 | > | std::vector<AtomType*>::iterator j; | 
| 477 | > |  | 
| 478 | > | int ii = 0; | 
| 479 | > | int jj = 0; | 
| 480 | > | int nbiTypeScore; | 
| 481 | > |  | 
| 482 | > | std::vector<std::pair<int, std::vector<std::string> > > foundNBI; | 
| 483 | > |  | 
| 484 | > | for (i = at1Chain.begin(); i != at1Chain.end(); i++) { | 
| 485 | > | jj = 0; | 
| 486 | > | for (j = at2Chain.begin(); j != at2Chain.end(); j++) { | 
| 487 | > |  | 
| 488 | > | nbiTypeScore = ii + jj; | 
| 489 | > |  | 
| 490 | > | std::vector<std::string> myKeys; | 
| 491 | > | myKeys.push_back((*i)->getName()); | 
| 492 | > | myKeys.push_back((*j)->getName()); | 
| 493 | > |  | 
| 494 | > | NonBondedInteractionType* nbiType = nonBondedInteractionTypeCont_.find(myKeys); | 
| 495 | > | if (nbiType) { | 
| 496 | > | foundNBI.push_back(std::make_pair(nbiTypeScore, myKeys)); | 
| 497 | > | } | 
| 498 | > | jj++; | 
| 499 | > | } | 
| 500 | > | ii++; | 
| 501 | > | } | 
| 502 | > |  | 
| 503 | > |  | 
| 504 | > | if (foundNBI.size() > 0) { | 
| 505 | > | // sort the foundNBI by the score: | 
| 506 | > | std::sort(foundNBI.begin(), foundNBI.end()); | 
| 507 | > |  | 
| 508 | > | int bestScore = foundNBI[0].first; | 
| 509 | > | std::vector<std::string> theKeys = foundNBI[0].second; | 
| 510 | > |  | 
| 511 | > | NonBondedInteractionType* bestType = nonBondedInteractionTypeCont_.find(theKeys); | 
| 512 | > | return bestType; | 
| 513 | > | } else { | 
| 514 | > | //if no exact match found, try wild card match | 
| 515 | > | return nonBondedInteractionTypeCont_.find(keys, wildCardAtomTypeName_); | 
| 516 | > | } | 
| 517 | > | } | 
| 518 |  | } | 
| 519 |  |  | 
| 520 |  | BondType* ForceField::getExactBondType(const std::string &at1, |