Changeset 4307


Ignore:
Timestamp:
08/12/08 16:38:48 (12 years ago)
Author:
ansari
Message:

Updated code, with correct copyright info and package name

Location:
trunk/loci/apps/flow
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/apps/flow/Detector.java

    r4277 r4307  
    11// 
    2 // Detector.java 
     2//Detector.java 
    33// 
    44 
    55/* 
    6 Utility class for doing particle detection in flow cytometry. 
    7  
     6JVMLink client/server architecture for communicating between Java and 
     7non-Java programs using sockets. 
    88Copyright (c) 2008 Hidayath Ansari and Curtis Rueden. All rights reserved. 
    99 
    1010Redistribution and use in source and binary forms, with or without 
    1111modification, are permitted provided that the following conditions are met: 
    12   * Redistributions of source code must retain the above copyright 
    13     notice, this list of conditions and the following disclaimer. 
    14   * Redistributions in binary form must reproduce the above copyright 
    15     notice, this list of conditions and the following disclaimer in the 
    16     documentation and/or other materials provided with the distribution. 
    17   * Neither the name of the UW-Madison LOCI nor the names of its 
    18     contributors may be used to endorse or promote products derived from 
    19     this software without specific prior written permission. 
     12* Redistributions of source code must retain the above copyright 
     13notice, this list of conditions and the following disclaimer. 
     14* Redistributions in binary form must reproduce the above copyright 
     15notice, this list of conditions and the following disclaimer in the 
     16documentation and/or other materials provided with the distribution. 
     17* Neither the name of the UW-Madison LOCI nor the names of its 
     18contributors may be used to endorse or promote products derived from 
     19this software without specific prior written permission. 
    2020 
    2121THIS SOFTWARE IS PROVIDED BY THE UW-MADISON LOCI ``AS IS'' AND ANY 
     
    3939import java.util.Vector; 
    4040 
     41 
    4142public class Detector { 
     43         
    4244 
    4345        private static IndexColorModel theCM = makeCM(); 
     
    4850 
    4951                for(int ii=0 ; ii<256 ; ii++) 
    50                 r[ii] = g[ii] = b[ii] = (byte)ii; 
    51  
     52                r[ii] = g[ii] = b[ii] = (byte)ii;                
     53                 
    5254                return new IndexColorModel(8, 256, r,g,b); 
    5355    } 
     
    5759        private int intensityThreshold = 30; 
    5860        private int areaThreshold = 100; 
    59  
     61         
    6062        private int numRegions; 
    6163        private int[][] floodArray; 
    62  
     64         
    6365        private byte[] imageData; 
    64  
     66         
    6567        public void setIntensityThreshold(int t) { intensityThreshold = t; } 
    6668        public void setAreaThreshold(int t) { areaThreshold = t; } 
     
    7072                impParticles.hide(); 
    7173        } 
    72  
     74         
    7375        public static void main(String[] args) { 
    7476                Detector d = new Detector(512, 30, 100); 
    7577                Detector.impParticles = new ImagePlus("Particles", new ByteProcessor(d.size,d.size)); 
    76  
     78                 
     79 
     80                 
    7781                Detector.imp3 = IJ.openImage("particles.tiff"); 
    7882                Detector.imp3.show(); 
    7983                IJ.run("Despeckle"); 
    8084                //IJ.run("Haar wavelet filter", "k1=3 k2=3 k3=3 std=1.6"); 
    81  
     85                 
     86                 
     87                 
    8288                d.findParticles((ByteProcessor) Detector.imp3.getProcessor()); 
    8389                d.crunchArray(); 
    8490                displayImage(d.floodArray); 
    8591        } 
    86  
     92         
    8793        public Detector(int s, int intensT, int areaT) { 
    8894                size = s; 
     
    9096                areaThreshold = areaT; 
    9197        } 
    92  
     98         
    9399        public Vector<Particle> crunchArray() { 
    94  
     100                 
    95101                Vector<Particle> retval = new Vector<Particle>(); 
    96102                int[] area = new int[numRegions], totalIntensity = new int[numRegions]; 
     
    102108                        } 
    103109                } 
    104  
     110                 
    105111                boolean[] edgeParticle = new boolean[numRegions]; 
    106112                for (int i=0; i<size; i++) { 
     
    110116                        if (floodArray[i][size-1] > 1) edgeParticle[floodArray[i][size-1]-2] = true; 
    111117                } 
    112  
     118                 
     119                 
    113120                for (int i=0; i<numRegions; i++) { 
    114121                        if (area[i] < areaThreshold || edgeParticle[i]) continue; 
     
    132139                //Heuristic 1 
    133140                for (int i=0; i<50; i++) markPixels(floodArray); 
    134  
     141                 
    135142                // Find the particle regions. 
    136143                numRegions = fillParticles(floodArray); 
    137144        } 
    138  
     145         
    139146        public static void displayImage(int[][] arr) { 
    140147                byte[] particleArray = new byte[arr.length*arr[0].length]; 
     
    147154                impParticles.show(); 
    148155        } 
    149  
     156         
    150157        private int fillParticles(int[][] floodArray) { 
    151158                int num = 2; 
     
    168175                } 
    169176        } 
    170  
     177         
    171178        private void markPixels(int[][] arr) { 
    172179                int m=size-1; 
     
    183190                                        if (i<m &&        arr[i+1][j]  ==1) {bottom++;} 
    184191                                        if (i<m && j<m && arr[i+1][j+1]==1) {bottom++; right++;} 
    185  
     192                                         
    186193                                        int binTop = top>0 ? 1 : 0; 
    187194                                        int binBottom = bottom>0 ? 1 : 0; 
     
    198205                array[i][j] = num; 
    199206                int m=size-1; 
    200  
     207                 
    201208                int iter=j-1, left=j, right=j; 
    202209                while (iter>0 && array[i][iter]==1) { 
     
    209216                } 
    210217                right=iter; 
    211  
     218                 
    212219                if (left<0) left=0; 
    213220                if (right>m) right=m; 
    214  
     221                 
    215222                for (int k=left; k<=right; k++) { 
    216223                        if (i>1 && array[i-1][k] == 1) heuristicFloodFill(array, i-1, k, num); 
  • trunk/loci/apps/flow/JVMLinkFlowCytometry.java

    r4277 r4307  
    11// 
    2 // JVMLinkFlowCytometry.java 
     2//JVMLinkFlowCytometry.java 
    33// 
    44 
     
    1010Redistribution and use in source and binary forms, with or without 
    1111modification, are permitted provided that the following conditions are met: 
    12   * Redistributions of source code must retain the above copyright 
    13     notice, this list of conditions and the following disclaimer. 
    14   * Redistributions in binary form must reproduce the above copyright 
    15     notice, this list of conditions and the following disclaimer in the 
    16     documentation and/or other materials provided with the distribution. 
    17   * Neither the name of the UW-Madison LOCI nor the names of its 
    18     contributors may be used to endorse or promote products derived from 
    19     this software without specific prior written permission. 
     12* Redistributions of source code must retain the above copyright 
     13 notice, this list of conditions and the following disclaimer. 
     14* Redistributions in binary form must reproduce the above copyright 
     15 notice, this list of conditions and the following disclaimer in the 
     16 documentation and/or other materials provided with the distribution. 
     17* Neither the name of the UW-Madison LOCI nor the names of its 
     18 contributors may be used to endorse or promote products derived from 
     19 this software without specific prior written permission. 
    2020 
    2121THIS SOFTWARE IS PROVIDED BY THE UW-MADISON LOCI ``AS IS'' AND ANY 
     
    3333package loci.apps.flow; 
    3434 
     35 
    3536// TODO: make sure the pixels/micron thing is consistent 
    3637 
     
    6364        int begin; 
    6465        int end; 
    65  
     66         
    6667        public Slice(int n) { 
    6768                num = n; 
     
    7677} 
    7778 
     79 
    7880public class JVMLinkFlowCytometry { 
    79  
     81         
    8082        private static final int MIN_INTENSITY = 0; 
    8183        private static final int MAX_INTENSITY = 255; 
    82  
     84         
    8385        private static final int INTENSITY_AXIS = 0; 
    8486        private static final int AREA_AXIS = 1; 
    85  
     87         
    8688        private static final int PIXELS = 0; 
    8789        private static final int MICRONS = 1; 
     
    9395        private static ColorModel theCM; 
    9496        private static Detector d; 
    95  
     97         
    9698        public static int nSlices; 
    9799        private static int nParticles; 
     
    103105        private static Vector<Double> diameterValues; 
    104106        private static Vector<Integer> cellFrameV = new Vector<Integer>(); 
    105  
     107         
    106108        private static Vector<Particle> particles; 
    107109        private static Vector<Slice> slices; 
     
    121123        private static double maxArea, minArea, maxIntensity, minIntensity; 
    122124        private static ScalarMap xMap, yMap; 
    123  
     125         
    124126        private static double pixelMicronSquared; 
    125  
     127         
    126128        private static int resolutionWidth = 0; 
    127129        private static int resolutionHeight = 0; 
     
    129131        private static int intensityThreshold=30, areaThresholdInPixels=100, areaUnit=0; 
    130132        private static boolean showParticles=false; 
    131  
     133         
    132134        private static Vector<Integer> sliceBegin, sliceEnd; 
    133135        // sliceBegin[i] is the minimum identifier of all particles on slice i 
    134136        // sliceEnd[i] is the maximum identifier of all particles on slice i 
    135  
     137         
    136138        // For XML metadata 
    137139        private static String s_Name, s_Experiment, s_Params, s_Date; 
     
    141143                ij.getBounds(); 
    142144        } 
    143  
     145         
    144146        public static void incrementSlices() { 
    145147                nSlices++; 
     
    152154                stack.addSlice("Slice "+nSlices, bp); 
    153155                imp.setStack("Islet images", stack); 
    154                 imp.setSlice(nSlices); 
     156                imp.setSlice(stack.getSize()); 
    155157                imp.show(); 
    156         } 
    157  
    158         public static void init(int width, int height, double pixelsPerMicron) { 
    159                 setResolution(width, height); 
    160                 s_Date = new java.text.SimpleDateFormat("MM.dd.yyyy hh:mm:ss").format(new java.util.Date()); 
    161  
    162                 byte[] r = new byte[256]; 
    163                 byte[] g = new byte[256]; 
    164                 byte[] b = new byte[256]; 
    165  
    166                 for(int ii=0 ; ii<256 ; ii++) 
    167                 r[ii] = g[ii] = b[ii] = (byte)ii; 
    168  
    169                 theCM = new IndexColorModel(8, 256, r,g,b); 
    170                 imp = new ImagePlus("Islet images", new ByteProcessor(resolutionWidth,resolutionHeight)); 
    171 //              stack = new ImageStack(512, 512, ImageTools.makeColorModel(1, DataBuffer.TYPE_BYTE)); 
    172                 stack = new ImageStack(resolutionWidth, resolutionHeight, theCM); 
    173                 imp.show(); 
    174  
    175                 Detector.createImageHolder(resolutionWidth, resolutionHeight); 
    176  
    177                 imp.unlock(); 
    178                 maxArea=Double.MIN_VALUE; 
    179                 minArea=Double.MAX_VALUE; 
     158                 
     159                if (nSlices == 1) { 
     160                        stack.deleteSlice(1); 
     161                } 
     162                else if (nSlices == 2) { 
     163                        ImageWindow stackwin = ((ImageWindow) imp.getWindow()); 
     164                        scroll = (Scrollbar) stackwin.getComponent(1); 
     165 
     166                        AdjustmentListener l = new AdjustmentListener() { 
     167                                public void adjustmentValueChanged(AdjustmentEvent arg0) { 
     168                                        try { 
     169                                                int slideNum = ((Scrollbar) imp.getWindow().getComponent(1)).getValue(); 
     170                                                //for the detected particles window 
     171                                                if (showParticles) { 
     172                                                        d = new Detector(resolutionWidth, intensityThreshold, areaThresholdInPixels); 
     173                                                        d.findParticles(stack.getProcessor(slideNum)); 
     174                                                        d.crunchArray(); 
     175                                                        Detector.displayImage(d.getFloodArray()); 
     176                                                } 
     177 
     178                                                //for the graph 
     179                                                //IJ.log("This is slide "+slideNum+" and particle numbers on this slide go from "+sliceBegin[slideNum]+" to "+sliceEnd[slideNum]); 
     180                                                //IJ.log(Integer.toString(((Scrollbar) Intensity_.this.imp.getWindow().getComponent(1)).getValue())); 
     181                                                JVMLinkFlowCytometry.data_ref.setData(newestGetData(slideNum, cumulative, intensity, fn)); 
     182                                                JVMLinkFlowCytometry.display.reDisplayAll(); 
     183                                                //Intensity_.this.data_ref.setData(getData(imp.getCurrentSlice(), cumulative, intensity, fn)); 
     184                                        } catch (RemoteException e) {} catch (VisADException e) {} 
     185                                } 
     186                        }; 
     187                        scroll.addAdjustmentListener(l); 
     188                } 
     189        } 
     190         
     191        public static void initVars() { 
     192                maxArea=Double.MIN_VALUE;  
     193                minArea=Double.MAX_VALUE;  
    180194                maxIntensity = Double.MIN_VALUE; 
    181195                minIntensity = Double.MAX_VALUE; 
     
    183197                nParticles = 0; 
    184198 
    185                 pixelMicronSquared = pixelsPerMicron*pixelsPerMicron; 
    186                 pixelMicronSquared = 0.149*0.149; 
    187  
    188199                particles = new Vector<Particle>(); 
    189200                slices = new Vector<Slice>(); 
    190  
     201                 
    191202                sliceBegin = new Vector<Integer>(); 
    192203                sliceEnd = new Vector<Integer>(); 
     
    194205                intensityValues = new Vector<Double>(); 
    195206                diameterValues = new Vector<Double>(); 
    196  
     207                 
    197208                XAxisValues = intensityValues; 
    198                 YAxisValues = areaValues; 
     209                YAxisValues = areaValues;                
     210 
     211                area = RealType.getRealType("Area"); 
     212                intensity = RealType.getRealType("Intensity"); 
     213                diameter = RealType.getRealType("Diameter"); 
     214        } 
     215 
     216        public static void init(int width, int height, double pixelsPerMicron) { 
     217                setResolution(width, height); 
     218                s_Date = new java.text.SimpleDateFormat("MM.dd.yyyy hh:mm:ss").format(new java.util.Date()); 
     219 
     220                byte[] r = new byte[256]; 
     221                byte[] g = new byte[256]; 
     222                byte[] b = new byte[256]; 
     223 
     224                for(int ii=0 ; ii<256 ; ii++) 
     225                r[ii] = g[ii] = b[ii] = (byte)ii; 
     226 
     227                theCM = new IndexColorModel(8, 256, r,g,b); 
     228                imp = new ImagePlus("Islet images", new ByteProcessor(resolutionWidth,resolutionHeight)); 
     229                stack = new ImageStack(resolutionWidth, resolutionHeight, theCM); 
     230                imp.show(); 
     231                 
     232                Detector.createImageHolder(resolutionWidth, resolutionHeight); 
     233                 
     234                imp.unlock(); 
     235                 
     236                initVars(); 
     237                 
     238                pixelMicronSquared = 0.149*0.149; 
     239                if (pixelsPerMicron > 0) pixelMicronSquared = pixelsPerMicron*pixelsPerMicron; 
     240                 
    199241 
    200242                byte[] dummyData = new byte[resolutionWidth*resolutionHeight]; 
    201243                bp = new ByteProcessor(resolutionWidth,resolutionHeight,dummyData, theCM); 
    202244                bp.createImage(); 
    203                 nSlices = 2; 
    204245                stack.addSlice("Slice "+nSlices, bp); 
    205                 newestProcessFrame(-1); // because newestProcessFrame indexes from non-blank slides 
    206                 stack.addSlice("Slice "+nSlices, bp); 
    207                 newestProcessFrame(0); 
    208246                imp.setStack("Islet images", stack); 
    209  
    210                 ImageWindow stackwin = ((ImageWindow) imp.getWindow()); 
    211                 scroll = (Scrollbar) stackwin.getComponent(1); 
    212  
    213                 imp.setSlice(nSlices); 
    214                 //intensityValues.add(0.0); 
    215                 //areaValues.add(0.0); 
    216                 //intensityValues.add(0.0); 
    217                 //areaValues.add(0.0); 
    218  
    219                 area = RealType.getRealType("Area"); 
    220                 intensity = RealType.getRealType("Intensity"); 
    221                 diameter = RealType.getRealType("Diameter"); 
    222  
    223                 try { 
     247                 
     248                imp.setSlice(1); 
     249 
     250                try {                    
    224251                        // Display initialization 
    225                         //RealTupleType point = new RealTupleType(area, intensity); 
    226  
     252                         
    227253                        display = new DisplayImplJ2D("Graph Display"); 
    228254                        data_ref = new DataReferenceImpl("data_ref"); 
     
    257283                        CBcumulative.addItemListener(CBitemListener); 
    258284 
    259                         AdjustmentListener l = new AdjustmentListener() { 
    260                                 public void adjustmentValueChanged(AdjustmentEvent arg0) { 
    261                                         try { 
    262                                                 int slideNum = ((Scrollbar) imp.getWindow().getComponent(1)).getValue(); 
    263                                                 //for the detected particles window 
    264                                                 if (showParticles) { 
    265                                                         d = new Detector(resolutionWidth, intensityThreshold, areaThresholdInPixels); 
    266                                                         d.findParticles(stack.getProcessor(slideNum)); 
    267                                                         d.crunchArray(); 
    268                                                         Detector.displayImage(d.getFloodArray()); 
    269                                                 } 
    270  
    271                                                 //for the graph 
    272                                                 //IJ.log("This is slide "+slideNum+" and particle numbers on this slide go from "+sliceBegin[slideNum]+" to "+sliceEnd[slideNum]); 
    273                                                 //IJ.log(Integer.toString(((Scrollbar) Intensity_.this.imp.getWindow().getComponent(1)).getValue())); 
    274                                                 JVMLinkFlowCytometry.data_ref.setData(newestGetData(slideNum, cumulative, intensity, fn)); 
    275                                                 JVMLinkFlowCytometry.display.reDisplayAll(); 
    276                                                 //Intensity_.this.data_ref.setData(getData(imp.getCurrentSlice(), cumulative, intensity, fn)); 
    277                                         } catch (RemoteException e) {} catch (VisADException e) {} 
    278                                 } 
    279                         }; 
    280                         scroll.addAdjustmentListener(l); 
    281  
    282285                        imp.setSlice(1); 
    283286                        frame.setSize(600, 600); 
     
    285288                } catch (VisADException e) {IJ.log("VisAD Exception in init: "+e.getMessage());} catch (RemoteException re) {IJ.log("Remote Exception: "+re.getMessage());} 
    286289        } 
    287  
     290         
    288291        public static void setAxes(int x, int y) { 
    289292                // 0 - Intensity 
     
    291294                // 2 - Diameter 
    292295                xAxis = x; yAxis = y; 
    293  
     296                                 
    294297                switch(xAxis) { 
    295298                case 0: 
     
    306309                        break; 
    307310                } 
    308  
     311                 
    309312                switch(yAxis) { 
    310313                case 0: 
     
    331334                        display.addMap(xMap); 
    332335                        display.addMap(yMap); 
    333  
     336                         
    334337                } catch (RemoteException e) { e.printStackTrace(); } 
    335338                  catch (VisADException  e) { e.printStackTrace(); } 
     
    337340 
    338341        // Setters 
    339  
     342         
    340343        public static void setResolution(int width, int height) { 
    341344                resolutionWidth = width; 
    342345                resolutionHeight = height; 
    343346        } 
    344  
     347         
    345348        public static void setXAxis(int option) { xAxis = option; } 
    346349        public static void setYAxis(int option) { yAxis = option; } 
     
    353356        public static void setMaxY(int val) { maxY = val; } 
    354357        public static void setIntensityThreshold(int val) { intensityThreshold = val; } 
    355         public static void setAreaThreshold(int val) { 
     358        public static void setAreaThreshold(int val) {  
    356359                if (areaUnit == PIXELS) { 
    357360                        areaThresholdInPixels = val; 
    358361                } 
    359362                else if (areaUnit == MICRONS) { 
    360                         areaThresholdInPixels = (int) Math.round(val*pixelMicronSquared); 
     363                        areaThresholdInPixels = (int) Math.round(val*pixelMicronSquared);                        
    361364                } 
    362365        } 
     
    372375                        newestProcessFrame(i+1); 
    373376                } 
    374                 updateGraph(); 
    375         } 
    376  
     377                updateGraph();           
     378        } 
     379         
    377380        public static void saveDataWithXML() throws FormatException, IOException { 
    378381                ImageWriter iw = new ImageWriter(); 
    379382                MetadataStore metadataStore = MetadataTools.createOMEXMLMetadata(); 
    380383                metadataStore.createRoot(); 
    381  
     384                 
    382385                metadataStore.setPixelsSizeX(new Integer(resolutionWidth), 0, 0); 
    383386                metadataStore.setPixelsSizeY(new Integer(resolutionHeight), 0, 0); 
     
    390393                metadataStore.setExperimenterFirstName(s_Name, 0); 
    391394 
     395                 
    392396                MetadataRetrieve metadataObject = (MetadataRetrieve) metadataStore; 
    393397                iw.setMetadataRetrieve(metadataObject); 
     
    400404                // setImageCreationDate, setImageName on MetadataStore 
    401405                iw.setId("testImage.ome.tiff"); 
    402  
     406                 
    403407                System.out.println(stack.getSize()); 
    404408                for (int i=1; i<=stack.getSize(); i++) { 
     
    410414 
    411415        public static void newestProcessFrame() { 
    412                 newestProcessFrame(nSlices-2); 
    413         } 
    414  
     416                newestProcessFrame(nSlices); 
     417        } 
     418         
    415419        public static void newestProcessFrame(int sliceNum) { 
    416                 sliceNum = sliceNum+2; 
    417420                imp.unlock(); 
    418421                d = new Detector(resolutionWidth, intensityThreshold, areaThresholdInPixels); 
     
    429432                        thisSlice.end = nParticles+thisParticles.size()-1; 
    430433                } 
    431  
     434                 
    432435                for (int i=0; i<thisParticles.size(); i++) { 
    433436                        Particle thisParticle = thisParticles.get(i); 
     
    436439                        thisParticle.setPixelsPerMicron(pixelMicronSquared); 
    437440                        particles.add(thisParticle); 
    438  
     441                 
    439442                        //thisParticle.print(); 
    440  
     443                         
    441444                        int thisArea = thisParticle.getMicronArea(); 
    442445                        int thisIntensity = thisParticle.getIntensity(); 
     
    446449                        if (thisIntensity < minIntensity) minIntensity = thisIntensity; 
    447450                } 
    448  
     451                 
    449452                slices.add(thisSlice); 
    450         } 
    451  
     453                System.out.println("Particles size is "+particles.size()); 
     454        } 
     455         
    452456        public static void newProcessFrame() { 
    453457                imp.unlock(); 
     
    474478                System.out.println("just added to vectors: "+totalArea+ " "+totalIntensity/totalArea); 
    475479        } 
    476  
     480         
    477481        public static void processFrame() { 
    478482                incrementSlices(); 
     
    493497                areaValues.add(totalArea); 
    494498                intensityValues.add(totalIntensity); 
    495                 cellFrameV.add(nSlices); 
    496  
     499                cellFrameV.add(nSlices);  
     500                 
    497501                sliceBegin.ensureCapacity(2*nSlices); 
    498502                sliceEnd.ensureCapacity(2*nSlices); 
     
    502506                for (int i=0; i<sliceBegin.size(); i++) System.out.println(sliceBegin.get(i)); 
    503507        } 
    504  
     508         
    505509        private static double getMinX() { 
    506                 double areaRange = (maxArea - minArea)/pixelMicronSquared; 
    507  
     510                double areaRange = (maxArea - minArea);///pixelMicronSquared; 
     511                 
    508512                if (minX !=0) return minX; 
    509513                else { 
    510514                        switch(xAxis) { 
    511                                 case AREA_AXIS: return (minArea/pixelMicronSquared - 0.05*areaRange); 
    512                                 case INTENSITY_AXIS: return MIN_INTENSITY; 
    513                                 default: return (minArea/pixelMicronSquared - 0.05*areaRange); 
     515                                case AREA_AXIS: return (minArea - 0.05*areaRange); 
     516                                case INTENSITY_AXIS: return MIN_INTENSITY;  
     517                                default: return (minArea - 0.05*areaRange); 
    514518                        } 
    515519                } 
    516520        } 
    517  
     521         
    518522        private static double getMaxX() { 
    519                 double areaRange = (maxArea - minArea)/pixelMicronSquared; 
     523                double areaRange = (maxArea - minArea);///pixelMicronSquared; 
    520524 
    521525                if (maxX !=0) return maxX; 
    522526                else { 
    523527                        switch(xAxis) { 
    524                                 case AREA_AXIS: return (maxArea/pixelMicronSquared+0.05*areaRange); 
     528                                case AREA_AXIS: return (maxArea+0.05*areaRange); 
    525529                                case INTENSITY_AXIS: return MAX_INTENSITY; 
    526                                 default: return (maxArea/pixelMicronSquared+0.05*areaRange); 
     530                                default: return (maxArea+0.05*areaRange); 
    527531                        } 
    528532                } 
     
    530534 
    531535        private static double getMinY() { 
    532                 double areaRange = (maxArea - minArea)/pixelMicronSquared; 
    533  
     536                double areaRange = (maxArea - minArea);///pixelMicronSquared; 
     537                 
    534538                if (minY !=0) return minY; 
    535539                else { 
    536540                        switch(yAxis) { 
    537                                 case AREA_AXIS: return (minArea/pixelMicronSquared - 0.05*areaRange); 
    538                                 case INTENSITY_AXIS: return MIN_INTENSITY; 
    539                                 default: return (minArea/pixelMicronSquared - 0.05*areaRange); 
     541                                case AREA_AXIS: return (minArea - 0.05*areaRange); 
     542                                case INTENSITY_AXIS: return MIN_INTENSITY;  
     543                                default: return (minArea - 0.05*areaRange); 
    540544                        } 
    541545                } 
    542546        } 
    543  
     547         
    544548        private static double getMaxY() { 
    545                 double areaRange = (maxArea - minArea)/pixelMicronSquared; 
     549                double areaRange = (maxArea - minArea);///pixelMicronSquared; 
    546550 
    547551                if (maxY !=0) return maxY; 
    548552                else { 
    549553                        switch(yAxis) { 
    550                                 case AREA_AXIS: return (maxArea/pixelMicronSquared+0.05*areaRange); 
     554                                case AREA_AXIS: return (maxArea+0.05*areaRange); 
    551555                                case INTENSITY_AXIS: return MAX_INTENSITY; 
    552                                 default: return (maxArea/pixelMicronSquared+0.05*areaRange); 
     556                                default: return (maxArea+0.05*areaRange); 
    553557                        } 
    554558                } 
     
    586590                        } 
    587591                } 
    588  
     592                 
    589593                //System.out.println("beginIndex:"+beginIndex+" endIndex:"+endIndex+" numParticles:"+numParticles); 
    590  
     594                 
    591595                if (numParticles == 0) return null; 
    592596 
    593597                xArray = new double[numParticles]; 
    594598                yArray = new double[numParticles]; 
     599                 
    595600 
    596601                for (int i=beginIndex; i<=endIndex; i++) { 
     
    604609                        } 
    605610                } 
    606                 //for (int i=beginIndex; i<=endIndex; i++) System.out.println("Now plotting "+Double.toString(xArray[i-beginIndex]) + " " + Double.toString(yArray[i-beginIndex])); 
    607  
     611                for (int i=beginIndex; i<=endIndex; i++) System.out.println("Now plotting "+Double.toString(xArray[i-beginIndex]) + " " + Double.toString(yArray[i-beginIndex])); 
     612                 
    608613                List1DDoubleSet xSet; 
    609614                FlatField ff=null; 
     
    617622                return ff; 
    618623        } 
    619  
     624         
    620625        public static FlatField newGetData(int slice, boolean cumulative, RealType x, FunctionType fn) { 
    621626                //slice is NOT zero-indexed. 
     
    672677        } 
    673678 
     679         
    674680        public static void saveValues() throws IOException { 
    675681                BufferedWriter bw = new BufferedWriter(new FileWriter("values"+s_Date.substring(0,9))); 
     
    683689                } 
    684690        } 
    685  
     691         
    686692        public static void showParticles(boolean val) { 
    687693                showParticles = val; 
     
    689695                else Detector.impParticles.hide(); 
    690696        } 
    691  
     697         
    692698        public static void processFile(String filename) throws IOException { 
    693699                ImagePlus imp = IJ.openImage(filename); 
    694700                ImageStack stack = imp.getStack(); 
    695701                int size = imp.getWidth(); 
    696  
     702                 
    697703                double PixelsPerMicron = Double.valueOf(IJ.getString("Please enter the pixels/micron value for this analysis", "0.1")); 
    698704                pixelMicronSquared = PixelsPerMicron*PixelsPerMicron; 
    699  
    700                 init(size, size, 1); 
     705                 
     706                init(size, size, PixelsPerMicron); 
    701707                showParticles(true); 
    702708                for (int i=1; i<=stack.getSize(); i++) { 
     
    707713                        updateGraph(); 
    708714                } 
    709  
     715                 
    710716                BufferedWriter bw = new BufferedWriter(new FileWriter(filename+".values")); 
    711717                bw.write("Area (micron^2)\t\t(pixel^2)\t\tIntensity\t\tFrame"); bw.newLine(); bw.newLine(); 
    712718                System.out.println("Particles size is "+particles.size()); 
    713719                for (int i=0; i<particles.size(); i++) { 
    714                         bw.write(particles.get(i).getMicronArea()+"\t\t"+particles.get(i).getPixelArea()+"\t\t"+particles.get(i).getMeanIntensity()+"\t\t"+(particles.get(i).getSliceNum()-2)); bw.newLine(); 
     720                        bw.write(particles.get(i).getMicronArea()+"\t\t"+particles.get(i).getPixelArea()+"\t\t"+particles.get(i).getMeanIntensity()+"\t\t"+(particles.get(i).getSliceNum())); bw.newLine(); 
    715721                } 
    716722                bw.flush(); 
     
    724730                } 
    725731        } 
    726  
     732         
    727733        private static String flattenVector(Vector<Double> v) { 
    728734                String retval = ""; 
     
    732738                return retval; 
    733739        } 
     740         
     741        public static void main(String[] args) throws IOException { 
     742                if (args.length > 0) { 
     743                        intensityThreshold = Integer.valueOf(IJ.getString("Please enter the intensity threshold for this analysis", "30")); 
     744                        areaThresholdInPixels = Integer.valueOf(IJ.getString("Please enter the area threshold in pixels", "100")); 
     745                        processFile(args[0]); 
     746                        System.out.println("Done. Press Ctrl-C to exit"); 
     747                } 
     748                else System.out.println("Please provide a filename"); 
     749        } 
    734750} 
  • trunk/loci/apps/flow/Particle.java

    r4277 r4307  
    11// 
    2 // Particle.java 
     2//Particle.java 
    33// 
    44 
    55/* 
    6 Particle class to store information for each detected particle while 
    7 running flow cytometry. 
     6JVMLink client/server architecture for communicating between Java and 
     7non-Java programs using sockets. 
    88Copyright (c) 2008 Hidayath Ansari and Curtis Rueden. All rights reserved. 
    99 
    1010Redistribution and use in source and binary forms, with or without 
    1111modification, are permitted provided that the following conditions are met: 
    12   * Redistributions of source code must retain the above copyright 
    13     notice, this list of conditions and the following disclaimer. 
    14   * Redistributions in binary form must reproduce the above copyright 
    15     notice, this list of conditions and the following disclaimer in the 
    16     documentation and/or other materials provided with the distribution. 
    17   * Neither the name of the UW-Madison LOCI nor the names of its 
    18     contributors may be used to endorse or promote products derived from 
    19     this software without specific prior written permission. 
     12* Redistributions of source code must retain the above copyright 
     13notice, this list of conditions and the following disclaimer. 
     14* Redistributions in binary form must reproduce the above copyright 
     15notice, this list of conditions and the following disclaimer in the 
     16documentation and/or other materials provided with the distribution. 
     17* Neither the name of the UW-Madison LOCI nor the names of its 
     18contributors may be used to endorse or promote products derived from 
     19this software without specific prior written permission. 
    2020 
    2121THIS SOFTWARE IS PROVIDED BY THE UW-MADISON LOCI ``AS IS'' AND ANY 
     
    4040        private int sliceNum; 
    4141        private double pixelMicronSquared; 
    42  
     42                 
    4343        public Particle(int a, int i) { 
    4444                pixelArea = a; 
    4545                totalIntensity = i; 
    4646        } 
    47  
     47         
    4848        public void setPixelsPerMicron(double ppm) { 
    4949                pixelMicronSquared = ppm; 
    5050                micronArea = (int) Math.round(pixelArea/pixelMicronSquared); 
     51                System.out.println("pixelMicronSquared is "+ppm); 
    5152        } 
    52  
     53         
    5354        public void print() { 
    5455                System.out.println("Particle "+num+" on slice "+sliceNum+" with area (in pixels) "+pixelArea+" and total intensity "+totalIntensity); 
     
    8485 
    8586        public int getMeanIntensity() { 
    86                 if (pixelArea==0) return 0; 
    87                 else return totalIntensity/micronArea; 
    88         } 
     87                if (pixelArea==0) return 0;  
     88                else return totalIntensity/pixelArea; 
     89        }        
    8990} 
Note: See TracChangeset for help on using the changeset viewer.