package org.seqcode.motifs;
import java.util.*;
import java.io.*;
import org.seqcode.data.connections.DatabaseException;
import org.seqcode.data.connections.DatabaseFactory;
import org.seqcode.data.connections.UnknownRoleException;
import org.seqcode.data.motifdb.*;
import org.seqcode.genome.Genome;
import org.seqcode.genome.location.Region;
import org.seqcode.genome.sequence.SequenceGenerator;
import org.seqcode.gsebricks.verbs.*;
import org.seqcode.gseutils.*;
public class CenterOnMotif {
private Genome genome;
private ArrayList<WeightMatrix> matrices; // these are the matrices to scan for
private int expand;
private double cutoffpercent;
public void parseArgs(String args[]) throws Exception {
genome = Args.parseGenome(args).cdr();
cutoffpercent = Args.parseDouble(args,"cutoff",.5);
expand = Args.parseInteger(args,"expand",0);
MarkovBackgroundModel bgModel = null;
String bgmodelname = Args.parseString(args,"bgmodel","whole genome zero order");
BackgroundModelMetadata md = BackgroundModelLoader.getBackgroundModel(bgmodelname,
1,
"MARKOV",
Args.parseGenome(args).cdr().getDBID());
if (md != null) {
bgModel = BackgroundModelLoader.getMarkovModel(md);
} else {
System.err.println("Couldn't get metadata for " + bgmodelname);
}
matrices = new ArrayList<WeightMatrix>();
matrices.addAll(Args.parseWeightMatrices(args));
if (bgModel == null) {
for (WeightMatrix m : matrices) {
m.toLogOdds();
}
} else {
for (WeightMatrix m : matrices) {
m.toLogOdds(bgModel);
}
}
}
public void run() throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
SequenceGenerator seqgen = new SequenceGenerator();
String line = null;
while ((line = reader.readLine()) != null) {
Region region = Region.fromString(genome, line);
if (region == null) {
continue;
}
region = region.expand(expand,expand);
char[] seq = seqgen.execute(region).toCharArray();
int bestpos = -1;
double bestscore = 0;
String beststrand = "";
for (WeightMatrix m : matrices) {
float cut = (float)(cutoffpercent * m.getMaxScore());
List<WMHit> hits = WeightMatrixScanner.scanSequence(m,
cut,
seq);
for (WMHit h : hits) {
if (h.getScore() > bestscore) {
bestscore = h.getScore();
bestpos = (h.getStart() + h.getEnd()) / 2;
beststrand = h.getStrand();
}
}
}
if (bestscore > 0) {
int p = region.getStart() + bestpos;
System.out.println(region.getChrom() + ":" + p + "-" + p + ":" + beststrand);
}
}
}
public static void main(String args[]) throws Exception {
CenterOnMotif center = new CenterOnMotif();
center.parseArgs(args);
center.run();
}
}