Changeset 7996


Ignore:
Timestamp:
05/03/12 19:10:47 (8 years ago)
Author:
aivar
Message:

SLIM Plugin: Fixes Trac #686 log and linear scales and #687 show photon count. Also #689 masking is partially working.

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

Legend:

Unmodified
Added
Removed
  • trunk/projects/slim-plugin/src/main/java/loci/slim/SLIMProcessor.java

    r7994 r7996  
    6868import loci.slim.process.IProcessor; 
    6969import loci.slim.process.Threshold; 
     70import loci.slim.ui.DecayGraph; 
    7071import loci.slim.ui.ExcitationPanel; 
     72import loci.slim.ui.IDecayGraph; 
    7173import loci.slim.ui.IUserInterfacePanel; 
    7274import loci.slim.ui.IUserInterfacePanelListener; 
     
    10811083        double yCount[]; 
    10821084        double yFitted[]; 
     1085        int photons = 0; 
    10831086 
    10841087        // loop over all channels or just the current one 
     
    10921095 
    10931096            // count photons and pixels 
    1094             int photons = 0; 
    10951097            int pixels = 0; 
    10961098 
     
    11321134            title += " Channel " + (_channel + 1); 
    11331135        } 
    1134         showDecayGraph(title, uiPanel, _fittingCursor, dataArray[visibleChannel]); 
     1136        showDecayGraph(title, uiPanel, _fittingCursor, 
     1137                dataArray[visibleChannel], photons); 
    11351138        uiPanel.setParameters(dataArray[visibleChannel].getParams()); 
    11361139 
     
    11561159        double yCount[]; 
    11571160        double yFitted[]; 
     1161        int[] photons = new int[getRois().length]; 
     1162        for (int i = 0; i < photons.length; ++i) { 
     1163            photons[i] = 0; 
     1164        } 
    11581165 
    11591166        // loop over all channels or just the current one 
     
    11741181                            ++pixels; 
    11751182                            for (int b = 0; b < _bins; ++b) { 
    1176                                 yCount[b] += getData(_cursor, channel, x, y, b); 
     1183                                double count = getData(_cursor, channel, x, y, b); 
     1184                                yCount[b] += count; 
     1185                                photons[roiNumber - 1] += count; 
    11771186                            } 
    11781187                        } 
     
    12151224                title += " Channel " + (_channel + 1); 
    12161225            } 
    1217             showDecayGraph(title, uiPanel, _fittingCursor, dataArray[dataIndex]); 
     1226            showDecayGraph(title, uiPanel, _fittingCursor, 
     1227                    dataArray[dataIndex], photons[roiNumber - 1]); 
    12181228            double lifetime = dataArray[dataIndex].getParams()[3]; 
    12191229            if (lifetime < min) { 
     
    13051315        double yCount[]; 
    13061316        double yFitted[]; 
     1317        int photons = 0; 
    13071318 
    13081319        // loop over all channels or just the current one 
     
    13131324            location[2] = channel; 
    13141325            yCount = processor.getPixel(location); 
    1315             int photons = 0; 
    13161326            for (int c = 0; c < _bins; ++c) { 
    13171327                photons += yCount[c]; 
     
    13541364            visibleChannel = _channel; 
    13551365        } 
    1356         showDecayGraph(title, uiPanel, _fittingCursor, dataArray[visibleChannel]); 
     1366        showDecayGraph(title, uiPanel, _fittingCursor, 
     1367                dataArray[visibleChannel], photons); 
    13571368 
    13581369        // update UI parameters 
     
    17491760            final IUserInterfacePanel uiPanel, 
    17501761            final FittingCursor fittingCursor, 
    1751             final ICurveFitData data) 
     1762            final ICurveFitData data, 
     1763            int photons) 
    17521764    { 
    1753         loci.slim.ui.IDecayGraph decayGraph = loci.slim.ui.DecayGraph.getInstance(); 
     1765        IDecayGraph decayGraph = DecayGraph.getInstance(); 
    17541766        JFrame frame = decayGraph.init(uiPanel.getFrame(), _bins, _timeRange); 
    17551767        decayGraph.setTitle(title); 
     
    17601772        decayGraph.setStartStop(transStart, dataStart, transStop); 
    17611773        decayGraph.setData(data); 
     1774        decayGraph.setPhotons(photons); 
    17621775    } 
    17631776     
  • trunk/projects/slim-plugin/src/main/java/loci/slim/fitting/images/AbstractBaseFittedImage.java

    r7994 r7996  
    7777    private HistogramDataGroup _histogramData; 
    7878    private IColorizedFittedImage _fittedImage; 
     79    private Mask _mask; 
    7980     
    8081    public AbstractBaseFittedImage( 
     
    108109            clear(_values); 
    109110            HistogramDataNode histogramDataChannel 
    110                     = new HistogramDataNode(_values); 
     111                    = new HistogramDataNode(this, _values); 
    111112            dataChannelList.add(histogramDataChannel); 
    112113             
     
    227228        redisplay(minMaxLUT); 
    228229    } 
     230     
     231    public void redraw(Mask mask) { 
     232        if (mask != _mask) { 
     233            _mask = mask; 
     234             
     235            if (_histogramData.getAutoRange()) { 
     236                double[] minMaxLUT = _histogramData.getMinMaxLUT(); //TODO too much repeated code from "redisplay()" 
     237                minMaxLUT = PaletteFix.adjustMinMax(minMaxLUT[0], minMaxLUT[1]); 
     238                if (_colorizeGrayScale) { 
     239                    // redraw all images with new LUT 
     240                    for (IColorizedFittedImage fittedImage : _fittedImages) { 
     241                        fittedImage.setMinAndMax(minMaxLUT[0], minMaxLUT[1]); //TODO we are redrawing all images anyway, then the current one again below... 
     242                    } 
     243                } 
     244                else { 
     245                    // when using a FloatProcessor the LUT belongs to entire stack 
     246                    _fittedImage.setMinAndMax(minMaxLUT[0], minMaxLUT[1]); 
     247                } 
     248            } 
     249 
     250            for (int y = 0; y < _values[0].length; ++y) { 
     251                for (int x = 0; x < _values.length; ++x) { 
     252                    double value = Double.NaN; 
     253                    if (null == mask || mask.test(x, y)) { 
     254                        value = _values[x][y]; 
     255                    } 
     256                    _fittedImage.draw(x, y, value); 
     257                } 
     258            } 
     259 
     260            //TODO 
     261            System.out.println("imagePlus.setProcessor etc."); 
     262            _imagePlus.setProcessor(_fittedImage.getImageProcessor().duplicate());  
     263        } 
     264    } 
    229265 
    230266    //TODO MASK 
  • trunk/projects/slim-plugin/src/main/java/loci/slim/fitting/images/IFittedImage.java

    r7994 r7996  
    3838 
    3939import loci.slim.histogram.HistogramDataGroup; 
     40import loci.slim.mask.Mask; 
    4041 
    4142/** 
     
    106107 
    107108    /** 
    108      * Redisplays the image. 
     109     * Redisplays the image after a LUT change. 
    109110     */ 
    110111    public void redisplay(); 
     112     
     113    /** 
     114     * Redisplays the image after masking. 
     115     *  
     116     * @param mask 
     117     */ 
     118    public void redraw(Mask mask); 
    111119 
    112120    /** 
  • trunk/projects/slim-plugin/src/main/java/loci/slim/histogram/HistogramDataNode.java

    r7994 r7996  
    3535package loci.slim.histogram; 
    3636 
     37import loci.slim.fitting.images.IFittedImage; 
    3738import loci.slim.mask.IMaskGroup; 
    3839import loci.slim.mask.IMaskNode; 
     
    4950 */ 
    5051public class HistogramDataNode { 
     52    private IFittedImage _fittedImage; 
    5153    private double[][] _values; 
    5254    private IMaskNode _maskNode; 
     
    6567     * will be incorrect. 
    6668     *  
     69     * @param fittedImage 
    6770     * @param values  
    6871     */ 
    69     public HistogramDataNode(double[][] values) { 
     72    public HistogramDataNode(IFittedImage fittedImage, double[][] values) { 
     73        _fittedImage = fittedImage; 
    7074        _values = values; 
    7175    } 
    72      
     76 
     77    /** 
     78     * Assigns a mask group. 
     79     *  
     80     * @param maskGroup  
     81     */ 
    7382    public void setMaskGroup(IMaskGroup maskGroup) { 
     83        // create a new mask node that listens to the group 
    7484        _maskNode = new MaskNode(maskGroup, new IMaskNodeListener () { 
    7585            public void updateMask(Mask mask) { 
    7686                System.out.println("HistogramDataNode.setMaskGroup IMaskNodeListener.updateMask " + mask); 
     87                if (null != mask) { 
     88                    boolean[][] bits = mask.getBits(); 
     89                    if (null != bits) { 
     90                        System.out.println("mask excludes " + countBits(bits)); 
     91                    } 
     92                } 
    7793                setOtherMask(mask); 
    7894                //TODO redraw, here or in setOtherMask() 
     95                _fittedImage.redraw(mask); 
    7996            } 
    8097        }); 
     
    111128        _otherMask = mask; 
    112129        if (null == _selfMask) { 
     130            // no self, so total mask is just other 
    113131            _totalMask = mask; 
    114132        } 
    115133        else { 
     134            // total mask is self plus other 
    116135            _totalMask = _selfMask.add(mask); 
    117136        } 
     
    145164        } 
    146165 
    147         System.out.println("I am " + this + " setSelfMask, total mask excludes " + countBits(_totalMask.getBits())); 
     166        System.out.print("I am " + this); 
     167        if (null != _totalMask) System.out.print(" setSelfMask, total mask excludes " + countBits(_totalMask.getBits())); 
     168        System.out.println(); 
    148169    } 
    149170     
  • trunk/projects/slim-plugin/src/main/java/loci/slim/mask/MaskGroup.java

    r7994 r7996  
    6868    @Override 
    6969    public void updateMask(IMaskNode node, Mask mask) { 
     70        checkMask("incoming", mask); 
    7071        // update map with given mask 
    7172        _maskMap.put(node, mask); 
    7273 
    73         // combine maska and notify other nodes 
    74         for (IMaskNode otherNode : _nodeList) { 
    75             System.out.println("MaskGroup.updateMask, consider " + otherNode); 
     74        // combine masks and notify other nodes 
     75        for (IMaskNode peerNode : _nodeList) { 
     76            System.out.println("MaskGroup.updateMask, consider " + peerNode); 
    7677            // don't notify the caller 
    77             if (otherNode != node) { 
     78            if (peerNode != node) { 
    7879                // don't combine the recipients mask 
    79                 Mask combinedMask = Mask.addOtherMasks(mask, _maskMap.values()); 
     80                Mask peerMask = _maskMap.get(peerNode); 
     81                Mask combinedMask = Mask.addOtherMasks(peerMask, _maskMap.values()); 
     82                checkMask("combined", combinedMask); 
    8083                System.out.println("MaskGroup.updateMask, notify " + combinedMask); 
    81                 otherNode.updateOtherMask(combinedMask); 
     84                peerNode.updateOtherMask(combinedMask); 
    8285            } 
     86            else System.out.println("MaskGroup.updateMask, originating node " + node + " skipped"); 
    8387        } 
    8488 
    8589 
    8690    } 
     91     
     92    private void checkMask(String title, Mask mask) { 
     93        int trues = 0; 
     94        int falses = 0; 
     95        if (null == mask) { 
     96            System.out.println("Mask is null"); 
     97            return; 
     98        } 
     99        boolean[][] bits = mask.getBits(); 
     100        if (null == bits) { 
     101            System.out.println("mask has null bits"); 
     102            return; 
     103        } 
     104        for (int y = 0; y < bits[0].length; ++y) { 
     105            for (int x = 0; x < bits.length; ++x) { 
     106                if (bits[x][y]) { 
     107                    ++trues; 
     108                } 
     109                else { 
     110                    ++falses; 
     111                } 
     112            } 
     113        } 
     114        System.out.println(title + " mask has " + trues + " trues " + falses + " falses"); 
     115    } 
    87116} 
  • trunk/projects/slim-plugin/src/main/java/loci/slim/ui/DecayGraph.java

    r7992 r7996  
    3838import java.awt.BasicStroke; 
    3939import java.awt.Color; 
     40import java.awt.Container; 
    4041import java.awt.Dimension; 
    4142import java.awt.Graphics2D; 
     43import java.awt.event.ItemEvent; 
     44import java.awt.event.ItemListener; 
    4245import java.awt.event.MouseEvent; 
    4346import java.awt.geom.Ellipse2D; 
    4447import java.awt.geom.Rectangle2D; 
    45  
     48import java.awt.BorderLayout; 
     49import java.awt.FlowLayout; 
     50import javax.swing.BoxLayout; 
     51 
     52 
     53import javax.swing.JCheckBox; 
    4654import javax.swing.JComponent; 
    4755import javax.swing.JFrame; 
     56import javax.swing.JLabel; 
     57import javax.swing.JPanel; 
     58import javax.swing.JTextField; 
    4859import javax.swing.SwingUtilities; 
    4960 
     
    114125    XYSeriesCollection _residualDataset; 
    115126 
    116     JFreeChart m_decayChart; 
    117     JFreeChart m_residualsChart; 
     127    JTextField _photonTextField; 
     128    JCheckBox _logCheckBox; 
    118129 
    119130    /** 
     
    179190            // create a frame for the chart 
    180191            _frame = new JFrame(); 
    181             _frame.getContentPane().add(layer); 
     192            Container container = _frame.getContentPane(); 
     193            container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS)); 
     194            container.add(layer); 
     195             
     196            JPanel miscPane = new JPanel(); 
     197            miscPane.setLayout(new FlowLayout()); 
     198            JLabel label = new JLabel("Photon count:"); 
     199            miscPane.add(label); 
     200            _photonTextField = new JTextField(7); 
     201            _photonTextField.setEditable(false); 
     202            miscPane.add(_photonTextField); 
     203            _logCheckBox = new JCheckBox("Logarithmic"); 
     204            _logCheckBox.setSelected(_logarithmic); 
     205            _logCheckBox.addItemListener(new ItemListener() { 
     206                public void itemStateChanged(ItemEvent e) { 
     207                    _logarithmic = _logCheckBox.isSelected(); 
     208                    NumberAxis photonAxis; 
     209                    if (_logarithmic) { 
     210                        photonAxis = new LogarithmicAxis(PHOTON_AXIS_LABEL); 
     211                    } 
     212                    else { 
     213                        photonAxis = new NumberAxis(PHOTON_AXIS_LABEL); 
     214                    } 
     215                    _decaySubPlot.setRangeAxis(photonAxis); 
     216                } 
     217            }); 
     218            miscPane.add(_logCheckBox); 
     219            container.add(miscPane); 
     220 
    182221            _frame.setSize(FRAME_SIZE); 
    183222            _frame.pack(); 
     
    223262        createDatasets(_bins, _timeInc, data); 
    224263 
     264    } 
     265 
     266    /** 
     267     * Sets the displayed photon count. 
     268     *  
     269     * @param photons  
     270     */ 
     271    public void setPhotons(int photons) { 
     272        _photonTextField.setText("" + photons); 
     273    } 
     274 
     275    /* 
     276     * Sets whether vertical axis should be logarithmic. 
     277     *  
     278     * @param logarithmic 
     279     */ 
     280    public void setLogarithmic(boolean logarithmic) { 
     281        _logarithmic = logarithmic; 
    225282    } 
    226283 
  • trunk/projects/slim-plugin/src/main/java/loci/slim/ui/IDecayGraph.java

    r7930 r7996  
    7575     
    7676    /** 
     77     * Sets number of photons in fit. 
     78     *  
     79     * @param photons 
     80     */ 
     81    public void setPhotons(int photons); 
     82     
     83    /** 
    7784     * Changes (or initializes) the start and stop vertical bars. 
    7885     * 
Note: See TracChangeset for help on using the changeset viewer.