/*
* Sequences.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.evolution.sequence;
import dr.evolution.util.Taxon;
import dr.util.Attributable;
import dr.util.Identifiable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
/**
* Class for storing sequences.
*
* @author Andrew Rambaut
* @version $Id: Sequences.java,v 1.12 2005/05/24 20:25:56 rambaut Exp $
*/
public class Sequences implements SequenceList, Attributable, Identifiable {
/**
* Constructor.
*/
public Sequences() {
}
// **************************************************************
// SequenceList IMPLEMENTATION
// **************************************************************
/**
* @return a count of the number of sequences in the list.
*/
public int getSequenceCount() {
return sequences.size();
}
/**
* @return the ith sequence in the list.
*/
public Sequence getSequence(int index) {
return sequences.get(index);
}
/**
* Sets an named attribute for a given sequence.
*
* @param index the index of the sequence whose attribute is being set.
* @param name the name of the attribute.
* @param value the new value of the attribute.
*/
public void setSequenceAttribute(int index, String name, Object value) {
Sequence sequence = getSequence(index);
sequence.setAttribute(name, value);
}
/**
* @param index the index of the sequence whose attribute is being fetched.
* @param name the name of the attribute of interest.
* @return an object representing the named attributed for the given sequence.
*/
public Object getSequenceAttribute(int index, String name) {
Sequence sequence = getSequence(index);
return sequence.getAttribute(name);
}
// **************************************************************
// TaxonList IMPLEMENTATION
// **************************************************************
/**
* @return a count of the number of taxa in the list.
*/
public int getTaxonCount() {
return getSequenceCount();
}
/**
* @return the taxon of the ith sequence.
*/
public Taxon getTaxon(int taxonIndex) {
return getSequence(taxonIndex).getTaxon();
}
/**
* @return the ID of the taxon of the ith sequence. If it doesn't have
* a taxon, returns the ID of the sequence itself.
*/
public String getTaxonId(int taxonIndex) {
Taxon taxon = getTaxon(taxonIndex);
if (taxon != null)
return taxon.getId();
else
throw new IllegalArgumentException("Illegal taxon index:" + taxonIndex);
}
/**
* returns the index of the taxon with the given id.
*/
public int getTaxonIndex(String id) {
for (int i = 0, n = getTaxonCount(); i < n; i++) {
if (getTaxonId(i).equals(id)) return i;
}
return -1;
}
/**
* returns the index of the given taxon.
*/
public int getTaxonIndex(Taxon taxon) {
for (int i = 0, n = getTaxonCount(); i < n; i++) {
if (getTaxon(i) == taxon) return i;
}
return -1;
}
public List<Taxon> asList() {
List<Taxon> taxa = new ArrayList<Taxon>();
for (int i = 0, n = getTaxonCount(); i < n; i++) {
taxa.add(getTaxon(i));
}
return taxa;
}
/**
* Sets an named attribute for the taxon of a given sequence. If the sequence
* doesn't have a taxon then the attribute is added to the sequence itself.
*
* @param taxonIndex the index of the taxon whose attribute is being set.
* @param name the name of the attribute.
* @param value the new value of the attribute.
*/
public void setTaxonAttribute(int taxonIndex, String name, Object value) {
Taxon taxon = getTaxon(taxonIndex);
if (taxon != null)
taxon.setAttribute(name, value);
else
setSequenceAttribute(taxonIndex, name, value);
}
/**
* @param taxonIndex the index of the taxon whose attribute is being fetched.
* @param name the name of the attribute of interest.
* @return an object representing the named attributed for the given taxon.
*/
public Object getTaxonAttribute(int taxonIndex, String name) {
Taxon taxon = getTaxon(taxonIndex);
if (taxon != null)
return taxon.getAttribute(name);
else
return getSequenceAttribute(taxonIndex, name);
}
public Iterator<Taxon> iterator() {
return new Iterator<Taxon>() {
private int index = -1;
public boolean hasNext() {
return index < getTaxonCount() - 1;
}
public Taxon next() {
index++;
return getTaxon(index);
}
public void remove() { /* do nothing */ }
};
}
// **************************************************************
// Identifiable IMPLEMENTATION
// **************************************************************
protected String id = null;
/**
* @return the id.
*/
public String getId() {
return id;
}
/**
* Sets the id.
*/
public void setId(String id) {
this.id = id;
}
// **************************************************************
// Sequences METHODS
// **************************************************************
/**
* @param sequence the sequence add to the end of the sequence list
*/
public void addSequence(Sequence sequence) {
sequences.add(sequence);
}
/**
* @param position in SequenceList to insert sequence
* @param sequence the sequence to insert
*/
public void insertSequence(int position, Sequence sequence) {
sequences.insertElementAt(sequence, position);
}
/**
* Remove a sequence from the sequence list
*
* @param index the index of the sequence to remove
* @return the sequence.
*/
public Sequence removeSequence(int index) {
Sequence sequence = getSequence(index);
sequences.removeElementAt(index);
return sequence;
}
// **************************************************************
// Attributable IMPLEMENTATION
// **************************************************************
/**
* Sets an named attribute for this object.
*
* @param name the name of the attribute.
* @param value the new value of the attribute.
*/
public void setAttribute(String name, Object value) {
if (attributes == null)
attributes = new Attributable.AttributeHelper();
attributes.setAttribute(name, value);
}
/**
* @param name the name of the attribute of interest.
* @return an object representing the named attributed for this object.
*/
public Object getAttribute(String name) {
if (attributes == null)
return null;
else
return attributes.getAttribute(name);
}
/**
* @return an iterator of the attributes that this object has.
*/
public Iterator<String> getAttributeNames() {
if (attributes == null)
return null;
else
return attributes.getAttributeNames();
}
// **************************************************************
// INSTANCE VARIABLES
// **************************************************************
protected final Vector<Sequence> sequences = new Vector<Sequence>();
private Attributable.AttributeHelper attributes = null;
}