Changeset 7971


Ignore:
Timestamp:
04/14/12 02:31:45 (7 years ago)
Author:
avivekan
Message:

major plugin update

Location:
trunk/projects/flow-cytometry/src/main/java/loci/apps/flow
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/projects/flow-cytometry/src/main/java/loci/apps/flow/Find_Particle_Areas.java

    r7964 r7971  
    11package loci.apps.flow; 
    22 
     3import java.util.ArrayList; 
     4import java.util.Collections; 
    35 
    46import ij.*; 
     7import ij.plugin.Duplicator; 
    58import ij.plugin.filter.PlugInFilter; 
    6 import ij.plugin.frame.*; 
     9import ij.plugin.frame.RoiManager; 
    710import ij.process.ImageProcessor; 
     11import ij.text.TextWindow; 
    812import ij.gui.GenericDialog; 
    913import ij.macro.Interpreter; 
     
    1216public class Find_Particle_Areas implements PlugInFilter { 
    1317 
    14         protected ImagePlus image; 
    15  
     18        private String myMethod; 
     19        private double thresholdMin; 
     20        private boolean exclude, doTheSum, dofullStack;  
     21        private ImagePlus imp, origImage; 
     22        private int stackSize, curSlice, sizeMin; 
     23        private Duplicator duplicator; 
     24        private TextWindow twindow; 
     25 
     26        /** 
     27         * Original setup method called by ImageJ when plugin is run. 
     28         * 
     29         * @param arg String arg0 
     30         * @param image ImagePlus image to run calculation on 
     31         */ 
    1632        @Override 
    1733        public int setup(String arg, ImagePlus image) { 
    18  
    19                 this.image = image; 
     34                origImage = image; 
    2035                return DOES_8G | NO_CHANGES; 
    2136        } 
    2237 
    23  
     38        /** 
     39         * Main program that is run by calling this plugin. Plugin prompts user with 
     40         * options, then calculates desired results. Options include: brightfield/intensity  
     41         * image being used, threshold minimum if intensity, size minimum if brightfield,  
     42         * to exclude particles on the edge during analysis, to show the summed result of 
     43         * analysis on single image, and/or to run calculation over entire stack if image  
     44         * is a stack. 
     45         * 
     46         * @param arg0 ImageProcessor object created when plugin is started. 
     47         * @param DialogOptions list of options displayed in dialog box, not actually  
     48         * passed in as parameter. 
     49         */ 
    2450        @Override 
    2551        public void run(ImageProcessor arg0) { 
    2652                try{ 
     53                        //get information from user about image and desired analysis 
    2754 
    2855                        GenericDialog gd = new GenericDialog("Calculate Particle Areas"); 
     
    3461                        gd.addCheckbox("Exclude_Particles_on_Edge",true); 
    3562                        gd.addCheckbox("Show summed areas",false); 
     63                        gd.addCheckbox("Run Plugin Over Entire Stack", false); 
    3664 
    3765                        gd.showDialog(); 
    3866                        if (gd.wasCanceled()) return; 
    3967 
    40                         String myMethod= gd.getNextChoice (); 
    41                         double thresholdMin= (double) gd.getNextNumber(); 
    42                         int sizeMin= (int) gd.getNextNumber(); 
    43                         boolean exclude=gd.getNextBoolean ();  
    44                         boolean doTheSum= gd.getNextBoolean(); 
    45  
     68                        //populate static variables 
     69                        myMethod= gd.getNextChoice (); 
     70                        thresholdMin= (double) gd.getNextNumber(); 
     71                        sizeMin= (int) gd.getNextNumber(); 
     72                        exclude=gd.getNextBoolean ();  
     73                        doTheSum= gd.getNextBoolean(); 
     74                        dofullStack = gd.getNextBoolean(); 
     75 
     76                        //begin core program 
    4677                        Interpreter.batchMode=true; 
    4778 
    48                         ImageProcessor duplicatedArg0 = arg0.duplicate(); 
    49                         ImagePlus imp = new ImagePlus("duplicate", duplicatedArg0); // has only one slice 
    50  
     79                        //check option for analyze full stack first, bypass other methods if so. 
     80                        //uses original stacked image, not single image 
     81                        if (dofullStack){ 
     82                                stackSize = origImage.getStackSize(); 
     83                                curSlice= origImage.getCurrentSlice(); 
     84                                analyzeFullStack(origImage.duplicate()); 
     85                        }  
     86                        else{ 
     87                                //create a duplicate and run calculations on it to preserve original image 
     88                                imp = new ImagePlus("duplicate", arg0.duplicate()); // has only one slice 
     89                                findParticles(imp); 
     90                                if (doTheSum) 
     91                                        doTheSum(true); 
     92 
     93                                imp.flush(); 
     94                                imp.close(); 
     95                        } 
     96 
     97 
     98                } catch(Exception e){ 
     99                        IJ.showMessage("Error with plugin."); 
     100                        e.printStackTrace(); 
     101                } 
     102        } 
     103 
     104        /** 
     105         *Main image analysis portion of plugin, analyzes image based on type (intensity/brightfield).  
     106         *Results are set up in the RoiManager and ResultsTable, nothing is returned. 
     107         * 
     108         * @param imageToAnalyze ImagePlus image to analyze 
     109         */ 
     110        private void findParticles(ImagePlus imageToAnalyze){ 
     111                try{ 
     112                        //if image is of intensity, do related calculations, else do brightfield calculations 
    51113                        if(myMethod.equals("Intensity")){ 
    52                                 imp.getProcessor().setThreshold(thresholdMin, 255, ImageProcessor.RED_LUT); 
    53                                 /*                              IJ.run(imp, "Threshold...", null); 
    54                                 IJ.runMacro("setAutoThreshold(\"Default dark\")", null); 
    55                                 IJ.runMacro("setThreshold("+thresholdMin+", 255)", null); 
    56                                  */                             IJ.run(imp, "Convert to Mask", null); 
    57  
    58                                  if(exclude) IJ.run(imp, "Analyze Particles...", "size="+sizeMin+"-Infinity circularity=0.00-1.00 show=Masks display exclude clear include add"); 
    59                                  else IJ.run(imp, "Analyze Particles...", "size="+sizeMin+"-Infinity circularity=0.00-1.00 show=Masks display clear include add"); 
     114                                imageToAnalyze.getProcessor().setThreshold(thresholdMin, 255, ImageProcessor.RED_LUT); 
     115                                IJ.run(imageToAnalyze, "Convert to Mask", null); 
     116 
     117                                if(exclude) IJ.run(imageToAnalyze, "Analyze Particles...", "size="+sizeMin+"-Infinity circularity=0.00-1.00 show=Masks display exclude clear include add"); 
     118                                else IJ.run(imageToAnalyze, "Analyze Particles...", "size="+sizeMin+"-Infinity circularity=0.00-1.00 show=Masks display clear include add"); 
    60119                        }                        
    61120                        else{ 
    62                                 IJ.run(imp, "Find Edges", null); 
    63                                 IJ.run(imp, "Find Edges", null); 
    64  
    65                                 IJ.run(imp, "Gaussian Blur...", "sigma=5"); 
    66  
    67                                 IJ.run(imp, "Auto Threshold", "method=Minimum white"); 
    68  
    69                                 if(exclude) IJ.run(imp, "Analyze Particles...", "size="+sizeMin+"-Infinity circularity=0.00-1.00 show=Masks exclude clear add"); 
    70                                 else IJ.run(imp, "Analyze Particles...", "size="+sizeMin+"-Infinity circularity=0.00-1.00 show=Masks clear add"); 
    71  
     121                                IJ.run(imageToAnalyze, "Find Edges", null); 
     122                                IJ.run(imageToAnalyze, "Find Edges", null); 
     123 
     124                                IJ.run(imageToAnalyze, "Gaussian Blur...", "sigma=5"); 
     125 
     126                                IJ.run(imageToAnalyze, "Auto Threshold", "method=Minimum white"); 
     127 
     128                                if(exclude) IJ.run(imageToAnalyze, "Analyze Particles...", "size="+sizeMin+"-Infinity circularity=0.00-1.00 show=Masks display exclude clear include add"); 
     129                                else IJ.run(imageToAnalyze, "Analyze Particles...", "size="+sizeMin+"-Infinity circularity=0.00-1.00 show=Masks display clear include add"); 
     130 
     131                        }                
     132                }catch(Exception e){ 
     133                        IJ.showMessage("Error with finding particles"); 
     134                        IJ.log(e.getMessage()); 
     135 
     136                } 
     137        } 
     138 
     139        /** 
     140         *Calculates sum of particle areas in current image using values present in  
     141         *ResultsTable. For this to function as desired, this method must be called  
     142         *right after findParticleAreas(). 
     143         * 
     144         * @param popUp boolean, if true create message window in ImageJ showing summed value 
     145         * @return summedValue the sum of all "Area" values in ResultsTable 
     146         */ 
     147 
     148        private float doTheSum(boolean popUp){ 
     149                float retVal=0;          
     150                try{ 
     151                        //only if there are values in the results table 
     152                        if(ResultsTable.getResultsTable().getCounter()>0){ 
     153                                //get the values under the column "Area" 
     154                                float[] temp = ResultsTable.getResultsTable().getColumn(ResultsTable.getResultsTable().getColumnIndex("Area")); 
     155                                for (int i = 0; i < temp.length; i++){ 
     156                                        retVal+=temp[i]; 
     157                                } 
     158                                //if user desires a pop up message box, do so to display summed pixels on single image 
     159                                if (popUp)  
     160                                        IJ.showMessage("Sum of all particle areas: "+retVal+" (pixels)"); 
    72161                        } 
    73                                  
    74  
    75 //                              IJ.runMacro("roiManager(\"Measure\")",null); 
    76  
    77                         if (doTheSum){ 
    78                                 RoiManager roiMan = RoiManager.getInstance2(); 
    79                                 if(roiMan.getCount()>0) 
    80                                         roiMan.runCommand("Measure"); 
    81                                 try{ 
    82                                         int lengthOfRoiTable=roiMan.getCount(); 
    83                                         float retVal=0; 
    84                                         float[] temp = ResultsTable.getResultsTable().getColumn(ResultsTable.getResultsTable().getColumnIndex("Area")); 
    85                                         for (int i = 0; i < lengthOfRoiTable; i++){ 
    86                                                 retVal+=temp[i]; 
    87                                         } 
    88                                         IJ.showMessage("Sum of all particle areas: "+retVal+" (pixels)"); 
    89                                 } catch(Exception e){ 
    90                                         IJ.showMessage("Error with doTheSum"); 
     162                } catch(Exception e){ 
     163                        IJ.showMessage("Error with doTheSum"); 
     164                        IJ.log(e.getMessage()); 
     165                } 
     166                return retVal; 
     167        } 
     168 
     169        /** 
     170         * For conducting analysis on image if image is a stack. Creates a custom  
     171         * user-friendly results table containing summed values for slices with particle. 
     172         * 
     173         * @param imageToAnalyze ImagePlus stack to run analysis sequence over 
     174         */ 
     175 
     176        private void analyzeFullStack(ImagePlus imageToAnalyze){ 
     177                //init 
     178                duplicator = new Duplicator(); 
     179                float particleValue=0; 
     180                ArrayList<Float> totalParticleValues=new ArrayList<Float>(); 
     181                int numEntries=0; 
     182 
     183                try{ 
     184                        twindow.close(true);            //if previous text window is open then this will prompt to save and close...will throw excpetion if first time 
     185                } catch (Exception e){ 
     186                        //fall through                          //if no such text window exists yet, fall through and create one. 
     187                } 
     188                twindow = new TextWindow("Found Particles", " \t Slice \t \tPixel Area", "", 800, 300); 
     189 
     190                try{ 
     191                        //while there are images left in the stack from current position 
     192                        while(curSlice<=stackSize){      
     193                                //find particles on current slice 
     194                                findParticles(duplicator.run(imageToAnalyze, curSlice, curSlice)); 
     195                                //get sum of pixels of particles on current slice 
     196                                particleValue = doTheSum(false); 
     197                                //create custom results table entry (text window), add value to an array for further analysis 
     198                                if (particleValue!=0){ 
     199                                        twindow.append("Particle(s) found in slice    \t"+ curSlice+ "\t    with a total pixel area of    \t"+particleValue); 
     200                                        totalParticleValues.add(particleValue); 
     201                                        numEntries++; 
    91202                                } 
    92                         } 
    93  
    94                         imp.close(); 
    95  
    96  
    97                 } catch(Exception e){ 
    98                         e.printStackTrace(); 
    99  
    100                 } 
    101         //      Interpreter.batchMode=false; 
    102  
     203                                //set image to next slice 
     204                                imageToAnalyze.setSlice(curSlice+1); 
     205                                origImage.setSlice(curSlice+1); 
     206                                curSlice++; 
     207                        }  
     208                        //sort the values in array to find median 
     209                        Collections.sort(totalParticleValues); 
     210                        particleValue=0; 
     211                        //sum the values in array to find average 
     212                        for(int i=0; i<totalParticleValues.size(); i++) 
     213                                particleValue+=totalParticleValues.get(i); 
     214                        //make custom entry for average and median 
     215                        twindow.append("Average pixel area over    \t"+ numEntries + "\t    slices is    \t"+(particleValue/numEntries)); 
     216                        twindow.append("Median pixel area from    \t"+ numEntries + "\t    slices is    \t"+(totalParticleValues.get(numEntries/2))); 
     217                         
     218                        imageToAnalyze.flush(); 
     219                        imageToAnalyze.close(); 
     220                } catch (IndexOutOfBoundsException e){ 
     221                        IJ.log("Finished processing image stack."); 
     222                } catch (Exception e){ 
     223                        IJ.showMessage("Error with processing stack."); 
     224                        IJ.log(e.getMessage()); 
     225                } 
    103226        } 
    104227 
  • trunk/projects/flow-cytometry/src/main/java/loci/apps/flow/FlowCyto.java

    r7964 r7971  
    2525        private static ByteProcessor bp; 
    2626        private static ColorModel theCM;         
    27         private static String s_Name, s_Experiment, s_Params, s_Date, tempImageName; 
     27        //      private static String s_Name, s_Experiment, s_Params, s_Date, tempImageName; 
    2828        private static double pixelMicronSquared; 
    2929        private static RoiManager rman; 
     
    6767        public static void init(String mode, int width, int height, double pixelsPerMicron) { 
    6868                try{ 
    69         //              timer = new Timestamp(0); 
     69                        //              timer = new Timestamp(0); 
    7070                        long initialTime = System.nanoTime(); 
    7171                        nSlices=0; 
     
    7575                        impIN=new ImagePlus(); 
    7676                        imp=new ImagePlus(); 
    77         //              s_Date = new java.text.SimpleDateFormat("MM.dd.yyyy hh:mm:ss").format(new java.util.Date()); 
     77                        //              s_Date = new java.text.SimpleDateFormat("MM.dd.yyyy hh:mm:ss").format(new java.util.Date()); 
    7878                        byte[] r = new byte[256]; 
    7979                        for(int ii=0 ; ii<256 ; ii++) 
     
    209209                long initialTime = System.nanoTime(); 
    210210                Interpreter.batchMode=true; 
    211                  
     211 
    212212                try{ 
    213213 
     
    219219                                        IJ.log("plugin finished on intensity image "+nSlicesIN+" in "+ ((System.nanoTime() - initialTime)/1000) +"us"); 
    220220                                        //-------------------------------------------------------------// 
    221                                  
     221 
    222222                                }catch(Exception e){ 
    223223                                        if(excludeOnEdge)IJ.run(imp, "Find Particle Areas", "channel=Brightfield threshold_minimum="+thresholdMin+" size_minimum="+sizeMin+" exclude_particles_on_edge"); 
    224224                                        else IJ.run(imp, "Find Particle Areas", "channel=Brightfield threshold_minimum="+thresholdMin+" size_minimum="+sizeMin+""); 
    225225                                } 
    226                                 //                              if(excludeOnEdge) IJ.run("Find Particle Areas", "channel=Intensity threshold_minimum="+thresholdMin+" size_minimum="+sizeMin+" exclude_particles_on_edge"); 
    227                                 //                              else IJ.run("Find Particle Areas", "channel=Intensity threshold_minimum="+thresholdMin+" size_minimum="+sizeMin+""); 
    228226                        } 
    229227                        else { 
     
    234232                                        IJ.log("plugin finished on brightfield image "+nSlicesBF+" in "+ ((System.nanoTime() - initialTime)/1000) +"us"); 
    235233                                        //-------------------------------------------------------------// 
    236                                  
     234 
    237235                                }catch(Exception e){ 
    238236                                        if(excludeOnEdge)IJ.run(imp, "Find Particle Areas", "channel=Brightfield threshold_minimum="+thresholdMin+" size_minimum="+sizeMin+" exclude_particles_on_edge"); 
    239237                                        else IJ.run(imp, "Find Particle Areas", "channel=Brightfield threshold_minimum="+thresholdMin+" size_minimum="+sizeMin+""); 
    240238                                } 
    241                                 //                              if(excludeOnEdge)IJ.run("Find Particle Areas", "channel=Brightfield threshold_minimum="+thresholdMin+" size_minimum="+sizeMin+" exclude_particles_on_edge"); 
    242                                 //                              else IJ.run("Find Particle Areas", "channel=Brightfield threshold_minimum="+thresholdMin+" size_minimum="+sizeMin+""); 
    243239                        } 
    244240 
     
    248244                                rtab = ResultsTable.getResultsTable(); 
    249245 
    250                                 //                      int lengthOfRoiTable = rman.getCount(); 
    251  
    252                                 //                      if (lengthOfRoiTable!=0){ 
    253  
    254                                 //                      retVal = new float[lengthOfRoiTable]; 
    255246                                float[] areasArray = rtab.getColumn(rtab.getColumnIndex("Area")); 
    256247 
    257248                                if(areasArray!=null){ 
    258                                         //                              for (int i = 0; i < lengthOfRoiTable; i++){ 
    259                                         //                                      retVal[i]=areasArray[i]; 
    260                                         //                              } 
    261                                         //                      rman.dispose(); 
    262                                         rtab.reset(); 
    263                                         rman.runCommand("Deselect"); 
    264                                         rman.runCommand("Delete"); 
     249 
     250                //                      rtab.reset(); 
     251                //                      rman.runCommand("Deselect"); 
     252                //                      rman.runCommand("Delete"); 
    265253 
    266254                                        //-----------------------FOR DEBUG PURPOSES--------------------// 
    267255                                        IJ.log("particle areas calculated in "+ ((System.nanoTime() - initialTime)/1000) +"us"); 
    268256                                        //-------------------------------------------------------------// 
    269                                         //                              return retVal; 
     257 
    270258                                        return areasArray; 
    271259                                } 
     
    288276        } 
    289277 
     278        public static void logInImageJ(String message){ 
     279                IJ.log(message); 
     280        } 
     281 
    290282} 
Note: See TracChangeset for help on using the changeset viewer.