diff --git a/src/main/java/demo/DemoOrientBioAssembly.java b/src/main/java/demo/DemoOrientBioAssembly.java index 0069cb3f..578d2cc3 100644 --- a/src/main/java/demo/DemoOrientBioAssembly.java +++ b/src/main/java/demo/DemoOrientBioAssembly.java @@ -117,7 +117,7 @@ private static boolean analyzeSymmetry(Structure s,String pdbID, int biolAssembl System.out.println("================="); System.out.println("Sequence ID : " + parameters.getSequenceIdentityThreshold() ); System.out.println("Stoichiometry : " + calc.getSubunits().getStoichiometry()); - System.out.println("Pseudostoichiometry: " + calc.getSubunits().isPseudoStiochiometric()); + System.out.println("Pseudostoichiometry: " + calc.getSubunits().isPseudoStoichiometric()); System.out.println("Point Group : " + calc.getRotationGroup().getPointGroup()); System.out.println("Symmetry RMSD : " + String.format("%.2f",calc.getRotationGroup().getAverageTraceRmsd())); @@ -148,7 +148,7 @@ private static boolean analyzeSymmetry(Structure s,String pdbID, int biolAssembl } System.out.println("================="); - return calc.getSubunits().isPseudoStiochiometric(); + return calc.getSubunits().isPseudoStoichiometric(); } else { System.out.println("No protein chains found"); return false; diff --git a/src/main/java/org/biojava3/structure/quaternary/analysis/CalcBioAssemblySymmetry.java b/src/main/java/org/biojava3/structure/quaternary/analysis/CalcBioAssemblySymmetry.java index 72d64aa6..dca620d7 100644 --- a/src/main/java/org/biojava3/structure/quaternary/analysis/CalcBioAssemblySymmetry.java +++ b/src/main/java/org/biojava3/structure/quaternary/analysis/CalcBioAssemblySymmetry.java @@ -73,10 +73,12 @@ public boolean orient(){ System.out.println("Results for " + Math.round(parameters.getSequenceIdentityThreshold()*100) + "% sequence identity threshold:"); System.out.println(); System.out.println("Global symmetry:"); - System.out.println("Stoichiometry : " + globalSymmetry.getSubunits().getStoichiometry()); - System.out.println("Pseudostoichiometry : " + globalSymmetry.getSubunits().isPseudoStiochiometric()); - System.out.println("Point group : " + globalSymmetry.getRotationGroup().getPointGroup()); - System.out.println("Symmetry RMSD : " + (float) globalSymmetry.getRotationGroup().getAverageTraceRmsd()); + System.out.println("Stoichiometry : " + globalSymmetry.getSubunits().getStoichiometry()); + System.out.println("Pseudostoichiometry : " + globalSymmetry.getSubunits().isPseudoStoichiometric()); + System.out.println("Min sequence identity : " + Math.round(globalSymmetry.getSubunits().getMinSequenceIdentity()*100)); + System.out.println("Max sequence identity : " + Math.round(globalSymmetry.getSubunits().getMaxSequenceIdentity()*100)); + System.out.println("Point group : " + globalSymmetry.getRotationGroup().getPointGroup()); + System.out.println("Symmetry RMSD : " + (float) globalSymmetry.getRotationGroup().getAverageTraceRmsd()); } axisTransformation = new AxisTransformation(globalSymmetry); @@ -97,10 +99,12 @@ public boolean orient(){ AxisTransformation at = new AxisTransformation(localSymmetry); System.out.println(); System.out.println("Results for " + Math.round(parameters.getSequenceIdentityThreshold()*100) + "% sequence identity threshold:"); - System.out.println("Stoichiometry : " + localSymmetry.getSubunits().getStoichiometry()); - System.out.println("Pseudostoichiometry : " + localSymmetry.getSubunits().isPseudoStiochiometric()); - System.out.println("Point group : " + localSymmetry.getRotationGroup().getPointGroup()); - System.out.println("Symmetry RMSD : " + (float) localSymmetry.getRotationGroup().getAverageTraceRmsd()); + System.out.println("Stoichiometry : " + localSymmetry.getSubunits().getStoichiometry()); + System.out.println("Pseudostoichiometry : " + localSymmetry.getSubunits().isPseudoStoichiometric()); + System.out.println("Min sequence identity : " + Math.round(localSymmetry.getSubunits().getMinSequenceIdentity()*100)); + System.out.println("Max sequence identity : " + Math.round(localSymmetry.getSubunits().getMaxSequenceIdentity()*100)); + System.out.println("Point group : " + localSymmetry.getRotationGroup().getPointGroup()); + System.out.println("Symmetry RMSD : " + (float) localSymmetry.getRotationGroup().getAverageTraceRmsd()); System.out.println(); JmolSymmetryScriptGenerator gen = JmolSymmetryScriptGenerator.getInstance(at, "l"+count); if (count == 0) { diff --git a/src/main/java/org/biojava3/structure/quaternary/analysis/OrientBiologicalAssembly.java b/src/main/java/org/biojava3/structure/quaternary/analysis/OrientBiologicalAssembly.java index 12282b09..87ea1049 100644 --- a/src/main/java/org/biojava3/structure/quaternary/analysis/OrientBiologicalAssembly.java +++ b/src/main/java/org/biojava3/structure/quaternary/analysis/OrientBiologicalAssembly.java @@ -103,7 +103,7 @@ private void orient(Structure structure) { // initialize with default parameters QuatSymmetryParameters params = new QuatSymmetryParameters(); params.setSequenceIdentityThreshold(0.95); -// params.setStructuralAlignmentOnly(true); + params.setStructuralAlignmentOnly(true); params.setVerbose(verbose); System.out.println("Default parameters:"); diff --git a/src/main/java/org/biojava3/structure/quaternary/core/QuatSymmetryDetector.java b/src/main/java/org/biojava3/structure/quaternary/core/QuatSymmetryDetector.java index 7d1c5013..e0e3f3c7 100644 --- a/src/main/java/org/biojava3/structure/quaternary/core/QuatSymmetryDetector.java +++ b/src/main/java/org/biojava3/structure/quaternary/core/QuatSymmetryDetector.java @@ -147,6 +147,8 @@ private Subunits createGlobalSubunits() { Subunits subunits = new Subunits(chainClusterer.getCalphaCoordinates(), chainClusterer.getSequenceClusterIds(), chainClusterer.getPseudoStoichiometry(), + chainClusterer.getMinSequenceIdentity(), + chainClusterer.getMaxSequenceIdentity(), chainClusterer.getFolds(), chainClusterer.getChainIds(), chainClusterer.getModelNumbers()); @@ -166,6 +168,8 @@ private Subunits createLocalSubunit(List subCluster) { List subCalphaCoordinates = new ArrayList(subCluster.size()); List subSequenceIds = new ArrayList(subCluster.size()); List subPseudoStoichiometry = new ArrayList(subCluster.size()); + List subMinSequenceIdentity = new ArrayList(subCluster.size()); + List subMaxSequenceIdentity = new ArrayList(subCluster.size()); List subChainIds = new ArrayList(subCluster.size()); List subModelNumbers = new ArrayList(subCluster.size()); @@ -173,6 +177,8 @@ private Subunits createLocalSubunit(List subCluster) { subCalphaCoordinates.add(chainClusterer.getCalphaCoordinates().get(index)); subSequenceIds.add(chainClusterer.getSequenceClusterIds().get(index)); subPseudoStoichiometry.add(chainClusterer.getPseudoStoichiometry().get(index)); + subMinSequenceIdentity.add(chainClusterer.getMinSequenceIdentity().get(index)); + subMaxSequenceIdentity.add(chainClusterer.getMaxSequenceIdentity().get(index)); subChainIds.add(chainClusterer.getChainIds().get(index)); subModelNumbers.add(chainClusterer.getModelNumbers().get(index)); } @@ -184,6 +190,8 @@ private Subunits createLocalSubunit(List subCluster) { Subunits subunits = new Subunits(subCalphaCoordinates, subSequenceIds, subPseudoStoichiometry, + subMinSequenceIdentity, + subMaxSequenceIdentity, subFolds, subChainIds, subModelNumbers); diff --git a/src/main/java/org/biojava3/structure/quaternary/core/SequenceAlignmentCluster.java b/src/main/java/org/biojava3/structure/quaternary/core/SequenceAlignmentCluster.java index f2c9a85d..7eb5334b 100644 --- a/src/main/java/org/biojava3/structure/quaternary/core/SequenceAlignmentCluster.java +++ b/src/main/java/org/biojava3/structure/quaternary/core/SequenceAlignmentCluster.java @@ -22,8 +22,8 @@ public class SequenceAlignmentCluster { private int alignmentLength = 0; private boolean pseudoStoichiometric = false; - private double minSequenceIdentity = 100; - private double maxSequenceIdentity = 0; + private double minSequenceIdentity = 1.0; + private double maxSequenceIdentity = 0.0; private boolean modified = true; @@ -36,10 +36,16 @@ public boolean isPseudoStoichiometric() { } public double getMinSequenceIdentity() { + if (! isPseudoStoichiometric()) { + return 1.0; + } return minSequenceIdentity; } public double getMaxSequenceIdentity() { + if (! isPseudoStoichiometric()) { + return 1.0; + } return maxSequenceIdentity; } @@ -49,11 +55,7 @@ public void addUniqueSequenceList(UniqueSequenceList sequenceList) { } public int getSequenceCount() { - int count = 0; - for (UniqueSequenceList list: uniqueSequenceList) { - count += list.getChainCount(); - } - return count; + return uniqueSequenceList.size(); } public int getSequenceAlignmentLength() { @@ -68,9 +70,7 @@ public List getUniqueSequenceList() { public List getChainIds() { List ids = new ArrayList(); for (UniqueSequenceList list: uniqueSequenceList) { - for (int i = 0, n = list.getChainCount(); i < n; i++) { - ids.add(list.getChainId(i)); - } + ids.add(list.getChainId()); } return ids; } @@ -78,9 +78,7 @@ public List getChainIds() { public List getModelNumbers() { List numbers = new ArrayList(); for (UniqueSequenceList list: uniqueSequenceList) { - for (int i = 0, n = list.getChainCount(); i < n; i++) { - numbers.add(list.getModelNumber(i)); - } + numbers.add(list.getModelNumber()); } return numbers; } @@ -88,9 +86,7 @@ public List getModelNumbers() { public List getStructureIds() { List numbers = new ArrayList(); for (UniqueSequenceList list: uniqueSequenceList) { - for (int i = 0, n = list.getChainCount(); i < n; i++) { - numbers.add(list.getStructureId(i)); - } + numbers.add(list.getStructureId()); } return numbers; } @@ -129,7 +125,7 @@ public boolean identityMatch(Atom[] cAlphaAtoms, String chainId, int modelNumber if (seqMatch) { List alig1 = new ArrayList(); List alig2 = new ArrayList(); - Atom[] referenceAtoms = u.getReferenceChain(); + Atom[] referenceAtoms = u.getCalphaAtoms(); int inCommon = alignIdenticalSequence(referenceAtoms, cAlphaAtoms, alig1, alig2); // System.out.println("in common: " + inCommon); @@ -154,8 +150,8 @@ public int[][][] alignClustersByStructure(SequenceAlignmentCluster cluster) { pseudoStoichiometric = false; int[][][] alignment = null; - Atom[] referenceAtoms1 = this.getUniqueSequenceList().get(0).getReferenceChain(); - Atom[] referenceAtoms2 = cluster.getUniqueSequenceList().get(0).getReferenceChain(); + Atom[] referenceAtoms1 = this.getUniqueSequenceList().get(0).getCalphaAtoms(); + Atom[] referenceAtoms2 = cluster.getUniqueSequenceList().get(0).getCalphaAtoms(); double alignmentLengthFraction = (double)Math.min(referenceAtoms1.length, referenceAtoms2.length) / Math.max(referenceAtoms1.length, referenceAtoms2.length); @@ -318,14 +314,12 @@ private void createAlignedCAlphaAtoms() { alignmentIndices.add(alignment2.get(i)); } } - for (int i = 0; i < u.getChainCount(); i++) { - Atom[] unalignedAtoms = u.getChain(i); - Atom[] alignedAtoms = new Atom[alignmentIndices.size()]; - for (int j = 0; j < alignedAtoms.length; j++) { - alignedAtoms[j] = unalignedAtoms[alignmentIndices.get(j)]; - } - alignedCAlphaAtoms.add(alignedAtoms); + Atom[] unalignedAtoms = u.getCalphaAtoms(); + Atom[] alignedAtoms = new Atom[alignmentIndices.size()]; + for (int j = 0; j < alignedAtoms.length; j++) { + alignedAtoms[j] = unalignedAtoms[alignmentIndices.get(j)]; } + alignedCAlphaAtoms.add(alignedAtoms); } } diff --git a/src/main/java/org/biojava3/structure/quaternary/core/Subunits.java b/src/main/java/org/biojava3/structure/quaternary/core/Subunits.java index cfbf1e4d..b2009edf 100644 --- a/src/main/java/org/biojava3/structure/quaternary/core/Subunits.java +++ b/src/main/java/org/biojava3/structure/quaternary/core/Subunits.java @@ -25,6 +25,8 @@ public class Subunits { private List caCoords = Collections.emptyList(); private List sequenceClusterIds = Collections.emptyList(); private List pseudoStoichiometry = Collections.emptyList(); + private List minSequenceIdentity = Collections.emptyList(); + private List maxSequenceIdentity = Collections.emptyList(); private List chainIds = Collections.emptyList(); private List modelNumbers = Collections.emptyList(); private List folds = Collections.emptyList(); @@ -35,13 +37,15 @@ public class Subunits { private Point3d centroid; private MomentsOfInertia momentsOfInertia = new MomentsOfInertia(); - public Subunits(List caCoords, List sequenceClusterIds, List pseudoStoichiometry, List folds, List chainIds, List modelNumbers) { - this.caCoords = caCoords; - this.sequenceClusterIds = sequenceClusterIds; - this.pseudoStoichiometry = pseudoStoichiometry; - this.folds = folds; - this.chainIds = chainIds; - this.modelNumbers = modelNumbers; + public Subunits(List caCoords, List sequenceClusterIds, List pseudoStoichiometry, List minSequenceIdentity, List maxSequenceIdentity, List folds, List chainIds, List modelNumbers) { + this.caCoords = caCoords; + this.sequenceClusterIds = sequenceClusterIds; + this.pseudoStoichiometry = pseudoStoichiometry; + this.minSequenceIdentity = minSequenceIdentity; + this.maxSequenceIdentity = maxSequenceIdentity; + this.folds = folds; + this.chainIds = chainIds; + this.modelNumbers = modelNumbers; } public List getTraces() { @@ -60,7 +64,7 @@ public List getSequenceClusterIds() { return sequenceClusterIds; } - public boolean isPseudoStiochiometric() { + public boolean isPseudoStoichiometric() { for (Boolean b: pseudoStoichiometry) { if (b) { return true; @@ -69,10 +73,22 @@ public boolean isPseudoStiochiometric() { return false; } - public List getPseudoStoichiometry() { - return pseudoStoichiometry; + public double getMinSequenceIdentity() { + double minId = 1.0; + for (double seqId: minSequenceIdentity) { + minId = Math.min(seqId, minId); + } + return minId; } + public double getMaxSequenceIdentity() { + double maxId = 1.0; + for (double seqId: maxSequenceIdentity) { + maxId = Math.min(seqId, maxId); + } + return maxId; + } + public List getChainIds() { return chainIds; } diff --git a/src/main/java/org/biojava3/structure/quaternary/core/UniqueSequenceList.java b/src/main/java/org/biojava3/structure/quaternary/core/UniqueSequenceList.java index 8da6d6fa..6ea683f7 100644 --- a/src/main/java/org/biojava3/structure/quaternary/core/UniqueSequenceList.java +++ b/src/main/java/org/biojava3/structure/quaternary/core/UniqueSequenceList.java @@ -11,23 +11,24 @@ public class UniqueSequenceList { private String seqResSequence = ""; private List alignment1 = null; private List alignment2 = null; - private List caAtoms = new ArrayList(); - private List chainIds = new ArrayList(); - private List modelNumbers = new ArrayList(); - private List structureIds = new ArrayList(); + private Atom[] caAtoms = null; + private String chainId = null; + private Integer modelNumber = null; + private Integer structureId = null; public UniqueSequenceList(Atom[] cAlphaAtoms, String chainId, int modelNumber, int structureId, String seqResSequence) { - this.caAtoms.add(cAlphaAtoms); - this.chainIds.add(chainId); - this.modelNumbers.add(modelNumber); - this.structureIds.add(structureId); + this.caAtoms = cAlphaAtoms; + this.chainId = chainId; + this.modelNumber = modelNumber; + this.structureId = structureId; this.seqResSequence = seqResSequence; this.sequenceString = getSequenceString(cAlphaAtoms); this.alignment1 = new ArrayList(cAlphaAtoms.length); + this.alignment2 = new ArrayList(cAlphaAtoms.length); for (int i = 0; i < cAlphaAtoms.length; i++) { this.alignment1.add(i); + this.alignment2.add(i); } - this.alignment2 = alignment1; } /** @@ -41,43 +42,21 @@ public boolean isMatch(Atom[] caAlphaAtoms) { return sequenceString.equals(getSequenceString(caAlphaAtoms)); } - public void addChain(Atom[] cAlphaAtoms, String chainId, int modelNumber, int structureId) { - this.caAtoms.add(cAlphaAtoms); - this.chainIds.add(chainId); - this.modelNumbers.add(modelNumber); - this.structureIds.add(structureId); + public String getChainId() { + return chainId; } - public int getChainCount() { - return caAtoms.size(); - } - - public Atom[] getChain(int index) { - return caAtoms.get(index); - } - - public String getChainId(int index) { - return chainIds.get(index); - } - - public int getModelNumber(int index) { - return modelNumbers.get(index); + public int getModelNumber() { + return modelNumber; } - public int getStructureId(int index) { - return structureIds.get(index); + public int getStructureId() { + return structureId; } - public Atom[] getReferenceChain() { - return caAtoms.get(0); + public Atom[] getCalphaAtoms() { + return caAtoms; } - - /** - * @return the sequenceString - */ - public String getSequenceString() { - return sequenceString; - } public String getSeqResSequence() { return seqResSequence; @@ -119,6 +98,7 @@ public static String getSequenceString(Atom[] caAlphaAtoms) { for (Atom a: caAlphaAtoms) { Group g = a.getGroup(); + // TODO is the check for UNK required? UNK should have been filtered already in ChainClusterer? if (! g.getPDBName().equals("UNK")) { builder.append(g.getResidueNumber()); builder.append(g.getPDBName()); @@ -132,7 +112,7 @@ public static String getSequenceString(Atom[] caAlphaAtoms) { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("#: "); - builder.append(caAtoms.size()); + builder.append(caAtoms.length); builder.append(" seq: "); builder.append(sequenceString); builder.append("\n"); diff --git a/src/main/java/org/biojava3/structure/quaternary/misc/FindQuarternarySymmetry.java b/src/main/java/org/biojava3/structure/quaternary/misc/FindQuarternarySymmetry.java index 0c2d01ca..89bd3721 100644 --- a/src/main/java/org/biojava3/structure/quaternary/misc/FindQuarternarySymmetry.java +++ b/src/main/java/org/biojava3/structure/quaternary/misc/FindQuarternarySymmetry.java @@ -101,13 +101,13 @@ private void createSubunits() { } List folds = chainClusterer.getFolds(); maxFolds = folds.get(folds.size()-1); - subunits = new Subunits(chainClusterer.getCalphaCoordinates(), - chainClusterer.getSequenceClusterIds(), - chainClusterer.getPseudoStoichiometry(), - folds, - chainClusterer.getChainIds(), - chainClusterer.getModelNumbers()); - pseudoSymmetric = subunits.isPseudoStiochiometric(); +// subunits = new Subunits(chainClusterer.getCalphaCoordinates(), +// chainClusterer.getSequenceClusterIds(), +// chainClusterer.getPseudoStoichiometry(), +// folds, +// chainClusterer.getChainIds(), +// chainClusterer.getModelNumbers()); + pseudoSymmetric = subunits.isPseudoStoichiometric(); maxFolds = folds.get(folds.size()-1); if ( parameters.isVerbose()) System.out.println("Subunits: centroids: " + subunits.getCentroid() + " folds:" + subunits.getFolds());