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 ||
}
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;
}
}
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};
}
}
SecondaryStructuresStatusMap[j + k].setStatus(HelixPositions::Middle, i);
SecondaryStructuresStatusMap[j + k].setStatus(secondaryStructureTypes::Turn);
}
-
}
if( SecondaryStructuresStatusMap[j].getStatus(i) == HelixPositions::End ){
}
}
+ /* Не знаю зач они в дссп так сделали, этож полное говно */
+
// 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};
std::string secondaryStructures::patternSearch(){
-// analyzeBridgesAndLaddersPatterns();
+ analyzeBridgesAndLaddersPatterns();
analyzeTurnsAndHelicesPatterns();
// analyzePPHelicesPatterns();
Helis_PPII, // P
Helix_5, // I
Helix_3, // G
- Bulge, // B
+ Bridge, // B
Ladder, // E
Helix_4, // H
Count
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;