/*
* 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 Jul 26, 2007
*
*/
package org.biojava.nbio.structure;
import org.biojava.nbio.structure.io.FileParsingParameters;
import org.biojava.nbio.structure.io.PDBFileParser;
import org.biojava.nbio.structure.io.mmcif.ChemCompGroupFactory;
import org.biojava.nbio.structure.io.mmcif.ReducedChemCompProvider;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.junit.Test;
import static org.junit.Assert.*;
public class PdbFileFormat30Test {
/**
* There is a file format change in v3.0 of the PDB file format
* this test makes sure that the atom name changes are being processed correctly
* @throws IOException
*/
@Test
public void testRead30File() throws IOException{
Structure s = getStructure("/388d_v30.pdb");
int nrNuc = getNrNucleotides(s);
// there are 4 nucleotides less in the new version
// some chemically modified nucleotides residues have been declared to be HETATOMS
int shouldNr = 20;
assertEquals("structure does not contain the right number of nucleotides ", shouldNr ,nrNuc);
List<EntityInfo> compounds= s.getEntityInfos();
// from Biojava 5.0 on we are creating entities whenever an entity is found to be without an assigned compound
// in the file, for polymer entities, nonpolymer entities and water entities.
// For this file: 1 dna polymeric entity, 1 MG nonpolymeric entity, 1 water
// see issues https://github.com/biojava/biojava/issues/305 and https://github.com/biojava/biojava/pull/394
assertEquals(3, compounds.size());
EntityInfo mol = compounds.get(0);
assertTrue(mol.getDescription().startsWith("DNA"));
Structure s2 = getStructure("/104D_v30.pdb");
int nrNuc2 = getNrNucleotides(s2);
int shouldNr2 = 24;
assertEquals("structure does not contain the right number of nucleotides ", shouldNr2 , nrNuc2);
}
@Test
public void testRead23File() throws IOException{
Structure s = getStructure("/388d_v23.pdb");
int nrNuc = getNrNucleotides(s);
int shouldNr = 24;
assertEquals("structure does not contain the right number of nucleotides ", shouldNr , nrNuc);
List<EntityInfo> compounds= s.getEntityInfos();
// from Biojava 5.0 on we are creating entities whenever an entity is found to be without an assigned compound
// in the file, for polymer entities, nonpolymer entities and water entities.
// For this entry: we have 1 dna polymeric entity, 1 FLO nonpoly entity, 1 MO6 nonpoly entity, 1 water entity
// see issues https://github.com/biojava/biojava/issues/305 and https://github.com/biojava/biojava/pull/394
assertEquals(4, compounds.size());
EntityInfo mol = compounds.get(0);
assertTrue(mol.getDescription().startsWith("DNA"));
Structure s2 = getStructure("/104D_v23.pdb");
int nrNuc2 = getNrNucleotides(s2);
int shouldNr2 = 24;
assertEquals("structure does not contain the right number of nucleotides ", shouldNr2 , nrNuc2);
}
private Structure getStructure(String fileName) throws IOException{
InputStream inStream = this.getClass().getResourceAsStream(fileName);
assertNotNull(inStream);
ChemCompGroupFactory.setChemCompProvider(new ReducedChemCompProvider());
PDBFileParser pdbpars = new PDBFileParser();
FileParsingParameters params = new FileParsingParameters();
params.setAlignSeqRes(false);
pdbpars.setFileParsingParameters(params);
Structure structure = null;
structure = pdbpars.parsePDBFile(inStream) ;
return structure;
}
private int getNrNucleotides(Structure s){
GroupIterator iter = new GroupIterator(s);
int nr = 0;
while(iter.hasNext()){
Group g = iter.next();
if (g.getType().equals(GroupType.NUCLEOTIDE)){
nr ++;
} else {
//System.out.println(g.getType() + g.getPDBName());
}
}
return nr;
}
/**
* Checks that the legacy file check is working and that that non-legacy
* files have the correct number of chains when the line length is over
* 72 characters.
* @throws IOException
*/
@Test
public void testIsLegacyFormat_pdb_COMPND_handler() throws IOException{
Structure s = getStructure("/3mk3.pdb");
List<EntityInfo> compounds= s.getEntityInfos();
// we are doing heuristics to find missing compounds not specified in header
// thus here we have the one specified in header plus a SO4 nonpolymer entity
assertEquals(2, compounds.size());
EntityInfo mol = compounds.get(0);
assertTrue(mol.getDescription().equals("6,7-DIMETHYL-8-RIBITYLLUMAZINE SYNTHASE"));
assertEquals(60, mol.getChainIds().size());
assertEquals(60, mol.getChains().size());
assertTrue(isChainNameInEntity(mol,"S"));
assertTrue(isChainNameInEntity(mol,"T"));
assertTrue(isChainNameInEntity(mol,"U"));
assertTrue(isChainNameInEntity(mol,"g"));
assertTrue(isChainNameInEntity(mol,"h"));
assertTrue(isChainNameInEntity(mol,"i"));
}
private boolean isChainNameInEntity(EntityInfo e, String chainName) {
for (Chain c:e.getChains()) {
if (c.getName().equals(chainName)) return true;
}
return false;
}
}