| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #pragma once |
|
|
| |
| |
|
|
| #include <cif++.hpp> |
|
|
| #include <filesystem> |
|
|
| class dssp |
| { |
| public: |
| struct residue; |
|
|
| enum class structure_type : char |
| { |
| Loop = ' ', |
| Alphahelix = 'H', |
| Betabridge = 'B', |
| Strand = 'E', |
| Helix_3 = 'G', |
| Helix_5 = 'I', |
| Helix_PPII = 'P', |
| Turn = 'T', |
| Bend = 'S' |
| }; |
|
|
| enum class helix_type |
| { |
| _3_10, |
| alpha, |
| pi, |
| pp |
| }; |
|
|
| enum class helix_position_type |
| { |
| None, |
| Start, |
| End, |
| StartAndEnd, |
| Middle |
| }; |
|
|
| static constexpr size_t kHistogramSize = 30; |
|
|
| struct statistics |
| { |
| struct |
| { |
| uint32_t residues, chains, SS_bridges, intra_chain_SS_bridges, H_bonds; |
| uint32_t H_bonds_in_antiparallel_bridges, H_bonds_in_parallel_bridges; |
| uint32_t H_Bonds_per_distance[11]; |
| } count; |
|
|
| double accessible_surface; |
|
|
| struct |
| { |
| uint32_t residues_per_alpha_helix[kHistogramSize]; |
| uint32_t parallel_bridges_per_ladder[kHistogramSize]; |
| uint32_t antiparallel_bridges_per_ladder[kHistogramSize]; |
| uint32_t ladders_per_sheet[kHistogramSize]; |
| } histogram; |
| }; |
|
|
| enum class chain_break_type |
| { |
| None, |
| NewChain, |
| Gap |
| }; |
|
|
| dssp(const cif::datablock &db, int model_nr, int min_poly_proline_stretch_length, bool calculateSurfaceAccessibility); |
| dssp(const cif::mm::structure &s, int min_poly_proline_stretch_length, bool calculateSurfaceAccessibility); |
|
|
| ~dssp(); |
|
|
| dssp(const dssp &) = delete; |
| dssp &operator=(const dssp &) = delete; |
|
|
| statistics get_statistics() const; |
|
|
| class iterator; |
| using res_iterator = typename std::vector<residue>::iterator; |
|
|
| class residue_info |
| { |
| public: |
| friend class iterator; |
|
|
| residue_info() = default; |
| residue_info(const residue_info &rhs) = default; |
| residue_info &operator=(const residue_info &rhs) = default; |
|
|
| explicit operator bool() const { return not empty(); } |
| bool empty() const { return m_impl == nullptr; } |
|
|
| std::string asym_id() const; |
| int seq_id() const; |
| std::string alt_id() const; |
| std::string compound_id() const; |
| char compound_letter() const; |
|
|
| std::string auth_asym_id() const; |
| int auth_seq_id() const; |
|
|
| std::string pdb_strand_id() const; |
| int pdb_seq_num() const; |
| std::string pdb_ins_code() const; |
|
|
| std::optional<float> alpha() const; |
| std::optional<float> kappa() const; |
| std::optional<float> phi() const; |
| std::optional<float> psi() const; |
| std::optional<float> tco() const; |
| std::optional<float> omega() const; |
|
|
| bool is_pre_pro() const; |
| bool is_cis() const { return std::abs(omega().value_or(360)) < 30.0f; } |
|
|
| float chiral_volume() const; |
| std::size_t nr_of_chis() const; |
| float chi(std::size_t index) const; |
|
|
| std::tuple<float, float, float> ca_location() const; |
|
|
| chain_break_type chain_break() const; |
|
|
| |
| int nr() const; |
|
|
| structure_type type() const; |
|
|
| int ssBridgeNr() const; |
|
|
| helix_position_type helix(helix_type helixType) const; |
|
|
| bool is_alpha_helix_end_before_start() const; |
|
|
| bool bend() const; |
|
|
| double accessibility() const; |
|
|
| |
| std::tuple<residue_info, int, bool> bridge_partner(int i) const; |
|
|
| int sheet() const; |
| int strand() const; |
|
|
| |
| std::tuple<residue_info, double> acceptor(int i) const; |
| std::tuple<residue_info, double> donor(int i) const; |
|
|
| |
| bool operator==(const residue_info &rhs) const |
| { |
| return m_impl == rhs.m_impl; |
| } |
|
|
| |
| friend bool test_bond(residue_info const &a, residue_info const &b); |
|
|
| private: |
| residue_info(residue *res) |
| : m_impl(res) |
| { |
| } |
|
|
| residue *m_impl = nullptr; |
| }; |
|
|
| class iterator |
| { |
| public: |
| using iterator_category = std::bidirectional_iterator_tag; |
| using value_type = residue_info; |
| using difference_type = std::ptrdiff_t; |
| using pointer = value_type *; |
| using reference = value_type &; |
|
|
| iterator(const iterator &i) = default; |
| iterator(residue *res); |
| iterator &operator=(const iterator &i) = default; |
|
|
| reference operator*() { return m_current; } |
| pointer operator->() { return &m_current; } |
|
|
| iterator &operator++(); |
| iterator operator++(int) |
| { |
| auto tmp(*this); |
| this->operator++(); |
| return tmp; |
| } |
|
|
| iterator &operator--(); |
| iterator operator--(int) |
| { |
| auto tmp(*this); |
| this->operator--(); |
| return tmp; |
| } |
|
|
| bool operator==(const iterator &rhs) const { return m_current.m_impl == rhs.m_current.m_impl; } |
| bool operator!=(const iterator &rhs) const { return m_current.m_impl != rhs.m_current.m_impl; } |
|
|
| private: |
| residue_info m_current; |
| }; |
|
|
| using value_type = residue_info; |
|
|
| |
| using key_type = std::tuple<std::string, int>; |
|
|
| iterator begin() const; |
| iterator end() const; |
|
|
| residue_info operator[](const key_type &key) const; |
|
|
| bool empty() const { return begin() == end(); } |
|
|
| |
| |
|
|
| void write_legacy_output(std::ostream& os) const; |
|
|
| |
| void annotate(cif::datablock &db, bool writeOther, bool writeDSSPCategories) const; |
|
|
| |
|
|
| enum class pdb_record_type |
| { |
| HEADER, |
| COMPND, |
| SOURCE, |
| AUTHOR |
| }; |
|
|
| std::string get_pdb_header_line(pdb_record_type pdb_record) const; |
|
|
| private: |
| struct DSSP_impl *m_impl; |
| }; |
|
|
|
|