/* * Author: tdanford * Date: Mar 30, 2009 */ package org.seqcode.gseutils; import java.util.*; import org.seqcode.gsebricks.iterators.EmptyIterator; import org.seqcode.gsebricks.iterators.SerialIterator; import org.seqcode.gseutils.models.Model; /** * * Collects a series of "UnitCoverage" objects, keyed by arbitrary strings. * This is most useful when we're looking at the coverage of an entire genome, * in which case each UnitCoverage corresponds to a Chromosome and the Coverage * object itself is the genome. * * See also: ewok.verbs.location.RegionCoverage, which extends the functionality * of this class by appending a Genome object and allowing the user to deal * directly with Region objects instead of abstract intervals (as here.) * * @author tdanford */ public class Coverage { private Map<String,UnitCoverage> covermap; public Coverage() { covermap = new TreeMap<String,UnitCoverage>(); } public Coverage(CoverageModel m) { this(); for(int i = 0; i < m.keys.length; i++) { covermap.put(m.keys[i], new UnitCoverage(m.coverages[i])); } } public Coverage(Coverage c) { this(c.covermap); } public Coverage(Map<String,UnitCoverage> kmap) { covermap = new TreeMap<String,UnitCoverage>(); for(String k : kmap.keySet()) { covermap.put(k, new UnitCoverage(kmap.get(k))); } } public Integer[] rightNearest(String key, int pos) { return covermap.containsKey(key) ? covermap.get(key).rightNearest(pos) : null; } public Integer[] leftNearest(String key, int pos) { return covermap.containsKey(key) ? covermap.get(key).leftNearest(pos) : null; } public boolean hasCoverage(String key, int start, int end) { return covermap.containsKey(key) ? covermap.get(key).hasOverlap(start, end) : false; } public boolean isContained(String key, int start, int end) { return covermap.containsKey(key) ? covermap.get(key).isContained(start, end) : false; } public Iterator<String> keys() { return covermap.keySet().iterator(); } public Iterator<Integer[]> units() { ArrayList<Iterator<Integer[]>> units = new ArrayList<Iterator<Integer[]>>(); for(String k : covermap.keySet()) { units.add(covermap.get(k).covered()); } return new SerialIterator<Integer[]>(units.iterator()); } public Iterator<Integer[]> units(String k) { return covermap.get(k).units(); } public int size() { int s = 0; for(String k : covermap.keySet()) { s += covermap.get(k).size(); } return s; } public Coverage union(Coverage c) { Map<String,UnitCoverage> kmap = new TreeMap<String,UnitCoverage>(); for(String k : covermap.keySet()) { if(c.covermap.containsKey(k)) { kmap.put(k, covermap.get(k).union(c.covermap.get(k))); } else { kmap.put(k, new UnitCoverage(covermap.get(k))); } } for(String k : c.covermap.keySet()) { if(!covermap.containsKey(k)) { kmap.put(k, new UnitCoverage(c.covermap.get(k))); } } return new Coverage(kmap); } public Coverage subtract(Coverage c) { Map<String,UnitCoverage> kmap = new TreeMap<String,UnitCoverage>(); for(String k : covermap.keySet()) { if(c.covermap.containsKey(k)) { kmap.put(k, covermap.get(k).subtract(c.covermap.get(k))); } else { kmap.put(k, new UnitCoverage(covermap.get(k))); } } return new Coverage(kmap); } public Coverage intersection(Coverage c) { Map<String,UnitCoverage> kmap = new TreeMap<String,UnitCoverage>(); for(String k : covermap.keySet()) { if(c.covermap.containsKey(k)) { kmap.put(k, covermap.get(k).intersection(c.covermap.get(k))); } } return new Coverage(kmap); } public void addInterval(String key, int start, int end) { if(!covermap.containsKey(key)) { covermap.put(key, new UnitCoverage()); } covermap.get(key).addInterval(start, end); } public int coverage(String key, int start, int end) { return covermap.containsKey(key) ? covermap.get(key).coverage(start, end) : 0; } public Collection<Integer[]> covered(String key, int start, int end) { return covermap.containsKey(key) ? covermap.get(key).covered(start, end) : new ArrayList<Integer[]>(); } public boolean hasUnitCoverage(String k) { return covermap.containsKey(k); } public UnitCoverage getUnitCoverage(String k) { return covermap.containsKey(k) ? covermap.get(k) : null; } public int area() { int a = 0; for(String key : covermap.keySet()) { a += covermap.get(key).area(); } return a; } public CoverageModel asModel() { return new CoverageModel(this); } public static class CoverageModel extends Model { public String[] keys; public UnitCoverage.UnitCoverageModel[] coverages; public CoverageModel() {} public CoverageModel(Coverage c) { keys = c.covermap.keySet().toArray(new String[0]); coverages = new UnitCoverage.UnitCoverageModel[keys.length]; for(int i = 0; i < keys.length; i++) { coverages[i] = c.covermap.get(keys[i]).asModel(); } } } public Integer[] findNearestRight(String key, int location) { return covermap.containsKey(key) ? covermap.get(key).rightNearest(location) : null; } public Integer[] findNearestLeft(String key, int location) { return covermap.containsKey(key) ? covermap.get(key).leftNearest(location) : null; } public Collection<Pair<Integer[],Integer[]>> findRightPairs(String key, int maxDist, Coverage coverage) { if(covermap.containsKey(key) && coverage.covermap.containsKey(key)) { return covermap.get(key).findRightPairs(maxDist, coverage.covermap.get(key)); } else { return new ArrayList<Pair<Integer[],Integer[]>>(); } } public Collection<Pair<Integer[],Integer[]>> findLeftPairs(String key, int maxDist, Coverage coverage) { if(covermap.containsKey(key) && coverage.covermap.containsKey(key)) { return covermap.get(key).findLeftPairs(maxDist, coverage.covermap.get(key)); } else { return new ArrayList<Pair<Integer[],Integer[]>>(); } } }