Skip to content

Commit

Permalink
Merge branch 'openbabel:master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
gfzhou committed Oct 24, 2023
2 parents 5e914b0 + 2e11d9b commit 64159b2
Show file tree
Hide file tree
Showing 12 changed files with 151 additions and 97 deletions.
7 changes: 5 additions & 2 deletions .github/workflows/lint_python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@ jobs:
lint_python:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.10'
- run: pip install --upgrade pip wheel
- run: pip install --upgrade setuptools
- run: pip install bandit black codespell flake8 flake8-bugbear
flake8-comprehensions isort mypy pytest pyupgrade safety
- run: bandit --recursive --skip B101,B314,B404,B405,B602,B603,B607 .
Expand Down
4 changes: 2 additions & 2 deletions src/confsearch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ namespace OpenBabel

const double arr[] = {3.0, 2.0, 1.5, 1.0, 0.5, 0.25};
std::vector<double> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );
vec.erase(std::remove_if(vec.begin(), vec.end(), std::bind2nd(std::less<double>(), (cutoff + 0.1) )), vec.end());
vec.erase(std::remove_if(vec.begin(), vec.end(), [=](double v) { return v < cutoff + 0.1; }), vec.end());
vec.push_back(cutoff);

levels = vec;
Expand Down Expand Up @@ -443,7 +443,7 @@ int OBForceField::DiverseConfGen(double rmsd, unsigned int nconfs, double energy
UpdateConformersFromTree(&_mol, _energies, &divposes, verbose);

// Add back the energy offset
transform(_energies.begin(), _energies.end(), _energies.begin(), bind2nd(std::plus<double>(), energy_offset));
transform(_energies.begin(), _energies.end(), _energies.begin(), [=](double e) { return e + energy_offset; });

// Clean up
delete [] store_initial;
Expand Down
4 changes: 2 additions & 2 deletions src/distgeom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -529,10 +529,10 @@ namespace OpenBabel {

float lBounds = _d->GetLowerBounds(a->GetIdx() - 1, d->GetIdx() - 1) + DIST14_TOL;
float uBounds = _d->GetUpperBounds(a->GetIdx() - 1, d->GetIdx() - 1) - DIST14_TOL;
if (ct->IsTrans(a, d)) {
if (ct->IsTrans(a->GetId(), d->GetId())) {
// lower bounds should be trans (current upper bounds)
_d->SetLowerBounds(a->GetIdx() - 1, d->GetIdx() - 1, uBounds - DIST14_TOL);
} else if (ct->IsCis(a, d)) {
} else if (ct->IsCis(a->GetId(), d->GetId())) {
// upper bounds should be cis (current lower bounds)
_d->SetUpperBounds(a->GetIdx() - 1, d->GetIdx() - 1, lBounds + DIST14_TOL);
}
Expand Down
7 changes: 6 additions & 1 deletion src/formats/cifformat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ namespace OpenBabel
" B Use bonds listed in CIF file from _geom_bond_etc records (overrides option b)\n\n"

"Write Options e.g. -xg:\n"
" w Wrap atomic coordinates to unit cell (default = off)\n"
" g Write bonds using _geom_bond_etc fields \n\n";
}

Expand Down Expand Up @@ -1565,6 +1566,9 @@ namespace OpenBabel
return false;
ostream &ofs = *pConv->GetOutStream();

// default is false - leave coordinates as they are
bool wrapFractional = pConv->IsOption("w", OBConversion::OUTOPTIONS);

char buffer[BUFF_SIZE];

ofs <<"# CIF file generated by openbabel "<<BABEL_VERSION<<", see https://openbabel.org"<<endl;
Expand Down Expand Up @@ -1621,7 +1625,8 @@ namespace OpenBabel
vector3 v = atom->GetVector();
if (pUC != nullptr) {
v = pUC->CartesianToFractional(v);
v = pUC->WrapFractionalCoordinate(v);
if (wrapFractional)
v = pUC->WrapFractionalCoordinate(v);
}
X = v.x();
Y = v.y();
Expand Down
8 changes: 4 additions & 4 deletions src/formats/fchkformat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -665,16 +665,16 @@ namespace OpenBabel
no atom numbers < 0 or > Natoms */
if (NBond.end() != find_if(NBond.begin(),
NBond.end(),
bind2nd(less_equal<int>(), 0)) ||
[](int i) { return i <= 0; }) ||
NBond.end() != find_if(NBond.begin(),
NBond.end(),
bind2nd(greater<int>(), MxBond)) ||
[=](int i) { return i > MxBond; }) ||
IBond.end() != find_if(IBond.begin(),
IBond.end(),
bind2nd(less<int>(), 0)) ||
[](int i) { return i < 0; }) ||
IBond.end() != find_if(IBond.begin(),
IBond.end(),
bind2nd(greater<int>(), Natoms)))
[=](int i) { return i > Natoms; }))
{
error_msg << "Invalid connectivity : check the \"NBond\" and/or"
<< " \"IBond\" section(s).";
Expand Down
7 changes: 6 additions & 1 deletion src/formats/groformat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ bool GROFormat::ReadMolecule(OBBase* pOb, OBConversion* pConv)
string tempstr = "";
long int residx = 0;
OBAtom* atom;
OBResidue* res;
OBResidue* res = nullptr;
OBVectorData* velocity;

if (!ifs || ifs.peek() == EOF) {
Expand Down Expand Up @@ -275,6 +275,11 @@ bool GROFormat::ReadMolecule(OBBase* pOb, OBConversion* pConv)

if (resid == residx) {
// Add atom to an existing residue
if (res == nullptr) {
res = pmol->NewResidue();
res->SetName(resname);
res->SetNum(resid);
}
res->AddAtom(atom);
} else {
// Create new residue and use that
Expand Down
146 changes: 79 additions & 67 deletions src/formats/json/chemicaljsonformat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ namespace OpenBabel

"Write Options, e.g. -xv\n"
" m minified output formatting, with no line breaks or indents\n"
" s single geometry only, ignoring conformers, etc.\n"
" v verbose output (include default values)\n\n";
};

Expand Down Expand Up @@ -229,7 +230,7 @@ namespace OpenBabel
if (properties.HasMember("totalSpinMultiplicity") &&
properties["totalSpinMultiplicity"].IsInt())
{
pmol->SetTotalSpinMultiplicity(inRoot["totalSpinMultiplicity"].GetInt());
pmol->SetTotalSpinMultiplicity(properties["totalSpinMultiplicity"].GetInt());
}
}

Expand Down Expand Up @@ -303,7 +304,9 @@ namespace OpenBabel
// conformers / multiple coordinates
rapidjson::Value coords(rapidjson::kObjectType);
coords.AddMember("3d", coords3d, al); // default coords
if (pmol->NumConformers() > 1)

// -xs option gives only one geometry
if (pmol->NumConformers() > 1 && !pConv->IsOption("s", pConv->OUTOPTIONS))
{
rapidjson::Value conformers(rapidjson::kArrayType);

Expand Down Expand Up @@ -370,6 +373,7 @@ namespace OpenBabel
if (pmol->HasData(OBGenericDataType::UnitCell))
{
OBUnitCell *uc = (OBUnitCell *)pmol->GetData(OBGenericDataType::UnitCell);
if (uc != nullptr) {
rapidjson::Value unitCell(rapidjson::kObjectType);
unitCell.AddMember("a", uc->GetA(), al);
unitCell.AddMember("b", uc->GetB(), al);
Expand All @@ -390,65 +394,69 @@ namespace OpenBabel
}

doc.AddMember("unitCell", unitCell, al);
}
}

// vibrations
if (pmol->HasData(OBGenericDataType::VibrationData))
{
OBVibrationData *vib =
(OBVibrationData *)pmol->GetData(OBGenericDataType::VibrationData);
rapidjson::Value vibrations(rapidjson::kObjectType);

rapidjson::Value frequencies(rapidjson::kArrayType);
rapidjson::Value modes(rapidjson::kArrayType);
vector<double> wavenumbers = vib->GetFrequencies();
unsigned int mode = 1;
unsigned int modeCount = vib->GetNumberOfFrequencies();
for (unsigned int i = 0; i < modeCount; i++)
if (vib != nullptr)
{
frequencies.PushBack(wavenumbers[i], al);
modes.PushBack(mode++, al);
}
vibrations.AddMember("frequencies", frequencies, al);
vibrations.AddMember("modes", modes, al);
rapidjson::Value vibrations(rapidjson::kObjectType);

rapidjson::Value intensities(rapidjson::kArrayType);
vector<double> intensitiesVec = vib->GetIntensities();
for (unsigned int i = 0; i < modeCount; i++)
{
intensities.PushBack(intensitiesVec[i], al);
}
vibrations.AddMember("intensities", intensities, al);
rapidjson::Value frequencies(rapidjson::kArrayType);
rapidjson::Value modes(rapidjson::kArrayType);
vector<double> wavenumbers = vib->GetFrequencies();
unsigned int mode = 1;
unsigned int modeCount = vib->GetNumberOfFrequencies();
for (unsigned int i = 0; i < modeCount; i++)
{
frequencies.PushBack(wavenumbers[i], al);
modes.PushBack(mode++, al);
}
vibrations.AddMember("frequencies", frequencies, al);
vibrations.AddMember("modes", modes, al);

rapidjson::Value raman(rapidjson::kArrayType);
vector<double> ramanVec = vib->GetRamanActivities();
if (ramanVec.size() > 0)
{
rapidjson::Value intensities(rapidjson::kArrayType);
vector<double> intensitiesVec = vib->GetIntensities();
for (unsigned int i = 0; i < modeCount; i++)
{
raman.PushBack(ramanVec[i], al);
intensities.PushBack(intensitiesVec[i], al);
}
vibrations.AddMember("ramanIntensities", raman, al);
}
vibrations.AddMember("intensities", intensities, al);

rapidjson::Value displacements(rapidjson::kArrayType);
auto lx = vib->GetLx();
for (unsigned int i = 0; i < modeCount; i++)
{
rapidjson::Value displacement(rapidjson::kArrayType);
auto obDisp = lx[i]; // this is a vector<vector3>
for (auto j = obDisp.begin(); j != obDisp.end(); ++j)
rapidjson::Value raman(rapidjson::kArrayType);
vector<double> ramanVec = vib->GetRamanActivities();
if (ramanVec.size() > 0)
{
displacement.PushBack(j->x(), al);
displacement.PushBack(j->y(), al);
displacement.PushBack(j->z(), al);
for (unsigned int i = 0; i < modeCount; i++)
{
raman.PushBack(ramanVec[i], al);
}
vibrations.AddMember("ramanIntensities", raman, al);
}

displacements.PushBack(displacement, al);
}
vibrations.AddMember("eigenVectors", displacements, al);
rapidjson::Value displacements(rapidjson::kArrayType);
auto lx = vib->GetLx();
for (unsigned int i = 0; i < modeCount; i++)
{
rapidjson::Value displacement(rapidjson::kArrayType);
auto obDisp = lx[i]; // this is a vector<vector3>
for (auto j = obDisp.begin(); j != obDisp.end(); ++j)
{
displacement.PushBack(j->x(), al);
displacement.PushBack(j->y(), al);
displacement.PushBack(j->z(), al);
}

doc.AddMember("vibrations", vibrations, al);
displacements.PushBack(displacement, al);
}
vibrations.AddMember("eigenVectors", displacements, al);

doc.AddMember("vibrations", vibrations, al);
}
}

