package statalign.distance; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class AlignmentSample { Alignment reference = new Alignment(); Alignment mpd = new Alignment(); ArrayList<Double> posteriors = new ArrayList<Double>(); 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; } 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) { 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; } 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 { 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; } } }