/*
* BioJava development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. If you do not have a copy,
* see:
*
* http://www.gnu.org/copyleft/lesser.html
*
* Copyright for this code is held jointly by the individual
* authors. These should be listed in @author doc comments.
*
* For more information on the BioJava project and its aims,
* or to join the biojava-l mailing list, visit the home page
* at:
*
* http://www.biojava.org/
*
*/
package org.biojava.nbio.structure.xtal;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.zip.GZIPInputStream;
import org.biojava.nbio.structure.Structure;
import org.biojava.nbio.structure.StructureException;
import org.biojava.nbio.structure.StructureIO;
import org.biojava.nbio.structure.align.util.AtomCache;
import org.biojava.nbio.structure.contact.StructureInterfaceCluster;
import org.biojava.nbio.structure.contact.StructureInterfaceList;
import org.biojava.nbio.structure.io.FileParsingParameters;
import org.biojava.nbio.structure.io.PDBFileParser;
import org.junit.Test;
public class TestInterfaceClustering {
@Test
public void test3DDO() throws IOException, StructureException {
// 3DDO is special in that it contains 6 chains in 1 entity, all of them with different residue numbering
AtomCache cache = new AtomCache();
FileParsingParameters params = new FileParsingParameters();
params.setAlignSeqRes(true);
cache.setFileParsingParams(params);
cache.setUseMmCif(true);
StructureIO.setAtomCache(cache);
Structure s = StructureIO.getStructure("3DDO");
CrystalBuilder cb = new CrystalBuilder(s);
StructureInterfaceList interfaces = cb.getUniqueInterfaces(5.5);
interfaces.calcAsas(100, 1, 0);
interfaces.removeInterfacesBelowArea();
List<StructureInterfaceCluster> clusters = interfaces.getClusters();
// 22 if below 35A2 interfaces are filtered
assertEquals(22,interfaces.size());
// we simply want to test that some interfaces cluster together, for this entry
// it is problematic because of different residue numbering between different chains of same entity
assertTrue("Expected fewer than 22 interfaces (some interfaces should cluster together)",clusters.size()<22);
// first 2 clusters are of size 3
assertEquals("Cluster 1 should have 3 members",3,clusters.get(0).getMembers().size());
assertEquals("Cluster 2 should have 3 members",3,clusters.get(1).getMembers().size());
// detection of isologous test: first 3 interfaces should be isologous
assertTrue("Interface 1 should be isologous",interfaces.get(1).isIsologous());
assertTrue("Interface 2 should be isologous",interfaces.get(2).isIsologous());
assertTrue("Interface 3 should be isologous",interfaces.get(3).isIsologous());
}
@Test
public void test3C5FWithSeqresPdb() throws IOException, StructureException {
InputStream inStream = new GZIPInputStream(this.getClass().getResourceAsStream("/org/biojava/nbio/structure/io/3c5f_raw.pdb.gz"));
assertNotNull(inStream);
PDBFileParser pdbpars = new PDBFileParser();
FileParsingParameters params = new FileParsingParameters();
params.setAlignSeqRes(true);
pdbpars.setFileParsingParameters(params);
Structure s = pdbpars.parsePDBFile(inStream) ;
assertNotNull(s);
assertEquals(8, s.getPolyChains().size());
// 1 protein, 3 nucleotide chains, 1 NA nonpoly chain, 1 water: 6 entities
assertEquals(6, s.getEntityInfos().size());
CrystalBuilder cb = new CrystalBuilder(s);
StructureInterfaceList interfaces = cb.getUniqueInterfaces(5.5);
interfaces.calcAsas(100, 1, 0);
interfaces.removeInterfacesBelowArea();
List<StructureInterfaceCluster> clusters = interfaces.getClusters();
// 23 if below 35A2 interfaces are filtered
assertEquals(23,interfaces.size());
// we simply want to test that some interfaces cluster together
assertTrue("Expected fewer than 23 interfaces (some interfaces should cluster together)",clusters.size()<23);
// third cluster (index 2) is of size 2
assertEquals("Cluster 3 should have 2 members",2,clusters.get(2).getMembers().size());
assertTrue("Interface 3 should be isologous",interfaces.get(3).isIsologous());
}
// This doesn't work yet, since for raw files without a SEQRES, the seqres groups are not populated. Instead
// in that case Compound.getAlignedResIndex() returns residue numbers as given (without insertion codes) and
// thus in general residues will not be correctly aligned between different chains of same entity. This breaks
// cases like 3ddo (with no SEQRES records) where residue numbering is different in every chain of the one entity.
// Then contact overlap calculation will be wrong and interface clustering won't work.
// see https://github.com/eppic-team/eppic/issues/39
// See also TestCompoundResIndexMapping
//@Test
public void test3DDONoSeqresPdb() throws IOException, StructureException {
// 3ddo contains 6 chains in 1 entity, with residue numbering completely different in each of the chains
InputStream inStream = new GZIPInputStream(this.getClass().getResourceAsStream("/org/biojava/nbio/structure/io/3ddo_raw_noseqres.pdb.gz"));
assertNotNull(inStream);
PDBFileParser pdbpars = new PDBFileParser();
FileParsingParameters params = new FileParsingParameters();
params.setAlignSeqRes(true);
pdbpars.setFileParsingParameters(params);
Structure s = pdbpars.parsePDBFile(inStream) ;
assertNotNull(s);
assertEquals(6, s.getChains().size());
assertEquals(1, s.getEntityInfos().size());
CrystalBuilder cb = new CrystalBuilder(s);
StructureInterfaceList interfaces = cb.getUniqueInterfaces(5.5);
interfaces.calcAsas(100, 1, 0);
interfaces.removeInterfacesBelowArea();
List<StructureInterfaceCluster> clusters = interfaces.getClusters();
// 22 if below 35A2 interfaces are filtered
assertEquals(22,interfaces.size());
// we simply want to test that some interfaces cluster together, for this entry
// it is problematic because of different residue numbering between different chains of same entity
assertTrue("Expected fewer than 22 interfaces (some interfaces should cluster together)",clusters.size()<22);
// first 2 clusters are of size 3
assertEquals("Cluster 1 should have 3 members",3,clusters.get(0).getMembers().size());
assertEquals("Cluster 2 should have 3 members",3,clusters.get(1).getMembers().size());
// detection of isologous test: first 3 interfaces should be isologous
assertTrue("Interface 1 should be isologous",interfaces.get(1).isIsologous());
assertTrue("Interface 2 should be isologous",interfaces.get(2).isIsologous());
assertTrue("Interface 3 should be isologous",interfaces.get(3).isIsologous());
}
}