use of uk.ac.babraham.SeqMonk.Filters.ProbeGroupGenerator.ProbeWindowGenerator in project SeqMonk by s-andrews.
the class WindowedDifferencesFilter method generateProbeList.
/* (non-Javadoc)
* @see uk.ac.babraham.SeqMonk.Filters.ProbeFilter#generateProbeList()
*/
@Override
protected void generateProbeList() {
// We need to check that we don't add any probes more than once
// so we need to keep a hash of the probes we've added to the
// filtered list.
Hashtable<Probe, Float> goingToAdd = new Hashtable<Probe, Float>();
ProbeList newList = new ProbeList(startingList, "Filtered Probes", "", "Difference");
Chromosome[] chromosomes = collection.genome().getAllChromosomes();
for (int c = 0; c < chromosomes.length; c++) {
progressUpdated("Processing windows on Chr" + chromosomes[c].name(), c, chromosomes.length);
Probe[] probes = startingList.getProbesForChromosome(chromosomes[c]);
ProbeGroupGenerator gen = null;
if (windowType == DISTANCE_WINDOW) {
gen = new ProbeWindowGenerator(probes, windowSize);
} else if (windowType == CONSECUTIVE_WINDOW) {
gen = new ConsecutiveProbeGenerator(probes, windowSize);
} else if (windowType == FEATURE_WINDOW) {
gen = new FeatureProbeGroupGenerator(probes, collection.genome().annotationCollection().getFeaturesForType(optionPanel.featureTypeBox.getSelectedItem().toString()));
}
while (true) {
if (cancel) {
cancel = false;
progressCancelled();
return;
}
Probe[] theseProbes = gen.nextSet();
if (theseProbes == null) {
break;
}
int count = 0;
float d = 0;
for (int s1 = 0; s1 < fromStores.length; s1++) {
for (int s2 = 0; s2 < toStores.length; s2++) {
switch(combineType) {
case DifferencesFilter.AVERAGE:
d += getDifferenceValue(toStores[s2], fromStores[s1], theseProbes);
count++;
break;
case DifferencesFilter.MAXIMUM:
float dt1 = getDifferenceValue(toStores[s2], fromStores[s1], theseProbes);
if (count == 0 || dt1 > d)
d = dt1;
count++;
break;
case DifferencesFilter.MINIMUM:
float dt2 = getDifferenceValue(toStores[s2], fromStores[s1], theseProbes);
if (count == 0 || dt2 < d)
d = dt2;
count++;
break;
}
}
}
if (combineType == DifferencesFilter.AVERAGE) {
d /= count;
}
// Now we have the value we need to know if it passes the test
if (upperLimit != null)
if (d > upperLimit.doubleValue())
continue;
if (lowerLimit != null)
if (d < lowerLimit.doubleValue())
continue;
for (int i = 0; i < theseProbes.length; i++) {
if (goingToAdd.containsKey(theseProbes[i])) {
// Don't do anything if this probe is already there with a bigger difference
continue;
// if (Math.abs(goingToAdd.get(theseProbes[i])) > Math.abs(d)) continue;
}
goingToAdd.put(theseProbes[i], d);
}
}
}
// Finally add all of the cached probes to the actual probe list
Enumeration<Probe> en = goingToAdd.keys();
while (en.hasMoreElements()) {
Probe p = en.nextElement();
newList.addProbe(p, goingToAdd.get(p));
}
filterFinished(newList);
}
use of uk.ac.babraham.SeqMonk.Filters.ProbeGroupGenerator.ProbeWindowGenerator in project SeqMonk by s-andrews.
the class WindowedReplicateStatsFilter method generateProbeList.
/* (non-Javadoc)
* @see uk.ac.babraham.SeqMonk.Filters.ProbeFilter#generateProbeList()
*/
@Override
protected void generateProbeList() {
Chromosome[] chromosomes = collection.genome().getAllChromosomes();
Vector<ProbeGroupTTestValue> newListProbesVector = new Vector<ProbeGroupTTestValue>();
for (int c = 0; c < chromosomes.length; c++) {
progressUpdated("Processing windows on Chr" + chromosomes[c].name(), c, chromosomes.length);
Probe[] probes = startingList.getProbesForChromosome(chromosomes[c]);
ProbeGroupGenerator gen = null;
if (windowType == DISTANCE_WINDOW) {
gen = new ProbeWindowGenerator(probes, windowSize);
} else if (windowType == CONSECUTIVE_WINDOW) {
gen = new ConsecutiveProbeGenerator(probes, windowSize);
} else if (windowType == FEATURE_WINDOW) {
gen = new FeatureProbeGroupGenerator(probes, collection.genome().annotationCollection().getFeaturesForType(optionsPanel.featureTypeBox.getSelectedItem().toString()));
}
while (true) {
if (cancel) {
cancel = false;
progressCancelled();
return;
}
Probe[] theseProbes = gen.nextSet();
if (theseProbes == null) {
// System.err.println("List of probes was null");
break;
}
// We need at least 3 probes in a set to calculate a p-value
if (theseProbes.length < 3) {
// System.err.println("Only "+theseProbes.length+" probes in the set");
continue;
}
double[][] values = new double[stores.length][];
for (int j = 0; j < stores.length; j++) {
if (splitReplicateSets & stores[j] instanceof ReplicateSet) {
values[j] = new double[theseProbes.length * ((ReplicateSet) stores[j]).dataStores().length];
} else {
values[j] = new double[theseProbes.length];
}
}
for (int j = 0; j < stores.length; j++) {
int index = 0;
for (int i = 0; i < theseProbes.length; i++) {
try {
if (splitReplicateSets & stores[j] instanceof ReplicateSet) {
DataStore[] localStores = ((ReplicateSet) stores[j]).dataStores();
for (int l = 0; l < localStores.length; l++) {
values[j][index] = localStores[l].getValueForProbe(theseProbes[i]);
index++;
}
} else {
values[j][index] = stores[j].getValueForProbe(theseProbes[i]);
index++;
}
} catch (SeqMonkException e) {
}
}
if (index != values[j].length) {
throw new IllegalStateException("Didn't fill all values total=" + values[j].length + " index=" + index);
}
}
double pValue = 0;
try {
if (stores.length == 1) {
pValue = TTest.calculatePValue(values[0], 0);
} else if (stores.length == 2) {
pValue = TTest.calculatePValue(values[0], values[1]);
} else {
pValue = AnovaTest.calculatePValue(values);
}
} catch (SeqMonkException e) {
throw new IllegalStateException(e);
}
newListProbesVector.add(new ProbeGroupTTestValue(theseProbes, pValue));
}
}
ProbeGroupTTestValue[] newListProbes = newListProbesVector.toArray(new ProbeGroupTTestValue[0]);
// Do the multi-testing correction if necessary
if (multiTest) {
BenjHochFDR.calculateQValues(newListProbes);
}
ProbeList newList;
// We need to handle duplicate hits internally since probe lists can't do
// this themselves any more.
Hashtable<Probe, Float> newListTemp = new Hashtable<Probe, Float>();
if (multiTest) {
newList = new ProbeList(startingList, "", "", "Q-value");
for (int i = 0; i < newListProbes.length; i++) {
if (newListProbes[i].q <= cutoff) {
Probe[] passedProbes = newListProbes[i].probes;
for (int p = 0; p < passedProbes.length; p++) {
if (newListTemp.containsKey(passedProbes[p])) {
// We always give a probe the lowest possible q-value
if (newListTemp.get(passedProbes[p]) <= newListProbes[i].q) {
continue;
}
}
newListTemp.put(passedProbes[p], (float) newListProbes[i].q);
}
}
}
} else {
newList = new ProbeList(startingList, "", "", "P-value");
for (int i = 0; i < newListProbes.length; i++) {
if (newListProbes[i].p <= cutoff) {
Probe[] passedProbes = newListProbes[i].probes;
for (int p = 0; p < passedProbes.length; p++) {
if (newListTemp.containsKey(passedProbes[p])) {
// We always give a probe the lowest possible p-value
if (newListTemp.get(passedProbes[p]) <= newListProbes[i].p) {
continue;
}
}
newListTemp.put(passedProbes[p], (float) newListProbes[i].p);
}
}
}
}
// Add the cached hits to the new list
Enumeration<Probe> en = newListTemp.keys();
while (en.hasMoreElements()) {
Probe p = en.nextElement();
newList.addProbe(p, newListTemp.get(p));
}
filterFinished(newList);
}
use of uk.ac.babraham.SeqMonk.Filters.ProbeGroupGenerator.ProbeWindowGenerator in project SeqMonk by s-andrews.
the class WindowedValuesFilter method generateProbeList.
/* (non-Javadoc)
* @see uk.ac.babraham.SeqMonk.Filters.ProbeFilter#generateProbeList()
*/
@Override
protected void generateProbeList() {
ProbeList newList = new ProbeList(startingList, "Filtered Probes", "", null);
Chromosome[] chromosomes = collection.genome().getAllChromosomes();
for (int c = 0; c < chromosomes.length; c++) {
HashSet<Probe> passedProbes = new HashSet<Probe>();
progressUpdated("Processing windows on Chr" + chromosomes[c].name(), c, chromosomes.length);
Probe[] probes = startingList.getProbesForChromosome(chromosomes[c]);
ProbeGroupGenerator gen = null;
if (windowType == DISTANCE_WINDOW) {
gen = new ProbeWindowGenerator(probes, windowSize);
} else if (windowType == CONSECUTIVE_WINDOW) {
gen = new ConsecutiveProbeGenerator(probes, windowSize);
} else if (windowType == FEATURE_WINDOW) {
gen = new FeatureProbeGroupGenerator(probes, collection.genome().annotationCollection().getFeaturesForType(optionsPanel.featureTypeBox.getSelectedItem().toString()));
} else {
progressExceptionReceived(new SeqMonkException("No window type known with number " + windowType));
return;
}
while (true) {
if (cancel) {
cancel = false;
progressCancelled();
return;
}
Probe[] theseProbes = gen.nextSet();
if (theseProbes == null) {
break;
}
int count = 0;
for (int s = 0; s < stores.length; s++) {
double totalValue = 0;
for (int i = 0; i < theseProbes.length; i++) {
// Get the values for the probes in this set
try {
totalValue += stores[s].getValueForProbe(theseProbes[i]);
} catch (SeqMonkException e) {
}
}
totalValue /= theseProbes.length;
// Now we have the value we need to know if it passes the test
if (upperLimit != null)
if (totalValue > upperLimit.doubleValue())
continue;
if (lowerLimit != null)
if (totalValue < lowerLimit.doubleValue())
continue;
// This one passes, we can add it to the count
++count;
}
// probe to the probe set.
switch(limitType) {
case EXACTLY:
if (count == storesLimit)
for (int i = 0; i < theseProbes.length; i++) {
if (passedProbes.contains(theseProbes[i]))
continue;
newList.addProbe(theseProbes[i], null);
passedProbes.add(theseProbes[i]);
}
break;
case AT_LEAST:
if (count >= storesLimit)
for (int i = 0; i < theseProbes.length; i++) {
if (passedProbes.contains(theseProbes[i]))
continue;
newList.addProbe(theseProbes[i], null);
passedProbes.add(theseProbes[i]);
}
break;
case NO_MORE_THAN:
if (count <= storesLimit)
for (int i = 0; i < theseProbes.length; i++) {
if (passedProbes.contains(theseProbes[i]))
continue;
newList.addProbe(theseProbes[i], null);
passedProbes.add(theseProbes[i]);
}
break;
}
}
}
filterFinished(newList);
}
Aggregations