Search in sources :

Example 11 with Filter

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;
}
Also used : IDirectFilter(uk.ac.sussex.gdsc.smlm.results.filter.IDirectFilter) DirectFilter(uk.ac.sussex.gdsc.smlm.results.filter.DirectFilter) Ticker(uk.ac.sussex.gdsc.core.logging.Ticker) LinkedList(java.util.LinkedList) ConcurrentRuntimeException(org.apache.commons.lang3.concurrent.ConcurrentRuntimeException) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) Filter(uk.ac.sussex.gdsc.smlm.results.filter.Filter) IDirectFilter(uk.ac.sussex.gdsc.smlm.results.filter.IDirectFilter) MultiPathFilter(uk.ac.sussex.gdsc.smlm.results.filter.MultiPathFilter) DirectFilter(uk.ac.sussex.gdsc.smlm.results.filter.DirectFilter) MaximaSpotFilter(uk.ac.sussex.gdsc.smlm.filters.MaximaSpotFilter) Nullable(uk.ac.sussex.gdsc.core.annotation.Nullable)

Example 12 with Filter

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;
}
Also used : FilterSet(uk.ac.sussex.gdsc.smlm.results.filter.FilterSet) ArrayList(java.util.ArrayList) Filter(uk.ac.sussex.gdsc.smlm.results.filter.Filter) IDirectFilter(uk.ac.sussex.gdsc.smlm.results.filter.IDirectFilter) MultiPathFilter(uk.ac.sussex.gdsc.smlm.results.filter.MultiPathFilter) DirectFilter(uk.ac.sussex.gdsc.smlm.results.filter.DirectFilter) MaximaSpotFilter(uk.ac.sussex.gdsc.smlm.filters.MaximaSpotFilter) GenericDialog(ij.gui.GenericDialog) NonBlockingGenericDialog(ij.gui.NonBlockingGenericDialog) ExtendedGenericDialog(uk.ac.sussex.gdsc.core.ij.gui.ExtendedGenericDialog)

Example 13 with Filter

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");
    }
}
Also used : MultiFilter(uk.ac.sussex.gdsc.smlm.results.filter.MultiFilter) Filter(uk.ac.sussex.gdsc.smlm.results.filter.Filter) SbrFilter(uk.ac.sussex.gdsc.smlm.results.filter.SbrFilter) XyWidthFilter(uk.ac.sussex.gdsc.smlm.results.filter.XyWidthFilter) AndFilter(uk.ac.sussex.gdsc.smlm.results.filter.AndFilter) PrecisionFilter(uk.ac.sussex.gdsc.smlm.results.filter.PrecisionFilter) SignalFilter(uk.ac.sussex.gdsc.smlm.results.filter.SignalFilter) SnrHysteresisFilter(uk.ac.sussex.gdsc.smlm.results.filter.SnrHysteresisFilter) AnrFilter(uk.ac.sussex.gdsc.smlm.results.filter.AnrFilter) WidthFilter(uk.ac.sussex.gdsc.smlm.results.filter.WidthFilter) CoordinateFilter(uk.ac.sussex.gdsc.smlm.results.filter.CoordinateFilter) SnrFilter(uk.ac.sussex.gdsc.smlm.results.filter.SnrFilter) OrFilter(uk.ac.sussex.gdsc.smlm.results.filter.OrFilter) MultiHysteresisFilter(uk.ac.sussex.gdsc.smlm.results.filter.MultiHysteresisFilter) EShiftFilter(uk.ac.sussex.gdsc.smlm.results.filter.EShiftFilter) PrecisionHysteresisFilter(uk.ac.sussex.gdsc.smlm.results.filter.PrecisionHysteresisFilter) ShiftFilter(uk.ac.sussex.gdsc.smlm.results.filter.ShiftFilter) TraceFilter(uk.ac.sussex.gdsc.smlm.results.filter.TraceFilter) MemoryPeakResults(uk.ac.sussex.gdsc.smlm.results.MemoryPeakResults) ExtendedGenericDialog(uk.ac.sussex.gdsc.core.ij.gui.ExtendedGenericDialog)

