/*
* 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 May 18, 2010
* Author: Andreas Prlic
*
*/
package org.biojava.nbio.structure.align.ce;
import junit.framework.TestCase;
import org.biojava.nbio.structure.Atom;
import org.biojava.nbio.structure.StructureException;
import org.biojava.nbio.structure.align.StructureAlignment;
import org.biojava.nbio.structure.align.StructureAlignmentFactory;
import org.biojava.nbio.structure.align.client.JFatCatClient;
import org.biojava.nbio.structure.align.model.AFPChain;
import org.biojava.nbio.structure.align.util.AtomCache;
import org.biojava.nbio.structure.align.xml.AFPChainFlipper;
import org.biojava.nbio.structure.align.xml.AFPChainXMLConverter;
import org.biojava.nbio.structure.align.xml.AFPChainXMLParser;
import org.biojava.nbio.core.util.PrettyXMLWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
public class TestWebStartClient extends TestCase
{
@SuppressWarnings("unused")
public void testCPAlignment(){
//String name1="1cdg.A";
//String name2="1tim.A";
String name1="1VHR.A";
String name2="2IHB.A";
try {
//StructureAlignment algorithm = StructureAlignmentFactory.getAlgorithm(CeCPMain.algorithmName);
for (StructureAlignment algorithm : StructureAlignmentFactory.getAllAlgorithms()){
// disable for now
//align(name1,name2,algorithm);
}
} catch (Exception e){
e.printStackTrace();
fail (e.getMessage());
}
}
@SuppressWarnings("unused")
private void align(String name1, String name2, StructureAlignment algorithm)
throws StructureException, IOException {
if ( algorithm.getAlgorithmName().startsWith("Smith")) {
System.err.println("not testing SW, no need to run that on server...");
return;
}
//System.out.println("testing " + name1 + " " + name2 + " " + algorithm.getAlgorithmName());
AtomCache cache = new AtomCache();
Atom[] ca1 = cache.getAtoms(name1);
Atom[] ca2 = cache.getAtoms(name2);
AFPChain afpChain = algorithm.align(ca1,ca2);
afpChain.setName1(name1);
afpChain.setName2(name2);
assertNotNull(afpChain);
assertNotNull(afpChain.getAlgorithmName());
assertTrue(afpChain.getAlgorithmName().equals(algorithm.getAlgorithmName()));
String xml = AFPChainXMLConverter.toXML(afpChain,ca1,ca2);
/// SERVER part
String serverLocation = "http://beta.rcsb.org/pdb/rest/";
AFPChain afpServer = JFatCatClient.getAFPChainFromServer(serverLocation,algorithm.getAlgorithmName(), name1, name2, ca1, ca2, 5000);
assertNotNull(afpServer);
assertTrue("Algorithm names don't match!", afpServer.getAlgorithmName().equals(algorithm.getAlgorithmName()));
assertTrue("Alignment blockNum < 1" , afpServer.getBlockNum() >= 1);
String xml2 = AFPChainXMLConverter.toXML(afpServer, ca1, ca2);
//System.err.println(" tmp disabled comparison of server and client XML, a minor rounding diff...");
assertEquals("The server and the locally calculated XML representations don;t match!", xml,xml2);
AFPChain afpFlip = AFPChainFlipper.flipChain(afpChain);
String xmlFlipped = AFPChainXMLConverter.toXML(afpFlip, ca2, ca1);
//System.out.println(xmlFlipped);
AFPChain fromXmlFlipped = AFPChainXMLParser.fromXML(xmlFlipped, ca2, ca1);
assertEquals("The alignment lengths don't match", afpFlip.getNrEQR(), fromXmlFlipped.getNrEQR());
String xmlFromFlippled = AFPChainXMLConverter.toXML(fromXmlFlipped,ca2,ca1);
assertEquals("The XML of the flipped and the recreated from that XML don't match!", xmlFlipped, xmlFromFlippled);
AFPChain afpBackToOrig = AFPChainFlipper.flipChain(fromXmlFlipped);
//String xml5 = AFPChainXMLConverter.toXML(afpBackToOrig, ca1, ca2);
// ok in the double flipping there are some minor after comma mismatches.
String xmlShortOrig = getShortXML(afpChain,ca1, ca2);
String xmlShortFinal = getShortXML(afpBackToOrig, ca1, ca2);
assertEquals("The 2 x flipped alignment does not match the original", xmlShortOrig,xmlShortFinal);
}
private String getShortXML(AFPChain afpChain, Atom[] ca1, Atom[] ca2) throws IOException {
StringWriter result = new StringWriter();
PrintWriter writer = new PrintWriter(result);
PrettyXMLWriter xml = new PrettyXMLWriter(writer);
xml.openTag("AFPChain");
//AFPChainXMLConverter.printXMLHeader(xml, afpChain);
int blockNum = afpChain.getBlockNum();
for(int bk = 0; bk < blockNum; bk ++) {
xml.openTag("block");
AFPChainXMLConverter.printXMLEQRInferPositions(xml, afpChain, bk, ca1, ca2);
xml.closeTag("block");
}
xml.closeTag("AFPChain");
return result.toString();
}
}