Molassembler  3.0.0
Molecule graph and conformer library
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Composites.h
Go to the documentation of this file.
1 
12 #ifndef INCLUDE_MOLASSEMBLER_STEREOPERMUTATION_COMPOSITES_H
13 #define INCLUDE_MOLASSEMBLER_STEREOPERMUTATION_COMPOSITES_H
14 
20 
21 #include "boost/optional.hpp"
22 
23 namespace Scine {
24 namespace Molassembler {
25 namespace Stereopermutations {
26 
34 class MASM_EXPORT Composite {
35 public:
39  struct AngleGroup {
41  double angle;
43  std::vector<Shapes::Vertex> vertices;
48  bool isotropic;
49  };
50 
56  struct OrientationState : public Temple::Crtp::LexicographicComparable<OrientationState> {
70  std::size_t identifier;
71 
74  Shapes::Shape passShape,
75  Shapes::Vertex passFusedVertex,
76  Stereopermutation::Occupation passOccupation,
77  std::size_t passIdentifier
78  );
79 
84  Stereopermutation::Occupation rotateOccupation(const std::vector<Shapes::Vertex>& rotation) const;
85 
90  Shapes::Vertex lowestEqualVertexInShape() const;
91 
99  std::vector<Shapes::Vertex> findReductionMapping(Shapes::Vertex reducedFusedVertex) const;
100 
115  [[nodiscard]] std::vector<Shapes::Vertex> transformToCanonical();
116 
123  void revert(const std::vector<Shapes::Vertex>& reversionMapping);
124 
132  AngleGroup smallestAngleGroup() const;
133 
135  inline auto tie() const {
136  // Comparisons should be performed in canonical space
137  const Shapes::Vertex reducedVertex = lowestEqualVertexInShape();
138  return std::make_tuple(
139  shape,
140  reducedVertex,
141  rotateOccupation(findReductionMapping(reducedVertex))
142  );
143  }
144  };
145 
147  enum class Alignment {
149  Eclipsed,
151  Staggered,
153  EclipsedAndStaggered,
155  BetweenEclipsedAndStaggered
156  };
157 
159  struct Permutation {
160  using DihedralTuple = std::tuple<Shapes::Vertex, Shapes::Vertex, double>;
161  using VertexPair = std::pair<Shapes::Vertex, Shapes::Vertex>;
162 
163  bool close(const std::vector<DihedralTuple>& comparisonDihedrals) const;
164 
166  VertexPair alignedVertices;
170  std::vector<DihedralTuple> dihedrals;
172  boost::optional<VertexPair> rankingEquivalentTo;
173  };
174 
175  using PermutationsList = std::vector<Permutation>;
176 
178  static bool isDuplicate(
179  Permutation permutation,
180  const PermutationsList& permutations,
181  double degrees
182  );
183 
184  static PermutationsList deduplicate(PermutationsList permutations, double degrees);
185 
187 
188  double dihedral(
189  Shapes::Vertex firstVertex,
190  Shapes::Vertex secondVertex
191  ) const;
192 
193  Permutation align(
194  Shapes::Vertex firstVertex,
195  Shapes::Vertex secondVertex,
196  Alignment alignment
197  );
198 
199  PermutationsList generateEclipsedOrStaggered(
200  Alignment alignment,
201  double deduplicationDegrees
202  );
203 
205  Alignment alignment,
206  double deduplicationDegrees=15
207  );
208 
212  std::pair<Shapes::Permutation, Shapes::Permutation> reversionMappings;
213  std::pair<AngleGroup, AngleGroup> angleGroups;
214  std::pair<Eigen::MatrixXd, Eigen::MatrixXd> coordinates;
216  };
218 
221 
228  Composite(
231  Alignment alignment = Alignment::Eclipsed
232  );
234 //
239  Temple::Math::toRadians(1.0)
240  };
241 
250  static std::vector<Shapes::Vertex> generateRotation(
252  Shapes::Vertex fixedVertex,
253  const std::vector<Shapes::Vertex>& changedVertices
254  );
255 
256  static std::vector<Shapes::Vertex> rotation(
258  Shapes::Vertex fixedVertex,
259  const std::vector<Shapes::Vertex>& perpendicularPlaneVertices
260  );
262 
265  void applyIdentifierPermutation(const std::vector<std::size_t>& permutation);
266 
267  template<typename F>
268  void updateIdentifiers(F f) {
269  // NOTE: OrientationState identifiers are not part of their comparison
270  // operators, so no reordering can take place
271  for(auto& orientationState : orientations_) {
272  orientationState.identifier = f(orientationState.identifier);
273  }
274  }
276 
280  const PermutationsList& allPermutations() const;
281 
286  bool isIsotropic() const;
287 
289  std::pair<unsigned, unsigned> orders() const;
290 
297  unsigned order() const;
298 
300  unsigned rotationalAxisSymmetryOrder() const;
301 
306  const Temple::OrderedPair<OrientationState>& orientations() const;
307 
309  unsigned rankingEquivalentBase(unsigned permutation) const;
310 
312  std::vector<unsigned> nonEquivalentPermutationIndices() const;
313 
319  unsigned countNonEquivalentPermutations() const;
320 
325  Alignment alignment() const;
327 
331  PermutationsList::const_iterator begin() const;
332  PermutationsList::const_iterator end() const;
334 
338  bool operator < (const Composite& other) const;
340  bool operator == (const Composite& other) const;
342  bool operator != (const Composite& other) const;
344 
345 private:
350 
353 
357 
372  static double perpendicularSubstituentAngle(
373  double angleFromBoundShapeVertex,
374  double angleBetweenSubstituents
375  );
376 };
377 
378 } // namespace Stereopermutations
379 } // namespace Molassembler
380 } // namespace Scine
381 
382 #endif
Alignment
Relative orientation of substituent groups along the dihedral.
Definition: Composites.h:147
Temple::OrderedPair< OrientationState > orientations_
Stores the relative orientation with which the permutations were generated.
Definition: Composites.h:349
double angle
The angle from this vertex group to the fused position in radians.
Definition: Composites.h:41
Generates all operators using a method returning a tuple.
Definition: OperatorSuppliers.h:78
Alignment alignment_
Stores with which Alignment the stereopermutations were generated.
Definition: Composites.h:355
Base class to describe substituent arrangements in shapes.
ShapeResult shape(const PositionCollection &normalizedPositions, Shape shape)
Forwarding function to calculate the continuous shape measure.
A group of shape vertices at an angle from the fused position.
Definition: Composites.h:39
auto tie() const
Full tuple-like lexicographical comparison of members in order of declaration.
Definition: Composites.h:135
std::vector< WideHashType > generate(const PrivateGraph &inner, boost::optional< const StereopermutatorList & > stereopermutatorsOption, AtomEnvironmentComponents bitmask)
Generates the hashes for every atom in a molecule&#39;s components.
Class representing a single rotational permutation.
Definition: Composites.h:159
PURITY_STRONG unsigned order(PointGroup group)
Returns the number of symmetry elements in a point group.
Encompasses the orientation of a shape along a fused bond.
Definition: Composites.h:56
Centralizes basic shape data in runtime types.
A class that imitates std::pair&lt;T, U&gt;, but whose template arguments are homogeneous and the stored va...
Definition: OrderedPair.h:36
constexpr Get< 1 > second
Calls std::get&lt;1&gt; on any argument it is invoked with.
Definition: Functor.h:125
PermutationsList stereopermutations_
List of dihedral sets that comprise all spatial arrangements.
Definition: Composites.h:352
Stereopermutation::Occupation occupation
Ranking occupation of shape vertices of this shape.
Definition: Composites.h:62
std::vector< Permutation > PermutationsList
Relative orientation of substituent groups along the dihedral.
Definition: Composites.h:175
Alignment alignment
Alignment used to generate this permutation.
Definition: Composites.h:168
constexpr Get< 0 > first
Calls std::get&lt;0&gt; on any argument it is invoked with.
Definition: Functor.h:123
bool isotropic
Whether the ranking characters indicate that this group of shape vertices is isotropic.
Definition: Composites.h:48
Defines symmetry names and total count.
Coordinates coordinates(Shape shape)
Fetch a shape&#39;s idealized coordiantes.
Shape
Enumeration of all contained symmetry names.
Definition: Shapes.h:28
Shapes::Shape shape
The shape of either positional shape.
Definition: Composites.h:58
boost::optional< VertexPair > rankingEquivalentTo
Shape vertices this permutation is ranking equivalent to, if applicable.
Definition: Composites.h:172
std::size_t identifier
An identifier to the shape source.
Definition: Composites.h:70
Shapes::Vertex fusedVertex
The shape vertex of the local shape that the other is fused at.
Definition: Composites.h:60
VertexPair alignedVertices
Shape vertices aligned for this set of dihedrals.
Definition: Composites.h:166
An ordered homogeneous pair-like class.
std::vector< DihedralTuple > dihedrals
Set of dihedrals between all relevant vertices along the bond.
Definition: Composites.h:170
Helpers for comparing floating point values.
std::vector< Shapes::Vertex > vertices
The shape vertices making up this group.
Definition: Composites.h:43
Represents the composite of two shapes joined by a bond at arbitrary shape vertices.
Definition: Composites.h:34