Search in sources :

Example 1 with DataException

use of uk.ac.sussex.gdsc.core.data.DataException in project GDSC-SMLM by aherbert.

the class CreateData method showSummary.

private double showSummary(List<? extends FluorophoreSequenceModel> fluorophores, List<LocalisationModel> localisations) {
    IJ.showStatus("Calculating statistics ...");
    final Statistics[] stats = new Statistics[NAMES.length];
    for (int i = 0; i < stats.length; i++) {
        stats[i] = (settings.getShowHistograms() || alwaysRemoveOutliers[i]) ? new StoredDataStatistics() : new Statistics();
    }
    // Find the largest timepoint
    final ImagePlus outputImp = WindowManager.getImage(benchmarkImageId);
    int frameCount;
    if (outputImp == null) {
        sortLocalisationsByTime(localisations);
        frameCount = localisations.get(localisations.size() - 1).getTime();
    } else {
        frameCount = outputImp.getStackSize();
    }
    final int[] countHistogram = new int[frameCount + 1];
    // Use the localisations that were drawn to create the sampled on/off times
    rebuildNeighbours(localisations);
    // Assume that there is at least one localisation
    final LocalisationModel first = localisations.get(0);
    // The current localisation
    int currentId = first.getId();
    // The last time this localisation was on
    int lastT = first.getTime();
    // Number of blinks
    int blinks = 0;
    // On-time of current pulse
    int currentT = 0;
    double signal = 0;
    final double centreOffset = settings.getSize() * 0.5;
    // Used to convert the sampled times in frames into seconds
    final double framesPerSecond = 1000.0 / settings.getExposureTime();
    // final double gain = new CreateDataSettingsHelper(settings).getTotalGainSafe();
    for (final LocalisationModel l : localisations) {
        final double[] data = l.getData();
        if (data == null) {
            throw new IllegalStateException("No localisation data. This should not happen!");
        }
        final double noise = data[1];
        final double sx = data[2];
        final double sy = data[3];
        final double intensityInPhotons = data[4];
        // Q. What if the noise is zero, i.e. no background photon / read noise?
        // Just ignore it at current. This is only an approximation to the SNR estimate
        // if this is not a Gaussian spot.
        final double snr = Gaussian2DPeakResultHelper.getMeanSignalUsingP05(intensityInPhotons, sx, sy) / noise;
        stats[SIGNAL].add(intensityInPhotons);
        stats[NOISE].add(noise);
        if (noise != 0) {
            stats[SNR].add(snr);
        }
        // if (l.isContinuous())
        if (l.getNext() != null && l.getPrevious() != null) {
            stats[SIGNAL_CONTINUOUS].add(intensityInPhotons);
            if (noise != 0) {
                stats[SNR_CONTINUOUS].add(snr);
            }
        }
        final int id = l.getId();
        // Check if this a new fluorophore
        if (currentId != id) {
            // Add previous fluorophore
            stats[SAMPLED_BLINKS].add(blinks);
            stats[SAMPLED_T_ON].add(currentT / framesPerSecond);
            stats[TOTAL_SIGNAL].add(signal);
            // Reset
            blinks = 0;
            currentT = 1;
            currentId = id;
            signal = intensityInPhotons;
        } else {
            signal += intensityInPhotons;
            // Check if the current fluorophore pulse is broken (i.e. a blink)
            if (l.getTime() - 1 > lastT) {
                blinks++;
                stats[SAMPLED_T_ON].add(currentT / framesPerSecond);
                currentT = 1;
                stats[SAMPLED_T_OFF].add(((l.getTime() - 1) - lastT) / framesPerSecond);
            } else {
                // Continuous on-time
                currentT++;
            }
        }
        lastT = l.getTime();
        countHistogram[lastT]++;
        stats[X].add((l.getX() - centreOffset) * settings.getPixelPitch());
        stats[Y].add((l.getY() - centreOffset) * settings.getPixelPitch());
        stats[Z].add(l.getZ() * settings.getPixelPitch());
    }
    // Final fluorophore
    stats[SAMPLED_BLINKS].add(blinks);
    stats[SAMPLED_T_ON].add(currentT / framesPerSecond);
    stats[TOTAL_SIGNAL].add(signal);
    // Samples per frame
    for (int t = 1; t < countHistogram.length; t++) {
        stats[SAMPLES].add(countHistogram[t]);
    }
    if (fluorophores != null) {
        for (final FluorophoreSequenceModel f : fluorophores) {
            stats[BLINKS].add(f.getNumberOfBlinks());
            // On-time
            for (final double t : f.getOnTimes()) {
                stats[T_ON].add(t);
            }
            // Off-time
            for (final double t : f.getOffTimes()) {
                stats[T_OFF].add(t);
            }
        }
    } else {
        // show no blinks
        stats[BLINKS].add(0);
        stats[T_ON].add(1);
    }
    if (results != null) {
        // Convert depth-of-field to pixels
        final double depth = settings.getDepthOfField() / settings.getPixelPitch();
        try {
            // Get widths
            final WidthResultProcedure wp = new WidthResultProcedure(results, DistanceUnit.PIXEL);
            wp.getW();
            stats[WIDTH].add(wp.wx);
        } catch (final DataException ex) {
            ImageJUtils.log("Unable to compute width: " + ex.getMessage());
        }
        try {
            // Get z depth
            final StandardResultProcedure sp = new StandardResultProcedure(results, DistanceUnit.PIXEL);
            sp.getXyz();
            // Get precision
            final PrecisionResultProcedure pp = new PrecisionResultProcedure(results);
            pp.getPrecision();
            stats[PRECISION].add(pp.precisions);
            for (int i = 0; i < pp.size(); i++) {
                if (Math.abs(sp.z[i]) < depth) {
                    stats[PRECISION_IN_FOCUS].add(pp.precisions[i]);
                }
            }
        } catch (final DataException ex) {
            ImageJUtils.log("Unable to compute LSE precision: " + ex.getMessage());
        }
        // Compute density per frame. Multi-thread for speed
        if (settings.getDensityRadius() > 0) {
            final int threadCount = Prefs.getThreads();
            final Ticker ticker = ImageJUtils.createTicker(results.getLastFrame(), threadCount, "Calculating density ...");
            final ExecutorService threadPool = Executors.newFixedThreadPool(threadCount);
            final List<Future<?>> futures = new LinkedList<>();
            final TFloatArrayList coordsX = new TFloatArrayList();
            final TFloatArrayList coordsY = new TFloatArrayList();
            final Statistics densityStats = stats[DENSITY];
            final float radius = (float) (settings.getDensityRadius() * getHwhm());
            final Rectangle bounds = results.getBounds();
            final double area = (double) bounds.width * bounds.height;
            // Store the density for each result.
            final int[] allDensity = new int[results.size()];
            final FrameCounter counter = results.newFrameCounter();
            results.forEach((PeakResultProcedure) result -> {
                if (counter.advance(result.getFrame())) {
                    counter.increment(runDensityCalculation(threadPool, futures, coordsX, coordsY, densityStats, radius, area, allDensity, counter.getCount(), ticker));
                }
                coordsX.add(result.getXPosition());
                coordsY.add(result.getYPosition());
            });
            runDensityCalculation(threadPool, futures, coordsX, coordsY, densityStats, radius, area, allDensity, counter.getCount(), ticker);
            ConcurrencyUtils.waitForCompletionUnchecked(futures);
            threadPool.shutdown();
            ImageJUtils.finished();
            // Split results into singles (density = 0) and clustered (density > 0)
            final MemoryPeakResults singles = copyMemoryPeakResults("No Density");
            final MemoryPeakResults clustered = copyMemoryPeakResults("Density");
            counter.reset();
            results.forEach((PeakResultProcedure) result -> {
                final int density = allDensity[counter.getAndIncrement()];
                result.setOrigValue(density);
                if (density == 0) {
                    singles.add(result);
                } else {
                    clustered.add(result);
                }
            });
        }
    }
    final StringBuilder sb = new StringBuilder();
    sb.append(datasetNumber).append('\t');
    if (settings.getCameraType() == CameraType.SCMOS) {
        sb.append("sCMOS (").append(settings.getCameraModelName()).append(") ");
        final Rectangle bounds = cameraModel.getBounds();
        sb.append(" ").append(bounds.x).append(",").append(bounds.y);
        final int size = settings.getSize();
        sb.append(" ").append(size).append("x").append(size);
    } else if (CalibrationProtosHelper.isCcdCameraType(settings.getCameraType())) {
        sb.append(CalibrationProtosHelper.getName(settings.getCameraType()));
        final int size = settings.getSize();
        sb.append(" ").append(size).append("x").append(size);
        if (settings.getCameraType() == CameraType.EMCCD) {
            sb.append(" EM=").append(settings.getEmGain());
        }
        sb.append(" CG=").append(settings.getCameraGain());
        sb.append(" RN=").append(settings.getReadNoise());
        sb.append(" B=").append(settings.getBias());
    } else {
        throw new IllegalStateException();
    }
    sb.append(" QE=").append(settings.getQuantumEfficiency()).append('\t');
    sb.append(settings.getPsfModel());
    if (psfModelType == PSF_MODEL_IMAGE) {
        sb.append(" Image").append(settings.getPsfImageName());
    } else if (psfModelType == PSF_MODEL_ASTIGMATISM) {
        sb.append(" model=").append(settings.getAstigmatismModel());
    } else {
        sb.append(" DoF=").append(MathUtils.rounded(settings.getDepthOfFocus()));
        if (settings.getEnterWidth()) {
            sb.append(" SD=").append(MathUtils.rounded(settings.getPsfSd()));
        } else {
            sb.append(" λ=").append(MathUtils.rounded(settings.getWavelength()));
            sb.append(" NA=").append(MathUtils.rounded(settings.getNumericalAperture()));
        }
    }
    sb.append('\t');
    sb.append((fluorophores == null) ? localisations.size() : fluorophores.size()).append('\t');
    sb.append(stats[SAMPLED_BLINKS].getN() + (int) stats[SAMPLED_BLINKS].getSum()).append('\t');
    sb.append(localisations.size()).append('\t');
    sb.append(frameCount).append('\t');
    sb.append(MathUtils.rounded(areaInUm)).append('\t');
    sb.append(MathUtils.rounded(localisations.size() / (areaInUm * frameCount), 4)).append('\t');
    sb.append(MathUtils.rounded(getHwhm(), 4)).append('\t');
    double sd = getPsfSd();
    sb.append(MathUtils.rounded(sd, 4)).append('\t');
    sd *= settings.getPixelPitch();
    final double sa = PsfCalculator.squarePixelAdjustment(sd, settings.getPixelPitch()) / settings.getPixelPitch();
    sb.append(MathUtils.rounded(sa, 4)).append('\t');
    // Width not valid for the Image PSF.
    // Q. Is this true? We can approximate the FHWM for a spot-like image PSF.
    final int nStats = (psfModelType == PSF_MODEL_IMAGE) ? stats.length - 1 : stats.length;
    for (int i = 0; i < nStats; i++) {
        final double centre = (alwaysRemoveOutliers[i]) ? ((StoredDataStatistics) stats[i]).getStatistics().getPercentile(50) : stats[i].getMean();
        sb.append(MathUtils.rounded(centre, 4)).append('\t');
    }
    createSummaryTable().accept(sb.toString());
    // Show histograms
    if (settings.getShowHistograms() && !java.awt.GraphicsEnvironment.isHeadless()) {
        IJ.showStatus("Calculating histograms ...");
        final boolean[] chosenHistograms = getChoosenHistograms();
        final WindowOrganiser wo = new WindowOrganiser();
        final HistogramPlotBuilder builder = new HistogramPlotBuilder(TITLE);
        for (int i = 0; i < NAMES.length; i++) {
            if (chosenHistograms[i]) {
                builder.setData((StoredDataStatistics) stats[i]).setName(NAMES[i]).setIntegerBins(integerDisplay[i]).setRemoveOutliersOption((settings.getRemoveOutliers() || alwaysRemoveOutliers[i]) ? 2 : 0).setNumberOfBins(settings.getHistogramBins()).show(wo);
            }
        }
        wo.tile();
    }
    IJ.showStatus("");
    return stats[SIGNAL].getMean();
}
Also used : RandomUtils(uk.ac.sussex.gdsc.core.utils.rng.RandomUtils) LoadLocalisations(uk.ac.sussex.gdsc.smlm.ij.plugins.LoadLocalisations) Arrays(java.util.Arrays) PoissonSamplerUtils(uk.ac.sussex.gdsc.core.utils.rng.PoissonSamplerUtils) Molecule(uk.ac.sussex.gdsc.smlm.data.config.MoleculeProtos.Molecule) IdPeakResult(uk.ac.sussex.gdsc.smlm.results.IdPeakResult) ImageProcessor(ij.process.ImageProcessor) HistogramPlotBuilder(uk.ac.sussex.gdsc.core.ij.HistogramPlot.HistogramPlotBuilder) ConfigurationException(uk.ac.sussex.gdsc.smlm.data.config.ConfigurationException) AiryPsfModel(uk.ac.sussex.gdsc.smlm.model.AiryPsfModel) GaussianPsfModel(uk.ac.sussex.gdsc.smlm.model.GaussianPsfModel) MemoryUtils(uk.ac.sussex.gdsc.core.utils.MemoryUtils) PSFType(uk.ac.sussex.gdsc.smlm.data.config.PSFProtos.PSFType) HelpUrls(uk.ac.sussex.gdsc.smlm.ij.plugins.HelpUrls) ResultsManager(uk.ac.sussex.gdsc.smlm.ij.plugins.ResultsManager) GammaDistribution(org.apache.commons.math3.distribution.GammaDistribution) Future(java.util.concurrent.Future) Vector(java.util.Vector) MemoryPeakResults(uk.ac.sussex.gdsc.smlm.results.MemoryPeakResults) Map(java.util.Map) DensityManager(uk.ac.sussex.gdsc.core.clustering.DensityManager) UnicodeReader(uk.ac.sussex.gdsc.core.utils.UnicodeReader) RadialFalloffIllumination(uk.ac.sussex.gdsc.smlm.model.RadialFalloffIllumination) DistanceUnit(uk.ac.sussex.gdsc.smlm.data.config.UnitProtos.DistanceUnit) RawResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.RawResultProcedure) ConcurrencyUtils(uk.ac.sussex.gdsc.core.utils.concurrent.ConcurrencyUtils) TextUtils(uk.ac.sussex.gdsc.core.utils.TextUtils) Gaussian2DFunction(uk.ac.sussex.gdsc.smlm.function.gaussian.Gaussian2DFunction) Executors(java.util.concurrent.Executors) PeakFit(uk.ac.sussex.gdsc.smlm.ij.plugins.PeakFit) TIntHashSet(gnu.trove.set.hash.TIntHashSet) ImagePlus(ij.ImagePlus) LocalisationList(uk.ac.sussex.gdsc.smlm.ij.plugins.LoadLocalisations.LocalisationList) UniformDistribution(uk.ac.sussex.gdsc.smlm.model.UniformDistribution) ShortProcessor(ij.process.ShortProcessor) FileUtils(uk.ac.sussex.gdsc.core.utils.FileUtils) CameraModelFisherInformationAnalysis(uk.ac.sussex.gdsc.smlm.ij.plugins.CameraModelFisherInformationAnalysis) CalibrationProtosHelper(uk.ac.sussex.gdsc.smlm.data.config.CalibrationProtosHelper) PlugIn(ij.plugin.PlugIn) LocalisationModelSet(uk.ac.sussex.gdsc.smlm.model.LocalisationModelSet) AiryPattern(uk.ac.sussex.gdsc.smlm.model.AiryPattern) Prefs(ij.Prefs) FrameCounter(uk.ac.sussex.gdsc.smlm.results.count.FrameCounter) WindowManager(ij.WindowManager) PeakResult(uk.ac.sussex.gdsc.smlm.results.PeakResult) CreateDataSettings(uk.ac.sussex.gdsc.smlm.ij.settings.GUIProtos.CreateDataSettings) GridDistribution(uk.ac.sussex.gdsc.smlm.model.GridDistribution) ArrayList(java.util.ArrayList) Atom(uk.ac.sussex.gdsc.smlm.data.config.MoleculeProtos.Atom) AutoThreshold(uk.ac.sussex.gdsc.core.threshold.AutoThreshold) GenericDialog(ij.gui.GenericDialog) ImagePsfModel(uk.ac.sussex.gdsc.smlm.model.ImagePsfModel) PsfModel(uk.ac.sussex.gdsc.smlm.model.PsfModel) PeakResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.PeakResultProcedure) PoissonGaussianFisherInformation(uk.ac.sussex.gdsc.smlm.function.PoissonGaussianFisherInformation) ImagePsfHelper(uk.ac.sussex.gdsc.smlm.ij.settings.ImagePsfHelper) UnivariateLikelihoodFisherInformationCalculator(uk.ac.sussex.gdsc.smlm.fitting.UnivariateLikelihoodFisherInformationCalculator) SpatialIllumination(uk.ac.sussex.gdsc.smlm.model.SpatialIllumination) PeakResultsReader(uk.ac.sussex.gdsc.smlm.results.PeakResultsReader) PsfCombiner(uk.ac.sussex.gdsc.smlm.ij.plugins.PsfCombiner) DiffusionType(uk.ac.sussex.gdsc.smlm.model.DiffusionType) Files(java.nio.file.Files) BufferedWriter(java.io.BufferedWriter) FitWorker(uk.ac.sussex.gdsc.smlm.engine.FitWorker) RandomGeneratorAdapter(uk.ac.sussex.gdsc.core.utils.rng.RandomGeneratorAdapter) AtomOrBuilder(uk.ac.sussex.gdsc.smlm.data.config.MoleculeProtos.AtomOrBuilder) IOException(java.io.IOException) SamplerUtils(uk.ac.sussex.gdsc.core.utils.rng.SamplerUtils) DiscreteUniformSampler(org.apache.commons.rng.sampling.distribution.DiscreteUniformSampler) File(java.io.File) SummaryStatistics(org.apache.commons.math3.stat.descriptive.SummaryStatistics) FloatProcessor(ij.process.FloatProcessor) BasePoissonFisherInformation(uk.ac.sussex.gdsc.smlm.function.BasePoissonFisherInformation) Paths(java.nio.file.Paths) AstigmatismZModel(uk.ac.sussex.gdsc.smlm.function.gaussian.AstigmatismZModel) TextFilePeakResults(uk.ac.sussex.gdsc.smlm.results.TextFilePeakResults) EmCcdCameraModel(uk.ac.sussex.gdsc.smlm.model.camera.EmCcdCameraModel) ImageStack(ij.ImageStack) PoissonSampler(org.apache.commons.rng.sampling.distribution.PoissonSampler) CameraModel(uk.ac.sussex.gdsc.smlm.model.camera.CameraModel) ExtendedPeakResult(uk.ac.sussex.gdsc.smlm.results.ExtendedPeakResult) PsfHelper(uk.ac.sussex.gdsc.smlm.data.config.PsfHelper) BufferedReader(java.io.BufferedReader) ImmutableMemoryPeakResults(uk.ac.sussex.gdsc.smlm.results.ImmutableMemoryPeakResults) DoubleEquality(uk.ac.sussex.gdsc.core.utils.DoubleEquality) StandardResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.StandardResultProcedure) SphericalDistribution(uk.ac.sussex.gdsc.smlm.model.SphericalDistribution) TIntArrayList(gnu.trove.list.array.TIntArrayList) GaussianFilter(uk.ac.sussex.gdsc.smlm.filters.GaussianFilter) TextWindow(ij.text.TextWindow) StandardValueProcedure(uk.ac.sussex.gdsc.smlm.function.StandardValueProcedure) ImagePSF(uk.ac.sussex.gdsc.smlm.data.config.PSFProtos.ImagePSF) Formatter(java.util.Formatter) FixedLifetimeImageModel(uk.ac.sussex.gdsc.smlm.model.FixedLifetimeImageModel) StoredDataStatistics(uk.ac.sussex.gdsc.core.utils.StoredDataStatistics) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) PeakResults(uk.ac.sussex.gdsc.smlm.results.PeakResults) DataException(uk.ac.sussex.gdsc.core.data.DataException) PsfCalculator(uk.ac.sussex.gdsc.smlm.ij.plugins.PsfCalculator) EmpiricalDistribution(org.apache.commons.math3.random.EmpiricalDistribution) MathUtils(uk.ac.sussex.gdsc.core.utils.MathUtils) BinomialDiscreteInverseCumulativeProbabilityFunction(uk.ac.sussex.gdsc.core.utils.rng.BinomialDiscreteInverseCumulativeProbabilityFunction) CalibrationWriter(uk.ac.sussex.gdsc.smlm.data.config.CalibrationWriter) Offset(uk.ac.sussex.gdsc.smlm.data.config.PSFProtos.Offset) TextFormat(com.google.protobuf.TextFormat) PsfProtosHelper(uk.ac.sussex.gdsc.smlm.data.config.PsfProtosHelper) SettingsManager(uk.ac.sussex.gdsc.smlm.ij.settings.SettingsManager) ItemEvent(java.awt.event.ItemEvent) CameraType(uk.ac.sussex.gdsc.smlm.data.config.CalibrationProtos.CameraType) SpatialDistribution(uk.ac.sussex.gdsc.smlm.model.SpatialDistribution) ExtendedGenericDialog(uk.ac.sussex.gdsc.core.ij.gui.ExtendedGenericDialog) AstigmatismModelManager(uk.ac.sussex.gdsc.smlm.ij.plugins.AstigmatismModelManager) UniformRealDistribution(org.apache.commons.math3.distribution.UniformRealDistribution) MoleculeModel(uk.ac.sussex.gdsc.smlm.model.MoleculeModel) TIntIntHashMap(gnu.trove.map.hash.TIntIntHashMap) MarsagliaTsangGammaSampler(uk.ac.sussex.gdsc.core.utils.rng.MarsagliaTsangGammaSampler) WidthResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.WidthResultProcedure) Gaussian2DPeakResultHelper(uk.ac.sussex.gdsc.smlm.results.Gaussian2DPeakResultHelper) List(java.util.List) FluorophoreSequenceModel(uk.ac.sussex.gdsc.smlm.model.FluorophoreSequenceModel) BirResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.BirResultProcedure) Entry(java.util.Map.Entry) CompoundMoleculeModel(uk.ac.sussex.gdsc.smlm.model.CompoundMoleculeModel) RealDistribution(org.apache.commons.math3.distribution.RealDistribution) HoltzerAstigmatismZModel(uk.ac.sussex.gdsc.smlm.function.gaussian.HoltzerAstigmatismZModel) ImageModel(uk.ac.sussex.gdsc.smlm.model.ImageModel) MaskDistribution3D(uk.ac.sussex.gdsc.smlm.model.MaskDistribution3D) TypeConverter(uk.ac.sussex.gdsc.core.data.utils.TypeConverter) PrecisionResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.PrecisionResultProcedure) Rectangle(java.awt.Rectangle) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) PSF(uk.ac.sussex.gdsc.smlm.data.config.PSFProtos.PSF) WindowOrganiser(uk.ac.sussex.gdsc.core.ij.plugin.WindowOrganiser) IntensityUnit(uk.ac.sussex.gdsc.smlm.data.config.UnitProtos.IntensityUnit) Mixture(uk.ac.sussex.gdsc.smlm.data.config.MoleculeProtos.Mixture) AtomicReference(java.util.concurrent.atomic.AtomicReference) SobolSequenceGenerator(org.apache.commons.math3.random.SobolSequenceGenerator) MaskDistribution(uk.ac.sussex.gdsc.smlm.model.MaskDistribution) OptionListener(uk.ac.sussex.gdsc.core.ij.gui.ExtendedGenericDialog.OptionListener) OpenDialog(ij.io.OpenDialog) ParameterUtils(uk.ac.sussex.gdsc.smlm.ij.plugins.ParameterUtils) IJImageSource(uk.ac.sussex.gdsc.smlm.ij.IJImageSource) NoiseEstimatorMethod(uk.ac.sussex.gdsc.smlm.data.config.FitProtos.NoiseEstimatorMethod) ReadHint(uk.ac.sussex.gdsc.smlm.results.ImageSource.ReadHint) ExponentialDistribution(org.apache.commons.math3.distribution.ExponentialDistribution) FisherInformationMatrix(uk.ac.sussex.gdsc.smlm.fitting.FisherInformationMatrix) UnitHelper(uk.ac.sussex.gdsc.smlm.data.config.UnitHelper) LinkedList(java.util.LinkedList) CcdCameraModel(uk.ac.sussex.gdsc.smlm.model.camera.CcdCameraModel) FileSaver(ij.io.FileSaver) Statistics(uk.ac.sussex.gdsc.core.utils.Statistics) ExecutorService(java.util.concurrent.ExecutorService) CreateDataSettingsHelper(uk.ac.sussex.gdsc.smlm.ij.settings.CreateDataSettingsHelper) TFloatArrayList(gnu.trove.list.array.TFloatArrayList) FunctionHelper(uk.ac.sussex.gdsc.smlm.function.FunctionHelper) UniformRandomProvider(org.apache.commons.rng.UniformRandomProvider) PoissonSamplerCache(org.apache.commons.rng.sampling.distribution.PoissonSamplerCache) AstigmatismModel(uk.ac.sussex.gdsc.smlm.data.config.PSFProtos.AstigmatismModel) ConversionException(uk.ac.sussex.gdsc.core.data.utils.ConversionException) SplitMix64(org.apache.commons.rng.core.source64.SplitMix64) Checkbox(java.awt.Checkbox) ActivationEnergyImageModel(uk.ac.sussex.gdsc.smlm.model.ActivationEnergyImageModel) LoadLocalisationsSettings(uk.ac.sussex.gdsc.smlm.ij.settings.GUIProtos.LoadLocalisationsSettings) FileInputStream(java.io.FileInputStream) Ticker(uk.ac.sussex.gdsc.core.logging.Ticker) PsfModelGradient1Function(uk.ac.sussex.gdsc.smlm.model.PsfModelGradient1Function) InterpolatedPoissonFisherInformation(uk.ac.sussex.gdsc.smlm.function.InterpolatedPoissonFisherInformation) Consumer(java.util.function.Consumer) CameraModelManager(uk.ac.sussex.gdsc.smlm.ij.plugins.CameraModelManager) LocalisationModel(uk.ac.sussex.gdsc.smlm.model.LocalisationModel) ImageJUtils(uk.ac.sussex.gdsc.core.ij.ImageJUtils) UniformIllumination(uk.ac.sussex.gdsc.smlm.model.UniformIllumination) SynchronizedPeakResults(uk.ac.sussex.gdsc.smlm.results.SynchronizedPeakResults) IJ(ij.IJ) NullArgumentException(org.apache.commons.math3.exception.NullArgumentException) SmlmUsageTracker(uk.ac.sussex.gdsc.smlm.ij.plugins.SmlmUsageTracker) InverseTransformDiscreteSampler(org.apache.commons.rng.sampling.distribution.InverseTransformDiscreteSampler) Comparator(java.util.Comparator) Collections(java.util.Collections) NormalizedGaussianSampler(org.apache.commons.rng.sampling.distribution.NormalizedGaussianSampler) LocalList(uk.ac.sussex.gdsc.core.utils.LocalList) UniformRandomProviders(uk.ac.sussex.gdsc.core.utils.rng.UniformRandomProviders) Rectangle(java.awt.Rectangle) HistogramPlotBuilder(uk.ac.sussex.gdsc.core.ij.HistogramPlot.HistogramPlotBuilder) MemoryPeakResults(uk.ac.sussex.gdsc.smlm.results.MemoryPeakResults) ImmutableMemoryPeakResults(uk.ac.sussex.gdsc.smlm.results.ImmutableMemoryPeakResults) Ticker(uk.ac.sussex.gdsc.core.logging.Ticker) FrameCounter(uk.ac.sussex.gdsc.smlm.results.count.FrameCounter) StoredDataStatistics(uk.ac.sussex.gdsc.core.utils.StoredDataStatistics) WidthResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.WidthResultProcedure) WindowOrganiser(uk.ac.sussex.gdsc.core.ij.plugin.WindowOrganiser) PrecisionResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.PrecisionResultProcedure) SummaryStatistics(org.apache.commons.math3.stat.descriptive.SummaryStatistics) StoredDataStatistics(uk.ac.sussex.gdsc.core.utils.StoredDataStatistics) Statistics(uk.ac.sussex.gdsc.core.utils.Statistics) ImagePlus(ij.ImagePlus) ReadHint(uk.ac.sussex.gdsc.smlm.results.ImageSource.ReadHint) LinkedList(java.util.LinkedList) TFloatArrayList(gnu.trove.list.array.TFloatArrayList) DataException(uk.ac.sussex.gdsc.core.data.DataException) LocalisationModel(uk.ac.sussex.gdsc.smlm.model.LocalisationModel) FluorophoreSequenceModel(uk.ac.sussex.gdsc.smlm.model.FluorophoreSequenceModel) ExecutorService(java.util.concurrent.ExecutorService) Future(java.util.concurrent.Future) StandardResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.StandardResultProcedure)

