use of uk.ac.sussex.gdsc.smlm.results.filter.Filter in project GDSC-SMLM by aherbert.
the class BenchmarkFilterAnalysis method scoreFilters.
@Nullable
private FilterScoreResult[] scoreFilters(FilterSet filterSet, boolean createTextResult) {
if (filterSet.size() == 0) {
return null;
}
initialiseScoring(filterSet);
FilterScoreResult[] scoreResults = new FilterScoreResult[filterSet.size()];
if (scoreResults.length == 1) {
// No need to multi-thread this
scoreResults[0] = scoreFilter((DirectFilter) filterSet.getFilters().get(0), defaultMinimalFilter, createTextResult, coordinateStore);
} else {
// Multi-thread score all the result
final int nThreads = getThreads(scoreResults.length);
final BlockingQueue<ScoreJob> jobs = new ArrayBlockingQueue<>(nThreads * 2);
final List<Thread> threads = new LinkedList<>();
final Ticker ticker = ImageJUtils.createTicker(scoreResults.length, nThreads, "Scoring Filters");
for (int i = 0; i < nThreads; i++) {
final ScoreWorker worker = new ScoreWorker(jobs, scoreResults, createTextResult, (coordinateStore == null) ? null : coordinateStore.newInstance(), ticker);
final Thread t = new Thread(worker);
threads.add(t);
t.start();
}
int index = 0;
for (final Filter filter : filterSet.getFilters()) {
if (IJ.escapePressed()) {
break;
}
put(jobs, new ScoreJob((DirectFilter) filter, index++));
}
// Finish all the worker threads by passing in a null job
for (int i = 0; i < threads.size(); i++) {
put(jobs, new ScoreJob(null, -1));
}
// Wait for all to finish
for (int i = 0; i < threads.size(); i++) {
try {
threads.get(i).join();
} catch (final InterruptedException ex) {
Logger.getLogger(BenchmarkFilterAnalysis.class.getName()).log(Level.WARNING, "Interrupted!", ex);
Thread.currentThread().interrupt();
throw new ConcurrentRuntimeException("Unexpected interruption", ex);
}
}
threads.clear();
ImageJUtils.finished();
// In case the threads were interrupted
if (ImageJUtils.isInterrupted()) {
scoreResults = null;
}
}
finishScoring();
return scoreResults;
}
use of uk.ac.sussex.gdsc.smlm.results.filter.Filter in project GDSC-SMLM by aherbert.
the class BenchmarkFilterAnalysis method expandFilters.
/**
* If filters have been provided in FiltersSets of 3 then expand the filters into a set assuming
* the three represent min:max:increment.
*
* @param filterSets the filter sets
* @return the expanded filter sets
*/
private List<FilterSet> expandFilters(List<FilterSet> filterSets) {
// Note:
// Do not clear the search range map and step size map when reading a new set of filters.
// The filters may be the same with slight modifications and so it is useful to keep the last
// settings.
final long[] expanded = new long[filterSets.size()];
final String[] name = new String[expanded.length];
int count = 0;
boolean doIt = false;
for (final FilterSet filterSet : filterSets) {
if (filterSet.size() == 3 && filterSet.allSameType()) {
name[count] = filterSet.getName();
// Check we have min:max:increment by counting the combinations
final Filter f1 = filterSet.getFilters().get(0);
final Filter f2 = filterSet.getFilters().get(1);
final Filter f3 = filterSet.getFilters().get(2);
final int n = f1.getNumberOfParameters();
final double[] parameters = new double[n];
final double[] parameters2 = new double[n];
final double[] increment = new double[n];
for (int i = 0; i < n; i++) {
parameters[i] = f1.getParameterValue(i);
parameters2[i] = f2.getParameterValue(i);
increment[i] = f3.getParameterValue(i);
}
final long combinations = countCombinations(parameters, parameters2, increment);
if (combinations > 1) {
expanded[count] = combinations;
doIt = true;
}
}
count++;
}
if (!doIt) {
return filterSets;
}
final GenericDialog gd = new GenericDialog(TITLE);
gd.hideCancelButton();
final StringBuilder sb = new StringBuilder("The filter file contains potential triples of min:max:increment.\n \n");
for (count = 0; count < expanded.length; count++) {
if (expanded[count] > 0) {
sb.append("Expand set [").append((count + 1)).append("]");
if (!TextUtils.isNullOrEmpty(name[count])) {
sb.append(" ").append(name[count]);
}
sb.append(" to ").append(expanded[count]).append(" filters\n");
}
}
gd.addMessage(sb.toString());
gd.addCheckbox("Expand_filters", settings.expandFilters);
gd.showDialog();
if (!gd.wasCanceled()) {
settings.expandFilters = gd.getNextBoolean();
if (!settings.expandFilters) {
return filterSets;
}
}
IJ.showStatus("Expanding filters ...");
final List<FilterSet> filterList2 = new ArrayList<>(filterSets.size());
for (final FilterSet filterSet : filterSets) {
count = filterList2.size();
if (expanded[count] == 0) {
filterList2.add(filterSet);
continue;
}
final Filter f1 = filterSet.getFilters().get(0);
final Filter f2 = filterSet.getFilters().get(1);
final Filter f3 = filterSet.getFilters().get(2);
final int n = f1.getNumberOfParameters();
final double[] parameters = new double[n];
final double[] parameters2 = new double[n];
final double[] increment = new double[n];
for (int i = 0; i < n; i++) {
parameters[i] = f1.getParameterValue(i);
parameters2[i] = f2.getParameterValue(i);
increment[i] = f3.getParameterValue(i);
}
final List<Filter> list = expandFilters(f1, parameters, parameters2, increment);
filterList2.add(new FilterSet(filterSet.getName(), list));
}
IJ.showStatus("");
ImageJUtils.log("Expanded input to %d filters in %s", countFilters(filterList2), TextUtils.pleural(filterList2.size(), "set"));
return filterList2;
}
use of uk.ac.sussex.gdsc.smlm.results.filter.Filter in project GDSC-SMLM by aherbert.
the class FreeFilterResults method run.
@Override
public void run(String arg) {
SmlmUsageTracker.recordPlugin(this.getClass(), arg);
if (MemoryPeakResults.isMemoryEmpty()) {
// Ask user if they want to show the demo filters
final ExtendedGenericDialog gd = new ExtendedGenericDialog(TITLE);
gd.enableYesNoCancel();
gd.hideCancelButton();
gd.addMessage("No results in memory. Show the demo filters?");
gd.showDialog();
if (gd.wasOKed()) {
logDemoFilters(TITLE);
}
return;
}
if (!showDialog()) {
return;
}
final MemoryPeakResults results = ResultsManager.loadInputResults(inputOption, false, null, null);
if (MemoryPeakResults.isEmpty(results)) {
IJ.error(TITLE, "No results could be loaded");
IJ.showStatus("");
return;
}
// Filter results
final Filter filter = Filter.fromXml(filterSettings.getFreeFilter());
if (filter != null) {
final MemoryPeakResults newResults = filter.filter(results);
if (newResults.size() > 0) {
newResults.setName(results.getName() + " Free Filtered");
MemoryPeakResults.addResults(newResults);
}
IJ.showStatus(String.format("Filtered %d results to %d", results.size(), newResults.size()));
} else {
IJ.showStatus("ERROR: Unable to create filter");
}
}
use of uk.ac.sussex.gdsc.smlm.results.filter.Filter in project GDSC-SMLM by aherbert.
the class FilterAnalysis method showDialog.
private boolean showDialog(List<MemoryPeakResults> resultsList, boolean fileInput) {
final GenericDialog gd = new GenericDialog(TITLE);
String helpKey = "filter-analysis";
if (fileInput) {
helpKey += "-file";
}
gd.addHelp(HelpUrls.getUrl(helpKey));
int total = 0;
final Counter tp = new Counter();
for (final MemoryPeakResults r : resultsList) {
total += r.size();
r.forEach((PeakResultProcedure) result -> {
if (result.getOrigValue() != 0) {
tp.increment();
}
});
}
ImageJUtils.addMessage(gd, "%d files, %d results, %d True-Positives", resultsList.size(), total, tp.getCount());
settings = Settings.load();
settings.save();
if (!fileInput) {
gd.addCheckbox("SNR_filter", settings.snrFilter);
gd.addNumericField("Min_SNR", settings.minSnr, 0);
gd.addNumericField("Max_SNR", settings.maxSnr, 0);
gd.addNumericField("Min_Width", settings.minWidth, 2);
gd.addNumericField("Max_Width", settings.maxWidth, 2);
gd.addNumericField("Increment_Width", settings.incWidth, 2);
gd.addCheckbox("Precision_filter", settings.precisionFilter);
gd.addNumericField("Min_Precision", settings.minPrecision, 0);
gd.addNumericField("Max_Precision", settings.maxPrecision, 0);
gd.addCheckbox("Trace_filter", settings.traceFilter);
gd.addNumericField("Min_distance", settings.minDistance, 2);
gd.addNumericField("Max_distance", settings.maxDistance, 2);
gd.addNumericField("Increment_distance", settings.incDistance, 2);
gd.addNumericField("Min_time", settings.minTime, 0);
gd.addNumericField("Max_time", settings.maxTime, 0);
gd.addNumericField("Increment_time", settings.incTime, 0);
gd.addCheckbox("Hysteresis_SNR_filter", settings.hysteresisSnrFilter);
gd.addNumericField("Min_SNR_gap", settings.minSnrGap, 0);
gd.addNumericField("Max_SNR_gap", settings.maxSnrGap, 0);
gd.addNumericField("Increment_SNR_gap", settings.incSnrGap, 0);
gd.addCheckbox("Hysteresis_Precision_filter", settings.hysteresisPrecisionFilter);
gd.addNumericField("Min_Precision_gap", settings.minPrecisionGap, 0);
gd.addNumericField("Max_Precision_gap", settings.maxPrecisionGap, 0);
gd.addNumericField("Increment_Precision_gap", settings.incPrecisionGap, 0);
gd.addCheckbox("Save_filters", settings.saveFilterSets);
}
gd.addCheckbox("Show_table", settings.showResultsTable);
gd.addSlider("Plot_top_n", 0, 20, settings.plotTopN);
gd.addCheckbox("Calculate_sensitivity", settings.calculateSensitivity);
gd.addSlider("Delta", 0.01, 1, settings.delta);
gd.showDialog();
return !gd.wasCanceled() && readDialog(gd, fileInput);
}
use of uk.ac.sussex.gdsc.smlm.results.filter.Filter in project GDSC-SMLM by aherbert.
the class FilterAnalysis method addPrecisionHysteresisFilters.
private void addPrecisionHysteresisFilters(List<FilterSet> filterSets) {
if (!settings.hysteresisPrecisionFilter) {
return;
}
for (int precisionGap = settings.minPrecisionGap; precisionGap <= settings.maxPrecisionGap; precisionGap += settings.incPrecisionGap) {
final List<Filter> filters = new LinkedList<>();
for (int precision = settings.minPrecision; precision <= settings.maxPrecision; precision++) {
filters.add(new PrecisionHysteresisFilter(2, 0, 1, 0, precision, precisionGap));
}
filterSets.add(new FilterSet(filters));
}
}
Aggregations