From 42761b45f5de985f9ccacf8897ec345ec15a5e5c Mon Sep 17 00:00:00 2001
From: Valerio Mariani <valerio.mariani@unibas.ch>
Date: Fri, 25 May 2012 12:56:59 +0200
Subject: [PATCH] Added stere-chemical and clashing statistics to the output.
 Tweaked logging system

---
 modules/mol/alg/src/filter_clashes.cc  | 41 +++++++++++++++++++++-----
 modules/mol/alg/src/ldt.cc             | 19 ++++++------
 modules/mol/alg/src/local_dist_test.cc |  2 +-
 3 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/modules/mol/alg/src/filter_clashes.cc b/modules/mol/alg/src/filter_clashes.cc
index 4b81ed10b..1b163d176 100644
--- a/modules/mol/alg/src/filter_clashes.cc
+++ b/modules/mol/alg/src/filter_clashes.cc
@@ -306,6 +306,12 @@ ClashingDistances FillClashingDistances(std::vector<String>& stereo_chemical_pro
 
 EntityView CheckStereoChemistry(const EntityView& ent, const StereoChemicalParams& bond_table, const StereoChemicalParams& angle_table, Real bond_tolerance, Real angle_tolerance, bool always_remove_bb)
 {
+  Real running_sum_zscore_bonds=0.0;
+  Real running_sum_zscore_angles=0.0;
+  int bond_count = 0;
+  int bad_bond_count = 0;
+  int angle_count = 1;
+  int bad_angle_count = 0;
   LOG_INFO("Checking stereo-chemistry")
   EntityView filtered=ent.CreateEmptyView();
   ResidueViewList residues=ent.GetResidueList();
@@ -347,10 +353,10 @@ EntityView CheckStereoChemistry(const EntityView& ent, const StereoChemicalParam
             Real zscore = (blength - ref_length)/ref_stddev;
             if (blength < min_length || blength > max_length) {
               LOG_INFO("BOND:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << bond_str << " " << min_length << " " << max_length << " " << blength << " " << zscore << " " << "FAIL")
+              bad_bond_count++;
               remove_sc=true;
               if (always_remove_bb==true) {
                 remove_bb=true;
-                continue;
               }
               String name=atom.GetName();
               if (name=="CA" || name=="N" || name=="O" || name=="C") {
@@ -358,7 +364,9 @@ EntityView CheckStereoChemistry(const EntityView& ent, const StereoChemicalParam
               }
             } else {
               LOG_VERBOSE("BOND:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << bond_str << " " << min_length << " " << max_length << " " << blength << " " << zscore << " " << "PASS")
-            }  
+            }
+	    bond_count++;
+            running_sum_zscore_bonds+=zscore;  
           }  
       }
       
@@ -399,10 +407,10 @@ EntityView CheckStereoChemistry(const EntityView& ent, const StereoChemicalParam
             Real zscore = (awidth - ref_width)/ref_stddev;
             if (awidth < min_width || awidth > max_width) {
               LOG_INFO("ANGLE:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << angle_str << " " << min_width << " " << max_width << " " << awidth << " " << zscore << " " << "FAIL")
+              bad_angle_count++;   
               remove_sc=true;
               if (always_remove_bb==true) {
                 remove_bb=true;
-                continue;
               }
               String name=atom.GetName();
               if (name=="CA" || name=="N" || name=="O" || name=="C") {
@@ -411,6 +419,8 @@ EntityView CheckStereoChemistry(const EntityView& ent, const StereoChemicalParam
             } else {
                 LOG_VERBOSE("ANGLE:" << " " << res.GetChain() << " " << res.GetName() << " " << res.GetNumber() << " " << angle_str << " " << min_width << " " << max_width << " " << awidth << " " << zscore << " " << "PASS")
             }
+            angle_count++;
+            running_sum_zscore_angles+=zscore;  
           }  
         }
       }         
@@ -434,6 +444,12 @@ EntityView CheckStereoChemistry(const EntityView& ent, const StereoChemicalParam
     }
     filtered.AddResidue(res, ViewAddFlag::INCLUDE_ATOMS);
   }
+  Real avg_zscore_bonds = running_sum_zscore_bonds/static_cast<float>(bond_count);
+  Real avg_zscore_angles = running_sum_zscore_angles/static_cast<float>(angle_count);
+  LOG_SCRIPT("Average Z-Score for bond lengths: " << avg_zscore_bonds);
+  LOG_SCRIPT("Bonds outside of tolerance range: " << bad_bond_count << " out of " << bond_count);
+  LOG_SCRIPT("Average Z-Score angle widths: " << avg_zscore_angles);
+  LOG_SCRIPT("Angles outside of tolerance range: " << bad_angle_count << " out of " << angle_count);
   return filtered;
 }
 
@@ -446,6 +462,8 @@ EntityView CheckStereoChemistry(const EntityHandle& ent, const StereoChemicalPar
 
 EntityView FilterClashes(const EntityView& ent, const ClashingDistances& min_distances, bool always_remove_bb)
 {
+  int distance_count = 0;
+  int bad_distance_count = 0;
   LOG_INFO("Filtering non-bonded clashes")
   EntityView filtered=ent.CreateEmptyView();
   ResidueViewList residues=ent.GetResidueList();
@@ -461,6 +479,7 @@ EntityView FilterClashes(const EntityView& ent, const ClashingDistances& min_dis
     for (AtomViewList::const_iterator 
          j=atoms.begin(), e2=atoms.end(); j!=e2; ++j) {
       AtomView atom=*j;
+
       String ele1=atom.GetElement();
       if (ele1=="H" || ele1=="D") {
         continue;
@@ -469,6 +488,9 @@ EntityView FilterClashes(const EntityView& ent, const ClashingDistances& min_dis
       for (AtomViewList::iterator 
            k=within.begin(), e3=within.end(); k!=e3; ++k) {
         AtomView atom2=*k;
+
+
+
         if (atom2==atom) {
           continue;
         }
@@ -477,25 +499,28 @@ EntityView FilterClashes(const EntityView& ent, const ClashingDistances& min_dis
           continue;
         }
 
+
         // In theory, this should also trigger for disulfide bonds, but 
         // since we don't detect disulfides correctly, we can't count on that 
-        // and we instead allow S-S distances down to 1.8.
+        // and we instead allow S-S distances down to 1.8.       
         if (atom.GetHandle().FindBondToAtom(atom2.GetHandle()).IsValid()) {
           continue;
         }
 
+
+
         Real d=geom::Length2(atom.GetPos()-atom2.GetPos());
         std::pair <Real,Real> distance_tolerance=min_distances.GetClashingDistance(ele1, ele2);
         Real distance=distance_tolerance.first;
         Real tolerance=distance_tolerance.second;
         Real threshold=distance-tolerance;
+
         if (d<threshold*threshold) {
           LOG_INFO(atom.GetResidue().GetChain() << " " << atom.GetResidue().GetName() << " " << atom.GetResidue().GetNumber() << " " << atom.GetName() << " " << atom2.GetResidue().GetChain() << " " << atom2.GetResidue().GetName() << " " << atom2.GetResidue().GetNumber() << " " << atom2.GetName() << " " << threshold << " " << sqrt(d) << " " << sqrt(d)-threshold << " " << "FAIL")
-       
+          bad_distance_count++; 
           remove_sc=true;
           if (always_remove_bb==true) {
             remove_bb=true;
-            continue;
           }
           String name=atom.GetName();
           if (name=="CA" || name=="N" || name=="O" || name=="C") {
@@ -503,7 +528,8 @@ EntityView FilterClashes(const EntityView& ent, const ClashingDistances& min_dis
           }
         } else {
           LOG_VERBOSE("CLASH:" << " " << atom.GetResidue().GetChain() << " " << atom.GetResidue().GetName() << " " << atom.GetResidue().GetNumber() << " " << atom.GetName() << " " << atom2.GetResidue().GetChain() << " " << atom2.GetResidue().GetNumber() << " " << atom2.GetResidue().GetName() << " " << atom2.GetName() << " " << threshold << " " << sqrt(d) << " " << sqrt(d)-threshold << " " << "PASS")
-        }  
+        }
+        distance_count++;
       }
     }
     
@@ -525,6 +551,7 @@ EntityView FilterClashes(const EntityView& ent, const ClashingDistances& min_dis
     }
     filtered.AddResidue(res, ViewAddFlag::INCLUDE_ATOMS);
   }
+  LOG_SCRIPT(bad_distance_count << " out of " << distance_count << " non-bonded short-range distances checked shorter than tolerance distance");
   return filtered;
 }
 
diff --git a/modules/mol/alg/src/ldt.cc b/modules/mol/alg/src/ldt.cc
index 5dbab61cf..48dfc9a6c 100644
--- a/modules/mol/alg/src/ldt.cc
+++ b/modules/mol/alg/src/ldt.cc
@@ -106,7 +106,7 @@ int main (int argc, char **argv)
   Real min_distance_tolerance = 0.0;
   Real bond_tolerance = 8.0;
   Real angle_tolerance = 8.0;
-  Real radius=8.0;
+  Real radius=15.0;
   
   IOProfile profile;
   profile.bond_feasibility_check=false;
@@ -164,23 +164,22 @@ int main (int argc, char **argv)
     exit(-1);
   }
   int verbosity_level=0;
+  int ost_verbosity_level=2;
   if (vm.count("verbosity")) {
     verbosity_level=vm["verbosity"].as<int>();
     if (verbosity_level==0) {
-      Logger::Instance().PushVerbosityLevel(0);
+      ost_verbosity_level=2;    
     } else if (verbosity_level==1) {
-      Logger::Instance().PushVerbosityLevel(3);
+      ost_verbosity_level=3;
     } else if (verbosity_level==2) {
-      Logger::Instance().PushVerbosityLevel(4);
+      ost_verbosity_level=4;
     } else {
       std::cout << "Verbosity level " << verbosity_level << " is not available" << std::endl;
       exit(-1);
     }
   }
 
-  if (verbosity_level>0) {
-    LOG_INFO("LDT INFO FORMAT:  Chain1  Residue1  ResNum1  Atom1  Chain2  Residue2  ResNum2  Atom2  ModelDist  TargetDist  Difference  Tolerance Status");
-  }
+  Logger::Instance().PushVerbosityLevel(ost_verbosity_level);
 
   if (vm.count("bond_tolerance")) {
     bond_tolerance=vm["bond_tolerance"].as<Real>();
@@ -218,8 +217,8 @@ int main (int argc, char **argv)
     LOG_INFO("BOND INFO FORMAT:  Chain  Residue  ResNum  Bond  Min  Max  Observed  Z-score  Status");
     LOG_INFO("ANGLE INFO FORMAT:  Chain  Residue  ResNum  Angle  Min  Max  Observed  Z-score  Status");
     LOG_INFO("CLASH INFO FORMAT:  Chain1  Residue1  ResNum1  Atom1  Chain2  Residue2  ResNum2  Atom2  Observed  Difference  Status");
-    LOG_INFO("LDT INFO FORMAT:  Chain1  Residue1  ResNum1  Atom1  Chain2  Residue2  ResNum2  Atom2  ModelDist  TargetDist  Difference  Tolerance Status");
   }
+  LOG_INFO("LDT INFO FORMAT:  Chain1  Residue1  ResNum1  Atom1  Chain2  Residue2  ResNum2  Atom2  ModelDist  TargetDist  Difference  Tolerance Status");
   for (size_t i=0; i<files.size(); ++i) {
     EntityHandle model=load(files[i], profile);
     if (!model) {
@@ -230,6 +229,7 @@ int main (int argc, char **argv)
     }
     EntityView v=model.CreateFullView();
 
+
     // The code in this following block is only used to make CASP9 models load correctly and normally commented out
     EntityView model2=model.Select("aname!=CEN,NV,OT1,OT,CAY,CY,OXT,1OCT,NT,OT2,2OCT,OVL1,OC1,O1,OC2,O2,OVU1");
     EntityView v1=model2.Select("not (rname==GLY and aname==CB)");
@@ -249,6 +249,7 @@ int main (int argc, char **argv)
         aitv.SetElement(firstletter);
       }
     }  
+    v=v1;
     std::cout << "File: " << files[i] << std::endl; 
     std::pair<int,int> cov = compute_coverage(v,glob_dist_list);
     std::cout << "Coverage: " << (float(cov.first)/float(cov.second)) << " (" << cov.first << " out of " << cov.second << " residues)" << std::endl;
@@ -284,7 +285,7 @@ int main (int argc, char **argv)
         std::cout << "Error reading the Clashing section of the stereo-chemical parameter file." << std::endl;
         exit(-1);
       }  
-      EntityView v=alg::CheckStereoChemistry(v,bond_table,angle_table,bond_tolerance,angle_tolerance);
+      v=alg::CheckStereoChemistry(v,bond_table,angle_table,bond_tolerance,angle_tolerance);
       cov = compute_coverage(v,glob_dist_list);
       std::cout << "Coverage after stereo-chemical checks: " << (float(cov.first)/float(cov.second)) << " (" << cov.first << " out of " << cov.second << " residues)" << std::endl;
       v=alg::FilterClashes(v,nonbonded_table);
diff --git a/modules/mol/alg/src/local_dist_test.cc b/modules/mol/alg/src/local_dist_test.cc
index 83d842226..430dd31be 100644
--- a/modules/mol/alg/src/local_dist_test.cc
+++ b/modules/mol/alg/src/local_dist_test.cc
@@ -132,7 +132,7 @@ std::pair<Real, Real> calc_overlap1(const ResidueDistanceList& res_distance_list
     Real mdl_dist=geom::Length(av1.GetPos()-av2.GetPos());
     ReferenceDistance ref_dist=*ai;
     if (within_tolerance(mdl_dist,ref_dist,tol).first) {
-      LOG_VERBOSE("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() 
+      LOG_INFO("LDT:" << " " << av1.GetResidue().GetChain() << " " << av1.GetResidue().GetName() << " " << av1.GetResidue().GetNumber() << " " << av1.GetName() 
            << " " << av2.GetResidue().GetChain() << " " << av2.GetResidue().GetName() << " " << av2.GetResidue().GetNumber() << " " << av2.GetName() << " " 
            << mdl_dist << " " << ref_dist.GetMinDistance() << " " << mdl_dist-ref_dist.GetMinDistance() << " " << tol << " " << "PASS")
       overlap.first+=1;
-- 
GitLab