Example 2 with DataException

use of uk.ac.sussex.gdsc.core.data.DataException in project GDSC-SMLM by aherbert.

the class UnivariateLikelihoodFisherInformationCalculator method compute.

/**
 * {@inheritDoc}
 *
 * @throws DataException If the Fisher information cannot be computed for a function value
 * @throws DataException If the Fisher information is infinite for a function value
 */
@Override
public FisherInformationMatrix compute(double[] parameters) {
    final int n = gf.getNumberOfGradients();
    final double[] data = new double[n * (n + 1) / 2];
    gf.initialise1(parameters);
    gf.forEach(new Gradient1Procedure() {

        // CHECKSTYLE.OFF: MemberName
        int k = -1;

        // CHECKSTYLE.ON: MemberName
        @Override
        public void execute(double value, double[] dvDt) {
            k++;
            if (!fi[k].isValid(value)) {
                return;
            }
            // Get the Fisher information of the value
            final double f = fi[k].getFisherInformation(value);
            if (f == 0) {
                // No summation
                return;
            }
            if (f == Double.POSITIVE_INFINITY) {
                throw new DataException("Fisher information is infinite at f(" + k + ")");
            }
            // Compute the actual matrix data
            for (int i = 0, c = 0; i < n; i++) {
                final double wgt = f * dvDt[i];
                for (int j = 0; j <= i; j++) {
                    data[c++] += wgt * dvDt[j];
                }
            }
        }
    });
    // Generate symmetric matrix
    final double[] matrix = new double[n * n];
    for (int i = 0, c = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            matrix[i * n + j] = matrix[j * n + i] = data[c++];
        }
    }
    return new FisherInformationMatrix(matrix, n);
}
Also used : DataException(uk.ac.sussex.gdsc.core.data.DataException) Gradient1Procedure(uk.ac.sussex.gdsc.smlm.function.Gradient1Procedure)

