From: Max Date: Mon, 26 Sep 2022 22:20:49 +0000 (+0300) Subject: asdsadasdsad X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=c5d77d0e609c8bae3f77669c9acdfea993ad061f;p=alexxy%2Fgromacs-dssp.git asdsadasdsad --- diff --git a/src/dssptools.cpp b/src/dssptools.cpp index 2086ac3..287f81e 100644 --- a/src/dssptools.cpp +++ b/src/dssptools.cpp @@ -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(); diff --git a/src/dssptools.h b/src/dssptools.h index 9b8e41f..875fdd4 100644 --- a/src/dssptools.h +++ b/src/dssptools.h @@ -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(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(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 }; };