/* * 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 31, 2010 * Author: Jianjiong Gao * */ package org.biojava.nbio.protmod.structure; import junit.framework.TestCase; import org.biojava.nbio.protmod.ModificationCategory; import org.biojava.nbio.protmod.ProteinModificationRegistry; import org.biojava.nbio.protmod.io.ModifiedCompoundXMLConverter; import org.biojava.nbio.structure.Chain; import org.biojava.nbio.structure.Structure; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Set; public class ModifiedCompoundSerializationTest extends TestCase { private static final Logger logger = LoggerFactory.getLogger(ModifiedCompoundSerializationTest.class); boolean allOK = false; private String[][] strucs; @Override public void setUp() { strucs = new String[1][1]; strucs[0][0]="2TMD"; //strucs = ProteinModificationParserTest.setUpShortTest(); //strucs = ProteinModificationParserTest.setUpLongTest(); } public void testMulti() { int count = 0; for ( String[] name : strucs){ try { testXMLSerialization(name[0]); count++; } catch (Exception e){ logger.error("Failed after running {} serializations at PDB ID: {}", count, name[0], e); fail(e.getMessage()); } } } public void test1CAD(){ String pdbId = "1CAD"; testXMLSerialization(pdbId); } public void test1a4w(){ String pdbId = "1a4w"; List<ModifiedCompound> all = testXMLSerialization(pdbId); try { mainLoop: for ( ModifiedCompound mc : all){ Set<StructureGroup> groups = mc.getGroups(); for (StructureGroup g: groups){ if (! g.getChainId().equals("H")) continue mainLoop; } ModificationCategory cat = mc.getModification().getCategory(); // all modifications on chain H should be crosslink 2 // if ( groups.size() != 2 ) { // logger.info(ModifiedCompoundXMLConverter.toXML(mc)); // logger.info(cat); // logger.info(mc); // // logger.info(mc.getAtomLinkages()); // // for (StructureGroup structureGroup : groups) { // logger.info(structureGroup); // } // } // assertEquals("Not the right number of groups! should be 2, but got " + groups.size() + " in: " + ModifiedCompoundXMLConverter.toXML(mc),2,groups.size()); // if (!cat.equals(ModificationCategory.CROSS_LINK_2)) { logger.info(ModifiedCompoundXMLConverter.toXML(mc)); logger.info(cat.toString()); logger.info(mc.toString()); } assertEquals(ModificationCategory.CROSS_LINK_2, cat); } } catch (Exception e){ logger.error("Exception: ", e); fail(e.getMessage()); } } public void test1UIS(){ String pdbId = "1UIS"; testXMLSerialization(pdbId); } // public void test2TMD(){ // String pdbId = "2TMD"; // testXMLSerialization(pdbId); // } public void test1CDG(){ String pdbId = "1CDG"; testXMLSerialization(pdbId); } public List<ModifiedCompound> testXMLSerialization(String pdbId){ String xml = null; ModifiedCompound currentMC = null; List<ModifiedCompound> all = new ArrayList<ModifiedCompound>(); try { Structure struc = TmpAtomCache.cache.getStructure(pdbId); ProteinModificationIdentifier parser = new ProteinModificationIdentifier(); for (Chain c : struc.getChains()) { parser.identify(c, ProteinModificationRegistry.allModifications()); Set<ModifiedCompound> mcs = parser.getIdentifiedModifiedCompound(); for (ModifiedCompound mc : mcs){ currentMC = mc; xml = doXMLSerialization(mc) ; //logger.info( pdbId + " got XML: " + String.format("%n") + xml); ModifiedCompound newMC = getModifiedCompoundFromXML(xml); String xml2 = doXMLSerialization(newMC); assertEquals(xml,xml2); //logger.info(xml2); //assertEquals("The two objects are not equal before and after XML serialization" , mc, newMC); //logger.info(mc.getDescription()); //logger.info(newMC.getDescription()); all.add(mc); } } } catch (Exception e){ logger.error(e.getMessage(),e); logger.error("Error when serializing {}", pdbId); logger.error(currentMC.getDescription()); logger.error(xml, e); fail(e.getMessage()); } xml = null; currentMC =null; return all; } private ModifiedCompound getModifiedCompoundFromXML(String xml) { return ModifiedCompoundXMLConverter.fromXML(xml); } private String doXMLSerialization(ModifiedCompound mc) throws IOException{ return ModifiedCompoundXMLConverter.toXML(mc); } public void testFlatFileParsing(){ InputStream inStream = this.getClass().getResourceAsStream("/org/biojava/nbio/protmod/parser/modifiedCompound.xml"); assertNotNull(inStream); try { String xml = convertStreamToString(inStream); //logger.info(xml); ModifiedCompound newMC = getModifiedCompoundFromXML(xml); assertNotNull(newMC); } catch (Exception e){ fail(e.getMessage()); } } public String convertStreamToString(InputStream is) throws IOException { /* * To convert the InputStream to String we use the * Reader.read(char[] buffer) method. We iterate until the * Reader return -1 which means there's no more data to * read. We use the StringWriter class to produce the string. */ if (is != null) { Writer writer = new StringWriter(); char[] buffer = new char[1024]; try { Reader reader = new BufferedReader( new InputStreamReader(is, "UTF-8")); int n; while ((n = reader.read(buffer)) != -1) { writer.write(buffer, 0, n); } } finally { is.close(); } return writer.toString(); } else { return ""; } } }