Example 3 with DataException

use of uk.ac.sussex.gdsc.core.data.DataException in project GDSC-SMLM by aherbert.

the class Fire method canCalculatePrecision.

private boolean canCalculatePrecision(MemoryPeakResults results) {
    try {
        pp = new PrecisionResultProcedure(results);
        pp.getLsePrecision();
    } catch (final DataException ex) {
        return false;
    }
    // Check they are different
    for (int i = 0; i < pp.size(); i++) {
        // Check this is valid
        if (Double.isFinite(pp.precisions[i])) {
            final double p1 = pp.precisions[i];
            for (int j = i + 1; j < pp.size(); j++) {
                if (Double.isFinite(pp.precisions[j]) && pp.precisions[j] != p1) {
                    return true;
                }
            }
            // All the results are the same, this is not valid
            break;
        }
    }
    return false;
}
Also used : DataException(uk.ac.sussex.gdsc.core.data.DataException) PrecisionResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.PrecisionResultProcedure) WeightedObservedPoint(org.apache.commons.math3.fitting.WeightedObservedPoint)

Example 4 with DataException

use of uk.ac.sussex.gdsc.core.data.DataException in project GDSC-SMLM by aherbert.

the class ImageJ3DResultsViewer method createSphereSizeFromPrecision.