// check for electronic spectra (UV/Vis, CD)
Expand All @@ -457,35 +465,39 @@ namespace OpenBabel
OBElectronicTransitionData *edata =
(OBElectronicTransitionData *)pmol->GetData(
OBGenericDataType::ElectronicTransitionData);
rapidjson::Value electronic(rapidjson::kObjectType);
rapidjson::Value energies(rapidjson::kArrayType);
rapidjson::Value intensities(rapidjson::kArrayType);
// get the energies and intensities
std::vector<double> wavelengths = edata->GetWavelengths();
std::vector<double> forces = edata->GetForces();

// we need to convert the wavelengths to eV
const double hc = 1239.841984332; // in eV*nm
for (unsigned int i = 0; i < wavelengths.size(); i++)
{
energies.PushBack(hc / wavelengths[i], al);
intensities.PushBack(forces[i], al);
}
electronic.AddMember("energies", energies, al);
electronic.AddMember("intensities", intensities, al);

std::vector<double> rotatoryStrengthsVec =
edata->GetRotatoryStrengthsLength();
if (rotatoryStrengthsVec.size() > 0)
if (edata != nullptr)
{
rapidjson::Value rotatoryStrengths(rapidjson::kArrayType);
for (unsigned int i = 0; i < rotatoryStrengthsVec.size(); i++)
rapidjson::Value electronic(rapidjson::kObjectType);
rapidjson::Value energies(rapidjson::kArrayType);
rapidjson::Value intensities(rapidjson::kArrayType);
// get the energies and intensities
std::vector<double> wavelengths = edata->GetWavelengths();
std::vector<double> forces = edata->GetForces();

// we need to convert the wavelengths to eV
const double hc = 1239.841984332; // in eV*nm
for (unsigned int i = 0; i < wavelengths.size(); i++)
{
rotatoryStrengths.PushBack(rotatoryStrengthsVec[i], al);
energies.PushBack(hc / wavelengths[i], al);
intensities.PushBack(forces[i], al);
}
electronic.AddMember("energies", energies, al);
electronic.AddMember("intensities", intensities, al);

std::vector<double> rotatoryStrengthsVec =
edata->GetRotatoryStrengthsLength();
if (rotatoryStrengthsVec.size() > 0)
{
rapidjson::Value rotatoryStrengths(rapidjson::kArrayType);
for (unsigned int i = 0; i < rotatoryStrengthsVec.size(); i++)
{
rotatoryStrengths.PushBack(rotatoryStrengthsVec[i], al);
}
electronic.AddMember("rotation", rotatoryStrengths, al);
}
electronic.AddMember("rotation", rotatoryStrengths, al);
spectra.AddMember("electronic", electronic, al);
}
spectra.AddMember("electronic", electronic, al);
}

