package statalign.postprocess.plugins.benchmarks;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
public class AlignmentSample implements Serializable {
/**
*
*/
private static final long serialVersionUID = 8798582281020900675L;
public Alignment reference = new Alignment();
public Alignment mpd = new Alignment();
public ArrayList<Double> posteriors = new ArrayList<Double>();
public ArrayList<Alignment> samples = new ArrayList<Alignment>();
public String toString() {
String ret = "";
ret += "%reference\n" + reference.toString();
for (int i = 0; i < samples.size(); i++) {
ret += "%" + i + "\n";
ret += samples.get(i);
}
ret += "%mpd\n" + mpd.toString();
ret += "%posteriors\n";
for (int i = 0; i < posteriors.size(); i++) {
ret += posteriors.get(i) + "\n";
}
return ret;
}
/**
* Loads an alignment sample object from a file.
* @param file
* @return
*/
public static AlignmentSample loadAlignments(File file) {
AlignmentSample sample = new AlignmentSample();
try {
BufferedReader buffer = new BufferedReader(new FileReader(file));
String textline = null;
String alignmentString = "";
String name = null;
ArrayList<String> sequences = new ArrayList<String>();
ArrayList<String> sequenceNames = new ArrayList<String>();
while ((textline = buffer.readLine()) != null) {
//System.out.println(textline);
if (textline.startsWith("%")) {
if(name == null)
{
}
else
if (name.equalsIgnoreCase("%reference")) {
sample.reference.sequences = sequences;
sample.reference.sequenceNames = sequenceNames;
} else if (name.equalsIgnoreCase("%mpd")) {
sample.mpd.sequences = sequences;
sample.mpd.sequenceNames = sequenceNames;
}
else
if(name.equalsIgnoreCase("%posteriors"))
{
}
else {
Alignment alignment = new Alignment();
alignment.sequences = sequences;
alignment.sequenceNames = sequenceNames;
sample.samples.add(alignment);
}
name = textline;
if("%posteriors".equals(name))
{
for(int i = 0 ; (textline = buffer.readLine()) != null && !textline.startsWith("%") ; i++)
{
sample.posteriors.add(new Double(textline));
}
if(textline != null && textline.startsWith("%"))
{
name = textline;
System.out.println("#"+name);
//''sequences = new ArrayList<String>();
//'sequenceNames = new ArrayList<String>();
}
}
if(!alignmentString.equals(""))
{
parseAlignmentString(alignmentString, sequences, sequenceNames);
alignmentString = "";
sequences = new ArrayList<String>();
sequenceNames = new ArrayList<String>();
}
} else {
alignmentString += textline + "\n";
}
}
if(name == null)
{
}
else
if (name.equalsIgnoreCase("%reference")) {
sample.reference.sequences = sequences;
sample.reference.sequenceNames = sequenceNames;
} else if (name.equalsIgnoreCase("%mpd")) {
sample.mpd.sequences = sequences;
sample.mpd.sequenceNames = sequenceNames;
}
else
if(name.equalsIgnoreCase("%posteriors"))
{
}
else {
Alignment alignment = new Alignment();
alignment.sequences = sequences;
alignment.sequenceNames = sequenceNames;
sample.samples.add(alignment);
}
if(!alignmentString.equals(""))
{
parseAlignmentString(alignmentString, sequences, sequenceNames);
alignmentString = "";
}
buffer.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return sample;
}
/**
* Fills a vector of sequences and vector of sequence names from a specified fasta alignment string.
* @param alignmentString
* @param sequences
* @param sequenceNames
*/
public static void parseAlignmentString(String alignmentString, ArrayList<String> sequences, ArrayList<String> sequenceNames)
{
String seq = "";
String name = "";
String [] split = alignmentString.split("\n");
for(int i = 0 ; i < split.length ; i++)
{
if(split[i].startsWith(">"))
{
name = split[i].substring(1);
sequenceNames.add(name);
if(!seq.equals(""))
{
sequences.add(seq);
seq = "";
}
name = "";
}
else
{
seq += split[i].trim();
}
}
if(!seq.equals(""))
{
sequences.add(seq);
}
}
static class Alignment implements Serializable {
/**
*
*/
private static final long serialVersionUID = -4881397407402273139L;
ArrayList<String> sequences = new ArrayList<String>();
ArrayList<String> sequenceNames = new ArrayList<String>();
public String toString() {
String ret = "";
for (int i = 0; i < sequences.size(); i++) {
ret += ">" + sequenceNames.get(i) + "\n";
ret += sequences.get(i) + "\n";
}
return ret;
}
}
}