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;
}
}
}
+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;
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 ||
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 :
}
}
}
+// 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;
+ }
+ }
+ }
std::string secondaryStructures::patternSearch(){
- analyzeBridgesAndLaddersPatterns();
+ analyzeBridgesAndStrandsPatterns();
analyzeTurnsAndHelicesPatterns();
// analyzePPHelicesPatterns();
Helis_PPII, // P
Helix_5, // I
Helix_3, // G
- Ladder, // E
+ Strand, // E
Bridge, // B
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), 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};
};
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 };
};