Skip to content

Commit

Permalink
api: added numRotatableBonds, numHydrogenBondAcceptors, numHydrogenBo…
Browse files Browse the repository at this point in the history
…ndDonors (#748)
  • Loading branch information
mkviatkovskii authored May 30, 2022
1 parent 5f933b7 commit 234d55e
Show file tree
Hide file tree
Showing 18 changed files with 494 additions and 1 deletion.
3 changes: 3 additions & 0 deletions api/c/indigo/indigo.h
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,9 @@ CEXPORT double indigoMostAbundantMass(int molecule);
CEXPORT double indigoMonoisotopicMass(int molecule);
CEXPORT const char* indigoMassComposition(int molecule);
CEXPORT double indigoTPSA(int molecule, int includeSP);
CEXPORT int indigoNumRotatableBonds(int molecule);
CEXPORT int indigoNumHydrogenBondAcceptors(int molecule);
CEXPORT int indigoNumHydrogenBondDonors(int molecule);

CEXPORT const char* indigoCanonicalSmiles(int molecule);
CEXPORT const char* indigoLayeredCode(int molecule);
Expand Down
48 changes: 47 additions & 1 deletion api/c/indigo/src/indigo_calc.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <base_cpp/output.h>
#include <molecule/lipinski.h>
#include <molecule/molecule_gross_formula.h>
#include <molecule/molecule_mass.h>
#include <molecule/tpsa.h>
Expand Down Expand Up @@ -141,7 +142,52 @@ CEXPORT double indigoTPSA(const int molecule, const int includeSP)
auto& mol = obj.getMolecule();
return TPSA::calculate(mol, static_cast<bool>(includeSP));
}
throw IndigoError("incorrect object type for TPSA calculation: %s", obj.debugInfo());
throw IndigoError("incorrect object type for TPSA calculation: %s, should be molecule", obj.debugInfo());
}
INDIGO_END(-1);
}

CEXPORT int indigoNumRotatableBonds(const int molecule)
{
INDIGO_BEGIN
{
auto& obj = self.getObject(molecule);
if (IndigoMolecule::is(obj))
{
auto& mol = obj.getMolecule();
return Lipinski::getNumRotatableBonds(mol);
}
throw IndigoError("incorrect object type for calculation number of rotatable bonds: %s, should be molecule", obj.debugInfo());
}
INDIGO_END(-1);
}

CEXPORT int indigoNumHydrogenBondAcceptors(const int molecule)
{
INDIGO_BEGIN
{
auto& obj = self.getObject(molecule);
if (IndigoMolecule::is(obj))
{
auto& mol = obj.getMolecule();
return Lipinski::getNumHydrogenBondAcceptors(mol);
}
throw IndigoError("incorrect object type for calculation number of hydrogen bond acceptors: %s, should be molecule", obj.debugInfo());
}
INDIGO_END(-1);
}

CEXPORT int indigoNumHydrogenBondDonors(const int molecule)
{
INDIGO_BEGIN
{
auto& obj = self.getObject(molecule);
if (IndigoMolecule::is(obj))
{
auto& mol = obj.getMolecule();
return Lipinski::getNumHydrogenBondDonors(mol);
}
throw IndigoError("incorrect object type for calculation number of hydrogen bond donors: %s, should be molecule", obj.debugInfo());
}
INDIGO_END(-1);
}
20 changes: 20 additions & 0 deletions api/cpp/src/IndigoMolecule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,23 @@ double IndigoMolecule::molecularWeight() const
{
return session()->_checkResultFloat(indigoMolecularWeight(id()));
}

double IndigoMolecule::tpsa(const bool includeSP) const
{
return session()->_checkResultFloat(indigoTPSA(id(), static_cast<int>(includeSP)));
}

int IndigoMolecule::numRotatableBonds() const
{
return session()->_checkResult(indigoNumRotatableBonds(id()));
}

int IndigoMolecule::numHydrogenBondAcceptors() const
{
return session()->_checkResult(indigoNumHydrogenBondAcceptors(id()));
}

int IndigoMolecule::numHydrogenBondDonors() const
{
return session()->_checkResult(indigoNumHydrogenBondDonors(id()));
}
4 changes: 4 additions & 0 deletions api/cpp/src/IndigoMolecule.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ namespace indigo_cpp
~IndigoMolecule() final = default;

double molecularWeight() const;
double tpsa(bool includeSP = false) const;
int numRotatableBonds() const;
int numHydrogenBondAcceptors() const;
int numHydrogenBondDonors() const;
};

