/* * 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.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import org.biojava.nbio.structure.Atom; import org.biojava.nbio.structure.Chain; import org.biojava.nbio.structure.Structure; import org.biojava.nbio.structure.StructureException; import org.biojava.nbio.structure.StructureIO; import org.biojava.nbio.structure.StructureTools; import org.biojava.nbio.structure.align.util.AtomCache; import org.biojava.nbio.structure.io.mmcif.MMCIFFileTools; import org.biojava.nbio.structure.io.mmcif.MMcifParser; import org.biojava.nbio.structure.io.mmcif.SimpleMMcifConsumer; import org.biojava.nbio.structure.io.mmcif.SimpleMMcifParser; import org.biojava.nbio.structure.io.mmcif.model.CIFLabel; import org.biojava.nbio.structure.io.mmcif.model.IgnoreField; import org.junit.Test; public class TestMMCIFWriting { @Test public void test1SMT() throws IOException, StructureException { // an x-ray structure testRoundTrip("1SMT"); } /** * MMCIF write test for an NMR structure with 2 chains * @throws IOException * @throws StructureException */ @Test public void test2N3J() throws IOException, StructureException { // an NMR structure (multimodel) with 2 chains testRoundTrip("2N3J"); } @Test public void test1A2C() throws IOException, StructureException { // a structure with insertion codes testRoundTrip("1A2C"); } private static class DemoBean { @IgnoreField String not_a_field; @SuppressWarnings("unused")//used by reflection String default_field; @CIFLabel(label="custom_label") String custom_field; public void setNot_a_field(String not_a_field) { this.not_a_field = not_a_field; } public void setDefault_field(String default_field) { this.default_field = default_field; } public void setCustom_field(String custom_field) { this.custom_field = custom_field; } } @Test public void testBeanAnnotations() { DemoBean bean = new DemoBean(); bean.setCustom_field("custom_field"); bean.setDefault_field(null); bean.setNot_a_field("not_a_field"); // Test (1) should have custom_label (@CIFLabel) // (2) shouldn't have not_a_field (@IgnoreField) String newline = System.getProperty("line.separator"); String mmcif = MMCIFFileTools.toMMCIF("_demo", bean); String expected = "_demo.default_field ?" + newline + "_demo.custom_label custom_field" + newline + "#" + newline; assertEquals(expected, mmcif); } private static void testRoundTrip(String pdbId) throws IOException, StructureException { AtomCache cache = new AtomCache(); StructureIO.setAtomCache(cache); cache.setUseMmCif(true); FileParsingParameters params = new FileParsingParameters(); params.setAlignSeqRes(true); cache.setFileParsingParams(params); Structure originalStruct = StructureIO.getStructure(pdbId); File outputFile = File.createTempFile("biojava_testing_", ".cif"); outputFile.deleteOnExit(); FileWriter fw = new FileWriter(outputFile); fw.write(originalStruct.toMMCIF()); fw.close(); MMcifParser parser = new SimpleMMcifParser(); SimpleMMcifConsumer consumer = new SimpleMMcifConsumer(); FileParsingParameters fileParsingParams = new FileParsingParameters(); fileParsingParams.setAlignSeqRes(true); consumer.setFileParsingParameters(fileParsingParams); parser.addMMcifConsumer(consumer); parser.parse(new BufferedReader(new FileReader(outputFile))); Structure readStruct = consumer.getStructure(); assertNotNull(readStruct); assertEquals(originalStruct.getChains().size(), readStruct.getChains().size()); assertEquals(originalStruct.nrModels(), readStruct.nrModels()); for (int i=0; i<originalStruct.nrModels();i++) { assertEquals(originalStruct.getModel(i).size(), readStruct.getModel(i).size()); } for (int modelIdx=0;modelIdx<originalStruct.nrModels();modelIdx++) { for (int i=0;i<originalStruct.getModel(modelIdx).size();i++) { assertEquals(originalStruct.getChains().get(i).getAtomGroups().size(), readStruct.getChains().get(i).getAtomGroups().size()); Chain origChain = originalStruct.getModel(modelIdx).get(i); Chain readChain = readStruct.getModel(modelIdx).get(i); assertEquals(origChain.getAtomGroups().size(), readChain.getAtomGroups().size()); //assertEquals(origChain.getSeqResGroups().size(), readChain.getSeqResGroups().size()); assertEquals(origChain.getId(), readChain.getId()); assertEquals(origChain.getName(), readChain.getName()); Atom[] origAtoms = StructureTools.getAllAtomArray(origChain); Atom[] readAtoms = StructureTools.getAllAtomArray(readChain); assertEquals(origAtoms.length, readAtoms.length); for (int atomIdx=0;atomIdx<origAtoms.length;atomIdx++) { assertEquals("atom serials don't match for atom "+origAtoms[atomIdx].toString(), origAtoms[atomIdx].getPDBserial(), readAtoms[atomIdx].getPDBserial()); assertEquals("atom names don't match for atom "+origAtoms[atomIdx].toString(), origAtoms[atomIdx].getName(), readAtoms[atomIdx].getName()); assertEquals("atom elements don't match for atom "+origAtoms[atomIdx].toString(), origAtoms[atomIdx].getElement(), readAtoms[atomIdx].getElement()); assertEquals("x values don't match for atom "+origAtoms[atomIdx].toString(), origAtoms[atomIdx].getX(), readAtoms[atomIdx].getX(),0.0001); assertEquals("y values don't match for atom "+origAtoms[atomIdx].toString(), origAtoms[atomIdx].getY(), readAtoms[atomIdx].getY(),0.0001); assertEquals("z values don't match for atom "+origAtoms[atomIdx].toString(), origAtoms[atomIdx].getZ(), readAtoms[atomIdx].getZ(),0.0001); } } } // Test cell and symmetry assertEquals(originalStruct.getCrystallographicInfo().getSpaceGroup(), readStruct.getCrystallographicInfo().getSpaceGroup()); } }