// ------------------------------------------------------------------------ // // // // ------------------------------------------------------------------------ void addNonbonded(const ROMol &mol,int confId,const AtomicParamVect ¶ms, ForceFields::ForceField *field,boost::shared_array<boost::uint8_t> neighborMatrix, double vdwThresh,bool ignoreInterfragInteractions){ PRECONDITION(mol.getNumAtoms()==params.size(),"bad parameters"); PRECONDITION(field,"bad forcefield"); INT_VECT fragMapping; if(ignoreInterfragInteractions){ std::vector<ROMOL_SPTR> molFrags=MolOps::getMolFrags(mol,true,&fragMapping); } unsigned int nAtoms=mol.getNumAtoms(); const Conformer &conf = mol.getConformer(confId); for(unsigned int i=0;i<nAtoms;i++){ if(!params[i]) continue; for(unsigned int j=i+1;j<nAtoms;j++){ if(!params[j] || (ignoreInterfragInteractions && fragMapping[i]!=fragMapping[j])){ continue; } if(getTwoBitCell(neighborMatrix,i*nAtoms+j)>=RELATION_1_4){ double dist=(conf.getAtomPos(i) - conf.getAtomPos(j)).length(); if(dist < vdwThresh*Utils::calcNonbondedMinimum(params[i],params[j])){ vdWContrib *contrib; contrib = new vdWContrib(field,i,j,params[i],params[j]); field->contribs().push_back(ForceFields::ContribPtr(contrib)); } } } } }
// ------------------------------------------------------------------------ // // // // ------------------------------------------------------------------------ void addEle(const ROMol &mol, int confId, MMFFMolProperties *mmffMolProperties, ForceFields::ForceField *field, boost::shared_array<boost::uint8_t> neighborMatrix, double nonBondedThresh, bool ignoreInterfragInteractions) { PRECONDITION(field, "bad ForceField"); PRECONDITION(mmffMolProperties, "bad MMFFMolProperties"); PRECONDITION(mmffMolProperties->isValid(), "missing atom types - invalid force-field"); std::ostream &oStream = mmffMolProperties->getMMFFOStream(); INT_VECT fragMapping; if (ignoreInterfragInteractions) { std::vector<ROMOL_SPTR> molFrags = MolOps::getMolFrags(mol, true, &fragMapping); } unsigned int nAtoms = mol.getNumAtoms(); double totalEleEnergy = 0.0; if (mmffMolProperties->getMMFFVerbosity()) { if (mmffMolProperties->getMMFFVerbosity() == MMFF_VERBOSITY_HIGH) { oStream << "\n" "E L E C T R O S T A T I C\n\n" "------ATOMS------ ATOM TYPES\n" " I J I J DISTANCE ENERGY\n" "--------------------------------------------------" << std::endl; } } const Conformer &conf = mol.getConformer(confId); double dielConst = mmffMolProperties->getMMFFDielectricConstant(); boost::uint8_t dielModel = mmffMolProperties->getMMFFDielectricModel(); for (unsigned int i = 0; i < nAtoms; ++i) { for (unsigned int j = i + 1; j < nAtoms; ++j) { if (ignoreInterfragInteractions && (fragMapping[i] != fragMapping[j])) { continue; } boost::uint8_t cell = getTwoBitCell(neighborMatrix, twoBitCellPos(nAtoms, i, j)); bool is1_4 = (cell == RELATION_1_4); if (cell >= RELATION_1_4) { if (isDoubleZero(mmffMolProperties->getMMFFPartialCharge(i)) || isDoubleZero(mmffMolProperties->getMMFFPartialCharge(j))) continue; double dist = (conf.getAtomPos(i) - conf.getAtomPos(j)).length(); if (dist > nonBondedThresh) { continue; } double chargeTerm = mmffMolProperties->getMMFFPartialCharge(i) * mmffMolProperties->getMMFFPartialCharge(j) / dielConst; EleContrib *contrib = new EleContrib( field, i, j, chargeTerm, dielModel, is1_4); field->contribs().push_back(ForceFields::ContribPtr(contrib)); if (mmffMolProperties->getMMFFVerbosity()) { const unsigned int iAtomType = mmffMolProperties->getMMFFAtomType(i); const unsigned int jAtomType = mmffMolProperties->getMMFFAtomType(j); const Atom *iAtom = mol.getAtomWithIdx(i); const Atom *jAtom = mol.getAtomWithIdx(j); const double eleEnergy = MMFF::Utils::calcEleEnergy( i, j, dist, chargeTerm, dielModel, is1_4); if (mmffMolProperties->getMMFFVerbosity() == MMFF_VERBOSITY_HIGH) { oStream << std::left << std::setw(2) << iAtom->getSymbol() << " #" << std::setw(5) << i + 1 << std::setw(2) << jAtom->getSymbol() << " #" << std::setw(5) << j + 1 << std::right << std::setw(5) << iAtomType << std::setw(5) << jAtomType << " " << std::fixed << std::setprecision(3) << std::setw(9) << dist << std::setw(10) << eleEnergy << std::endl; } totalEleEnergy += eleEnergy; } } } } if (mmffMolProperties->getMMFFVerbosity()) { if (mmffMolProperties->getMMFFVerbosity() == MMFF_VERBOSITY_HIGH) { oStream << std::endl; } oStream << "TOTAL ELECTROSTATIC ENERGY =" << std::right << std::setw(16) << std::fixed << std::setprecision(4) << totalEleEnergy << std::endl; } }
// ------------------------------------------------------------------------ // // // // ------------------------------------------------------------------------ void addVdW(const ROMol &mol, int confId, MMFFMolProperties *mmffMolProperties, ForceFields::ForceField *field, boost::shared_array<boost::uint8_t> neighborMatrix, double nonBondedThresh, bool ignoreInterfragInteractions) { PRECONDITION(field, "bad ForceField"); PRECONDITION(mmffMolProperties, "bad MMFFMolProperties"); PRECONDITION(mmffMolProperties->isValid(), "missing atom types - invalid force-field"); std::ostream &oStream = mmffMolProperties->getMMFFOStream(); INT_VECT fragMapping; if (ignoreInterfragInteractions) { std::vector<ROMOL_SPTR> molFrags = MolOps::getMolFrags(mol, true, &fragMapping); } unsigned int nAtoms = mol.getNumAtoms(); double totalVdWEnergy = 0.0; if (mmffMolProperties->getMMFFVerbosity()) { if (mmffMolProperties->getMMFFVerbosity() == MMFF_VERBOSITY_HIGH) { oStream << "\n" "V A N D E R W A A L S\n\n" "------ATOMS------ ATOM TYPES " " WELL\n" " I J I J DISTANCE ENERGY R* " " DEPTH\n" "-------------------------------------------------------------" "-------" << std::endl; } } const Conformer &conf = mol.getConformer(confId); for (unsigned int i = 0; i < nAtoms; ++i) { for (unsigned int j = i + 1; j < nAtoms; ++j) { if (ignoreInterfragInteractions && (fragMapping[i] != fragMapping[j])) { continue; } if (getTwoBitCell(neighborMatrix, twoBitCellPos(nAtoms, i, j)) >= RELATION_1_4) { double dist = (conf.getAtomPos(i) - conf.getAtomPos(j)).length(); if (dist > nonBondedThresh) { continue; } MMFFVdWRijstarEps mmffVdWConstants; if (mmffMolProperties->getMMFFVdWParams(i, j, mmffVdWConstants)) { VdWContrib *contrib = new VdWContrib(field, i, j, &mmffVdWConstants); field->contribs().push_back(ForceFields::ContribPtr(contrib)); if (mmffMolProperties->getMMFFVerbosity()) { const Atom *iAtom = mol.getAtomWithIdx(i); const Atom *jAtom = mol.getAtomWithIdx(j); const double vdWEnergy = MMFF::Utils::calcVdWEnergy( dist, mmffVdWConstants.R_ij_star, mmffVdWConstants.epsilon); if (mmffMolProperties->getMMFFVerbosity() == MMFF_VERBOSITY_HIGH) { unsigned int iAtomType = mmffMolProperties->getMMFFAtomType(i); unsigned int jAtomType = mmffMolProperties->getMMFFAtomType(j); oStream << std::left << std::setw(2) << iAtom->getSymbol() << " #" << std::setw(5) << i + 1 << std::setw(2) << jAtom->getSymbol() << " #" << std::setw(5) << j + 1 << std::right << std::setw(5) << iAtomType << std::setw(5) << jAtomType << " " << std::fixed << std::setprecision(3) << std::setw(9) << dist << std::setw(10) << vdWEnergy << std::setw(9) << mmffVdWConstants.R_ij_star << std::setw(9) << mmffVdWConstants.epsilon << std::endl; } totalVdWEnergy += vdWEnergy; } } } } } if (mmffMolProperties->getMMFFVerbosity()) { if (mmffMolProperties->getMMFFVerbosity() == MMFF_VERBOSITY_HIGH) { oStream << std::endl; } oStream << "TOTAL VAN DER WAALS ENERGY =" << std::right << std::setw(16) << std::fixed << std::setprecision(4) << totalVdWEnergy << std::endl; } }
// ------------------------------------------------------------------------ // // the two-bit matrix returned by this contains: // 0: if atoms i and j are directly connected // 1: if atoms i and j are connected via an atom // 2: if atoms i and j are in a 1,4 relationship // 3: otherwise // // NOTE: the caller is responsible for calling delete [] // on the result // // ------------------------------------------------------------------------ boost::shared_array<boost::uint8_t> buildNeighborMatrix(const ROMol &mol) { const boost::uint8_t RELATION_1_X_INIT = RELATION_1_X | (RELATION_1_X << 2) | (RELATION_1_X << 4) | (RELATION_1_X << 6); unsigned int nAtoms = mol.getNumAtoms(); unsigned nTwoBitCells = (nAtoms * (nAtoms + 1) - 1) / 8 + 1; boost::shared_array<boost::uint8_t> res(new boost::uint8_t[nTwoBitCells]); std::memset(res.get(), RELATION_1_X_INIT, nTwoBitCells); for (ROMol::ConstBondIterator bondi = mol.beginBonds(); bondi != mol.endBonds(); ++bondi) { setTwoBitCell(res, twoBitCellPos(nAtoms, (*bondi)->getBeginAtomIdx(), (*bondi)->getEndAtomIdx()), RELATION_1_2); unsigned int bondiBeginAtomIdx = (*bondi)->getBeginAtomIdx(); unsigned int bondiEndAtomIdx = (*bondi)->getEndAtomIdx(); for (ROMol::ConstBondIterator bondj = bondi; ++bondj != mol.endBonds();) { int idx1 = -1; int idx3 = -1; unsigned int bondjBeginAtomIdx = (*bondj)->getBeginAtomIdx(); unsigned int bondjEndAtomIdx = (*bondj)->getEndAtomIdx(); if (bondiBeginAtomIdx == bondjBeginAtomIdx) { idx1 = bondiEndAtomIdx; idx3 = bondjEndAtomIdx; } else if (bondiBeginAtomIdx == bondjEndAtomIdx) { idx1 = bondiEndAtomIdx; idx3 = bondjBeginAtomIdx; } else if (bondiEndAtomIdx == bondjBeginAtomIdx) { idx1 = bondiBeginAtomIdx; idx3 = bondjEndAtomIdx; } else if (bondiEndAtomIdx == bondjEndAtomIdx) { idx1 = bondiBeginAtomIdx; idx3 = bondjBeginAtomIdx; } else { // check if atoms i and j are in a 1,4-relationship if ((mol.getBondBetweenAtoms(bondiBeginAtomIdx, bondjBeginAtomIdx)) && (getTwoBitCell(res, twoBitCellPos(nAtoms, bondiEndAtomIdx, bondjEndAtomIdx)) == RELATION_1_X)) { setTwoBitCell( res, twoBitCellPos(nAtoms, bondiEndAtomIdx, bondjEndAtomIdx), RELATION_1_4); } else if ((mol.getBondBetweenAtoms(bondiBeginAtomIdx, bondjEndAtomIdx)) && (getTwoBitCell(res, twoBitCellPos(nAtoms, bondiEndAtomIdx, bondjBeginAtomIdx)) == RELATION_1_X)) { setTwoBitCell( res, twoBitCellPos(nAtoms, bondiEndAtomIdx, bondjBeginAtomIdx), RELATION_1_4); } else if ((mol.getBondBetweenAtoms(bondiEndAtomIdx, bondjBeginAtomIdx)) && (getTwoBitCell(res, twoBitCellPos(nAtoms, bondiBeginAtomIdx, bondjEndAtomIdx)) == RELATION_1_X)) { setTwoBitCell( res, twoBitCellPos(nAtoms, bondiBeginAtomIdx, bondjEndAtomIdx), RELATION_1_4); } else if ((mol.getBondBetweenAtoms(bondiEndAtomIdx, bondjEndAtomIdx)) && (getTwoBitCell(res, twoBitCellPos(nAtoms, bondiBeginAtomIdx, bondjBeginAtomIdx)) == RELATION_1_X)) { setTwoBitCell( res, twoBitCellPos(nAtoms, bondiBeginAtomIdx, bondjBeginAtomIdx), RELATION_1_4); } } if (idx1 > -1) { setTwoBitCell(res, twoBitCellPos(nAtoms, idx1, idx3), RELATION_1_3); } } } return res; }