Changeset 4214


Ignore:
Timestamp:
07/21/08 14:34:55 (12 years ago)
Author:
curtis
Message:

Split intensity pane into a separate class.

Location:
trunk/loci/slim
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/slim/GACurveFitter.java

    r4212 r4214  
    209209 
    210210  /** 
    211    * Returns a reference to the data array 
     211   * Returns a reference to the data array. 
    212212   * Does not create a copy. 
    213    **/  
     213   */ 
    214214  public int[] getData() { 
    215215    return curveData; 
  • trunk/loci/slim/SlimPlotter.java

    r4048 r4214  
    5050import loci.visbio.util.OutputConsole; 
    5151import visad.*; 
    52 import visad.bom.CurveManipulationRendererJ3D; 
    5352import visad.java3d.*; 
    5453import visad.util.ColorMapWidget; 
     
    6564 */ 
    6665public class SlimPlotter implements ActionListener, ChangeListener, 
    67   DisplayListener, DocumentListener, Runnable, WindowListener 
     66  DocumentListener, Runnable, WindowListener 
    6867{ 
    6968 
     
    126125  private int[] maxIntensity; 
    127126 
    128   // ROI parameters 
    129   private float[][] roiGrid; 
    130   private boolean[][] roiMask; 
    131   private UnionSet curveSet; 
    132   private Irregular2DSet roiSet; 
    133   private DataReferenceImpl roiRef; 
    134   private int roiX, roiY; 
    135   private int roiCount; 
    136   private double roiPercent; 
    137127  private float maxVal; 
    138128  private float tauMin, tauMax; 
     
    155145 
    156146  // GUI components for intensity pane 
    157   private JSlider cSlider; 
    158   private JLabel minLabel, maxLabel; 
    159   private JSlider minSlider, maxSlider; 
    160   private JCheckBox cToggle; 
     147  private IntensityPane intensityPane; 
    161148 
    162149  // GUI components for decay pane 
     
    196183  private DataRenderer decayRend, fitRend, resRend, lineRend, fwhmRend; 
    197184  private DataReferenceImpl decayRef, fwhmRef, fitRef, resRef; 
    198   private DisplayImpl iPlot, decayPlot; 
    199   private ScalarMap intensityMap; 
    200   private AnimationControl ac; 
     185  private DisplayImpl decayPlot; 
    201186 
    202187  // -- Constructor -- 
     
    352337      if (cVisible == null) System.exit(0); // dialog canceled (closed with X) 
    353338      maxWave = minWave + (channels - 1) * waveStep; 
    354       roiCount = width * height; 
    355       roiPercent = 100; 
    356339 
    357340      // pop up progress monitor 
     
    406389      // plot intensity data in 2D display 
    407390      progress.setNote("Building displays"); 
    408       iPlot = new DisplayImplJ3D("intensity", new TwoDDisplayRendererJ3D()); 
    409       iPlot.getMouseBehavior().getMouseHelper().setFunctionMap(new int[][][] { 
    410         {{MouseHelper.DIRECT, MouseHelper.NONE}, // L, shift-L 
    411          {MouseHelper.NONE, MouseHelper.NONE}}, // ctrl-L, ctrl-shift-L 
    412         {{MouseHelper.CURSOR_TRANSLATE, MouseHelper.CURSOR_ZOOM}, // M, shift-M 
    413          {MouseHelper.CURSOR_ROTATE, MouseHelper.NONE}}, // ctrl-M, ctrl-shift-M 
    414         {{MouseHelper.ROTATE, MouseHelper.ZOOM}, // R, shift-R 
    415          {MouseHelper.TRANSLATE, MouseHelper.NONE}}, // ctrl-R, ctrl-shift-R 
    416       }); 
    417       iPlot.enableEvent(DisplayEvent.MOUSE_DRAGGED); 
    418       iPlot.addDisplayListener(this); 
     391 
    419392      setProgress(progress, 720); // estimate: 72% 
    420393      if (progress.isCanceled()) System.exit(0); 
    421394 
    422       iPlot.addMap(new ScalarMap(xType, Display.XAxis)); 
    423       iPlot.addMap(new ScalarMap(yType, Display.YAxis)); 
    424       intensityMap = new ScalarMap(vType, Display.RGB); 
    425       iPlot.addMap(intensityMap); 
    426       iPlot.addMap(new ScalarMap(cType, Display.Animation)); 
    427       DataReferenceImpl intensityRef = new DataReferenceImpl("intensity"); 
    428       iPlot.addReference(intensityRef); 
    429395      setProgress(progress, 730); // estimate: 73% 
    430396      if (progress.isCanceled()) System.exit(0); 
    431397 
    432       // set up curve manipulation renderer in 2D display 
    433       roiGrid = new float[2][width * height]; 
    434       roiMask = new boolean[height][width]; 
    435       for (int h=0; h<height; h++) { 
    436         for (int w=0; w<width; w++) { 
    437           int ndx = h * width + w; 
    438           roiGrid[0][ndx] = w; 
    439           roiGrid[1][ndx] = h; 
    440           roiMask[h][w] = true; 
    441         } 
    442       } 
    443       final DataReferenceImpl curveRef = new DataReferenceImpl("curve"); 
    444       UnionSet dummyCurve = new UnionSet(new Gridded2DSet[] { 
    445         new Gridded2DSet(xy, new float[][] {{0}, {0}}, 1) 
    446       }); 
    447       curveRef.setData(dummyCurve); 
    448       CurveManipulationRendererJ3D curve = 
    449         new CurveManipulationRendererJ3D(0, 0, true); 
    450       iPlot.addReferences(curve, curveRef); 
    451       CellImpl cell = new CellImpl() { 
    452         public void doAction() throws VisADException, RemoteException { 
    453           // save latest drawn curve 
    454           curveSet = (UnionSet) curveRef.getData(); 
    455         } 
    456       }; 
    457       cell.addReference(curveRef); 
    458       roiRef = new DataReferenceImpl("roi"); 
    459       roiRef.setData(new Real(0)); // dummy 
    460       iPlot.addReference(roiRef, new ConstantMap[] { 
    461         new ConstantMap(0, Display.Blue), 
    462         new ConstantMap(0.1, Display.Alpha) 
    463       }); 
    464398      setProgress(progress, 740); // estimate: 74% 
    465399      if (progress.isCanceled()) System.exit(0); 
    466  
    467       ac = (AnimationControl) iPlot.getControl(AnimationControl.class); 
    468       iPlot.getProjectionControl().setMatrix( 
    469         iPlot.make_matrix(0, 0, 0, 0.85, 0, 0, 0)); 
    470400 
    471401      setProgress(progress, 750); // estimate: 75% 
     
    665595      masterPane.setLayout(new BorderLayout()); 
    666596      masterWindow.setContentPane(masterPane); 
    667       JPanel intensityPane = new JPanel(); 
    668       intensityPane.setLayout(new BoxLayout(intensityPane, BoxLayout.Y_AXIS)); 
    669       JPanel iPlotPane = new JPanel() { 
    670         private int height = 380; 
    671         public Dimension getMinimumSize() { 
    672           Dimension min = super.getMinimumSize(); 
    673           return new Dimension(min.width, height); 
    674         } 
    675         public Dimension getPreferredSize() { 
    676           Dimension pref = super.getPreferredSize(); 
    677           return new Dimension(pref.width, height); 
    678         } 
    679         public Dimension getMaximumSize() { 
    680           Dimension max = super.getMaximumSize(); 
    681           return new Dimension(max.width, height); 
    682         } 
    683       }; 
    684       iPlotPane.setLayout(new BorderLayout()); 
    685       iPlotPane.add(iPlot.getComponent(), BorderLayout.CENTER); 
    686       intensityPane.add(iPlotPane); 
     597 
     598      intensityPane = new IntensityPane(this, field, 
     599        width, height, channels, max, maxChan, cVisible, 
     600        xType, yType, vType, cType); 
    687601 
    688602      MenuBar menubar = new MenuBar(); 
     
    703617      menuViewLoadProj.addActionListener(this); 
    704618      menuView.add(menuViewLoadProj); 
    705  
    706       setProgress(progress, 970); // estimate: 97% 
    707       if (progress.isCanceled()) System.exit(0); 
    708  
    709       JPanel sliderPane = new JPanel(); 
    710       sliderPane.setLayout(new BoxLayout(sliderPane, BoxLayout.X_AXIS)); 
    711       intensityPane.add(sliderPane); 
    712       cSlider = new JSlider(1, channels, 1); 
    713       cSlider.setToolTipText( 
    714         "Selects the channel to display in the 2D intensity plot above"); 
    715       cSlider.setSnapToTicks(true); 
    716       cSlider.setMajorTickSpacing(channels / 4); 
    717       cSlider.setMinorTickSpacing(1); 
    718       cSlider.setPaintTicks(true); 
    719       cSlider.addChangeListener(this); 
    720       cSlider.setBorder(new EmptyBorder(8, 5, 8, 5)); 
    721       cSlider.setEnabled(channels > 1); 
    722       sliderPane.add(cSlider); 
    723       cToggle = new JCheckBox("", true); 
    724       cToggle.setToolTipText( 
    725         "Toggles the selected channel's visibility in the 3D data plot"); 
    726       cToggle.addActionListener(this); 
    727       cToggle.setEnabled(channels > 1); 
    728       sliderPane.add(cToggle); 
    729  
    730       JPanel minMaxPane = new JPanel(); 
    731       minMaxPane.setLayout(new BoxLayout(minMaxPane, BoxLayout.X_AXIS)); 
    732       intensityPane.add(minMaxPane); 
    733  
    734       JPanel minPane = new JPanel(); 
    735       minPane.setLayout(new BoxLayout(minPane, BoxLayout.Y_AXIS)); 
    736       minMaxPane.add(minPane); 
    737       minLabel = new JLabel("min=0"); 
    738       minLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT); 
    739       minPane.add(minLabel); 
    740       minSlider = new JSlider(0, max, 0); 
    741       minSlider.setToolTipText("<html>" + 
    742         "Adjusts intensity plot's minimum color value.<br>" + 
    743         "Anything less than this value appears black.</html>"); 
    744       minSlider.setMajorTickSpacing(max); 
    745       int minor = max / 16; 
    746       if (minor < 1) minor = 1; 
    747       minSlider.setMinorTickSpacing(minor); 
    748       minSlider.setPaintTicks(true); 
    749       minSlider.addChangeListener(this); 
    750       minSlider.setBorder(new EmptyBorder(0, 5, 8, 5)); 
    751       minPane.add(minSlider); 
    752  
    753       JPanel maxPane = new JPanel(); 
    754       maxPane.setLayout(new BoxLayout(maxPane, BoxLayout.Y_AXIS)); 
    755       minMaxPane.add(maxPane); 
    756       maxLabel = new JLabel("max=" + max); 
    757       maxLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT); 
    758       maxPane.add(maxLabel); 
    759       maxSlider = new JSlider(0, max, max); 
    760       maxSlider.setToolTipText("<html>" + 
    761         "Adjusts intensity plot's maximum color value.<br>" + 
    762         "Anything greater than this value appears white.</html>"); 
    763       maxSlider.setMajorTickSpacing(max); 
    764       maxSlider.setMinorTickSpacing(minor); 
    765       maxSlider.setPaintTicks(true); 
    766       maxSlider.addChangeListener(this); 
    767       maxSlider.setBorder(new EmptyBorder(0, 5, 8, 5)); 
    768       maxPane.add(maxSlider); 
    769  
    770       intensityRef.setData(field); 
    771       ColorControl cc = (ColorControl) iPlot.getControl(ColorControl.class); 
    772       cc.setTable(ColorControl.initTableGreyWedge(new float[3][256])); 
    773619 
    774620      setProgress(progress, 980); // estimate: 98% 
     
    1039885    try { Thread.sleep(200); } 
    1040886    catch (InterruptedException exc) { exc.printStackTrace(); } 
    1041     cSlider.setValue(maxChan + 1); 
    1042887  } 
    1043888 
     
    1073918  } 
    1074919 
    1075   /** Handles cursor updates. */ 
    1076   public void doCursor(double[] cursor, boolean rescale, boolean refit) { 
    1077     double[] domain = cursorToDomain(iPlot, cursor); 
    1078     roiX = (int) Math.round(domain[0]); 
    1079     roiY = (int) Math.round(domain[1]); 
    1080     if (roiX < 0) roiX = 0; 
    1081     if (roiX >= width) roiX = width - 1; 
    1082     if (roiY < 0) roiY = 0; 
    1083     if (roiY >= height) roiY = height - 1; 
    1084     roiCount = 1; 
    1085     plotData(true, rescale, refit); 
    1086   } 
    1087  
    1088920  /** Sets the currently selected range component's color widget table. */ 
    1089921  public void setWidgetTable(float[][] table) { 
     
    1121953        catch (RemoteException exc) { } 
    1122954      } 
    1123     } 
    1124     else if (src == cToggle) { 
    1125       // toggle visibility of this channel 
    1126       int c = cSlider.getValue() - 1; 
    1127       cVisible[c] = !cVisible[c]; 
    1128       plotData(true, true, false); 
    1129955    } 
    1130956    else if (src == cOverride) { 
     
    12251051      try { 
    12261052        PrintWriter out = new PrintWriter(new FileWriter(file)); 
    1227         out.println(timeBins + " x " + channels + " (count=" + roiCount + 
    1228           ", percent=" + roiPercent + ", maxVal=" + maxVal + ")"); 
     1053        out.println(timeBins + " x " + channels + 
     1054          " (count=" + intensityPane.getROICount() + 
     1055          ", percent=" + intensityPane.getROIPercent() + 
     1056          ", maxVal=" + maxVal + ")"); 
    12291057        for (int c=0; c<channels; c++) { 
    12301058          for (int t=0; t<timeBins; t++) { 
     
    12731101  /** Handles slider changes. */ 
    12741102  public void stateChanged(ChangeEvent e) { 
    1275     Object src = e.getSource(); 
    1276     if (src == cSlider) { 
    1277       int c = cSlider.getValue() - 1; 
    1278       try { ac.setCurrent(c); } 
    1279       catch (VisADException exc) { exc.printStackTrace(); } 
    1280       catch (RemoteException exc) { exc.printStackTrace(); } 
    1281       cToggle.removeActionListener(this); 
    1282       cToggle.setSelected(cVisible[c]); 
    1283       cToggle.addActionListener(this); 
    1284     } 
    1285     else if (src == minSlider) { 
    1286       int min = minSlider.getValue(); 
    1287       int max = maxSlider.getMaximum(); 
    1288       maxSlider.setMajorTickSpacing(max - min); 
    1289       int minor = (max - min) / 16; 
    1290       if (minor < 1) minor = 1; 
    1291       maxSlider.setMinorTickSpacing(minor); 
    1292       maxSlider.setMinimum(min); 
    1293       minLabel.setText("min=" + min); 
    1294       rescaleMinMax(); 
    1295     } 
    1296     else if (src == maxSlider) { 
    1297       int max = maxSlider.getValue(); 
    1298       minSlider.setMajorTickSpacing(max); 
    1299       int minor = max / 16; 
    1300       if (minor < 1) minor = 1; 
    1301       minSlider.setMinorTickSpacing(minor); 
    1302       minSlider.setMaximum(max); 
    1303       maxLabel.setText("max=" + max); 
    1304       rescaleMinMax(); 
    1305     } 
    1306     else if (src == numCurves) plotData(true, false, true); 
    1307   } 
    1308  
    1309   // -- DisplayListener methods -- 
    1310  
    1311   private boolean drag = false; 
    1312  
    1313   public void displayChanged(DisplayEvent e) { 
    1314     int id = e.getId(); 
    1315     if (id == DisplayEvent.MOUSE_PRESSED_CENTER) { 
    1316       drag = true; 
    1317       decayPlot.getDisplayRenderer(); 
    1318       doCursor(iPlot.getDisplayRenderer().getCursor(), false, false); 
    1319     } 
    1320     else if (id == DisplayEvent.MOUSE_RELEASED_CENTER) { 
    1321       drag = false; 
    1322       doCursor(iPlot.getDisplayRenderer().getCursor(), true, true); 
    1323     } 
    1324     else if (id == DisplayEvent.MOUSE_RELEASED_LEFT) { 
    1325       // done drawing curve 
    1326       try { 
    1327         roiSet = DelaunayCustom.fillCheck(curveSet, false); 
    1328         if (roiSet == null) { 
    1329           roiRef.setData(new Real(0)); 
    1330           doCursor(pixelToCursor(iPlot, e.getX(), e.getY()), true, true); 
    1331           iPlot.reAutoScale(); 
    1332         } 
    1333         else { 
    1334           roiRef.setData(roiSet); 
    1335           int[] tri = roiSet.valueToTri(roiGrid); 
    1336           roiX = roiY = 0; 
    1337           roiCount = 0; 
    1338           for (int h=0; h<height; h++) { 
    1339             for (int w=0; w<width; w++) { 
    1340               int ndx = h * width + w; 
    1341               roiMask[h][w] = tri[ndx] >= 0; 
    1342               if (roiMask[h][w]) { 
    1343                 roiX = w; 
    1344                 roiY = h; 
    1345                 roiCount++; 
    1346               } 
    1347             } 
    1348           } 
    1349           roiPercent = 100000 * roiCount / (width * height) / 1000.0; 
    1350           plotData(true, true, true); 
    1351         } 
    1352       } 
    1353       catch (VisADException exc) { 
    1354         String msg = exc.getMessage(); 
    1355         if ("path self intersects".equals(msg)) { 
    1356           JOptionPane.showMessageDialog(iPlot.getComponent(), 
    1357             "Please draw a curve that does not intersect itself.", 
    1358             "Slim Plotter", JOptionPane.ERROR_MESSAGE); 
    1359         } 
    1360         else exc.printStackTrace(); 
    1361       } 
    1362       catch (RemoteException exc) { exc.printStackTrace(); } 
    1363     } 
    1364     else if (id == DisplayEvent.MOUSE_DRAGGED) { 
    1365       if (!drag) return; // not a center mouse drag 
    1366       doCursor(iPlot.getDisplayRenderer().getCursor(), false, false); 
    1367     } 
     1103    plotData(true, false, true); 
    13681104  } 
    13691105 
     
    14201156          int ndx = timeBins * cc + t; 
    14211157          int sum = 0; 
    1422           if (roiCount == 1) sum = values[c][roiY][roiX][t]; 
     1158          if (intensityPane.getROICount() == 1) { 
     1159            int roiX = intensityPane.getROIX(); 
     1160            int roiY = intensityPane.getROIY(); 
     1161            sum = values[c][roiY][roiX][t]; 
     1162          } 
    14231163          else { 
     1164            boolean[][] roiMask = intensityPane.getROIMask(); 
    14241165            for (int h=0; h<height; h++) { 
    14251166              for (int w=0; w<width; w++) { 
     
    14511192          int sumTotal = 0; 
    14521193          for (int t=0; t<timeBins; t++) { 
    1453             if (roiCount == 1) sums[t] = values[c][roiY][roiX][t]; 
     1194            if (intensityPane.getROICount() == 1) { 
     1195              int roiX = intensityPane.getROIX(); 
     1196              int roiY = intensityPane.getROIY(); 
     1197              sums[t] = values[c][roiY][roiX][t]; 
     1198            } 
    14541199            else { 
     1200              boolean[][] roiMask = intensityPane.getROIMask(); 
    14551201              for (int h=0; h<height; h++) { 
    14561202                for (int w=0; w<width; w++) { 
     
    15901336      StringBuffer sb = new StringBuffer(); 
    15911337      sb.append("Decay curve for "); 
    1592       if (roiCount == 1) { 
     1338      if (intensityPane.getROICount() == 1) { 
     1339        int roiX = intensityPane.getROIX(); 
     1340        int roiY = intensityPane.getROIY(); 
    15931341        sb.append("("); 
    15941342        sb.append(roiX); 
     
    15981346      } 
    15991347      else { 
    1600         sb.append(roiCount); 
     1348        sb.append(intensityPane.getROICount()); 
    16011349        sb.append(" pixels ("); 
    1602         sb.append(roiPercent); 
     1350        sb.append(intensityPane.getROIPercent()); 
    16031351        sb.append("%)"); 
    16041352      } 
     
    19011649  } 
    19021650 
    1903   private void rescaleMinMax() { 
    1904     int min = minSlider.getValue(); 
    1905     int max = maxSlider.getValue(); 
    1906     try { intensityMap.setRange(min, max); } 
    1907     catch (VisADException exc) { exc.printStackTrace(); } 
    1908     catch (RemoteException exc) { exc.printStackTrace(); } 
    1909   } 
    1910  
    19111651  // -- Utility methods -- 
    1912  
    1913   /** Converts the given pixel coordinates to cursor coordinates. */ 
    1914   public static double[] pixelToCursor(DisplayImpl d, int x, int y) { 
    1915     if (d == null) return null; 
    1916     MouseBehavior mb = d.getDisplayRenderer().getMouseBehavior(); 
    1917     VisADRay ray = mb.findRay(x, y); 
    1918     return ray.position; 
    1919   } 
    1920  
    1921   /** Converts the given cursor coordinates to domain coordinates. */ 
    1922   public static double[] cursorToDomain(DisplayImpl d, double[] cursor) { 
    1923     return cursorToDomain(d, null, cursor); 
    1924   } 
    1925  
    1926   /** Converts the given cursor coordinates to domain coordinates. */ 
    1927   public static double[] cursorToDomain(DisplayImpl d, 
    1928     RealType[] types, double[] cursor) 
    1929   { 
    1930     if (d == null) return null; 
    1931  
    1932     // locate x, y and z mappings 
    1933     Vector maps = d.getMapVector(); 
    1934     int numMaps = maps.size(); 
    1935     ScalarMap mapX = null, mapY = null, mapZ = null; 
    1936     for (int i=0; i<numMaps; i++) { 
    1937       if (mapX != null && mapY != null && mapZ != null) break; 
    1938       ScalarMap map = (ScalarMap) maps.elementAt(i); 
    1939       if (types == null) { 
    1940         DisplayRealType drt = map.getDisplayScalar(); 
    1941         if (drt.equals(Display.XAxis)) mapX = map; 
    1942         else if (drt.equals(Display.YAxis)) mapY = map; 
    1943         else if (drt.equals(Display.ZAxis)) mapZ = map; 
    1944       } 
    1945       else { 
    1946         ScalarType st = map.getScalar(); 
    1947         if (st.equals(types[0])) mapX = map; 
    1948         if (st.equals(types[1])) mapY = map; 
    1949         if (st.equals(types[2])) mapZ = map; 
    1950       } 
    1951     } 
    1952  
    1953     // adjust for scale 
    1954     double[] scaleOffset = new double[2]; 
    1955     double[] dummy = new double[2]; 
    1956     double[] values = new double[3]; 
    1957     if (mapX == null) values[0] = Double.NaN; 
    1958     else { 
    1959       mapX.getScale(scaleOffset, dummy, dummy); 
    1960       values[0] = (cursor[0] - scaleOffset[1]) / scaleOffset[0]; 
    1961     } 
    1962     if (mapY == null) values[1] = Double.NaN; 
    1963     else { 
    1964       mapY.getScale(scaleOffset, dummy, dummy); 
    1965       values[1] = (cursor[1] - scaleOffset[1]) / scaleOffset[0]; 
    1966     } 
    1967     if (mapZ == null) values[2] = Double.NaN; 
    1968     else { 
    1969       mapZ.getScale(scaleOffset, dummy, dummy); 
    1970       values[2] = (cursor[2] - scaleOffset[1]) / scaleOffset[0]; 
    1971     } 
    1972  
    1973     return values; 
    1974   } 
    19751652 
    19761653  public static JTextField addRow(JPanel p, 
Note: See TracChangeset for help on using the changeset viewer.