@Nullable
private static Point3f[] createSphereSizeFromPrecision(MemoryPeakResults results) {
    final PrecisionResultProcedure p = new PrecisionResultProcedure(results);
    try {
        final PrecisionMethod m = p.getPrecision();
        IJ.log("Using precision method " + FitProtosHelper.getName(m));
        final Point3f[] size = new Point3f[results.size()];
        for (int i = 0, j = 0; i < p.precisions.length; i++) {
            // Precision is in NM which matches the rendering
            final float v = (float) p.precisions[i];
            size[j++] = new Point3f(v, v, v);
        }
        return size;
    } catch (final DataException ex) {
        IJ.error(TITLE, "The results have no precision: " + ex.getMessage());
        return null;
    }
}
Also used : DataException(uk.ac.sussex.gdsc.core.data.DataException) Point3f(org.scijava.vecmath.Point3f) PrecisionResultProcedure(uk.ac.sussex.gdsc.smlm.results.procedures.PrecisionResultProcedure) PrecisionMethod(uk.ac.sussex.gdsc.smlm.data.config.FitProtos.PrecisionMethod) Nullable(uk.ac.sussex.gdsc.core.annotation.Nullable)

Example 5 with DataException

use of uk.ac.sussex.gdsc.core.data.DataException in project GDSC-SMLM by aherbert.

