/* * 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; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.biojava.nbio.structure.align.util.AtomCache; import org.biojava.nbio.structure.io.FileParsingParameters; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; public class TestBond { private static AtomCache cache; @BeforeClass public static void setUp() { cache = new AtomCache(); cache.setUseMmCif(true); FileParsingParameters params = cache.getFileParsingParams(); params.setAlignSeqRes(true); params.setCreateAtomBonds(true); StructureIO.setAtomCache(cache); } @Test public void testStructConnModels() throws IOException, StructureException { Structure s = StructureIO.getStructure("1cdr"); Group groupOne = s.getPolyChain("A",1).getGroupByPDB(new ResidueNumber("A", 18, ' ')); Group groupTwo = s.getPolyChain("B",1).getGroupByPDB(new ResidueNumber("A", 78, ' ')); Atom atomOne = groupOne.getAtom("ND2"); Atom atomTwo = groupTwo.getAtom("C1"); assertTrue(areBonded(atomOne, atomTwo)); } @Test public void testIntraResidueBonds() throws StructureException, IOException { Structure s = StructureIO.getStructure("1kh9"); Group g = s.getPolyChainByPDB("A").getSeqResGroup(274); Atom cg = g.getAtom("CG"); Atom cb = g.getAtom("CB"); Atom cd1 = g.getAtom("CD1"); Atom cd2 = g.getAtom("CD2"); assertEquals(3, cg.getBonds().size()); for (Bond bond : cg.getBonds()) { if (bond.getOther(cg) == cb) { assertEquals(1, bond.getBondOrder()); } else if (bond.getOther(cg) == cd1) { assertEquals(2, bond.getBondOrder()); } else if (bond.getOther(cg) == cd2) { assertEquals(1, bond.getBondOrder()); } } } @Test public void testPeptideBonds() throws StructureException, IOException { Structure s = StructureIO.getStructure("1kh9"); AminoAcidImpl residue1 = (AminoAcidImpl) s.getPolyChainByPDB("A").getSeqResGroup(273); AminoAcidImpl residue2 = (AminoAcidImpl) s.getPolyChainByPDB("A").getSeqResGroup(274); Atom carboxylC = residue1.getC(); Atom aminoN = residue2.getN(); assertTrue(areBonded(carboxylC, aminoN)); } @Test public void testDisulfideBonds() throws StructureException, IOException { Structure s = StructureIO.getStructure("1kh9"); Atom atom1 = s.getPolyChainByPDB("A").getSeqResGroup(177).getAtom("SG"); Atom atom2 = s.getPolyChainByPDB("A").getSeqResGroup(167).getAtom("SG"); assertTrue(areBonded(atom1, atom2)); } @Test public void testLigandBonds() throws StructureException, IOException { Structure s = StructureIO.getStructure("1kh9"); Atom phosphateP = s.getChain("I").getAtomGroup(0).getAtom("P"); Atom phosphateO = s.getChain("I").getAtomGroup(0).getAtom("O1"); assertTrue(areBonded(phosphateP, phosphateO)); } /** * Test whether nucleotide bonds are being generated * @throws IOException * @throws StructureException */ @Test public void testNucleotideBonds() throws IOException, StructureException { Structure bio = StructureIO.getStructure("4y60"); for( Chain c : bio.getChains()) { int groupCounter = 0; List<Group> currentGroups = c.getAtomGroups(); for ( Group g : currentGroups) { if(groupCounter!=0 && groupCounter<currentGroups.size()) { List<Atom> atoms = g.getAtoms(); for ( Atom a : atoms) { if ( a.getName().equals("P")){ // Check to see if one of the phosphate atoms has bonding to something // outside of the group. List<Integer> indexList = new ArrayList<>(); for (Bond b : a.getBonds()){ indexList.add(atoms.indexOf(b.getOther(a))); } assertTrue(indexList.contains(-1)); } } } groupCounter++; } } } /** * Test whether these partial occupancy hydrogens are bonded to the residue. * @throws StructureException * @throws IOException */ @Test public void testHeavyAtomBondMissing() throws IOException, StructureException { assertEquals(testMissingBonds("3jtm"),0); assertEquals(testMissingBonds("3jq8"),0); assertEquals(testMissingBonds("3jq9"),0); assertEquals(testMissingBonds("3i06"),0); assertEquals(testMissingBonds("3nu3"),0); assertEquals(testMissingBonds("3nu4"),0); assertEquals(testMissingBonds("3nvd"),0); } /** * Test whether these partial occupancy hydrogens are bonded to the residue. * @throws StructureException * @throws IOException */ @Test public void testHydrogenToProteinBondMissing() throws IOException, StructureException { assertEquals(testMissingBonds("4txr"),0); assertEquals(testMissingBonds("3nvd"),0); } /** * Test whether these partial occupancy hydrogens are bonded to the residue. * @throws StructureException * @throws IOException */ @Test public void testAltLocBondMissing() throws IOException, StructureException { assertEquals(testMissingBonds("4cup"),0); } /** * * @throws IOException * @throws StructureException */ private int testMissingBonds(String pdbId) throws IOException, StructureException { Structure inputStructure = StructureIO.getStructure(pdbId); // Loop through the structure int nonBondedCounter =0; for(int i=0;i<inputStructure.nrModels();i++){ for(Chain c: inputStructure.getChains(i)){ for(Group g: c.getAtomGroups()){ // Skip single atom groups if(g.size()<=1){ continue; } // Get all the atoms List<Atom> atomsList = new ArrayList<>(g.getAtoms()); for(Group altLocOne: g.getAltLocs()){ atomsList.addAll(altLocOne.getAtoms()); } // Check they all have bonds for(Atom a: atomsList){ if(a.getBonds()==null){ nonBondedCounter++; } } } } } return nonBondedCounter; } private int testBondedToSelf(String pdbId) throws IOException, StructureException { Structure inputStructure = StructureIO.getStructure(pdbId); int bondedToSelf =0; for(int i=0;i<inputStructure.nrModels();i++){ for(Chain c: inputStructure.getChains(i)){ for(Group g: c.getAtomGroups()){ // Skip single atom groups if(g.size()<=1){ continue; } // Get all the atoms List<Atom> atomsList = new ArrayList<>(g.getAtoms()); for(Group altLocOne: g.getAltLocs()){ atomsList.addAll(altLocOne.getAtoms()); } // Check they all have bonds for(Atom a: atomsList){ if(a.getBonds()!=null){ for(Bond b: a.getBonds()){ if(b.getAtomA().equals(b.getAtomB())){ bondedToSelf+=1; } } } } } } } return bondedToSelf; } private boolean areBonded(Atom a, Atom b) { for (Bond bond : a.getBonds()) { if (bond.getOther(a) == b) { return true; } } return false; } /* * Each of the following PDB IDs used to make formBonds() crash. */ @Test public void test145D() throws IOException, StructureException { StructureIO.getStructure("145D"); } @Test public void test1APJ() throws IOException, StructureException { StructureIO.getStructure("1APJ"); } @Test public void test1BDX() throws IOException, StructureException { StructureIO.getStructure("1BDX"); } /** * Test that all the atoms in deuterated structures are bonded. * @throws IOException an error getting the required file * @throws StructureException an error parsing the required file */ @Test public void testDeuterated() throws IOException, StructureException { // The terminal Hydrogen D3 - is missing (from the CCD) assertEquals(testMissingBonds("1GKT"),2); assertEquals(testMissingBonds("1IO5"),2); // All H/D2,H/D3 errors assertEquals(testMissingBonds("5E5J"),13); } /** * Test this weird case - with missing Oxygen atoms, alternate locations on Deuterium * and terminal hydrogens. * @throws IOException an error getting the required file * @throws StructureException an error parsing the required file */ @Test public void testWeirdCase() throws IOException, StructureException { assertEquals(testMissingBonds("1IU6"),6); } /** * Test that Sulphur atoms are not found to be bonded to themselves * @throws IOException an error getting the required file * @throws StructureException an error parsing the required file */ @Test public void testSSBonds() throws IOException, StructureException { for(String pdbCode : new String[]{"3ZXW","1NTY", "4H2I", "2K6D", "2MLM"}){ assertEquals(testBondedToSelf(pdbCode),0); } } }