using IndigoMoleculeSPtr = std::shared_ptr<IndigoMolecule>;
Expand Down
109 changes: 109 additions & 0 deletions api/cpp/tests/basic/molecule.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/****************************************************************************
* Copyright (C) from 2009 to Present EPAM Systems.
*
* This file is part of Indigo toolkit.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/

#include <gtest/gtest.h>

#include <IndigoMolecule.h>

#include "common.h"

using namespace indigo_cpp;

TEST(Molecule, molecularWeight)
{
const auto& session = IndigoSession::create();
{
const auto& molecule = session->loadMolecule(METHANE);
EXPECT_NEAR(16.042, molecule.molecularWeight(), 0.01);
}
{
const auto& molecule = session->loadMolecule(CAFFEINE);
EXPECT_NEAR(194.191, molecule.molecularWeight(), 0.01);
}
{
const auto& molecule = session->loadMolecule(SULFASALAZINE);
EXPECT_NEAR(398.393, molecule.molecularWeight(), 0.01);
}
}

TEST(Molecule, tpsa)
{
const auto& session = IndigoSession::create();
{
const auto& molecule = session->loadMolecule(METHANE);
EXPECT_NEAR(0.0, molecule.tpsa(), 0.01);
EXPECT_NEAR(0.0, molecule.tpsa(true), 0.01);
}
{
const auto& molecule = session->loadMolecule(CAFFEINE);
EXPECT_NEAR(58.44, molecule.tpsa(), 0.01);
EXPECT_NEAR(58.44, molecule.tpsa(true), 0.01);
}
{
const auto& molecule = session->loadMolecule(SULFASALAZINE);
EXPECT_NEAR(141.31, molecule.tpsa(), 0.01);
EXPECT_NEAR(149.69, molecule.tpsa(true), 0.01);
}
}

TEST(Molecule, numRotatableBonds)
{
const auto& session = IndigoSession::create();
{
const auto& molecule = session->loadMolecule(METHANE);
EXPECT_EQ(0, molecule.numRotatableBonds());
}
{
const auto& molecule = session->loadMolecule(CAFFEINE);
EXPECT_EQ(0, molecule.numRotatableBonds());
}
{
const auto& molecule = session->loadMolecule(SULFASALAZINE);
EXPECT_EQ(6, molecule.numRotatableBonds());
}
}

TEST(Molecule, numHydrogenBondAcceptors)
{
const auto& session = IndigoSession::create();
{
const auto& molecule = session->loadMolecule(METHANE);
EXPECT_EQ(0, molecule.numHydrogenBondAcceptors());
}
{
const auto& molecule = session->loadMolecule(CAFFEINE);
EXPECT_EQ(6, molecule.numHydrogenBondAcceptors());
}
{
const auto& molecule = session->loadMolecule(SULFASALAZINE);
EXPECT_EQ(9, molecule.numHydrogenBondAcceptors());
}
}

TEST(Molecule, numHydrogenBondDonors)
{
const auto& session = IndigoSession::create();
{
const auto& molecule = session->loadMolecule(CAFFEINE);
EXPECT_EQ(0, molecule.numHydrogenBondDonors());
}
{
const auto& molecule = session->loadMolecule(SULFASALAZINE);
EXPECT_EQ(3, molecule.numHydrogenBondDonors());
}
}
4 changes: 4 additions & 0 deletions api/cpp/tests/common.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

#include <string>

#define METHANE "C"
#define CAFFEINE "CN1C=NC2=C1C(=O)N(C(=O)N2C)C"
#define SULFASALAZINE "C1=CC=NC(=C1)NS(=O)(=O)C2=CC=C(C=C2)N=NC3=CC(=C(C=C3)O)C(=O)O"

namespace indigo_cpp
{
std::string dataPath(const char* dataPathSuffix);
Expand Down
9 changes: 9 additions & 0 deletions api/dotnet/src/IndigoLib.cs
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,15 @@ public static extern int indigoSetSGroupBrackets(int sgroup, int brk_style, floa
[DllImport("indigo"), SuppressUnmanagedCodeSecurity]
public static extern double indigoTPSA(int molecule, bool includeSP);

[DllImport("indigo"), SuppressUnmanagedCodeSecurity]
public static extern int indigoNumRotatableBonds(int molecule);

[DllImport("indigo"), SuppressUnmanagedCodeSecurity]
public static extern int indigoNumHydrogenBondAcceptors(int molecule);

[DllImport("indigo"), SuppressUnmanagedCodeSecurity]
public static extern int indigoNumHydrogenBondDonors(int molecule);

[DllImport("indigo"), SuppressUnmanagedCodeSecurity]
public static extern byte* indigoCanonicalSmiles(int molecule);

Expand Down
18 changes: 18 additions & 0 deletions api/dotnet/src/IndigoObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1397,6 +1397,24 @@ public double tpsa(bool includeSP = false)
return dispatcher.checkResult(IndigoLib.indigoTPSA(self, includeSP));
}

public int numRotatableBonds()
{
dispatcher.setSessionID();
return dispatcher.checkResult(IndigoLib.indigoNumRotatableBonds(self));
}

public int numHydrogenBondAcceptors()
{
dispatcher.setSessionID();
return dispatcher.checkResult(IndigoLib.indigoNumHydrogenBondAcceptors(self));
}

public int numHydrogenBondDonors()
{
dispatcher.setSessionID();
return dispatcher.checkResult(IndigoLib.indigoNumHydrogenBondDonors(self));
}

public string canonicalSmiles()
{
dispatcher.setSessionID();
Expand Down
6 changes: 6 additions & 0 deletions api/java/indigo/src/main/java/com/epam/indigo/IndigoLib.java
Original file line number Diff line number Diff line change
Expand Up @@ -599,6 +599,12 @@ int indigoSetSGroupBrackets(

double indigoTPSA(int molecule, boolean includeSP);

int indigoNumRotatableBonds(int molecule);

int indigoNumHydrogenBondAcceptors(int molecule);

int indigoNumHydrogenBondDonors(int molecule);

Pointer indigoCanonicalSmiles(int molecule);

Pointer indigoLayeredCode(int molecule);
Expand Down
15 changes: 15 additions & 0 deletions api/java/indigo/src/main/java/com/epam/indigo/IndigoObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -825,6 +825,21 @@ public double tpsa(boolean includeSP) {
return Indigo.checkResultDouble(this, lib.indigoTPSA(self, includeSP));
}

public int numRotatableBonds() {
dispatcher.setSessionID();
return Indigo.checkResult(this, lib.indigoNumRotatableBonds(self));
}

public int numHydrogenBondAcceptors() {
dispatcher.setSessionID();
return Indigo.checkResult(this, lib.indigoNumHydrogenBondAcceptors(self));
}

public int numHydrogenBondDonors() {
dispatcher.setSessionID();
return Indigo.checkResult(this, lib.indigoNumHydrogenBondDonors(self));
}

public String canonicalSmiles() {
dispatcher.setSessionID();
return Indigo.checkResultString(this, lib.indigoCanonicalSmiles(self));
Expand Down
39 changes: 39 additions & 0 deletions api/python/indigo/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3230,6 +3230,39 @@ def tpsa(self, includeSP=False):
Indigo._lib.indigoTPSA(self.id, includeSP)
)

def numRotatableBonds(self):
"""Molecule method returns the number of rotatable bonds
Returns:
int: number of rotatable bonds
"""
self.dispatcher._setSessionId()
return self.dispatcher._checkResult(
Indigo._lib.indigoNumRotatableBonds(self.id)
)

def numHydrogenBondAcceptors(self):
"""Molecule method returns the number of hydrogen bond acceptors
Returns:
float: number of hydrogen bond acceptors
"""
self.dispatcher._setSessionId()
return self.dispatcher._checkResult(
Indigo._lib.indigoNumHydrogenBondAcceptors(self.id)
)

def numHydrogenBondDonors(self):
"""Molecule method returns the number of hydrogen bond donors
Returns:
float: number of hydrogen bond donors
"""
self.dispatcher._setSessionId()
return self.dispatcher._checkResult(
Indigo._lib.indigoNumHydrogenBondDonors(self.id)
)

def canonicalSmiles(self):
"""Molecule or reaction method returns canonical smiles
Expand Down Expand Up @@ -5029,6 +5062,12 @@ def __init__(self, path=None):
Indigo._lib.indigoMassComposition.argtypes = [c_int]
Indigo._lib.indigoTPSA.restype = c_double
Indigo._lib.indigoTPSA.argtypes = [c_int, c_int]
Indigo._lib.indigoNumRotatableBonds.restype = c_int
Indigo._lib.indigoNumRotatableBonds.argtypes = [c_int]
Indigo._lib.indigoNumHydrogenBondAcceptors.restype = c_int
Indigo._lib.indigoNumHydrogenBondAcceptors.argtypes = [c_int]
Indigo._lib.indigoNumHydrogenBondDonors.restype = c_int
Indigo._lib.indigoNumHydrogenBondDonors.argtypes = [c_int]
Indigo._lib.indigoCanonicalSmiles.restype = c_char_p
Indigo._lib.indigoCanonicalSmiles.argtypes = [c_int]
Indigo._lib.indigoCanonicalSmarts.restype = c_char_p
Expand Down
Empty file.
Loading

0 comments on commit 234d55e

Please sign in to comment.