the class TsfPeakResultsReader method readHeader.

/**
 * Read the TSF header.
 *
 * @return the spot list header
 */
public SpotList readHeader() {
    if (readHeader) {
        return spotList;
    }
    readHeader = true;
    try (FileInputStream fi = new FileInputStream(filename);
        DataInputStream di = new DataInputStream(fi)) {
        // The file has an initial 0, then the offset (as long)
        // to the position of spotList.
        final int magic = di.readInt();
        // Throw exceptions which are caught below
        if (magic != 0) {
            throw new DataException("Magic number is not 0 (required for a TSF file)");
        }
        final long offset = di.readLong();
        if (offset < 0) {
            throw new DataException("Offset < 0, cannot find header data in this file");
        }
        if (fi.skip(offset) != offset) {
            throw new DataException("Failed to skip to the spot list offset");
        }
        spotList = SpotList.parseDelimitedFrom(fi);
        // We can do special processing for a TSF file we created
        isGdsc = (spotList.getApplicationId() == TsfPeakResultsWriter.APPLICATION_ID);
        isMulti = isMulti(spotList);
    } catch (final Exception ex) {
        logger.warning(() -> "Failed to read SpotList message: " + ex.getMessage());
    }
    return spotList;
}
Also used : DataException(uk.ac.sussex.gdsc.core.data.DataException) DataInputStream(java.io.DataInputStream) FileInputStream(java.io.FileInputStream) DataException(uk.ac.sussex.gdsc.core.data.DataException) InvalidProtocolBufferException(com.google.protobuf.InvalidProtocolBufferException) IOException(java.io.IOException)

