From: Max Date: Mon, 26 Sep 2022 20:43:38 +0000 (+0300) Subject: asdsadasdsadsadasdasd X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=d9141aa492373cfdaa9c548f6e22456e1baff336;p=alexxy%2Fgromacs-dssp.git asdsadasdsadsadasdasd --- diff --git a/src/dssptools.cpp b/src/dssptools.cpp index 335901f..2086ac3 100644 --- a/src/dssptools.cpp +++ b/src/dssptools.cpp @@ -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(j) + 3}; @@ -367,7 +405,7 @@ void secondaryStructures::analyzePPHelicesPatterns(){} std::string secondaryStructures::patternSearch(){ -// analyzeBridgesAndLaddersPatterns(); + analyzeBridgesAndLaddersPatterns(); analyzeTurnsAndHelicesPatterns(); // analyzePPHelicesPatterns(); diff --git a/src/dssptools.h b/src/dssptools.h index b822eb1..77309f6 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 - 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(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(turnsTypes::Count)> TurnsStatusArray {HelixPositions::None, HelixPositions::None, HelixPositions::None}; - std::array(bridgeTypes::Count)> BridgesStatusArray{ 0, 0 }; }; std::vector SecondaryStructuresStatusMap;