core/indigo-core/molecule/molecule.h (137 lines of code) (raw):
/****************************************************************************
* 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.
***************************************************************************/
#ifndef __molecule_h__
#define __molecule_h__
#include "molecule/base_molecule.h"
#include "molecule/molecule_sgroups.h"
#ifdef _WIN32
#pragma warning(push)
#pragma warning(disable : 4251)
#endif
namespace indigo
{
class DLLEXPORT Molecule : public BaseMolecule
{
public:
Molecule();
Molecule& asMolecule() override;
void clear() override;
BaseMolecule* neu() override;
int addAtom(int label) override;
int resetAtom(int idx, int label);
void setPseudoAtom(int idx, const char* text);
bool isTemplateAtom(int idx) override;
int getTemplateAtomOccurrence(int idx) override;
virtual int addTemplateAtom(const char* text) override;
void setTemplateAtom(int idx, const char* text);
int addBond(int beg, int end, int order) override;
int addBond_Silent(int beg, int end, int order) override;
void setAtomCharge(int idx, int charge);
void setAtomCharge_Silent(int idx, int charge);
void setAtomIsotope(int idx, int isotope);
void setAtomRadical(int idx, int radical);
void setValence(int idx, int valence);
void setExplicitValence(int idx, int valence) override;
void resetExplicitValence(int idx);
bool isExplicitValenceSet(int idx);
void setImplicitH(int idx, int impl_h) override;
bool isImplicitHSet(int idx);
// Set bond order method.
// If keep_connectivity is false then connectivity to bond ends
// will be recalculated. Connectivity should be kept only when bond order
// is changed to/from aromatic.
void setBondOrder(int idx, int order, bool keep_connectivity = false);
void setBondOrder_Silent(int idx, int order);
int getAtomNumber(int idx) override;
int getAtomCharge(int idx) override;
int getAtomIsotope(int idx) override;
int getAtomRadical(int idx) override;
int getBondOrder(int idx) const override;
int getBondTopology(int idx) override;
int getAtomAromaticity(int idx) override;
int getExplicitValence(int idx) override;
int getAtomValence(int idx) override;
int getAtomSubstCount(int idx) override;
int getAtomRingBondsCount(int idx) override;
int getAtomConnectivity(int idx) override;
int getAtomMaxH(int idx) override;
int getAtomMinH(int idx) override;
int getAtomTotalH(int idx) override;
bool isPseudoAtom(int idx) override;
const char* getPseudoAtom(int idx) override;
bool isRSite(int atom_idx) override;
dword getRSiteBits(int atom_idx) override;
void allowRGroupOnRSite(int atom_idx, int rg_idx) override;
void setRSiteBits(int atom_idx, int bits);
bool bondStereoCare(int idx) override;
bool aromatize(const AromaticityOptions& options) override;
bool dearomatize(const AromaticityOptions& options) override;
int getImplicitH(int idx, bool impl_h_no_throw) override;
int getImplicitH(int idx);
int getImplicitH_NoThrow(int idx, int fallback);
int calcImplicitHForConnectivity(int idx, int conn);
int getAtomConnectivity_noImplH(int idx);
int getAtomConnectivity_NoThrow(int idx, int fallback);
int calcAtomConnectivity_noImplH(int idx);
void calcAromaticAtomConnectivity(int idx, int& n_arom, int& min_conn);
bool isSaturatedAtom(int idx) override;
int totalHydrogensCount();
bool atomNumberBelongs(int idx, const int* numbers, int count) override;
bool possibleAtomNumber(int idx, int number) override;
bool possibleAtomNumberAndCharge(int idx, int number, int charge) override;
bool possibleAtomNumberAndIsotope(int idx, int number, int isotope) override;
bool possibleAtomIsotope(int idx, int isotope) override;
bool possibleAtomCharge(int idx, int charge) override;
void getAtomDescription(int idx, Array<char>& description) override;
void getBondDescription(int idx, Array<char>& description) override;
bool possibleBondOrder(int idx, int order) override;
int getVacantPiOrbitals(int atom_idx, int* lonepairs_out);
int getVacantPiOrbitals(int atom_idx, int conn, int* lonepairs_out);
static int matchAtomsCmp(Graph& g1, Graph& g2, int idx1, int idx2, void* userdata);
static void saveBondOrders(Molecule& mol, Array<int>& orders);
static void loadBondOrders(Molecule& mol, Array<int>& orders);
void invalidateHCounters();
static void checkForConsistency(Molecule& mol);
static bool shouldWriteHCount(Molecule& mol, int idx);
static bool shouldWriteHCountEx(Molecule& mol, int idx, int h_to_ignore);
bool isAromatized();
bool getIgnoreBadValenceFlag();
void setIgnoreBadValenceFlag(bool flag);
// Check
bool isNitrogenV5(int atom_index);
bool isNitrogenV5ForConnectivity(int atom_index, int conn);
bool isPiBonded(int atom_index) const;
void invalidateAtom(int index, int mask) override;
bool restoreAromaticHydrogens(bool unambiguous_only = true);
bool standardize(const StandardizeOptions& options);
bool ionize(float ph, float ph_toll, const IonizeOptions& options);
bool isPossibleFischerProjection(const char* options);
protected:
struct _Atom
{
int number;
bool explicit_valence;
bool explicit_impl_h;
int isotope;
int charge;
int pseudoatom_value_idx; // if number == ELEM_PSEUDO, this is the corresponding
// index from _pseudo_atom_values
int rgroup_bits; // if number == ELEM_RSITE, these are 32 bits, each allowing
// an r-group with corresponding number to go for this atom.
// Simple 'R' atoms have this field equal to zero.
int template_occur_idx; // if number == ELEM_TEMPLATE, this is the corresponding
// index from _template_occurrences
};
Array<_Atom> _atoms;
Array<int> _bond_orders;
Array<int> _connectivity; // implicit H not included
Array<int> _aromaticity;
Array<int> _implicit_h;
Array<int> _total_h;
Array<int> _valence;
Array<int> _radicals;
StringPool _pseudo_atom_values;
bool _aromatized;
bool _ignore_bad_valence;
void _mergeWithSubmolecule(BaseMolecule& bmol, const Array<int>& vertices, const Array<int>* edges, const Array<int>& mapping, int skip_flags) override;
void _flipBond(int atom_parent, int atom_from, int atom_to) override;
void _removeAtoms(const Array<int>& indices, const int* mapping) override;
// If 'validate' is true then vertex connectivity and implicit hydrogens
// are calculates and stored. If 'validate' is false then connectivity
// information is cleared.
void _validateVertexConnectivity(int idx, bool validate);
void _invalidateVertexCache(int idx);
private:
int _getImplicitHForConnectivity(int idx, int conn, bool use_cache);
};
} // namespace indigo
#ifdef _WIN32
#pragma warning(pop)
#endif
#endif