asdsadasdsad
authorMax <Infinity2573@gmail.com>
Mon, 26 Sep 2022 22:20:49 +0000 (01:20 +0300)
committerMax <Infinity2573@gmail.com>
Mon, 26 Sep 2022 22:20:49 +0000 (01:20 +0300)
src/dssptools.cpp
src/dssptools.h

index 2086ac3df93efbb2e35ed3f6b810f3ebafd46dd4..287f81e18dfe2fa5b5c426c7d23ba25f990148c2 100644 (file)
@@ -127,12 +127,14 @@ void secondaryStructures::secondaryStructuresData::setBreak(secondaryStructuresD
     setStatus(secondaryStructureTypes::Break);
 }
 
-void secondaryStructures::secondaryStructuresData::setBridge(secondaryStructuresData *bridgePartner, bridgeTypes bridgeType){
+void secondaryStructures::secondaryStructuresData::setBridge(secondaryStructuresData *bridgePartner, std::size_t bridgePartnerIndex, bridgeTypes bridgeType){
     if(bridgeType == bridgeTypes::ParallelBridge){
         bridgePartners[0] = bridgePartner;
+        bridgePartnersIndexes[0] = bridgePartnerIndex;
     }
     else if (bridgeType == bridgeTypes::AntiParallelBridge){
         bridgePartners[1] = bridgePartner;
+        bridgePartnersIndexes[1] = bridgePartnerIndex;
     }
 }
 
@@ -141,6 +143,18 @@ bool secondaryStructures::secondaryStructuresData::hasBridges() const{
 
 }
 
+bool secondaryStructures::secondaryStructuresData::hasBridges(bridgeTypes bridgeType) const{
+    if(bridgeType == bridgeTypes::ParallelBridge){
+        return bridgePartners[0] != nullptr;
+    }
+    else if (bridgeType == bridgeTypes::AntiParallelBridge){
+        return bridgePartners[1] != nullptr;
+    }
+
+    return false;
+
+}
+
 bool secondaryStructures::secondaryStructuresData::isBridgePartnerWith(secondaryStructuresData *bridgePartner, bridgeTypes bridgeType) const{
     if(bridgeType == bridgeTypes::ParallelBridge){
         return bridgePartners[0] == bridgePartner;
@@ -151,6 +165,20 @@ bool secondaryStructures::secondaryStructuresData::isBridgePartnerWith(secondary
     return false;
 }
 
+std::size_t secondaryStructures::secondaryStructuresData::getBridgePartnerIndex(bridgeTypes bridgeType) const{
+    if (bridgeType == bridgeTypes::ParallelBridge){
+        return bridgePartnersIndexes[0];
+    }
+    return bridgePartnersIndexes[1];
+}
+
+secondaryStructures::secondaryStructuresData secondaryStructures::secondaryStructuresData::getBridgePartner(bridgeTypes bridgeType) const{
+    if(bridgeType == bridgeTypes::ParallelBridge){
+        return *(bridgePartners[0]);
+    }
+    return *(bridgePartners[1]);
+}
+
 bool secondaryStructures::hasHBondBetween(std::size_t Donor, std::size_t Acceptor) const{
     if( (*ResInfoMap)[Donor].acceptor[0] == nullptr ||
         (*ResInfoMap)[Donor].acceptor[1] == nullptr ||
@@ -234,20 +262,21 @@ bridgeTypes secondaryStructures::calculateBridge(std::size_t i, std::size_t j) c
     return bridgeTypes::None;
 }
 
-void secondaryStructures::analyzeBridgesAndLaddersPatterns(){
+void secondaryStructures::analyzeBridgesAndStrandsPatterns(){
+//  Calculate Bridgez
     for(std::size_t i {1}; i + 4 < SecondaryStructuresStatusMap.size(); ++i){
         for(std::size_t j {i + 3}; j + 1 < SecondaryStructuresStatusMap.size(); ++j ){
             switch(calculateBridge(i, j)){
             case bridgeTypes::ParallelBridge : {
-                SecondaryStructuresStatusMap[i].setBridge(&(SecondaryStructuresStatusMap[j]), bridgeTypes::ParallelBridge);
+                SecondaryStructuresStatusMap[i].setBridge(&(SecondaryStructuresStatusMap[j]), j, bridgeTypes::ParallelBridge);
                 SecondaryStructuresStatusMap[i].setStatus(secondaryStructureTypes::Bridge);
-                SecondaryStructuresStatusMap[j].setBridge(&(SecondaryStructuresStatusMap[i]), bridgeTypes::ParallelBridge);
+                SecondaryStructuresStatusMap[j].setBridge(&(SecondaryStructuresStatusMap[i]), i, bridgeTypes::ParallelBridge);
                 SecondaryStructuresStatusMap[j].setStatus(secondaryStructureTypes::Bridge);
             }
             case bridgeTypes::AntiParallelBridge : {
-                SecondaryStructuresStatusMap[i].setBridge(&(SecondaryStructuresStatusMap[j]), bridgeTypes::AntiParallelBridge);
+                SecondaryStructuresStatusMap[i].setBridge(&(SecondaryStructuresStatusMap[j]), j, bridgeTypes::AntiParallelBridge);
                 SecondaryStructuresStatusMap[i].setStatus(secondaryStructureTypes::Bridge);
-                SecondaryStructuresStatusMap[j].setBridge(&(SecondaryStructuresStatusMap[i]), bridgeTypes::AntiParallelBridge);
+                SecondaryStructuresStatusMap[j].setBridge(&(SecondaryStructuresStatusMap[i]), i, bridgeTypes::AntiParallelBridge);
                 SecondaryStructuresStatusMap[j].setStatus(secondaryStructureTypes::Bridge);
             }
             default :
@@ -255,6 +284,36 @@ void secondaryStructures::analyzeBridgesAndLaddersPatterns(){
             }
         }
     }
+//  Calculate Extended Strandz
+    for(std::size_t i {1}; i + 1 < SecondaryStructuresStatusMap.size(); ++i){
+        bool is_Estrand {false};
+        for(std::size_t j {2}; j != 0; --j){
+            for(const bridgeTypes &bridgeType : {bridgeTypes::ParallelBridge, bridgeTypes::AntiParallelBridge}){
+                if (SecondaryStructuresStatusMap[i].hasBridges(bridgeType) && SecondaryStructuresStatusMap[i + j].hasBridges(bridgeType) ){
+                    std::size_t i_partner{SecondaryStructuresStatusMap[i].getBridgePartnerIndex(bridgeType)}, j_partner{SecondaryStructuresStatusMap[i + j].getBridgePartnerIndex(bridgeType)}, second_strand{};
+                    if ( abs(i_partner - j_partner) < 6){
+                        if (i_partner < j_partner){
+                            second_strand = i_partner;
+                        }
+                        else{
+                            second_strand = j_partner;
+                        }
+                        for(int k{abs(i_partner - j_partner)}; k >= 0; --k){
+                            SecondaryStructuresStatusMap[second_strand + k].setStatus(secondaryStructureTypes::Strand);
+                        }
+                        is_Estrand = true;
+                    }
+
+                }
+            }
+            if (is_Estrand){
+                for(;j >= 0; --j){
+                    SecondaryStructuresStatusMap[i + j].setStatus(secondaryStructureTypes::Strand);
+                }
+                break;
+            }
+        }
+    }
 
 
 
@@ -405,7 +464,7 @@ void secondaryStructures::analyzePPHelicesPatterns(){}
 std::string secondaryStructures::patternSearch(){
 
 
-    analyzeBridgesAndLaddersPatterns();
+    analyzeBridgesAndStrandsPatterns();
     analyzeTurnsAndHelicesPatterns();
 //    analyzePPHelicesPatterns();
 
index 9b8e41fcfe894ad540cf74fef6a245dc3f2e0277..875fdd4ec3e32796459476f3a4249baba4ba549c 100644 (file)
@@ -125,7 +125,7 @@ enum class secondaryStructureTypes : std::size_t { // TODO
     Helis_PPII, // P
     Helix_5, // I
     Helix_3, // G
-    Ladder, // E
+    Strand, // E
     Bridge, // B
     Helix_4, // H
     Count
@@ -169,12 +169,15 @@ public:
         bool                                getStatus(const secondaryStructureTypes secondaryStructureTypeName) const, isBreakPartnerWith(const secondaryStructuresData *partner) const;
         HelixPositions                      getStatus(const turnsTypes turn) const;
         secondaryStructureTypes             getStatus() const;
-        void                                setBreak(secondaryStructuresData *breakPartner), setBridge(secondaryStructuresData *bridgePartner, bridgeTypes bridgeType);
-        bool                                hasBridges() const, isBridgePartnerWith(secondaryStructuresData *bridgePartner, bridgeTypes bridgeType) const;
+        void                                setBreak(secondaryStructuresData *breakPartner), setBridge(secondaryStructuresData *bridgePartner, std::size_t bridgePartnerIndex, bridgeTypes bridgeType);
+        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;
     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};
     };
@@ -193,7 +196,7 @@ private:
 
     bool            NoChainBreaksBetween(std::size_t ResiStart, std::size_t ResiEnd) const, isLoop(const std::size_t resiIndex) const, PiHelixPreference;
     bridgeTypes     calculateBridge(std::size_t i, std::size_t j) const;
-    void            analyzeBridgesAndLaddersPatterns(), analyzeTurnsAndHelicesPatterns(), analyzePPHelicesPatterns();
+    void            analyzeBridgesAndStrandsPatterns(), analyzeTurnsAndHelicesPatterns(), analyzePPHelicesPatterns();
 
     const float                           HBondEnergyCutOff{ -0.5 };
 };