Example 14 with 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);
}
Also used : Color(java.awt.Color) TextWindow(ij.text.TextWindow) HashMap(java.util.HashMap) WindowOrganiser(uk.ac.sussex.gdsc.core.ij.plugin.WindowOrganiser) Filter(uk.ac.sussex.gdsc.smlm.results.filter.Filter) AtomicReference(java.util.concurrent.atomic.AtomicReference) OpenDialog(ij.io.OpenDialog) ArrayList(java.util.ArrayList) MemoryPeakResults(uk.ac.sussex.gdsc.smlm.results.MemoryPeakResults) AndFilter(uk.ac.sussex.gdsc.smlm.results.filter.AndFilter) GenericDialog(ij.gui.GenericDialog) PeakResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.PeakResultProcedure) PlotWindow(ij.gui.PlotWindow) MathUtils(uk.ac.sussex.gdsc.core.utils.MathUtils) PrecisionFilter(uk.ac.sussex.gdsc.smlm.results.filter.PrecisionFilter) LinkedList(java.util.LinkedList) PeakResultsReader(uk.ac.sussex.gdsc.smlm.results.PeakResultsReader) SnrHysteresisFilter(uk.ac.sussex.gdsc.smlm.results.filter.SnrHysteresisFilter) SettingsManager(uk.ac.sussex.gdsc.smlm.ij.settings.SettingsManager) WidthFilter(uk.ac.sussex.gdsc.smlm.results.filter.WidthFilter) GUIFilterSettings(uk.ac.sussex.gdsc.smlm.ij.settings.GUIProtos.GUIFilterSettings) Files(java.nio.file.Files) BufferedWriter(java.io.BufferedWriter) FilterSet(uk.ac.sussex.gdsc.smlm.results.filter.FilterSet) ClassificationResult(uk.ac.sussex.gdsc.core.match.ClassificationResult) Plot(ij.gui.Plot) File(java.io.File) SnrFilter(uk.ac.sussex.gdsc.smlm.results.filter.SnrFilter) Consumer(java.util.function.Consumer) FilterXStreamUtils(uk.ac.sussex.gdsc.smlm.results.filter.FilterXStreamUtils) OrFilter(uk.ac.sussex.gdsc.smlm.results.filter.OrFilter) List(java.util.List) Counter(uk.ac.sussex.gdsc.smlm.results.count.Counter) Paths(java.nio.file.Paths) ImageJUtils(uk.ac.sussex.gdsc.core.ij.ImageJUtils) IJ(ij.IJ) PrecisionHysteresisFilter(uk.ac.sussex.gdsc.smlm.results.filter.PrecisionHysteresisFilter) BufferedReader(java.io.BufferedReader) PlugIn(ij.plugin.PlugIn) Collections(java.util.Collections) TraceFilter(uk.ac.sussex.gdsc.smlm.results.filter.TraceFilter) Counter(uk.ac.sussex.gdsc.smlm.results.count.Counter) GenericDialog(ij.gui.GenericDialog) MemoryPeakResults(uk.ac.sussex.gdsc.smlm.results.MemoryPeakResults)

Example 15 with Filter

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));
    }
}
Also used : FilterSet(uk.ac.sussex.gdsc.smlm.results.filter.FilterSet) Filter(uk.ac.sussex.gdsc.smlm.results.filter.Filter) AndFilter(uk.ac.sussex.gdsc.smlm.results.filter.AndFilter) PrecisionFilter(uk.ac.sussex.gdsc.smlm.results.filter.PrecisionFilter) SnrHysteresisFilter(uk.ac.sussex.gdsc.smlm.results.filter.SnrHysteresisFilter) WidthFilter(uk.ac.sussex.gdsc.smlm.results.filter.WidthFilter) SnrFilter(uk.ac.sussex.gdsc.smlm.results.filter.SnrFilter) OrFilter(uk.ac.sussex.gdsc.smlm.results.filter.OrFilter) PrecisionHysteresisFilter(uk.ac.sussex.gdsc.smlm.results.filter.PrecisionHysteresisFilter) TraceFilter(uk.ac.sussex.gdsc.smlm.results.filter.TraceFilter) PrecisionHysteresisFilter(uk.ac.sussex.gdsc.smlm.results.filter.PrecisionHysteresisFilter) LinkedList(java.util.LinkedList)

Aggregations

Filter (uk.ac.sussex.gdsc.smlm.results.filter.Filter)21 DirectFilter (uk.ac.sussex.gdsc.smlm.results.filter.DirectFilter)12 FilterSet (uk.ac.sussex.gdsc.smlm.results.filter.FilterSet)11 PrecisionFilter (uk.ac.sussex.gdsc.smlm.results.filter.PrecisionFilter)10 SnrFilter (uk.ac.sussex.gdsc.smlm.results.filter.SnrFilter)10 WidthFilter (uk.ac.sussex.gdsc.smlm.results.filter.WidthFilter)10 MaximaSpotFilter (uk.ac.sussex.gdsc.smlm.filters.MaximaSpotFilter)9 AndFilter (uk.ac.sussex.gdsc.smlm.results.filter.AndFilter)9 IDirectFilter (uk.ac.sussex.gdsc.smlm.results.filter.IDirectFilter)9 MultiPathFilter (uk.ac.sussex.gdsc.smlm.results.filter.MultiPathFilter)9 OrFilter (uk.ac.sussex.gdsc.smlm.results.filter.OrFilter)9 PrecisionHysteresisFilter (uk.ac.sussex.gdsc.smlm.results.filter.PrecisionHysteresisFilter)9 SnrHysteresisFilter (uk.ac.sussex.gdsc.smlm.results.filter.SnrHysteresisFilter)9 TraceFilter (uk.ac.sussex.gdsc.smlm.results.filter.TraceFilter)9 ArrayList (java.util.ArrayList)8 LinkedList (java.util.LinkedList)8 ExtendedGenericDialog (uk.ac.sussex.gdsc.core.ij.gui.ExtendedGenericDialog)7 GenericDialog (ij.gui.GenericDialog)5 List (java.util.List)4 IJ (ij.IJ)3