Aggregations

DataException (uk.ac.sussex.gdsc.core.data.DataException)15 PrecisionResultProcedure (uk.ac.sussex.gdsc.smlm.results.procedures.PrecisionResultProcedure)6 ExtendedGenericDialog (uk.ac.sussex.gdsc.core.ij.gui.ExtendedGenericDialog)5 Rectangle (java.awt.Rectangle)4 PeakResult (uk.ac.sussex.gdsc.smlm.results.PeakResult)4 GenericDialog (ij.gui.GenericDialog)3 BigDecimal (java.math.BigDecimal)3 ArrayList (java.util.ArrayList)3 UniformRandomProvider (org.apache.commons.rng.UniformRandomProvider)3 TDoubleArrayList (gnu.trove.list.array.TDoubleArrayList)2 IJ (ij.IJ)2 ImageStack (ij.ImageStack)2 PlugIn (ij.plugin.PlugIn)2 ImageProcessor (ij.process.ImageProcessor)2 FileInputStream (java.io.FileInputStream)2 IOException (java.io.IOException)2 MathContext (java.math.MathContext)2 TypeConverter (uk.ac.sussex.gdsc.core.data.utils.TypeConverter)2 WindowOrganiser (uk.ac.sussex.gdsc.core.ij.plugin.WindowOrganiser)2 LocalList (uk.ac.sussex.gdsc.core.utils.LocalList)2