36std::ostream &
operator<<(std::ostream &os,
const std::optional<T> &opt) {
38 return os << opt.value();
99 return d_matrix == other.d_matrix && d_position == other.d_position;
106 : d_matrix(matrix), d_position(position) {}
108 const ZMatrix *d_matrix =
nullptr;
109 std::size_t d_position = 0;
120 d_internalCoordRefs(nElements),
121 d_torsionDependences(nElements) {
122 d_order.reserve(nElements);
125 void addElement(
unsigned int idx, std::optional<double> length = {},
126 std::optional<unsigned int> bondRef = {},
127 std::optional<double> angle = {},
128 std::optional<unsigned int> angleRef = {},
129 std::optional<TorsionCandidates> torsion = {},
130 std::optional<unsigned int> torionRef = {},
131 std::optional<TorsionDependence> torsionDep = {}) {
132 PRECONDITION(idx < d_internalCoordRefs.size(),
"Index out of range");
133 PRECONDITION(!d_internalCoordRefs[idx],
"element already set");
135 d_order.emplace_back(idx);
137 d_internalCoordRefs[idx] = {length, bondRef, angle,
138 angleRef, torsion, torionRef};
139 d_torsionDependences[idx] = std::move(torsionDep);
143 const unsigned int atomIdx)
const {
144 PRECONDITION(atomIdx < d_internalCoordRefs.size(),
"Invalid atom index");
146 "Accessing an ZMatrix Element that was not set before");
147 return *d_internalCoordRefs[atomIdx];
151 const unsigned int atomIdx)
const {
152 PRECONDITION(atomIdx < d_torsionDependences.size(),
"Invalid atom index");
153 return d_torsionDependences[atomIdx];
157 PRECONDITION(atomIdx < d_internalCoordRefs.size(),
"Invalid atom index");
158 d_internalCoordRefs[atomIdx]->torsion = {torsion};
162 PRECONDITION(atomIdx < d_torsionDependences.size(),
"Invalid atom index");
164 "Atom has no torsion dependence");
165 d_torsionDependences[atomIdx]->offset =
166 -d_torsionDependences[atomIdx]->offset;
170 PRECONDITION(idx < d_order.size(),
"Invalid row index");
171 auto atomIdx = d_order[idx];
173 "Accessing row in matrix that was not set before");
174 return {atomIdx, d_internalCoordRefs[atomIdx].value(),
175 d_torsionDependences[atomIdx]};
204 std::vector<unsigned int> d_order;
205 std::vector<std::optional<InternalCoordinateReference>> d_internalCoordRefs;
206 std::vector<std::optional<TorsionDependence>> d_torsionDependences;
212 os <<
"AtomIdx BondRefernece BondLength AngleReference BondAngle "
213 "TorsionReference TorsionAngle TorsionDependence Offset\n";
215 for (
const auto &[atomIdx, internalReferences, torsionDependence] : zmat) {
216 const auto &[bl, bondRef, ba, angleRef, torsion, torsionRef] =
218 os << atomIdx <<
" " << bl <<
" " << bondRef <<
" " << ba <<
" " << angleRef
219 <<
" " << torsionRef <<
" [";
222 os << r.lower <<
',' << r.upper;
225 for (
const auto t : ts) {
226 os << dequantize(t) <<
"; ";
235 if (torsionDependence) {
236 const auto &[offset, ref] = torsionDependence.value();
237 os <<
" " << ref <<
" " << offset;
RDKIT_GRAPHMOL_EXPORT std::ostream & operator<<(std::ostream &target, const RDKit::Atom &at)
allows Atom objects to be dumped to streams
#define PRECONDITION(expr, mess)
std::ptrdiff_t difference_type
bool operator==(const Iterator &other) const
reference operator*() const
std::bidirectional_iterator_tag iterator_category
bool operator!=(const Iterator &other) const
std::bidirectional_iterator_tag iterator_concept
const std::optional< TorsionDependence > & getTorsionReference(const unsigned int atomIdx) const
const InternalCoordinateReference & getReferences(const unsigned int atomIdx) const
void updateTorsion(const unsigned int atomIdx, TorsionRange torsion)
void addElement(unsigned int idx, std::optional< double > length={}, std::optional< unsigned int > bondRef={}, std::optional< double > angle={}, std::optional< unsigned int > angleRef={}, std::optional< TorsionCandidates > torsion={}, std::optional< unsigned int > torionRef={}, std::optional< TorsionDependence > torsionDep={})
ZMatrixRow operator[](unsigned int idx) const
ZMatrix(unsigned int nElements)
const_iterator cbegin() const
reverse_iterator rbegin()
const_iterator begin() const
const_reverse_iterator rend() const
const_iterator end() const
std::reverse_iterator< const_iterator > const_reverse_iterator
const_iterator cend() const
void invertTorsionDependence(const unsigned int atomIdx)
const_reverse_iterator rbegin() const
const_reverse_iterator crend() const
const_reverse_iterator crbegin() const
std::reverse_iterator< iterator > reverse_iterator
#define RDKIT_DISTGEOMETRY_EXPORT
std::shared_ptr< ZMatrix > ZMatPtr
std::ostream & operator<<(std::ostream &os, const std::optional< T > &opt)
Class to store Z-Matrix.
std::optional< double > angle
std::optional< unsigned int > torsionRef
std::optional< TorsionCandidates > torsion
std::optional< unsigned int > angleRef
std::optional< unsigned int > bondRef
std::optional< double > length
const std::optional< TorsionDependence > & torsionDependence
const InternalCoordinateReference & internal