/*
* 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.io;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.List;
import org.biojava.nbio.structure.Bond;
import org.biojava.nbio.structure.Group;
import org.biojava.nbio.structure.ResidueNumber;
import org.biojava.nbio.structure.Site;
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.junit.Test;
/**
* Created by larsonmattr on 10/31/2015.
*/
public class TestParseMmCIFFeatures {
@Test
public void testSSBond()throws IOException, StructureException {
AtomCache cache = new AtomCache();
StructureIO.setAtomCache(cache);
cache.setUseMmCif(true);
FileParsingParameters params = new FileParsingParameters();
params.setCreateAtomBonds(true);
cache.setFileParsingParams(params);
Structure sCif = StructureIO.getStructure("2OYA");
assertNotNull(sCif);
// After it has read the file, it should check that expected SSBONDs are present.
List<Bond> bonds = sCif.getSSBonds();
// 2OYA has 6 ssbonds, 3 on molecule A and 3 on molecule B
assertEquals(6, bonds.size());
// Check the bonds
assertDisulfideBond("A", "A", 446, 507, bonds.get(0));
assertDisulfideBond("A", "A", 459, 517, bonds.get(1));
assertDisulfideBond("A", "A", 487, 497, bonds.get(2));
assertDisulfideBond("B", "B", 446, 507, bonds.get(3));
assertDisulfideBond("B", "B", 459, 517, bonds.get(4));
assertDisulfideBond("B", "B", 487, 497, bonds.get(5));
}
@Test
public void testSSBondAltLocs() throws IOException, StructureException {
AtomCache cache = new AtomCache();
StructureIO.setAtomCache(cache);
cache.setUseMmCif(true);
FileParsingParameters params = new FileParsingParameters();
params.setCreateAtomBonds(true);
cache.setFileParsingParams(params);
Structure sCif = StructureIO.getStructure("3DVF");
assertNotNull(sCif);
// After it has read the file, it should check that expected SSBONDs are present.
List<Bond> bonds = sCif.getSSBonds();
// 3DVF has 2 ssbonds including 1 in an alt loc
assertEquals(2, bonds.size());
// Check the bonds
assertDisulfideBond("A", "A", 23, 88, bonds.get(0));
assertDisulfideBond("A", "A", 23, 88, bonds.get(1));
// check that we have the bonds correctly assigned to both atom and its altgroup atom
Group g = sCif.getPolyChainByPDB("A").getGroupByPDB(new ResidueNumber("A", 23, ' '));
Group altG = g.getAltLocGroup('B');
Group g2 = sCif.getPolyChainByPDB("A").getGroupByPDB(new ResidueNumber("A", 88, ' '));
List<Bond> bs = g.getAtom("SG").getBonds();
Bond b = null;
for (Bond bn:bs){
if (bn.getAtomA().getName().equals("SG") && bn.getAtomB().getName().equals("SG")) {
b = bn;
}
}
List<Bond> altbs = altG.getAtom("SG").getBonds();
Bond bAltG = null;
for (Bond bn:altbs){
if (bn.getAtomA().getName().equals("SG") && bn.getAtomB().getName().equals("SG")) {
bAltG = bn;
}
}
assertNotNull(b);
assertNotNull(bAltG);
//System.out.println(g);
//System.out.println(altG);
assertSame(g.getAtom("SG") , b.getAtomA());
assertSame(altG.getAtom("SG"), bAltG.getAtomA());
assertSame(g2.getAtom("SG"), b.getAtomB());
assertSame(g2.getAtom("SG"), bAltG.getAtomB());
}
private void assertDisulfideBond(String expectedChainId1, String expectedChainId2, int expectedResSerial1, int expectedResSerial2, Bond bond) {
String chainId1 = bond.getAtomA().getGroup().getChainId();
String chainId2 = bond.getAtomB().getGroup().getChainId();
ResidueNumber resNum1 = bond.getAtomA().getGroup().getResidueNumber();
ResidueNumber resNum2 = bond.getAtomB().getGroup().getResidueNumber();
assertEquals("disulfide bond first chain id failed ", expectedChainId1, chainId1);
assertEquals("disulfide bond second chain id failed ", expectedChainId2, chainId2);
assertEquals("disulfide bond failed first residue number failed ", new ResidueNumber(expectedChainId1, expectedResSerial1, null), resNum1);
assertEquals("disulfide bond failed second residue number failed ", new ResidueNumber(expectedChainId2, expectedResSerial2, null), resNum2);
}
@Test
public void testSites()throws IOException, StructureException {
AtomCache cache = new AtomCache();
StructureIO.setAtomCache(cache);
cache.setUseMmCif(true);
Structure sCif = StructureIO.getStructure("4HHB");
assertNotNull(sCif);
// After it has read the file, it should check that expected SITES are present.
List<Site> sites = sCif.getSites();
// 4HHB has 6 sites from ligands.
assertEquals(6, sites.size());
// Check for each site that it has parsed all residues.
assertEquals(1, getGroupsInSite(sCif, "AC1"));
assertEquals(1, getGroupsInSite(sCif, "AC2"));
assertEquals(16, getGroupsInSite(sCif, "AC3"));
assertEquals(13, getGroupsInSite(sCif, "AC4"));
assertEquals(15, getGroupsInSite(sCif, "AC5"));
assertEquals(7, getGroupsInSite(sCif, "AC6"));
// Check that struct_site parsing worked, and they have descriptions.
assertEquals(getDescription(sCif, "AC1"), "BINDING SITE FOR RESIDUE PO4 D 147");
assertEquals(getDescription(sCif, "AC2"), "BINDING SITE FOR RESIDUE PO4 B 147");
assertEquals(getDescription(sCif, "AC3"), "BINDING SITE FOR RESIDUE HEM A 142");
assertEquals(getDescription(sCif, "AC4"), "BINDING SITE FOR RESIDUE HEM B 148");
assertEquals(getDescription(sCif, "AC5"), "BINDING SITE FOR RESIDUE HEM C 142");
assertEquals(getDescription(sCif, "AC6"), "BINDING SITE FOR RESIDUE HEM D 148");
}
@Test
public void testSites1a4w()throws IOException, StructureException {
AtomCache cache = new AtomCache();
StructureIO.setAtomCache(cache);
cache.setUseMmCif(true);
Structure sCif = StructureIO.getStructure("1A4W");
assertNotNull(sCif);
// After it has read the file, it should check that expected SITES are present.
List<Site> sites = sCif.getSites();
// 1a4w has 5 sites from ligands.
assertEquals(5, sites.size());
// Check for each site that it has parsed all residues.
assertEquals(3, getGroupsInSite(sCif, "CAT"));
assertEquals(6, getGroupsInSite(sCif, "AC1")); // Site has residue with insertion code.
assertEquals(6, getGroupsInSite(sCif, "AC2"));
assertEquals(14, getGroupsInSite(sCif, "AC3"));
assertEquals(14, getGroupsInSite(sCif, "AC4"));
}
private int getGroupsInSite(Structure structure, String site) {
for (Site a_site : structure.getSites()) {
if (a_site.getSiteID().equals(site)) {
return a_site.getGroups().size();
}
}
return 0;
}
private String getDescription(Structure structure, String site) {
for (Site a_site : structure.getSites()) {
if (a_site.getSiteID().equals(site)) {
return a_site.getDescription();
}
}
return "";
}
}