Tried to fix that damn shit with breaks.
authorMax <Infinity2573@gmail.com>
Sun, 11 Sep 2022 23:20:01 +0000 (02:20 +0300)
committerMax <Infinity2573@gmail.com>
Sun, 11 Sep 2022 23:20:01 +0000 (02:20 +0300)
src/dssp.cpp
src/dssptools.cpp
src/dssptools.h

index d2493c6f20c351a43ab1b9683f6b4ea9973f552c..2818c00ed22b201ed0a834e4089f2daca0a6e68a 100644 (file)
@@ -116,7 +116,7 @@ void Dssp::optionsFinished(TrajectoryAnalysisSettings* /* settings */) {
 void Dssp::initAnalysis(const TrajectoryAnalysisSettings &settings, const TopologyInformation& top)
 {
     DT.initAnalysis(top, initParams);
-    nres = 0;
+    nres = DT.nres;
 }
 
 void Dssp::analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc, TrajectoryAnalysisModuleData* /* pdata*/)
index 494e8c26f29b72834ee926c9ae21bbe4115687b1..8ec503ae719395b1b8936b5985ab0d38e69159d2 100644 (file)
@@ -107,6 +107,10 @@ bool secondaryStructures::secondaryStructuresData::getStatus(const secondaryStru
     return SecondaryStructuresStatusArray[static_cast<std::size_t>(secondaryStructureTypeName)];
 }
 
+bool secondaryStructures::secondaryStructuresData::isBreakPartnerWith(secondaryStructuresData *partner) const{
+    return breakPartners[0] == partner || breakPartners[1] == partner;
+}
+
 HelixPositions secondaryStructures::secondaryStructuresData::getStatus(const turnsTypes turn) const{
     return TurnsStatusArray[static_cast<std::size_t>(turn)];
 }
@@ -115,6 +119,16 @@ secondaryStructureTypes secondaryStructures::secondaryStructuresData::getStatus(
     return SSData;
 }
 
