/**
* 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/
*
* Created on 2012-11-20
* Created by Douglas Myers-Turnbull
*
* @since 3.0.6
*/
package org.biojava.nbio.structure.rcsb;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
import static org.junit.Assert.assertEquals;
/**
* Tests {@link RCSBDescriptionFactory}.
* @author dmyerstu
* @since 3.0.6
*/
public class RCSBDescriptionFactoryTest {
private static final String TEST_DIR = "src/test/resources/";
/**
* Opens the file as a {@link FileInputStream}. Copied from ResourceList, which is not in biojava.
*/
private FileInputStream openStream(String filename) {
File file = new File(TEST_DIR + filename);
FileInputStream fis;
try {
fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
return fis;
}
/**
* Tests on the live database. Just makes sure the resource can be found.
* If this test fails, it may be because the database changed.
*/
@Test
public void testUrl() {
RCSBDescriptionFactory.get("1w0p"); // just make sure it doesn't throw an exception
}
/**
* Covers all the basic features, including EC numbers. Does not cover multiple polymers or multiple chains.
*/
@Test
public void test1() {
RCSBDescription description = RCSBDescriptionFactory.get(openStream("describeMol/1w0p.xml"));
assertEquals("1W0P", description.getPdbId());
List<RCSBPolymer> polymers = description.getPolymers();
assertEquals(1, polymers.size());
RCSBPolymer polymer = polymers.get(0);
assertEquals("protein", polymer.getType());
assertEquals(1, polymer.getIndex().intValue());
assertEquals("SIALIDASE", polymer.getDescription());
assertEquals("3.2.1.18", polymer.getEnzClass());
assertEquals(781, polymer.getLength().intValue());
assertEquals(85675.5, polymer.getWeight(), 0);
List<Character> chains = polymer.getChains();
assertEquals(1, chains.size());
assertEquals('A', (char) chains.get(0));
List<String> synonyms = polymer.getSynonyms();
assertEquals(2, synonyms.size());
assertEquals("NEURAMINIDASE", synonyms.get(0));
assertEquals("NANASE", synonyms.get(1));
RCSBTaxonomy tax = polymer.getTaxonomy();
assertEquals(666, tax.getId());
assertEquals("Vibrio cholerae", tax.getName());
RCSBMacromolecule mol = polymer.getMolecule();
assertEquals("Sialidase", mol.getName());
List<String> accessions = mol.getAccessions();
assertEquals(4, accessions.size());
assertEquals("A5F7A4", accessions.get(0));
assertEquals("C3M1H8", accessions.get(1));
assertEquals("P37060", accessions.get(2));
assertEquals("Q9KR59", accessions.get(3));
}
/**
* What if we have a structureId but no polymers?
*/
@Test
public void testEmpty() {
RCSBDescription description = RCSBDescriptionFactory.get(openStream("describeMol/empty.xml"));
assertEquals("empty", description.getPdbId());
List<RCSBPolymer> polymers = description.getPolymers();
assertEquals(0, polymers.size());
}
/**
* What if we have polymers but no macroMolecule or chains?
* And what if a polymer contains no attributes?
*/
@Test
public void testAlmostEmpty() {
RCSBDescription description = RCSBDescriptionFactory.get(openStream("describeMol/almost_empty.xml"));
assertEquals("almost_empty", description.getPdbId());
List<RCSBPolymer> polymers = description.getPolymers();
assertEquals(2, polymers.size());
RCSBPolymer polymer = polymers.get(0);
assertEquals("notype", polymer.getType());
assertEquals(1, polymer.getIndex().intValue());
assertEquals("really close to empty", polymer.getDescription());
assertEquals(null, polymer.getEnzClass());
assertEquals(10, polymer.getLength().intValue());
assertEquals(0, polymer.getWeight(), 0);
polymer = polymers.get(1);
assertEquals(null, polymer.getType()); // make sure these are null and not ""
assertEquals(null, polymer.getIndex());
assertEquals(null, polymer.getDescription());
assertEquals(null, polymer.getEnzClass());
assertEquals(null, polymer.getLength());
assertEquals(null, polymer.getWeight());
}
/**
* Covers multiple polymers and multiple chains.
*/
@Test
public void test2() {
RCSBDescription description = RCSBDescriptionFactory.get(openStream("describeMol/4hhb.xml"));
assertEquals("4HHB", description.getPdbId());
List<RCSBPolymer> polymers = description.getPolymers();
assertEquals(2, polymers.size());
// first polymer
RCSBPolymer polymer = polymers.get(0);
assertEquals("protein", polymer.getType());
assertEquals(1, polymer.getIndex().intValue());
assertEquals("HEMOGLOBIN (DEOXY) (ALPHA CHAIN)", polymer.getDescription());
assertEquals(null, polymer.getEnzClass());
assertEquals(141, polymer.getLength().intValue());
assertEquals(15150.5, polymer.getWeight(), 0);
List<Character> chains = polymer.getChains();
assertEquals(2, chains.size());
assertEquals('A', (char) chains.get(0));
assertEquals('C', (char) chains.get(1));
List<String> synonyms = polymer.getSynonyms();
assertEquals(0, synonyms.size());
RCSBTaxonomy tax = polymer.getTaxonomy();
assertEquals(9606, tax.getId());
assertEquals("Homo sapiens", tax.getName());
RCSBMacromolecule mol = polymer.getMolecule();
assertEquals("Hemoglobin subunit alpha", mol.getName());
List<String> accessions = mol.getAccessions();
assertEquals(8, accessions.size());
assertEquals("P69905", accessions.get(0));
assertEquals("P01922", accessions.get(1));
assertEquals("Q1HDT5", accessions.get(2));
assertEquals("Q3MIF5", accessions.get(3));
assertEquals("Q53F97", accessions.get(4));
assertEquals("Q96KF1", accessions.get(5));
assertEquals("Q9NYR7", accessions.get(6));
assertEquals("Q9UCM0", accessions.get(7));
// second polymer
polymer = polymers.get(1);
assertEquals("protein", polymer.getType());
assertEquals(2, polymer.getIndex().intValue());
assertEquals("HEMOGLOBIN (DEOXY) (BETA CHAIN)", polymer.getDescription());
assertEquals(null, polymer.getEnzClass());
assertEquals(146, polymer.getLength().intValue());
assertEquals(15890.4, polymer.getWeight(), 0);
chains = polymer.getChains();
assertEquals(2, chains.size());
assertEquals('B', (char) chains.get(0));
assertEquals('D', (char) chains.get(1));
synonyms = polymer.getSynonyms();
assertEquals(0, synonyms.size());
tax = polymer.getTaxonomy();
assertEquals(9606, tax.getId());
assertEquals("Homo sapiens", tax.getName());
mol = polymer.getMolecule();
assertEquals("Hemoglobin subunit beta", mol.getName());
accessions = mol.getAccessions();
assertEquals(16, accessions.size());
assertEquals("P68871", accessions.get(0));
assertEquals("A4GX73", accessions.get(1));
assertEquals("B2ZUE0", accessions.get(2));
assertEquals("P02023", accessions.get(3));
assertEquals("Q13852", accessions.get(4));
assertEquals("Q14481", accessions.get(5));
assertEquals("Q14510", accessions.get(6));
assertEquals("Q45KT0", accessions.get(7));
assertEquals("Q549N7", accessions.get(8));
assertEquals("Q6FI08", accessions.get(9));
assertEquals("Q6R7N2", accessions.get(10));
assertEquals("Q8IZI1", accessions.get(11));
assertEquals("Q9BX96", accessions.get(12));
assertEquals("Q9UCD6", accessions.get(13));
assertEquals("Q9UCP8", accessions.get(14));
assertEquals("Q9UCP9", accessions.get(15));
}
}