| Client Algorithms |
SMARTS language
The atomic primitives provided are:
| Symbol | Description | Default |
|---|---|---|
| * | any atom | no default |
| a | aromatic atom | no default |
| A | aliphatic atom | no default |
| D<n> | n number of connections | 1 |
| H<n> | n total number of Hydrogens attached | 1 |
| h<n> | n implicit number of Hydrogens attached | 1 |
| R<n> | the atoms belongs to n SSSR rings | any ring atom |
| r<n> | the atoms belongs to a SSSR ring of size n | any ring atom |
| X<n> | n number of total connections | 1 |
| x<n> | n total ring connections | at least 1 |
| -<n> | -n charge | -1 (-- is -2) |
| +<n> | +n charge | +1 (++ is +2) |
| #<n> | atomic number of n | no default |
Additional CDL atomic primitives are
| Symbol | Description | Default |
|---|---|---|
| j<n> | Vertex index equals n | no defaults. Must provide a value. This primitive is handy when searching for subgroups from a certain distance of a known atom: i.e. [j15]~*~*~*~[$([NX3+](=O)[O-])] searches a Nitro group 4 bonds apart from the vertex of index 15 |
| < | repositions the index of the second smarts graph vertex to the one of the LHS of symbol <
This symbol is actually not an atomic primitive, hence it should be included in the main branch of a smarts (it should not be included in brackets). |
no arguments required. Please refer to the fusion operator of the CDL chemical algebra |
The bond primitives provided :
| Symbol | Description |
|---|---|
| - | single bond |
| = | double bond |
| # | triple bond |
| : | aromatic bond |
| ~ | any bond |
| @ | any ring bond |
Logical operators:
| Symbol | Operator | Description |
|---|---|---|
| , | or | Lazy evaluator of LHS or RHS |
| ! | not | negates the subsequent rule |
| & | and | Lazy operator. Checks first LHS |
| ; | and | Lazy operator. Checks first RHS |
template <class Molecule>
struct smarts {
typedef Molecule molecule_t;
smarts(const std::string& smart_str);
bool operator()(const molecule_t& external_mol);
bool empty();
const mapped_cont_t& get_mapped_vertices() const;
size_t smarts_size() const;
};
mapped_cont_t is of type std::vector<std::vector<std::pair<vertex_descriptor,vertex_descriptor> > > which provides the same mapping as explained in the indexed_molecule.
For component grouping use the following class :
template <class Molecule>
struct component_smarts {
typedef Molecule molecule_t;
component_smarts(const std::string& smart_str);
bool operator()(const molecule_t& external_mol);
private :
std::vector<std::string> m_component_smarts;
};
This implementation of componen grouping accepts groups enclosed by parenthesis. If an initial zero-level parenthesis is present, then the following groups must be enclosed by parenthesis: i.e. "(" must follow a "."