Первая говноверсия говнопроливновых говноспиралей.
[alexxy/gromacs-dssp.git] / src / dssptools.h
index 048d1533e4577dd9102e8706d7f0916996dbf3e9..940dd42cb4389a4acabbf28a999c681549e85730 100644 (file)
@@ -77,6 +77,7 @@ struct initParameters {
     real                                                 cutoff_; // = 4.0; ???
     NBSearchMethod                                       NBS;
     bool                                                 verbose, PPHelices, addHydrogens;
+    int                                                  pp_stretch;
 };
 
 enum class backboneAtomTypes : std::size_t
@@ -122,11 +123,11 @@ enum class secondaryStructureTypes : std::size_t { // TODO
     Break, // =
     Bend, // S
     Turn, // T
-    Helis_PPII, // P
+    Helix_PP, // P
     Helix_5, // I
     Helix_3, // G
-    Bridge, // B
     Strand, // E
+    Bridge, // B
     Helix_4, // H
     Count
 
@@ -136,6 +137,7 @@ enum class turnsTypes : std::size_t {
     Turn_3 = 0,
     Turn_4,
     Turn_5,
+    Turn_PP,
     Count
 };
 
@@ -158,13 +160,13 @@ enum class bridgeTypes : std::size_t {
 class secondaryStructures{ // PatterSearch Wrapper
 public:
     secondaryStructures();
-    void                    initiateSearch(const std::vector<ResInfo> &ResInfoMatrix, const bool PiHelicesPreferencez = true);
+    void                    initiateSearch(const std::vector<ResInfo> &ResInfoMatrix, const bool PiHelicesPreferencez, const int _pp_stretch);
     std::string             patternSearch();
     ~secondaryStructures();
 
     class secondaryStructuresData{ // PatternSearch Tool
     public:
-        void                                setStatus(const secondaryStructureTypes secondaryStructureTypeName);
+        void                                setStatus(const secondaryStructureTypes secondaryStructureTypeName, bool status = true);
         void                                setStatus(const HelixPositions helixPosition, const turnsTypes turn);
         bool                                getStatus(const secondaryStructureTypes secondaryStructureTypeName) const, isBreakPartnerWith(const secondaryStructuresData *partner) const;
         HelixPositions                      getStatus(const turnsTypes turn) const;
@@ -173,13 +175,14 @@ public:
         bool                                hasBridges() const, hasBridges(bridgeTypes bridgeType) const, isBridgePartnerWith(secondaryStructuresData *bridgePartner, bridgeTypes bridgeType) const;
         std::size_t                         getBridgePartnerIndex(bridgeTypes bridgeType) const;
         secondaryStructuresData             getBridgePartner(bridgeTypes bridgeType) const;
+        void                                set_phi(const ResInfo resi), set_psi(const ResInfo resi);
     private:
         std::array<bool, static_cast<std::size_t>(secondaryStructureTypes::Count)>  SecondaryStructuresStatusArray{ true, 0, 0, 0, 0, 0, 0 };
         secondaryStructuresData                                        *breakPartners[2]{nullptr, nullptr};
         secondaryStructuresData                                        *bridgePartners[2]{nullptr, nullptr};
         std::size_t                                                     bridgePartnersIndexes[2]{};
         secondaryStructureTypes                                         SecondaryStructuresStatus {secondaryStructureTypes::Loop};
-        std::array<HelixPositions, static_cast<std::size_t>(turnsTypes::Count)>  TurnsStatusArray {HelixPositions::None, HelixPositions::None, HelixPositions::None};
+        std::array<HelixPositions, static_cast<std::size_t>(turnsTypes::Count)>  TurnsStatusArray {HelixPositions::None, HelixPositions::None, HelixPositions::None, HelixPositions::None};
     };
 
     std::vector<secondaryStructuresData>     SecondaryStructuresStatusMap;
@@ -188,13 +191,14 @@ private:
     const std::vector<ResInfo>                                       *ResInfoMap;
 
     const gmx::EnumerationArray<secondaryStructureTypes, const char> secondaryStructureTypeNames = {
-       { '~', '=', 'S', 'T', 'P', 'I', 'G', 'B', 'E', 'H'}
+       { '~', '=', 'S', 'T', 'P', 'I', 'G', 'E', 'B', 'H'}
     };
     std::string     SecondaryStructuresStringLine;
 
     bool            hasHBondBetween(std::size_t resi1, std::size_t resi2) const;
 
     bool            NoChainBreaksBetween(std::size_t ResiStart, std::size_t ResiEnd) const, isLoop(const std::size_t resiIndex) const, PiHelixPreference;
+    int8_t          pp_stretch;
     bridgeTypes     calculateBridge(std::size_t i, std::size_t j) const;
     void            analyzeBridgesAndStrandsPatterns(), analyzeTurnsAndHelicesPatterns(), analyzePPHelicesPatterns();
 
@@ -239,7 +243,7 @@ private:
    initParameters                        initParams;
    AtomsDataPtr                          atoms_;
    std::string                           filename_;
-   void                                  calculateBends(const t_trxframe& fr, const t_pbc* pbc);
+   void                                  calculateBends(const t_trxframe& fr, const t_pbc* pbc), calculateDihedrals(const t_trxframe& fr, const t_pbc* pbc);
    std::vector<std::string>              ResiNames;
    std::vector<std::size_t>              AtomResi;
    std::vector<ResInfo>                  IndexMap;
@@ -253,6 +257,7 @@ private:
                                                                    const t_pbc*               pbc);
    float CalculateAtomicDistances(const int &A, const int &B, const t_trxframe &fr, const t_pbc *pbc);
    float CalculateAtomicDistances(const rvec &A, const int &B, const t_trxframe &fr, const t_pbc *pbc);
+   float CalculateDihedralAngle(const int &A, const int &B, const int &C, const int &D, const t_trxframe &fr, const t_pbc *pbc);
 
    class DsspStorage
    {