// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include "../gemmi_gph/gemmi/math.hpp" #include "../gemmi_gph/gemmi/symmetry.hpp" #include #include #include "Coord.h" #include "UnitCell.h" class CrystalLattice { Coord vec[3]; void FixHandedness(); public: void ReorderABEqual(); void ReorderMonoclinic(); CrystalLattice() = default; explicit CrystalLattice(const UnitCell &cell); explicit CrystalLattice(const std::vector& input); CrystalLattice(float a, float b, float c, float alpha, float beta, float gamma); CrystalLattice(const Coord &a, const Coord &b, const Coord &c); [[nodiscard]] float CalcVolume() const; [[nodiscard]] const Coord &Vec0() const; [[nodiscard]] const Coord &Vec1() const; [[nodiscard]] const Coord &Vec2() const; [[nodiscard]] Coord Astar() const; [[nodiscard]] Coord Bstar() const; [[nodiscard]] Coord Cstar() const; [[nodiscard]] UnitCell GetUnitCell() const; [[nodiscard]] std::vector GetVector() const; CrystalLattice FromPrimitive(char centering) const; CrystalLattice ToPrimitive(char centering) const; CrystalLattice Multiply(const RotMatrix &input) const; CrystalLattice Multiply(const gemmi::Mat33 &input) const; void Sort(); void Regularize(const gemmi::CrystalSystem &input); [[nodiscard]] std::vector GetUBMatrix() const; CrystalLattice NiggliReduce() const; void FlipSign(size_t i1); }; inline std::ostream &operator<<( std::ostream &output, const CrystalLattice &in ) { output << in.Vec0() << std::endl << in.Vec1() << std::endl << in.Vec2() << std::endl; return output; }