org.biojava.nbio.phylo.ForesterWrapper Maven / Gradle / Ivy
The newest version!
/*
* 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.phylo;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.biojava.nbio.core.sequence.MultipleSequenceAlignment;
import org.biojava.nbio.core.sequence.io.FastaWriter;
import org.biojava.nbio.core.sequence.io.template.FastaHeaderFormatInterface;
import org.biojava.nbio.core.sequence.template.Compound;
import org.biojava.nbio.core.sequence.template.Sequence;
import org.forester.evoinference.matrix.distance.BasicSymmetricalDistanceMatrix;
import org.forester.io.parsers.FastaParser;
import org.forester.io.writers.PhylogenyWriter;
import org.forester.msa.Msa;
import org.forester.phylogeny.Phylogeny;
/**
* This class contains wrapper methods for communication between BioJava and
* forester (e.g, Data Structure conversion).
*
* @author Aleix Lafita
* @since 4.1.1
*
*/
public class ForesterWrapper {
/** Prevent instantiation */
private ForesterWrapper() {
}
/**
* Convert a BioJava {@link MultipleSequenceAlignment} to a forester
* {@link Msa}. The easiest way to convert them is writting the msa as a
* FASTA file and then parsing it with the forester {@link FastaParser}.
*
* @param msa
* BioJava MultipleSequenceAlignment
* @return forester Msa object
* @throws IOException
* if the conversion was not possible
*/
public static , D extends Compound> Msa convert(
MultipleSequenceAlignment msa) throws IOException {
// Convert the biojava MSA to a FASTA String
OutputStream os = new ByteArrayOutputStream();
FastaWriter fastaW = new FastaWriter<>(os,
msa.getAlignedSequences(),
new FastaHeaderFormatInterface() {
@Override
public String getHeader(C sequence) {
return sequence.getAccession().toString();
};
});
fastaW.process();
String fastaMSA = os.toString();
// Parse the FASTA file in forester
return FastaParser.parseMsa(fastaMSA);
}
/**
* Convert a Phylogenetic tree to its Newick representation, so that it can
* be exported to an external application.
*
* @param phylo
* Phylogeny phylogenetic tree
* @param writeDistances
* write the branch lengths if true
* @return
* @throws IOException
*/
public static String getNewickString(Phylogeny phylo,
boolean writeDistances) throws IOException {
PhylogenyWriter w = new PhylogenyWriter();
StringBuffer newickString = w.toNewHampshire(phylo, writeDistances);
return newickString.toString();
}
/**
* Helper function to clone a forester symmetrical DistanceMatrix.
*
* @param distM
* forester symmetrical DistanceMatrix
* @return identical copy of the forester symmetrical DistanceMatrix
*/
public static BasicSymmetricalDistanceMatrix cloneDM(
BasicSymmetricalDistanceMatrix distM) {
int n = distM.getSize();
BasicSymmetricalDistanceMatrix cloneDM =
new BasicSymmetricalDistanceMatrix(n);
for (int i = 0; i < n; i++) {
cloneDM.setIdentifier(i, distM.getIdentifier(i));
for (int j = i + 1; j < n; j++) {
cloneDM.setValue(i, j, distM.getValue(i, j));
}
}
return cloneDM;
}
}