package org.seqcode.motifs;
import org.seqcode.genome.location.Region;
import org.seqcode.genome.location.StrandedRegion;
import org.seqcode.genome.sequence.SequenceGenerator;
import org.seqcode.genome.sequence.SequenceUtils;
public class ConsensusSequenceScorer {
private ConsensusSequence consensus;
private SequenceGenerator seqgen;
public ConsensusSequenceScorer(ConsensusSequence cons){
consensus = cons;
seqgen = new SequenceGenerator();
}
public ConsensusSequenceScorer(ConsensusSequence cons, SequenceGenerator sg){
consensus = cons;
seqgen = sg;
}
public ConsensusSequenceScoreProfile execute(Region r) {return execute(r, '.');}
public ConsensusSequenceScoreProfile execute(Region r, char watsoncrick) {
String seq = seqgen.execute(r);
seq = seq.toUpperCase();
int[] fscores=null, rscores=null;
char strand = '.';
if(watsoncrick!='.'){
if(r instanceof StrandedRegion){
char rstrand = ((StrandedRegion)r).getStrand();
if((watsoncrick=='W' && rstrand=='+') || (watsoncrick=='C' && rstrand=='-'))
strand='+';
else
strand='-';
}else
strand = watsoncrick=='W' ? '+' : '-';
}
try {
if(strand=='.' || strand=='+')
fscores = score(consensus, seq.toCharArray(), '+');
else{
fscores = new int[seq.length()];
for(int i=0; i<seq.length(); i++)
fscores[i] = consensus.getMaxMismatch();
}
if(strand=='.' || strand=='-'){
seq = SequenceUtils.reverseComplement(seq);
rscores = score(consensus, seq.toCharArray(), '-');
}else{
rscores = new int[seq.length()];
for(int i=0; i<seq.length(); i++)
rscores[i] = consensus.getMaxMismatch();
}
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace(System.err);
}
return new ConsensusSequenceScoreProfile(consensus, fscores, rscores);
}
public ConsensusSequenceScoreProfile execute(String seq) {return execute(seq, '.');}
public ConsensusSequenceScoreProfile execute(String seq, char strand) {
seq = seq.toUpperCase();
int[] fscores = null, rscores = null;
if(strand=='.' || strand=='+')
fscores = score(consensus, seq.toCharArray(), '+');
else{
fscores = new int[seq.length()];
for(int i=0; i<seq.length(); i++)
fscores[i] = consensus.getMaxMismatch();
}
if(strand=='.' || strand=='-'){
seq = SequenceUtils.reverseComplement(seq);
rscores = score(consensus, seq.toCharArray(), '-');
}else{
rscores = new int[seq.length()];
for(int i=0; i<seq.length(); i++)
rscores[i] = consensus.getMaxMismatch();
}
return new ConsensusSequenceScoreProfile(consensus, fscores, rscores);
}
public static int[] score(ConsensusSequence cons, char[] sequence, char strand) {
int[] results = new int[sequence.length];
/* scan through the sequence */
int length = cons.getLength();
for (int i = 0; i < sequence.length; i++) {
results[i] = cons.getMaxMismatch();
}
if (sequence.length<length)
return results;
for (int i = 0; i <= sequence.length - length; i++) {
int mismatches=0;
for (int j = 0; j < length; j++)
if(!cons.getMatrix()[j][sequence[i+j]])
mismatches++;
if(strand=='-')
results[sequence.length-length-i] = mismatches;
else
results[i] = mismatches;
}
return results;
}
}