if (spectra.MemberCount() > 0)
Expand Down
2 changes: 1 addition & 1 deletion src/formats/json/pubchemjsonformat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -760,7 +760,7 @@ class PubChemJSONFormat : public OBMoleculeFormat
// Coordinates
// TODO: An option to round coordinates to n decimal places?
xcoords.PushBack(rapidjson::Value(patom->GetX()).Move(), al);
ycoords.PushBack(rapidjson::Value(patom->GetX()).Move(), al);
ycoords.PushBack(rapidjson::Value(patom->GetY()).Move(), al);
if (pmol->GetDimension() == 3) {
zcoords.PushBack(rapidjson::Value(patom->GetZ()).Move(), al);
}
Expand Down
2 changes: 1 addition & 1 deletion src/formats/pdbqtformat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ namespace OpenBabel
}

double charge = atom->GetPartialCharge();
snprintf(buffer, BUFF_SIZE, "%s%5d %-4s %-3s %c%4d%c %8.3f%8.3f%8.3f 0.00 0.00 %+5.3f %.2s",
snprintf(buffer, BUFF_SIZE, "%s%5d %-4s %-3s %c%4d%c %8.3f%8.3f%8.3f 0.00 0.00 %+8.3f %-2.2s",
het?"HETATM":"ATOM ",
index,
type_name,
Expand Down
Loading

0 comments on commit 64159b2

Please sign in to comment.