asdsadasdsadsadasdasd
authorMax <Infinity2573@gmail.com>
Mon, 26 Sep 2022 20:43:38 +0000 (23:43 +0300)
committerMax <Infinity2573@gmail.com>
Mon, 26 Sep 2022 20:43:38 +0000 (23:43 +0300)
src/dssptools.cpp
src/dssptools.h

index 335901f63262243ee62346d1b3460f50e9f17f29..2086ac3df93efbb2e35ed3f6b810f3ebafd46dd4 100644 (file)
@@ -127,21 +127,45 @@ void secondaryStructures::secondaryStructuresData::setBreak(secondaryStructuresD
     setStatus(secondaryStructureTypes::Break);
 }
 
+void secondaryStructures::secondaryStructuresData::setBridge(secondaryStructuresData *bridgePartner, bridgeTypes bridgeType){
+    if(bridgeType == bridgeTypes::ParallelBridge){
+        bridgePartners[0] = bridgePartner;
+    }
+    else if (bridgeType == bridgeTypes::AntiParallelBridge){
+        bridgePartners[1] = bridgePartner;
+    }
+}
+
+bool secondaryStructures::secondaryStructuresData::hasBridges() const{
+    return bridgePartners[0] || bridgePartners[1];
+
+}
+
+bool secondaryStructures::secondaryStructuresData::isBridgePartnerWith(secondaryStructuresData *bridgePartner, bridgeTypes bridgeType) const{
+    if(bridgeType == bridgeTypes::ParallelBridge){
+        return bridgePartners[0] == bridgePartner;
+    }
+    else if (bridgeType == bridgeTypes::AntiParallelBridge){
+        return bridgePartners[1] == bridgePartner;
+    }
+    return false;
+}
+
 bool secondaryStructures::hasHBondBetween(std::size_t Donor, std::size_t Acceptor) const{
     if( (*ResInfoMap)[Donor].acceptor[0] == nullptr ||
         (*ResInfoMap)[Donor].acceptor[1] == nullptr ||
         (*ResInfoMap)[Acceptor].info == nullptr ){
-        std::cout << "Bad hbond check. Reason(s): " ;
-        if ( (*ResInfoMap)[Donor].acceptor[0] == nullptr ){
-            std::cout << "Donor has no acceptor[0]; ";
-        }
-        if ( (*ResInfoMap)[Donor].acceptor[1] == nullptr ){
-            std::cout << "Donor has no acceptor[1]; ";
-        }
-        if ( (*ResInfoMap)[Acceptor].info == nullptr ){
-            std::cout << "No info about acceptor; ";
-        }
-        std::cout << std::endl;
+//        std::cout << "Bad hbond check. Reason(s): " ;
+//        if ( (*ResInfoMap)[Donor].acceptor[0] == nullptr ){
+//            std::cout << "Donor has no acceptor[0]; ";
+//        }
+//        if ( (*ResInfoMap)[Donor].acceptor[1] == nullptr ){
+//            std::cout << "Donor has no acceptor[1]; ";
+//        }
+//        if ( (*ResInfoMap)[Acceptor].info == nullptr ){
+//            std::cout << "No info about acceptor; ";
+//        }
+//        std::cout << std::endl;
         return false;
     }
 //    else if (!( (*ResInfoMap)[Acceptor].donor[0] == nullptr ||
@@ -193,14 +217,17 @@ bool secondaryStructures::NoChainBreaksBetween(std::size_t Resi1, std::size_t Re
 }
 
 bridgeTypes secondaryStructures::calculateBridge(std::size_t i, std::size_t j) const{
-    if( i < 1 || j < 1 || i + 1 >= ResInfoMap->size() || j + 1 >= ResInfoMap->size() ){
+    if( i < 1 || j < 1 || i + 1 >= ResInfoMap->size() || j + 1 >= ResInfoMap->size() ){ // Protection from idiotz, не обязательно нужен
         return bridgeTypes::None;
     }
-    if(NoChainBreaksBetween(i - 1, i + 1) && NoChainBreaksBetween(j - 1, j + 1)){
-        if((hasHBondBetween(i + 1, j) && hasHBondBetween(j, i - 1)) || (hasHBondBetween(j + 1, i) && hasHBondBetween(i, j - 1)) ){ //possibly swap
+
+    ResInfo a{(*ResInfoMap)[i]}, b{(*ResInfoMap)[j]};
+
+    if(NoChainBreaksBetween(i - 1, i + 1) && NoChainBreaksBetween(j - 1, j + 1) && a.prevResi && a.nextResi && b.prevResi && b.nextResi){
+        if((hasHBondBetween(i + 1, j) && hasHBondBetween(j, i - 1)) || (hasHBondBetween(j + 1, i) && hasHBondBetween(i, j - 1)) ){
             return bridgeTypes::ParallelBridge;
         }
-        else if((hasHBondBetween(i + 1, j - 1) && hasHBondBetween(j + 1, i - 1)) || (hasHBondBetween(j, i) && hasHBondBetween(i, j)) ){ //possibly swap
+        else if((hasHBondBetween(i + 1, j - 1) && hasHBondBetween(j + 1, i - 1)) || (hasHBondBetween(j, i) && hasHBondBetween(i, j)) ){
             return bridgeTypes::AntiParallelBridge;
         }
     }
@@ -210,11 +237,22 @@ bridgeTypes secondaryStructures::calculateBridge(std::size_t i, std::size_t j) c
 void secondaryStructures::analyzeBridgesAndLaddersPatterns(){
     for(std::size_t i {1}; i + 4 < SecondaryStructuresStatusMap.size(); ++i){
         for(std::size_t j {i + 3}; j + 1 < SecondaryStructuresStatusMap.size(); ++j ){
-            bridgeTypes type {calculateBridge(i, j)};
-            if (type == bridgeTypes::None){
+            switch(calculateBridge(i, j)){
+            case bridgeTypes::ParallelBridge : {
+                SecondaryStructuresStatusMap[i].setBridge(&(SecondaryStructuresStatusMap[j]), bridgeTypes::ParallelBridge);
+                SecondaryStructuresStatusMap[i].setStatus(secondaryStructureTypes::Bridge);
+                SecondaryStructuresStatusMap[j].setBridge(&(SecondaryStructuresStatusMap[i]), bridgeTypes::ParallelBridge);
+                SecondaryStructuresStatusMap[j].setStatus(secondaryStructureTypes::Bridge);
+            }
+            case bridgeTypes::AntiParallelBridge : {
+                SecondaryStructuresStatusMap[i].setBridge(&(SecondaryStructuresStatusMap[j]), bridgeTypes::AntiParallelBridge);
+                SecondaryStructuresStatusMap[i].setStatus(secondaryStructureTypes::Bridge);
+                SecondaryStructuresStatusMap[j].setBridge(&(SecondaryStructuresStatusMap[i]), bridgeTypes::AntiParallelBridge);
+                SecondaryStructuresStatusMap[j].setStatus(secondaryStructureTypes::Bridge);
+            }
+            default :
                 continue;
             }
-            bool found {false};
         }
     }
 
@@ -298,7 +336,6 @@ void secondaryStructures::analyzeTurnsAndHelicesPatterns(){
                         SecondaryStructuresStatusMap[j + k].setStatus(HelixPositions::Middle, i);
                         SecondaryStructuresStatusMap[j + k].setStatus(secondaryStructureTypes::Turn);
                     }
-
                 }
 
                 if( SecondaryStructuresStatusMap[j].getStatus(i) == HelixPositions::End ){
@@ -344,9 +381,10 @@ void secondaryStructures::analyzeTurnsAndHelicesPatterns(){
         }
     }
 
+    /* Не знаю зач они в дссп так сделали, этож полное говно */
+
 //    for(std::size_t i {1}; i + 1 < SecondaryStructuresStatusMap.size(); ++i){
 //        if (SecondaryStructuresStatusMap[i].getStatus() == secondaryStructureTypes::Loop || SecondaryStructuresStatusMap[i].getStatus(secondaryStructureTypes::Bend)){
-////            std::cout << "Testing " << i-1 << " and " << i << std::endl;
 //            bool isTurn = false;
 //            for(const turnsTypes &j : {turnsTypes::Turn_3, turnsTypes::Turn_4, turnsTypes::Turn_5}){
 //                std::size_t stride {static_cast<std::size_t>(j) + 3};
@@ -367,7 +405,7 @@ void secondaryStructures::analyzePPHelicesPatterns(){}
 std::string secondaryStructures::patternSearch(){
 
 
-//    analyzeBridgesAndLaddersPatterns();
+    analyzeBridgesAndLaddersPatterns();
     analyzeTurnsAndHelicesPatterns();
 //    analyzePPHelicesPatterns();
 
index b822eb18548e68dca7245be083ef0257abe1f90c..77309f62b2c1d3cebe6a2cdb24cd1be5f3829e91 100644 (file)
@@ -125,7 +125,7 @@ enum class secondaryStructureTypes : std::size_t { // TODO
     Helis_PPII, // P
     Helix_5, // I
     Helix_3, // G
-    Bulge, // B
+    Bridge, // B
     Ladder, // E
     Helix_4, // H
     Count
@@ -169,13 +169,14 @@ 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);
+        void                                setBreak(secondaryStructuresData *breakPartner), setBridge(secondaryStructuresData *bridgePartner, bridgeTypes bridgeType);
+        bool                                hasBridges() const, isBridgePartnerWith(secondaryStructuresData *bridgePartner, 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};
         secondaryStructureTypes                                         SecondaryStructuresStatus {secondaryStructureTypes::Loop};
         std::array<HelixPositions, static_cast<std::size_t>(turnsTypes::Count)>  TurnsStatusArray {HelixPositions::None, HelixPositions::None, HelixPositions::None};
-        std::array<bool, static_cast<std::size_t>(bridgeTypes::Count)>  BridgesStatusArray{ 0, 0 };
     };
 
     std::vector<secondaryStructuresData>     SecondaryStructuresStatusMap;