package org.seqcode.data.seqdata.tools;
import java.util.*;
import org.seqcode.data.core.*;
import org.seqcode.data.seqdata.*;
import org.seqcode.genome.Genome;
import org.seqcode.gseutils.Args;
/**
* Tries to determine one or more control experiments to use for
* one or more chipseq experiments.
*
* Usage:
* java org.seqcode.gse.tools.chipseq.GuessControlExpt --species 'Mus musculus;mm9' --chipseq 'Sing ES CTCF E14;bowtie_unique'
*/
public class GuessControlExpt {
private static SeqDataLoader loader;
private static Collection<String> controlTypeNames;
private static Collection<Integer> controlTypeIDs;
private static MetadataLoader core;
private static Genome genome;
public static void main(String args[]) throws Exception {
genome = Args.parseGenome(args).cdr();
List<SeqLocator> locators = Args.parseSeqExpt(args);
loader = new SeqDataLoader(false, true);
core = loader.getMetadataLoader();
controlTypeNames = new ArrayList<String>();
controlTypeNames.add("CONTROL");
controlTypeNames.add("INPUT");
controlTypeIDs = new ArrayList<Integer>();
boolean strict = Args.parseFlags(args).contains("strict");
for (String f : controlTypeNames) {
ExptType type = core.loadExptType(f, false, false);
if (type != null) {
controlTypeIDs.add(type.getDBID());
}
}
Set<String> output = new HashSet<String>();
for (SeqLocator l : locators) {
Collection<SeqAlignment> alignments = new ArrayList<SeqAlignment>();
if (l.getReplicates().size() == 0) {
alignments.addAll(loader.loadAlignments(l.getExptName(),
null,
l.getAlignName(),
null,null,null,
null,null,null,
genome));
} else {
alignments.addAll(loader.loadAlignments(l, genome));
}
for (SeqAlignment a : alignments) {
Collection<SeqAlignment> controls = controlsForAlignment(a);
if (controls.size() == 0) {
System.err.println("No controls for " + a);
if (strict) {
System.exit(1);
}
}
for (SeqAlignment c : controls) {
output.add(c.getExpt().getName() + ";" + c.getName());
}
}
}
for (String a : output) {
System.out.println(a);
}
}
public static Collection<SeqAlignment> controlsForAlignment(SeqAlignment a) throws Exception {
ArrayList<SeqAlignment> output = new ArrayList<SeqAlignment>();
SeqExpt expt = a.getExpt();
CellLine cells = expt.getCellLine();
ExptCondition cond = expt.getExptCondition();
for (Integer i : controlTypeIDs) {
output.addAll(loader.loadAlignments(null,null,null,
i, null, cond.getDBID(),
null, cells.getDBID(), null,
genome));
}
return output;
}
}