    001    package calhoun.analysis.crf.io;
    002
    003    import java.io.BufferedReader;
    004    import java.io.IOException;
    005    import java.io.Writer;
    006    import java.util.ArrayList;
    007    import java.util.List;
    008    import java.util.Map;
    009
    010    import org.apache.commons.logging.Log;
    011    import org.apache.commons.logging.LogFactory;
    012
    013    import calhoun.analysis.crf.features.supporting.phylogenetic.RootedBinaryPhylogeneticTree;
    014    import calhoun.util.Assert;
    015
    016    /** an input component that reads in multiple alignment sequences.  Creates
    017     * {@link MultipleAlignmentInputSequence} objects for each sequence.  Can be used as
    018     * a regular input or as part of an interleaved input file.
    019     */
    020    public class MultipleAlignmentInput extends InterleavedInputComponentBase {
    021            private static final long serialVersionUID = 1796622784861590659L;
    022            private static final Log log = LogFactory.getLog(MultipleAlignmentInput.class);
    023
    024            public boolean read(BufferedReader r, Map<String, InputSequence<?>> output) throws IOException {
    025                    List<String> speciesNames = new ArrayList<String>();
    026                    List<String> consensuses = new ArrayList<String>();
    027                    int nSpecies;
    028
    029                    String temp = r.readLine();
    030                    if(temp == null)
    031                            return false;
    032
    033                    try {
    034                            nSpecies = Integer.parseInt(temp);
    035                    } catch (Exception e){
    036                            log.error("Offending line was : " + temp);
    037                            throw new IOException();
    038                    }
    039
    040                    temp = r.readLine();
    041                    RootedBinaryPhylogeneticTree tree = new RootedBinaryPhylogeneticTree(temp);
    042
    043                    log.debug("Number of species : " + nSpecies);
    044
    045                    for (int spec=0; spec<nSpecies; spec++) {
    046                            String str1 = r.readLine();
    047                            Assert.a(str1 != null);
    048
    049                            log.debug("One of the species: " + str1);
    050                            speciesNames.add(str1.substring(1));
    051
    052                            String str2 = r.readLine();
    053                            Assert.a(str2 != null);
    054                            consensuses.add(str2);
    055                    }
    056
    057                    InputSequence<?> inputSeq = new MultipleAlignmentInputSequence(speciesNames, consensuses, speciesNames.get(0), tree);
    058                    output.put(name, inputSeq);
    059                    return true;
    060            }
    061
    062
    063            public void write(Writer w, Map<String, ? extends InputSequence<?>> data) throws IOException {
    064                    MultipleAlignmentInputSequence inputSeq = (MultipleAlignmentInputSequence) data.get(name);
    065                    w.write("" + inputSeq.nSpecies + "\n");
    066                    w.write("" + inputSeq.tree.newick() + "\n");
    067                    for (int spec=0; spec<inputSeq.nSpecies; spec++) {
    068                            w.write(">" + inputSeq.speciesNames.get(spec));
    069                            w.write('\n');
    070                            w.write(inputSeq.consensuses.get(spec));
    071                            w.write('\n');
    072                    }
    073            }
    074    }