+void secondaryStructures::secondaryStructuresData::setBreak(secondaryStructuresData *breakPartner){
+    if (breakPartners[0] == nullptr){
+        breakPartners[0] = breakPartner;
+    }
+    else{
+        breakPartners[1] = breakPartner;
+    }
+    setStatus(secondaryStructureTypes::Break);
+}
+
 bool secondaryStructures::hasHBondBetween(std::size_t Donor, std::size_t Acceptor) const{ // prob should add resi name comparison ?
     if( (*ResInfoMap)[Donor].acceptor[0] == nullptr ||
         (*ResInfoMap)[Donor].acceptor[1] == nullptr ||
@@ -368,19 +382,26 @@ std::string secondaryStructures::patternSearch(){
 
     /*Write Data*/
 
-    for(std::size_t i {0}; i < SecondaryStructuresStatusMap.size(); ++i){
-        SecondaryStructuresStringLine[i] = secondaryStructureTypeNames[static_cast<secondaryStructureTypes>(SecondaryStructuresStatusMap[i].getStatus())] ;
+    for(std::size_t i {static_cast<std::size_t>(secondaryStructureTypes::Bend)}; i != static_cast<std::size_t>(secondaryStructureTypes::Turn); ++i){ // TODO
+        for(std::size_t j {0}; j < SecondaryStructuresStatusMap.size(); ++j){
+            if (SecondaryStructuresStatusMap[j].getStatus(static_cast<secondaryStructureTypes>(i))){
+                SecondaryStructuresStringLine[j] = secondaryStructureTypeNames[i] ;
+            }
+        }
     }
 
     /*Add breaks*/
 
-    for(std::size_t i {0}, linefactor{1}; i + 1 < SecondaryStructuresStatusMap.size(); ++i, ++linefactor ){
-        if( SecondaryStructuresStatusMap[i].getStatus(secondaryStructureTypes::Break) ){
-            SecondaryStructuresStringLine.insert(SecondaryStructuresStringLine.begin() + i + linefactor, secondaryStructureTypeNames[secondaryStructureTypes::Break]);
+    if(SecondaryStructuresStatusMap.size() > 1){
+        for(std::size_t i {0}, linefactor{0}; i + 1 < SecondaryStructuresStatusMap.size(); ++i, ++linefactor ){
+            if( SecondaryStructuresStatusMap[i].getStatus(secondaryStructureTypes::Break) && SecondaryStructuresStatusMap[i + 1].getStatus(secondaryStructureTypes::Break) ){
+                if(SecondaryStructuresStatusMap[i].isBreakPartnerWith(&SecondaryStructuresStatusMap[i + 1]) && SecondaryStructuresStatusMap[i + 1].isBreakPartnerWith(&SecondaryStructuresStatusMap[i]) ){
+                    SecondaryStructuresStringLine.insert(SecondaryStructuresStringLine.begin() + i + linefactor, secondaryStructureTypeNames[secondaryStructureTypes::Break]);
+                }
+            }
         }
     }
     return SecondaryStructuresStringLine;
-
 }
 
 secondaryStructures::~secondaryStructures(){
@@ -546,7 +567,8 @@ void DsspTool::calculateBends(const t_trxframe &fr, const t_pbc *pbc)
                                     pbc)
            > maxdist)
        {
-           PatternSearch.SecondaryStructuresStatusMap[i].setStatus(secondaryStructureTypes::Break);
+           PatternSearch.SecondaryStructuresStatusMap[i].setBreak(&PatternSearch.SecondaryStructuresStatusMap[i + 1]);
+           PatternSearch.SecondaryStructuresStatusMap[i + 1].setBreak(&PatternSearch.SecondaryStructuresStatusMap[i]);
 
            std::cout << "Break between " << i << " and " << i + 1 << std::endl;
        }
@@ -795,6 +817,8 @@ void DsspTool::initAnalysis(/*const TrajectoryAnalysisSettings &settings,*/const
 //         std::cout << " N = " << IndexMap[j].prevResi->getIndex(backboneAtomTypes::AtomN);
 //         std::cout << " H = " << IndexMap[j].prevResi->getIndex(backboneAtomTypes::AtomH) << std::endl;
    }
+
+   nres = i;
 }
 
 void DsspTool::analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc)
index a970ff9f0b41e4be4e272763387cf9493f49dac5..d0ccc71b5d66137187ce4d8c2468ee5e9a1595be 100644 (file)
@@ -122,7 +122,7 @@ enum class secondaryStructureTypes : std::size_t { // TODO
     Break, // =
     Bend, // S
     Turn, // T
-    Helis_PPII, // ?
+    Helis_PPII, // TODO
     Helix_5, // I
     Helix_3, // G
     Bulge, // B
@@ -155,22 +155,24 @@ enum class bridgeTypes : std::size_t {
     Count
 };
 
-class secondaryStructures{
+class secondaryStructures{ // PatterSearch Wrapper
 public:
     secondaryStructures();
     void                    initiateSearch(const std::vector<ResInfo> &ResInfoMatrix, const bool PiHelicesPreferencez = true);
     std::string             patternSearch();
     ~secondaryStructures();
 
-    class secondaryStructuresData{
+    class secondaryStructuresData{ // PatternSearch Tool
     public:
         void                                setStatus(const secondaryStructureTypes secondaryStructureTypeName);
         void                                setStatus(const HelixPositions helixPosition, const turnsTypes turn);
-        bool                                getStatus(const secondaryStructureTypes secondaryStructureTypeName) const;
+        bool                                getStatus(const secondaryStructureTypes secondaryStructureTypeName) const, isBreakPartnerWith(secondaryStructuresData *partner) const;
         HelixPositions                      getStatus(const turnsTypes turn) const;
         secondaryStructureTypes             getStatus() const;
+        void                                setBreak(secondaryStructuresData *breakPartner);
     private:
         std::array<bool, static_cast<std::size_t>(secondaryStructureTypes::Count)>  SecondaryStructuresStatusArray{ 0, 0, 0, 0, 0, 0, 0 };
+        secondaryStructuresData                                        *breakPartners[2]{nullptr, nullptr};
         secondaryStructureTypes                                        SSData {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 };
@@ -227,6 +229,8 @@ public:
 
    void analyzeFrame(int frnr, const t_trxframe& fr, t_pbc* pbc);
 
+   int                                   nres{};
+
    std::vector<std::pair<int, std::string>> getData();
 private:
    initParameters                        initParams;