Changeset 4322


Ignore:
Timestamp:
08/20/08 21:54:16 (12 years ago)
Author:
ansari
Message:

Updating flow cytometry app code.

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

Legend:

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

    r4307 r4322  
    9898         
    9999        public Vector<Particle> crunchArray() { 
    100                  
    101100                Vector<Particle> retval = new Vector<Particle>(); 
    102                 int[] area = new int[numRegions], totalIntensity = new int[numRegions]; 
     101                int[] area = new int[numRegions], totalIntensity = new int[numRegions], 
     102                      minY = new int[numRegions], maxY = new int[numRegions], 
     103                      minX = new int[numRegions], maxX = new int[numRegions]; 
     104                 
     105                for (int i=0; i<numRegions; i++) { minY[i] = 2*size; minX[i] = 2*size;} 
     106                 
    103107                for (int i=0; i<size; i++) { 
    104108                        for (int j=0; j<size; j++) { 
     
    106110                                area[floodArray[i][j]-2]++; 
    107111                                totalIntensity[floodArray[i][j]-2] += (imageData[i*size+j] & 0xff); 
     112                                 
     113                                if (i < minY[floodArray[i][j]-2]) minY[floodArray[i][j]-2] = i;  
     114                                if (i > maxY[floodArray[i][j]-2]) maxY[floodArray[i][j]-2] = i;  
     115                                if (j < minX[floodArray[i][j]-2]) minX[floodArray[i][j]-2] = j;  
     116                                if (j > maxX[floodArray[i][j]-2]) maxX[floodArray[i][j]-2] = j;  
    108117                        } 
    109118                } 
     
    120129                for (int i=0; i<numRegions; i++) { 
    121130                        if (area[i] < areaThreshold || edgeParticle[i]) continue; 
    122                         retval.add(new Particle(area[i], totalIntensity[i])); 
     131                        retval.add(new Particle(area[i], totalIntensity[i], minX[i], maxX[i], minY[i], maxY[i])); 
    123132                        //System.out.println("Region "+i+": Area "+area[i]+"  Intensity "+totalIntensity[i]); 
    124133                } 
  • trunk/loci/apps/flow/JVMLinkFlowCytometry.java

    r4307 r4322  
    3434 
    3535 
    36 // TODO: make sure the pixels/micron thing is consistent 
    37  
    3836import ij.*; 
    3937import ij.gui.ImageWindow; 
     
    4745import java.awt.image.*; 
    4846import java.io.BufferedWriter; 
     47import java.io.File; 
    4948import java.io.FileWriter; 
    5049import java.io.IOException; 
     
    7978 
    8079public class JVMLinkFlowCytometry { 
     80         
     81    /** Debugging flag. */ 
     82    protected static boolean debug = true; 
    8183         
    8284        private static final int MIN_INTENSITY = 0; 
     
    131133        private static int intensityThreshold=30, areaThresholdInPixels=100, areaUnit=0; 
    132134        private static boolean showParticles=false; 
     135        private static boolean b_logY = false; 
    133136         
    134137        private static Vector<Integer> sliceBegin, sliceEnd; 
     
    423426                Vector<Particle> thisParticles = d.crunchArray(); 
    424427                if (showParticles) { 
    425                         System.out.println("processFrame for slice "+sliceNum); 
     428                        System.out.println("Processing slice "+sliceNum); 
    426429                        Detector.displayImage(d.getFloodArray()); 
    427430                } 
     
    438441                        thisParticle.setSliceNum(nSlices); 
    439442                        thisParticle.setPixelsPerMicron(pixelMicronSquared); 
    440                         particles.add(thisParticle); 
     443                        addParticle(thisParticle); 
    441444                 
    442445                        //thisParticle.print(); 
     
    452455                slices.add(thisSlice); 
    453456                System.out.println("Particles size is "+particles.size()); 
    454         } 
    455          
     457                //for (int i=0; i<particles.size(); i++) particles.get(i).print(); 
     458        } 
     459         
     460        private static boolean addParticle(Particle particle) { 
     461                int particleIndex = particles.size()-1; 
     462                if (particles.size() == 0) { 
     463                        particles.add(particle); 
     464                        return false; 
     465                } 
     466                int lastSliceNum = nSlices-1; 
     467                boolean duplicate = false; 
     468                Particle lastParticle = particles.get(particleIndex); 
     469                mainloop: while (lastParticle.getSliceNum() == lastSliceNum) { 
     470                        if (duplicate = isSameParticle(particle, lastParticle)) { 
     471                                lastParticle.deactivate(); 
     472                                debug("Duplicate particle detected"); 
     473                                break mainloop;                  
     474                        } 
     475                        if (particleIndex == 0) break; 
     476                        lastParticle = particles.get(--particleIndex); 
     477                } 
     478                particles.add(particle); 
     479                return duplicate; 
     480        } 
     481 
     482        private static boolean isSameParticle(Particle oldP, Particle newP) { 
     483                int nMatches = 0; 
     484                double tolerance = 0.1; 
     485                if (newP.getPixelArea() < (1+tolerance)*oldP.getPixelArea() && newP.getPixelArea() > (1-tolerance)*oldP.getPixelArea()) nMatches++; 
     486                if (newP.getMeanIntensity() < (1+tolerance)*oldP.getMeanIntensity() && newP.getMeanIntensity() > (1-tolerance)*oldP.getMeanIntensity()) nMatches++; 
     487                if (newP.getCentroidY() < (1+tolerance)*oldP.getCentroidY() && newP.getCentroidY() > (1-tolerance)*oldP.getCentroidY()) nMatches++; 
     488                if (newP.getSizeY() < (1+tolerance)*oldP.getSizeY() && newP.getSizeY() > (1-tolerance)*oldP.getSizeY()) nMatches++; 
     489                if (newP.getCentroidX() < (1+tolerance)*oldP.getCentroidX() && newP.getCentroidX() > (1-tolerance)*oldP.getCentroidX()) nMatches++; 
     490                if (newP.getSizeX() < (1+tolerance)*oldP.getSizeX() && newP.getSizeX() > (1-tolerance)*oldP.getSizeX()) nMatches++; 
     491                 
     492                //Do something with the x-position and flow rate here. 
     493                 
     494                if (nMatches > 2) return true; 
     495                else return false; 
     496        } 
     497 
    456498        public static void newProcessFrame() { 
    457499                imp.unlock(); 
     
    535577        private static double getMinY() { 
    536578                double areaRange = (maxArea - minArea);///pixelMicronSquared; 
     579                double retval; 
    537580                 
    538581                if (minY !=0) return minY; 
    539582                else { 
    540583                        switch(yAxis) { 
    541                                 case AREA_AXIS: return (minArea - 0.05*areaRange); 
    542                                 case INTENSITY_AXIS: return MIN_INTENSITY;  
    543                                 default: return (minArea - 0.05*areaRange); 
    544                         } 
    545                 } 
     584                                case AREA_AXIS: retval = (minArea - 0.05*areaRange); 
     585                                case INTENSITY_AXIS: retval = MIN_INTENSITY;  
     586                                default: retval = (minArea - 0.05*areaRange); 
     587                        } 
     588                } 
     589                 
     590                if (b_logY) { 
     591                        if (retval < 0) { 
     592                                debug("getMinY() returning 0 (in log case)"); 
     593                                return 0; 
     594                        } 
     595                        else return Math.log(retval); 
     596                } 
     597                else return retval; 
    546598        } 
    547599         
    548600        private static double getMaxY() { 
    549601                double areaRange = (maxArea - minArea);///pixelMicronSquared; 
    550  
     602                double retval; 
     603                 
    551604                if (maxY !=0) return maxY; 
    552605                else { 
    553606                        switch(yAxis) { 
    554                                 case AREA_AXIS: return (maxArea+0.05*areaRange); 
    555                                 case INTENSITY_AXIS: return MAX_INTENSITY; 
    556                                 default: return (maxArea+0.05*areaRange); 
    557                         } 
    558                 } 
     607                                case AREA_AXIS: retval = (maxArea+0.05*areaRange); 
     608                                case INTENSITY_AXIS: retval = MAX_INTENSITY; 
     609                                default: retval = (maxArea+0.05*areaRange); 
     610                        } 
     611                } 
     612                 
     613                if (b_logY) { 
     614                        if (retval < 0) return 0; 
     615                        else return Math.log(retval); 
     616                } 
     617                else return retval; 
    559618        } 
    560619 
     
    573632                        yMap.setRange(getMinY(), getMaxY()); 
    574633                        data_ref.setData(newestGetData(nSlices, true, xType, fn)); 
    575                         display.addReference(data_ref); 
     634                        //display.addReference(data_ref); 
     635                        display.reDisplayAll(); // Replacing above line with this 
    576636                } catch (VisADException e) {IJ.log("VisAD Exception in updateGraph: "+e.getMessage()); } catch (RemoteException re) {IJ.log("Remote Exception: "+re.getMessage());} 
    577637        } 
     
    594654                 
    595655                if (numParticles == 0) return null; 
    596  
     656                 
     657                double minXGraph = getMinX(), maxXGraph = getMaxX(); 
     658                double minYGraph = getMinY(), maxYGraph = getMaxY(); 
     659 
     660                double[] newxArray = new double[numParticles]; 
     661                double[] newyArray = new double[numParticles]; 
     662                int arrayindex = 0; 
     663 
     664                for (int i=beginIndex; i<=endIndex; i++) { 
     665                        if (particles.get(i).getStatus()) { 
     666                                boolean xActive = true, yActive = true; 
     667                                double xValue=0, yValue=0; 
     668                                switch(xAxis) { 
     669                                        case INTENSITY_AXIS: 
     670                                                xValue = particles.get(i).getMeanIntensity(); 
     671                                                if (xValue < minXGraph || xValue > maxXGraph) xActive = false; 
     672                                                break; 
     673                                        case AREA_AXIS: 
     674                                                xValue = particles.get(i).getMicronArea(); 
     675                                                if (xValue < minXGraph || xValue > maxXGraph) xActive = false; 
     676                                                break; 
     677                                } 
     678                                switch(yAxis) { 
     679                                        case INTENSITY_AXIS: 
     680                                                yValue = particles.get(i).getMeanIntensity(); 
     681                                                yValue = (b_logY ? Math.log(yValue) : yValue); 
     682                                                if (yValue < minYGraph || yValue > maxYGraph) yActive = false; 
     683                                                break; 
     684                                        case AREA_AXIS: 
     685                                                yValue = particles.get(i).getMicronArea(); 
     686                                                yValue = (b_logY ? Math.log(yValue) : yValue); 
     687                                                if (yValue < minYGraph || yValue > maxYGraph) yActive = false; 
     688                                                break; 
     689                                } 
     690                                if (xActive && yActive) { 
     691                                        newxArray[arrayindex] = xValue; 
     692                                        newyArray[arrayindex] = yValue; 
     693                                        arrayindex++; 
     694                                } 
     695                        } 
     696                } 
     697                 
     698                 
     699                xArray = new double[arrayindex]; 
     700                yArray = new double[arrayindex]; 
     701                for (int i=0; i<arrayindex; i++) { 
     702                        xArray[i] = newxArray[i]; 
     703                        yArray[i] = newyArray[i]; 
     704                } 
     705                 
     706                 
     707                /* Old code 
    597708                xArray = new double[numParticles]; 
    598709                yArray = new double[numParticles]; 
     
    601712                for (int i=beginIndex; i<=endIndex; i++) { 
    602713                        switch(xAxis) { 
    603                                 case 0: xArray[i-beginIndex] = particles.get(i).getMeanIntensity(); break; 
    604                                 case 1: xArray[i-beginIndex] = particles.get(i).getMicronArea(); break; 
     714                                case INTENSITY_AXIS: xArray[i-beginIndex] = particles.get(i).getMeanIntensity(); break; 
     715                                case AREA_AXIS: xArray[i-beginIndex] = particles.get(i).getMicronArea(); break; 
    605716                        } 
    606717                        switch(yAxis) { 
    607                                 case 0: yArray[i-beginIndex] = particles.get(i).getMeanIntensity(); break; 
    608                                 case 1: yArray[i-beginIndex] = particles.get(i).getMicronArea(); break; 
    609                         } 
    610                 } 
    611                 for (int i=beginIndex; i<=endIndex; i++) System.out.println("Now plotting "+Double.toString(xArray[i-beginIndex]) + " " + Double.toString(yArray[i-beginIndex])); 
     718                                case INTENSITY_AXIS: yArray[i-beginIndex] = particles.get(i).getMeanIntensity(); break; 
     719                                case AREA_AXIS: yArray[i-beginIndex] = particles.get(i).getMicronArea(); break; 
     720                        } 
     721                } 
     722                */ 
     723                // for (int i=0; i<xArray.length; i++) debug("Now plotting "+Double.toString(xArray[i]) + " " + Double.toString(yArray[i])); 
    612724                 
    613725                List1DDoubleSet xSet; 
    614726                FlatField ff=null; 
    615                 if (endIndex >= beginIndex) try { 
     727                if (xArray.length > 0) try { 
    616728                        xSet = new List1DDoubleSet(xArray, x, null, null); 
    617729                        ff = new FlatField(fn, xSet); 
     
    680792        public static void saveValues() throws IOException { 
    681793                BufferedWriter bw = new BufferedWriter(new FileWriter("values"+s_Date.substring(0,9))); 
    682                 bw.write("Area values: "); bw.newLine(); 
    683                 for (int i=0; i<areaValues.size(); i++) { 
    684                         bw.write(Double.toString(areaValues.get(i))); bw.newLine(); 
    685                 } 
    686                 bw.write("Intensity values: "); bw.newLine(); 
    687                 for (int i=0; i<intensityValues.size(); i++) { 
    688                         bw.write(Double.toString(intensityValues.get(i))); bw.newLine(); 
    689                 } 
     794                bw.write("Area (micron^2)\t\t(pixel^2)\t\tIntensity\t\tFrame"); bw.newLine(); bw.newLine(); 
     795                System.out.println("Particles size is "+particles.size()); 
     796                for (int i=0; i<particles.size(); i++) { 
     797                        if (particles.get(i).getStatus()) 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(); 
     798                } 
     799                bw.flush(); 
     800                bw.close(); 
    690801        } 
    691802         
     
    698809        public static void processFile(String filename) throws IOException { 
    699810                ImagePlus imp = IJ.openImage(filename); 
    700                 ImageStack stack = imp.getStack(); 
     811                ImageStack stack = imp.getStack(); //TODO : Handle exception here. 
    701812                int size = imp.getWidth(); 
    702813                 
    703814                double PixelsPerMicron = Double.valueOf(IJ.getString("Please enter the pixels/micron value for this analysis", "0.1")); 
    704815                pixelMicronSquared = PixelsPerMicron*PixelsPerMicron; 
     816                 
     817                // Close the other open windows 
     818                frame.dispose(); 
     819                imp.close(); 
    705820                 
    706821                init(size, size, PixelsPerMicron); 
     
    718833                System.out.println("Particles size is "+particles.size()); 
    719834                for (int i=0; i<particles.size(); i++) { 
    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(); 
     835                        if (particles.get(i).getStatus()) 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(); 
    721836                } 
    722837                bw.flush(); 
     
    740855         
    741856        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         } 
     857                String filename = ""; 
     858                if (args.length > 0) filename = args[0]; 
     859                else { 
     860                        String wd = System.getProperty("user.dir"); 
     861                        JFileChooser fc = new JFileChooser(wd); 
     862                        int rc = fc.showDialog(null, "Select Data File"); 
     863                        if (rc == JFileChooser.APPROVE_OPTION) { 
     864                                File file = fc.getSelectedFile(); 
     865                                filename = file.getAbsolutePath(); 
     866                        } 
     867                        else {  
     868                                System.out.println("File chooser cancel button clicked"); 
     869                                return; 
     870                        } 
     871                } 
     872                intensityThreshold = Integer.valueOf(IJ.getString("Please enter the intensity threshold for this analysis", "30")); 
     873                areaThresholdInPixels = Integer.valueOf(IJ.getString("Please enter the area threshold in pixels", "100")); 
     874                processFile(filename); 
     875                System.out.println("Done. Press Ctrl-C to exit"); 
     876 
     877        } 
     878         
     879          private static void debug(String msg) { 
     880                    if (debug) System.out.println("JVMLinkFlowCytometry: " + msg); 
     881          } 
     882 
     883        public static void setLogY(boolean b_logy) { 
     884                b_logY = b_logy; 
     885        } 
     886         
     887        public static void closeAllWindows() { 
     888                ij.quit(); 
     889                frame.dispose(); 
     890        } 
     891 
    750892} 
  • trunk/loci/apps/flow/Particle.java

    r4307 r4322  
    4040        private int sliceNum; 
    4141        private double pixelMicronSquared; 
     42        private int centroid_x; 
     43        private int centroid_y; 
     44        private int size_x; 
     45        private int size_y; 
     46        private boolean active; 
    4247                 
    4348        public Particle(int a, int i) { 
    4449                pixelArea = a; 
    4550                totalIntensity = i; 
     51                active = true; 
    4652        } 
    4753         
     54        public Particle(int a, int i, int minx, int maxx, int miny, int maxy) { 
     55                pixelArea = a; 
     56                totalIntensity = i; 
     57                size_x = maxx - minx; 
     58                centroid_x = (maxx+minx)/2; 
     59                size_y = maxy - miny; 
     60                centroid_y = (maxy+miny)/2; 
     61                active = true; 
     62        } 
     63 
    4864        public void setPixelsPerMicron(double ppm) { 
    4965                pixelMicronSquared = ppm; 
    5066                micronArea = (int) Math.round(pixelArea/pixelMicronSquared); 
    51                 System.out.println("pixelMicronSquared is "+ppm); 
     67                //System.out.println("pixelMicronSquared is "+ppm); 
    5268        } 
    5369         
    5470        public void print() { 
    55                 System.out.println("Particle "+num+" on slice "+sliceNum+" with area (in pixels) "+pixelArea+" and total intensity "+totalIntensity); 
     71                System.out.println((active?"Active":"Inactive")+": Particle "+num+" on slice "+sliceNum+" with area (in pixels) "+pixelArea+" and total intensity "+totalIntensity); 
    5672        } 
    5773 
     
    87103                if (pixelArea==0) return 0;  
    88104                else return totalIntensity/pixelArea; 
    89         }        
     105        } 
     106 
     107        public int getCentroidY() { 
     108                return centroid_y; 
     109        } 
     110 
     111        public int getSizeY() { 
     112                return size_y; 
     113        } 
     114         
     115        public int getCentroidX() { 
     116                return centroid_x; 
     117        } 
     118 
     119        public int getSizeX() { 
     120                return size_x; 
     121        } 
     122 
     123        public void deactivate() { 
     124                active = false; 
     125        } 
     126         
     127        public boolean getStatus() { 
     128                return active; 
     129        } 
    90130} 
Note: See TracChangeset for help on using the changeset viewer.