void Geometry::computeGasteigerCharges() { // This is returning zero charges for some reason return; qDebug() << "Geometry::computeGasteigerCharges() not working correctly"; OpenBabel::OBAtom* obAtom(0); OpenBabel::OBMol obMol; obMol.BeginModify(); obMol.UnsetPartialChargesPerceived(); for (int i = 0; i < m_atoms.size(); ++i) { obAtom = obMol.NewAtom(); obAtom->SetAtomicNum(m_atoms[i]->atomicNumber()); obAtom->SetVector(m_coordinates[i].x, m_coordinates[i].y, m_coordinates[i].z); } obMol.SetTotalCharge(m_charge); obMol.SetTotalSpinMultiplicity(m_multiplicity); obMol.EndModify(); OpenBabel::OBMolAtomIter iter(&obMol); for (int i = 0; i < m_atoms.size(); ++i, ++iter) { int index(iter->GetIdx()); qDebug() << "Setting Gasteiger Charge for" << index << "to" << iter->GetPartialCharge(); GasteigerCharge& charge(m_atoms[i]->getProperty<GasteigerCharge>()); charge.setValue(iter->GetPartialCharge()); } }
List Factory::convert(Data::Geometry& geometry) { List list; Atoms* atoms(new Atoms()); Bonds* bonds(new Bonds()); list.append(atoms); list.append(bonds); unsigned nAtoms(geometry.nAtoms()); OpenBabel::OBMol obMol; obMol.BeginModify(); AtomMap atomMap; for (unsigned i = 0; i < nAtoms; ++i) { unsigned Z(geometry.atomicNumber(i)); qglviewer::Vec position(geometry.position(i)); Atom* atom(new Atom(geometry.atomicNumber(i))); atom->setPosition(geometry.position(i)); atoms->appendLayer(atom); OpenBabel::OBAtom* obAtom(obMol.NewAtom()); obAtom->SetAtomicNum(Z); obAtom->SetVector(position.x, position.y, position.z); atomMap.insert(obAtom, atom); } obMol.SetTotalCharge(geometry.charge()); obMol.SetTotalSpinMultiplicity(geometry.multiplicity()); obMol.EndModify(); obMol.ConnectTheDots(); obMol.PerceiveBondOrders(); for (OpenBabel::OBMolBondIter obBond(&obMol); obBond; ++obBond) { Atom* begin(atomMap.value(obBond->GetBeginAtom())); Atom* end(atomMap.value(obBond->GetEndAtom())); Bond* bond(new Bond(begin, end)); bond->setOrder(obBond->GetBondOrder()); bonds->appendLayer(bond); } return list; }
Data::Geometry* ZMatrixCoordinates::parse(QString const& str) { OpenBabel::OBConversion conv; conv.SetInFormat("gzmat"); // create dummy z-matrix input std::string s("#\n\nzmat\n\n0 1\n"); s += str.toStdString(); OpenBabel::OBMol mol; std::istringstream iss(s); conv.Read(&mol, &iss); Data::Geometry* geometry(new Data::Geometry); for (::OpenBabel::OBMolAtomIter obAtom(&mol); obAtom; ++obAtom) { qglviewer::Vec position(obAtom->x(), obAtom->y(), obAtom->z()); unsigned Z(obAtom->GetAtomicNum()); geometry->append(Z, position); } geometry->computeGasteigerCharges(); return geometry; }