JAL-4134 compute normalised dot product for contact matrix similarities
authorJames Procter <j.procter@dundee.ac.uk>
Mon, 27 Feb 2023 17:26:46 +0000 (17:26 +0000)
committerJames Procter <j.procter@dundee.ac.uk>
Mon, 27 Feb 2023 17:26:46 +0000 (17:26 +0000)
src/jalview/analysis/AverageDistanceEngine.java

index 90a96e0..ed6f861 100644 (file)
@@ -50,11 +50,20 @@ public class AverageDistanceEngine extends TreeEngine
     this.av =av;
     this.aa = aa;
     this.cm=cm;
+    calculate(cm);
+
+  }
+  public void calculate(ContactMatrixI cm)
+  {
+    this.cm = cm;
     node = new Vector<BinaryNode>();
     clusters = new Vector<BitSet>();
     distances = new Matrix(new double[cm.getWidth()][cm.getWidth()]);
     noseqs=cm.getWidth();
     done  = new BitSet();
+    double moduli[]=new double[cm.getWidth()];
+    
+    
     for (int i=0;i<cm.getWidth();i++)
     {
       // init the tree engine node for this column
@@ -68,22 +77,32 @@ public class AverageDistanceEngine extends TreeEngine
 
       // compute distance matrix element
       ContactListI ith=cm.getContactList(i);
+      
       for (int j=0;j<i;j++)
       {
+        distances.setValue(i,i,0);
         ContactListI jth = cm.getContactList(j);
         double prd=0;
         for (int indx=0;indx<cm.getHeight();indx++)
         {
+          if (j==0)
+          {
+            moduli[i]+=ith.getContactAt(indx)*ith.getContactAt(indx);
+          }
           prd+=ith.getContactAt(indx)*jth.getContactAt(indx);
         }
-        distances.setValue(i, j, prd);
-        distances.setValue(j, i, prd);
+        if (j==0)
+        {
+          moduli[i]=Math.sqrt(moduli[i]);
+        }
+        prd=(moduli[i]!=0 && moduli[j]!=0) ? prd/(moduli[i]*moduli[j]) : 0;
+        distances.setValue(i, j, 1-prd);
+        distances.setValue(j, i, 1-prd);
       }
     }
 
     noClus = clusters.size();
     cluster();
-    
   }
   /**
    * Calculates and saves the distance between the combination of cluster(i) and