/* * Author: tdanford * Date: Aug 19, 2008 */ package org.seqcode.viz.metaprofile; import java.util.*; import org.seqcode.data.seqdata.*; import org.seqcode.deepseq.StrandedBaseCount; import org.seqcode.deepseq.experiments.ControlledExperiment; import org.seqcode.deepseq.experiments.ExperimentManager; import org.seqcode.genome.Genome; import org.seqcode.genome.location.Point; import org.seqcode.genome.location.Region; import org.seqcode.genome.location.StrandedPoint; public class ChipSeqProfiler implements PointProfiler<Point,PointProfile> { private Genome genome; private ExperimentManager manager=null; private BinningParameters params; private int extension; private boolean useFivePrime=false; private char readStrand ='/'; public ChipSeqProfiler(Genome gen, BinningParameters ps, ExperimentManager man, int ext, char strand) { genome = gen; manager = man; params = ps; extension=ext; if(extension==-1){ useFivePrime = true; extension=0; } readStrand = strand; } public BinningParameters getBinningParameters() { return params; } public PointProfile execute(Point a) { int window = params.getWindowSize(); int left = window/2; int right = window-left-1; boolean strand = (a instanceof StrandedPoint) ? ((StrandedPoint)a).getStrand() == '+' : true; int start = Math.max(1, a.getLocation()-left); int end = Math.min(a.getLocation()+right, a.getGenome().getChromLength(a.getChrom())); Region query = new Region(a.getGenome(), a.getChrom(), start, end); int ext = 200; Region extQuery = new Region(a.getGenome(), a.getChrom(), start-ext>0 ? start-ext : 1, end+ext < a.getGenome().getChromLength(a.getChrom()) ? end+ext : a.getGenome().getChromLength(a.getChrom()) ); double[] array = new double[params.getNumBins()]; for(int i = 0; i < array.length; i++) { array[i] = 0; } for(ControlledExperiment expt : manager.getReplicates()){ List<StrandedBaseCount> sbcs = expt.getSignal().getBases(extQuery); for(StrandedBaseCount sbc : sbcs){ SeqHit hit = new SeqHit(genome, a.getChrom(), sbc); if(extension>0) hit = hit.extendHit(extension); if(hit.overlaps(query) && (readStrand=='.' || hit.getStrand()==readStrand)){ int startOffset = Math.max(0, hit.getStart()-start); int endOffset = Math.max(0, Math.min(end, hit.getEnd()-start)); if(!strand) { int tmpEnd = window-startOffset; int tmpStart = window-endOffset; startOffset = tmpStart; endOffset = tmpEnd; } int startbin = params.findBin(startOffset); int endbin = params.findBin(endOffset); addToArray(startbin, endbin, array, 1.0); } } } return new PointProfile(a, params, array, (a instanceof StrandedPoint)); } private void addToArray(int i, int j, double[] array, double value) { for(int k = i; k <= j; k++) { array[k] += value; } } public void cleanup() { } }