Files
rdkit/Code/GraphMol/CIPLabeler/Digraph.h
tadhurst-cdd d5d4d194ec atropisomer handling added (#6903)
* atropisomer handling added

* fixed non-used variables,  linking directives

* BOOST LIB start/stop fixes, linking fix

* Fixes for RDKIT CI errors

* minimalLib fix

* changed vector<enum> for java builds

* check for extra chars in CIP labeling

* removed wrong deprecated message

* fix ostrstream output error?

* restored _ChiralAtomRank to lowercase first letter

* changes for merged master

* Fixed catch label for new Catch package

* update expected psql results

* get swig wrappers building

* restore MolFileStereochem to FileParsers

* fix java wrapper for reapplyMolBlockWedging

* some suggestions

* move a couple functions out of Bond

* Merge branch 'master' into pr/atropisomers2

* merged master

* Renamed setStereoanyFromSquiggleBond

* atropisomers in cdxml, rationalize atrop wedging, stereoGroups in drawMol

* fix for CI build

* attempt to fix java build in CI

* attempt to fix java build in CI #2

* New routine to remove non-explicit  3D-geneated chirality

* changed to use pair for atrop atoms and related bonds

* Changes as per PR reviews

* PR review respnses

* PR review reponse - more

* Fix merge from master

* fixing java ci after merge

* Updated the help doc for atripisomers

* update the atropisomer docs

* improve the images

* add the source CXSMILES

---------

Co-authored-by: greg landrum <greg.landrum@gmail.com>
2023-12-22 04:58:18 +01:00

121 lines
2.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// Digraph is the core data structure for determining
// CahnIngoldPrelog (CIP) chirality of a molecule.
//
// It's a "directed graph" - meaning that each bond
// has a start and an end. For CIP determination,
// the start points back towards the atom that is
// being labelled.
//
// Copyright (C) 2020 Schrödinger, LLC
//
// @@ All Rights Reserved @@
// This file is part of the RDKit.
// The contents are covered by the terms of the BSD license
// which is included in the file license.txt, found at the root
// of the RDKit source tree.
//
#pragma once
#include <list>
#include <vector>
#include <boost/rational.hpp>
#include "TooManyNodesException.h"
namespace RDKit {
class Atom;
class Bond;
namespace CIPLabeler {
class Node;
class Edge;
class CIPMol;
/**
* A class to hold directed acyclic graphs representing the molecule.
*
* The root of the DAG is one of the foci of the configuration for
* which the label is being calculated. The tmproot may be set to
* other nodes that may become relevant in the calculation.
*
*/
class Digraph {
public:
Digraph() = delete;
Digraph(const Digraph &) = delete;
Digraph &operator=(const Digraph &) = delete;
Digraph(const CIPMol &mol, Atom *atom, bool atropsomerMode = false);
const CIPMol &getMol() const;
Node *getOriginalRoot() const;
Node *getCurrentRoot() const;
int getNumNodes() const;
/**
* Get all nodes which refer to `atom` in order of
* distance from the root.
*/
std::vector<Node *> getNodes(Atom *atom) const;
/**
* Access the reference atom for Rule 6 (if one is set).
*/
Atom *getRule6Ref() const;
/**
* Used exclusively for Rule 6, we set one atom as the reference.
* @param ref reference atom
*/
void setRule6Ref(Atom *ref);
/**
* Sets the root node of this digraph by flipping the directions
* of edges as required.
*
* This is more efficient than building a new Digraph, but is
* only valid for neighboring Nodes.
*
* @param newroot the new root
*/
void changeRoot(Node *newroot);
void expand(Node *beg);
Node &addNode(std::vector<char> &&visit, Atom *atom,
boost::rational<int> &&frac, int dist, int flags);
private:
const CIPMol &d_mol;
// The node from which the Digraph is first initialized.
// It matches the atom that is being labeled.
Node *dp_origin = nullptr;
// in atropisomer mode, we expand the two atoms of the atrop bond
bool d_atropisomerMode = false;
// The current root of the Digraph
Node *dp_root = nullptr;
Atom *dp_rule6Ref = nullptr;
// We can't store these in a vector, as adding new items will
// cause it to reallocate and invalidate the references
std::list<Node> d_nodes;
std::list<Edge> d_edges;
void addEdge(Node *beg, Bond *bond, Node *end);
};
} // namespace CIPLabeler
} // namespace RDKit