Changeset 7830 for trunk


Ignore:
Timestamp:
12/12/11 18:18:57 (8 years ago)
Author:
aivar
Message:

Can now display selection of fitted images; buggy.

Location:
trunk/projects/slim-plugin/src/main/java
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/projects/slim-plugin/src/main/java/imagej/slim/fitting/AbstractBaseFittedImage.java

    r7829 r7830  
    77 
    88import ij.process.MyFloatProcessor; //TODO IJ hack; update to IJ2 ImgLib 
     9import ij.ImagePlus; 
    910 
    1011import imagej.slim.histogram.HistogramData; 
     
    2021    private HistogramData _histogramData; 
    2122    private MyFloatProcessor _image; 
     23    private ImagePlus _imagePlus; 
    2224     
    2325    public AbstractBaseFittedImage(String title, int[] dimension) { 
     
    3032        _histogramData = new HistogramData(title, histogramDataChannels); 
    3133        _image = new MyFloatProcessor(x, y); 
     34        _imagePlus = new ImagePlus(title, _image); 
     35        _imagePlus.show(); 
    3236    } 
    3337 
     
    6165     */ 
    6266    public void endFit() { 
    63  
     67    } 
     68     
     69    /** 
     70     * Cancels a fit. 
     71     */ 
     72    public void cancelFit() { 
     73       _imagePlus.close(); 
     74       _imagePlus.hide(); 
    6475    } 
    6576 
     
    6980     */ 
    7081    public void recalcHistogram() { 
    71         _histogramData.getMinMax(); //TODO how about HistogramData.recalculate? 
     82        double[] minMax = _histogramData.getMinMax(); //TODO how about HistogramData.recalculate? 
     83//        System.out.println("min max " + minMax[0] + " " + minMax[1]); 
    7284        // etc. 
     85        _imagePlus.setProcessor(_image.duplicate()); 
    7386    } 
    7487     
  • trunk/projects/slim-plugin/src/main/java/imagej/slim/fitting/FLIMFittedImageFactory.java

    r7829 r7830  
    7373                break; 
    7474        } 
    75         return null; 
     75        return fittedImage; 
    7676    } 
    7777} 
  • trunk/projects/slim-plugin/src/main/java/imagej/slim/fitting/FLIMImageFitter.java

    r7829 r7830  
    5757    public void endFit() { 
    5858        for (IFittedImage fittedImage : _fittedImages) { 
    59             fittedImage.beginFit(); 
     59            fittedImage.endFit(); 
    6060        } 
    6161 
     62    } 
     63 
     64    /** 
     65     * Cancels a fit. 
     66     */ 
     67    public void cancelFit() { 
     68        for (IFittedImage fittedImage : _fittedImages) { 
     69            fittedImage.cancelFit(); 
     70        } 
    6271    } 
    6372 
  • trunk/projects/slim-plugin/src/main/java/imagej/slim/fitting/IFittedImage.java

    r7829 r7830  
    2929     */ 
    3030    public void endFit(); 
     31     
     32    /** 
     33     * Cancels a fit 
     34     */ 
     35    public void cancelFit(); 
    3136 
    3237    /** 
  • trunk/projects/slim-plugin/src/main/java/loci/slim/SLIMProcessor.java

    r7821 r7830  
    9191import imagej.slim.fitting.params.IFitResults; 
    9292import imagej.slim.fitting.config.Configuration; 
     93import imagej.slim.fitting.FLIMImageFitter; 
     94import imagej.slim.fitting.FLIMImageFitter.OutputImage; 
    9395 
    9496 
     
    960962        } 
    961963    } 
     964     
     965    //TODO This is the new version and "fitEachPixelX" is the old: 
     966    private Image<DoubleType> fitEachPixel(IUserInterfacePanel uiPanel) { 
     967        long start = System.nanoTime(); 
     968        int pixelCount = 0; 
     969        int totalPixelCount = totalPixelCount(m_width, m_height, m_channels, m_fitAllChannels); 
     970        int pixelsToProcessCount = 0; 
     971 
     972        Image<T> workImage = m_image; 
     973        if (!SLIMBinning.NONE.equals(uiPanel.getBinning())) { 
     974            workImage = m_binning.doBinning(uiPanel.getBinning(),  m_image); 
     975        } 
     976        LocalizableByDimCursor<T> pixelCursor = workImage.createLocalizableByDimCursor(); 
     977 
     978        ICurveFitter curveFitter = getCurveFitter(uiPanel); //TODO where is this used? 
     979        double params[] = uiPanel.getParameters(); 
     980 
     981        boolean useFittedParams; 
     982        LocalizableByDimCursor<DoubleType> resultsCursor = null; 
     983        if (null == m_fittedImage || uiPanel.getParameterCount() != m_fittedParameterCount) { 
     984            // can't use previous results 
     985            useFittedParams = false; 
     986            m_fittedParameterCount = uiPanel.getParameterCount(); 
     987            m_fittedImage = makeImage(m_channels, m_width, m_height, m_fittedParameterCount); 
     988        } 
     989        else { 
     990            // ask UI whether to use previous results 
     991            useFittedParams = uiPanel.refineFit(); 
     992        } 
     993        resultsCursor = m_fittedImage.createLocalizableByDimCursor(); 
     994         
     995        // build the data 
     996        ArrayList<ICurveFitData> curveFitDataList = new ArrayList<ICurveFitData>(); 
     997        ArrayList<ChunkyPixel> pixelList = new ArrayList<ChunkyPixel>(); 
     998        ICurveFitData curveFitData; 
     999        double yCount[]; 
     1000        double yFitted[]; 
     1001 
     1002        ChunkyPixelEffectIterator pixelIterator = new ChunkyPixelEffectIterator(new ChunkyPixelTableImpl(), m_width, m_height); 
     1003         
     1004        //TODO new style code starts only here: 
     1005        FLIMImageFitter imageFitter = new FLIMImageFitter(); 
     1006        OutputImage[] outputImages = { OutputImage.A1, OutputImage.T1, OutputImage.CHISQ }; 
     1007        imageFitter.setUpFit(outputImages, new int[] { m_width, m_height }, 1); 
     1008        imageFitter.beginFit();        
     1009 
     1010        while (!m_cancel && pixelIterator.hasNext()) { 
     1011            IJ.showProgress(++pixelCount, totalPixelCount); 
     1012            ChunkyPixel pixel = pixelIterator.next(); 
     1013            if (wantFitted(m_channel, pixel.getX(), pixel.getY())) { 
     1014                curveFitData = new CurveFitData(); 
     1015                curveFitData.setChannel(m_channel); 
     1016                curveFitData.setX(pixel.getX()); 
     1017                curveFitData.setY(pixel.getY()); 
     1018                curveFitData.setParams( 
     1019                    useFittedParams ? 
     1020                        getFittedParams(resultsCursor, m_channel, pixel.getX(), pixel.getY(), m_fittedParameterCount) : 
     1021                            params.clone()); 
     1022                yCount = new double[m_timeBins]; 
     1023                for (int b = 0; b < m_timeBins; ++b) { 
     1024                    yCount[b] = getData(pixelCursor, m_channel, pixel.getX(), pixel.getY(), b); //binnedData[m_channel][pixel.getY()][pixel.getX()][b]; 
     1025                } 
     1026                curveFitData.setYCount(yCount); 
     1027                yFitted = new double[m_timeBins]; 
     1028                curveFitData.setYFitted(yFitted); 
     1029                curveFitDataList.add(curveFitData); 
     1030                pixelList.add(pixel); 
     1031 
     1032                // process the pixels 
     1033                if (++pixelsToProcessCount >= PIXEL_COUNT || !pixelIterator.hasNext()) { 
     1034                    ICurveFitData[] data = curveFitDataList.toArray(new ICurveFitData[0]); 
     1035                    curveFitDataList.clear(); 
     1036                             
     1037                    if (null == _fittingEngine) { 
     1038                        _fittingEngine = Configuration.getInstance().getFittingEngine(); 
     1039                        _fittingEngine.setThreads(Configuration.getInstance().getThreads()); 
     1040                        _fittingEngine.setCurveFitter(Configuration.getInstance().getCurveFitter()); 
     1041                    }                                    
     1042                             
     1043                    IGlobalFitParams globalFitParams = new GlobalFitParams(); 
     1044                    globalFitParams.setFitAlgorithm(loci.curvefitter.ICurveFitter.FitAlgorithm.RLD_LMA); 
     1045                    globalFitParams.setFitFunction(loci.curvefitter.ICurveFitter.FitFunction.SINGLE_EXPONENTIAL); 
     1046                    globalFitParams.setXInc(m_timeRange); 
     1047                    globalFitParams.setPrompt(null); 
     1048                    if (null != m_excitationPanel) { 
     1049                        globalFitParams.setPrompt(m_excitationPanel.getValues(1)); 
     1050                    } 
     1051                    globalFitParams.setChiSquareTarget(data[0].getChiSquareTarget()); 
     1052                    globalFitParams.setFree(translateFree(uiPanel.getFunction(), uiPanel.getFree())); 
     1053                             
     1054                    java.util.List<ILocalFitParams> dataList = new ArrayList<ILocalFitParams>(); 
     1055                             
     1056                    for (ICurveFitData datum : data) { 
     1057                        ILocalFitParams localFitParams = new LocalFitParams(); 
     1058                        localFitParams.setY(datum.getYCount()); 
     1059                        localFitParams.setSig(datum.getSig()); 
     1060                        localFitParams.setParams(datum.getParams()); 
     1061                        localFitParams.setFitStart(m_startBin); 
     1062                        localFitParams.setFitStop(m_stopBin); 
     1063                        localFitParams.setYFitted(datum.getYFitted()); 
     1064                        dataList.add(localFitParams); 
     1065                    } 
     1066                             
     1067                    java.util.List<IFitResults> results = _fittingEngine.fit(globalFitParams, dataList); 
     1068                     
     1069                    for (int i = 0; i < results.size(); ++i) { 
     1070                        IFitResults result = results.get(i); 
     1071                        ChunkyPixel p = pixelList.get(i); 
     1072                        int[] location = { p.getX(), p.getY() }; 
     1073                        imageFitter.updatePixel(location, result.getParams()); 
     1074                    } 
     1075                 
     1076                    imageFitter.recalcHistogram(); 
     1077                     
     1078                    // done with these pixels 
     1079                    pixelsToProcessCount = 0; 
     1080                    pixelList.clear(); 
     1081                } 
     1082            } 
     1083        } 
     1084         
     1085        if (m_cancel) { 
     1086            IJ.showProgress(0, 0); 
     1087            cancelImageFit(); 
     1088            imageFitter.cancelFit(); 
     1089            return null; 
     1090        } 
     1091        imageFitter.endFit(); 
     1092         
     1093        //TODO so the results are not getting saved to an Imglib Image 
     1094        //TODO this technique of building an array of ICurveFitData, then breaking that down into 
     1095        // IGlobalFitParams and ILocalFitParams seems over-complicated 
     1096         
     1097        return null; 
     1098    } 
    9621099  
    9631100    /* 
     
    9681105     * Results of the fit go to VisAD for analysis. 
    9691106     */ 
    970     private Image<DoubleType> fitEachPixel(IUserInterfacePanel uiPanel) { 
     1107    private Image<DoubleType> fitEachPixelX(IUserInterfacePanel uiPanel) { 
    9711108        long start = System.nanoTime(); 
    9721109        int pixelCount = 0; 
Note: See TracChangeset for help on using the changeset viewer.