Changeset 4241


Ignore:
Timestamp:
07/23/08 14:07:16 (12 years ago)
Author:
curtis
Message:

Initial integration of per-pixel lifetime; miscellaneous bugfixes and cleanup.

Location:
trunk/loci/slim
Files:
6 edited

Legend:

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

    r4235 r4241  
    5757    maxDim = 1 << subsampleLevel; // 2^subsampleLevel 
    5858    maxProgress = 2 * maxDim * maxDim - 1; 
    59     image = new double[1][maxDim*maxDim]; 
    6059    alive = false; 
    6160    maxIterations = Integer.MAX_VALUE; 
     
    6564    estimated = false; 
    6665    improving = false; 
     66    setComponentCount(1); 
    6767  } 
    6868 
     
    7474 
    7575  public void run() { 
     76    alive = true; 
    7677    // initial pass - estimates 
    7778    while(subsampleLevel >= 0 && alive && !estimated) { 
  • trunk/loci/slim/CurveCollection.java

    r4235 r4241  
    7878   */ 
    7979  public CurveCollection(CurveFitter[][] curveFitters) { 
     80    Class curveFitterClass = curveFitters[0][0].getClass(); 
    8081    int numRows = curveFitters.length; 
    8182    int numCols = curveFitters[0].length; 
     
    9899      for (int y=0; y<res; y++) { 
    99100        for (int x=0; x<res; x++) { 
    100           CurveFitter cf = newCurveFitter(curves.getClass()); 
     101          CurveFitter cf = newCurveFitter(curveFitterClass); 
    101102          int[] data0 = curves[d-1][2*y][2*x].getData(); 
    102103          int[] data1 = curves[d-1][2*y][2*x+1].getData(); 
     
    147148   */ 
    148149  public void setComponentCount(int numExp) { 
    149     int depth = curves.length; 
    150     int numRows = curves[0].length; 
    151     int numCols = curves[0][0].length; 
    152     for (int d=0; d<depth; d++) { 
    153       for (int y=0; y<numRows; y++) { 
    154         for (int x=0; x<numCols; x++) { 
     150    for (int d=0; d<curves.length; d++) { 
     151      for (int y=0; y<curves[d].length; y++) { 
     152        for (int x=0; x<curves[d][y].length; x++) { 
    155153          curves[d][y][x].setComponentCount(numExp); 
    156154        } 
     
    206204      return (CurveFitter) c.newInstance(); 
    207205    } 
    208     catch (InstantiationException exc) { exc.printStackTrace(); } 
    209     catch (IllegalAccessException exc) { exc.printStackTrace(); } 
     206    catch (InstantiationException exc) { exc.printStackTrace(System.out); } 
     207    catch (IllegalAccessException exc) { exc.printStackTrace(System.out); } 
    210208    return null; 
    211209  } 
  • trunk/loci/slim/GACurveFitter.java

    r4240 r4241  
    4848 
    4949  private static final boolean DEBUG = false; 
    50    
     50 
    5151  private static final int STALL_GENERATIONS = 5; 
    5252  private static final double STALLED_FACTOR = 2.0d; 
     
    5454  private static final int SPECIMENS = 25; 
    5555  // Must be 0 < x < 1 
    56   private static final double INITIAL_MUTATION_FACTOR = .5;  
     56  private static final double INITIAL_MUTATION_FACTOR = .5; 
    5757  // Must be 0 < x < 1 
    5858  private static final double MUTATION_FACTOR_REDUCTION = .9; 
    59    
     59 
    6060  // -- Constructor -- 
    6161 
     
    7575  } 
    7676 
    77    
     77 
    7878  // -- CurveFitter API methods -- 
    7979 
     
    153153            // mutate, if necessary 
    154154            if (r.nextDouble() < MUTATION_CHANCE) { 
    155               newGeneration[i][j][k] *=  
     155              newGeneration[i][j][k] *= 
    156156                ((1.0 - mutationFactor) + r.nextDouble() * (2.0 * mutationFactor)); 
    157157            } 
  • trunk/loci/slim/LMCurveFitter.java

    r4239 r4241  
    4646  protected ExpFunction func; 
    4747  protected int numExponentials = 1; 
    48   protected double[][] curve; 
    49   protected double chi2; 
    5048 
    51   // histogram data 
    52   protected int[] data; 
    5349  protected int maxVal; 
    5450  protected float[] xVals, yVals, weights; 
     
    6965  public void iterate() { } 
    7066 
    71   /** Gets raw chi squared error. */ 
    72   public double getChiSquaredError() { return chi2; } 
    73  
    74   /** Gets chi squared error scaled by degrees of freedom. */ 
    75   public double getReducedChiSquaredError() { 
    76     return chi2 / (data.length - 2 * numExponentials - 1); 
    77   } 
    78  
    7967  public void setData(int[] data) { 
    80     this.data = data; 
    81     int num = data.length; 
     68    curveData = data; 
     69    int num = curveData.length; 
    8270    xVals = new float[num]; 
    8371    yVals = new float[num]; 
     
    8573    maxVal = 0; 
    8674    for (int i=0; i<num; i++) { 
    87       if (data[i] > maxVal) maxVal = data[i]; 
     75      if (curveData[i] > maxVal) maxVal = curveData[i]; 
    8876      xVals[i] = i; 
    89       yVals[i] = data[i]; 
     77      yVals[i] = curveData[i]; 
    9078      weights[i] = 1; // no weighting 
    9179    } 
    9280  } 
    9381 
    94   public int[] getData() { return data; } 
     82  public int[] getData() { return curveData; } 
    9583 
    9684  /** Sets the number of components in the fit. Must be 1 or 2. */ 
     
    10896  /** HACK - performs the actual fit. */ 
    10997  public void estimate() { 
    110     int num = data.length; 
     98    int num = curveData.length; 
    11199    final float[] guess = {num / 10, num / 5}; 
    112100    float[] params = new float[2 * numExponentials + 1]; 
     
    121109    //log("\t\titerations=" + lma.iterationCount); 
    122110 
    123     // compute chi2 
    124     chi2 = lma.chi2; 
    125     //if (maxVal != 0) chi2 /= maxVal; // normalize chi2 by the peak value (?) 
    126  
    127111    // store parameters into curve array 
    128     curve = new double[numExponentials][3]; 
     112    curveEstimate = new double[numExponentials][3]; 
    129113    for (int i=0; i<numExponentials; i++) { 
    130114      int e = 2 * i; 
    131       curve[i][0] = lma.parameters[e]; // a 
    132       curve[i][1] = lma.parameters[e + 1]; // b 
     115      curveEstimate[i][0] = lma.parameters[e]; // a 
     116      curveEstimate[i][1] = lma.parameters[e + 1]; // b 
    133117    } 
    134     curve[0][2] = lma.parameters[2 * numExponentials]; // c 
     118    curveEstimate[0][2] = lma.parameters[2 * numExponentials]; // c 
    135119  } 
    136120 
    137121  /** Gets the fit results. */ 
    138   public double[][] getCurve() { return curve; } 
     122  public double[][] getCurve() { return curveEstimate; } 
    139123 
    140124  /** Sets the fit results. */ 
    141   public void setCurve(double[][] curve) { this.curve = curve; } 
     125  public void setCurve(double[][] curve) { curveEstimate = curve; } 
    142126 
    143127  // -- Helper classes -- 
  • trunk/loci/slim/SlimPlotter.java

    r4238 r4241  
    480480      masterWindow.setContentPane(masterPane); 
    481481 
    482       twoDPane = new TwoDPane(this, values, cVisible, types); 
     482      twoDPane = new TwoDPane(this, values, numExp, 
     483        useLMA ? LMCurveFitter.class : GACurveFitter.class, cVisible, types); 
    483484 
    484485      MenuBar menubar = new MenuBar(); 
  • trunk/loci/slim/TwoDPane.java

    r4238 r4241  
    5656  // -- Constants -- 
    5757 
     58  private static final int BIN_RADIUS = 3; // TODO - make this a UI option 
    5859  private static final Color INVALID_COLOR = Color.red.brighter(); 
    5960 
     
    6970  private int[][][][] data; 
    7071  private int channels, width, height, timeBins; 
     72  private int numExp; 
     73  private Class curveFitterClass; 
    7174  private boolean[] cVisible; 
    7275  private SlimTypes types; 
     
    100103  private JCheckBox cToggle; 
    101104 
     105  // parameters for multithreaded lifetime computation 
     106  private Renderer[] curveRenderers; 
     107  private Thread[] curveThreads; 
     108  private Timer lifetimeRefresh; 
     109 
    102110  // -- Constructor -- 
    103111 
    104   public TwoDPane(SlimPlotter slim, int[][][][] data, 
    105     boolean[] cVisible, SlimTypes types) 
     112  public TwoDPane(SlimPlotter slim, int[][][][] data, int numExp, 
     113    Class curveFitterClass, boolean[] cVisible, SlimTypes types) 
    106114    throws VisADException, RemoteException 
    107115  { 
     
    115123    height = data[0][0].length; 
    116124    timeBins = data[0][0][0].length; 
     125 
     126    this.numExp = numExp; 
     127    this.curveFitterClass = curveFitterClass; 
    117128 
    118129    roiCount = width * height; 
     
    143154    roiGrid = new float[2][width * height]; 
    144155    roiMask = new boolean[height][width]; 
    145     for (int h=0; h<height; h++) { 
    146       for (int w=0; w<width; w++) { 
    147         int ndx = h * width + w; 
    148         roiGrid[0][ndx] = w; 
    149         roiGrid[1][ndx] = h; 
    150         roiMask[h][w] = true; 
     156    for (int y=0; y<height; y++) { 
     157      for (int x=0; x<width; x++) { 
     158        int ndx = y * width + x; 
     159        roiGrid[0][ndx] = x; 
     160        roiGrid[1][ndx] = y; 
     161        roiMask[y][x] = true; 
    151162      } 
    152163    } 
     
    200211 
    201212    progress = new JProgressBar(); 
     213    progress.setStringPainted(true); 
    202214    add(progress); 
    203215 
     
    293305 
    294306    cSlider.setValue(maxChan + 1); 
     307 
     308    // set up lifetime curve fitting threads for per-pixel lifetime analysis 
     309    curveRenderers = new Renderer[channels]; 
     310    curveThreads = new Thread[channels]; 
     311    for (int c=0; c<channels; c++) { 
     312      CurveCollection cc = new CurveCollection(data[c], 
     313        curveFitterClass, BIN_RADIUS); 
     314      curveRenderers[c] = new BurnInRenderer(cc); 
     315      curveRenderers[c].setComponentCount(numExp); 
     316      curveThreads[c] = new Thread(curveRenderers[c], "Lifetime-" + c); 
     317      curveThreads[c].setPriority(Thread.MIN_PRIORITY); 
     318    } 
     319    int delay = 100; // TODO - make this a UI option (FPS) 
     320    lifetimeRefresh = new Timer(delay, this); 
     321    for (int c=0; c<channels; c++) curveThreads[c].start(); 
     322    lifetimeRefresh.start(); 
    295323  } 
    296324 
     
    318346    else if (src == projectionMode) doSpectralProjection(); 
    319347    else if (src == emissionMode) doEmissionSpectrum(); 
     348    else { 
     349      // timer event - update lifetime display 
     350      int c = cSlider.getValue() - 1; 
     351      // update progress bar 
     352      progress.setMaximum(curveRenderers[c].getMaxProgress()); 
     353      progress.setValue(curveRenderers[c].getCurrentProgress()); 
     354      progress.setString( 
     355        "Iteration " + curveRenderers[c].getCurrentIterations() + 
     356        "/" + curveRenderers[c].getTotalIterations() + "; " + 
     357        curveRenderers[c].getSubsampleLevel() + " steps until total burn-in"); 
     358 
     359      if (lifetimeMode.isSelected()) { 
     360        // update VisAD display 
     361        double[][] lifetimeImage = curveRenderers[c].getImage(); 
     362        try { 
     363          FlatField ff = (FlatField) lifetimeField.getSample(c); 
     364          ff.setSamples(lifetimeImage); 
     365          imageRef.setData(lifetimeField); 
     366        } 
     367        catch (VisADException exc) { exc.printStackTrace(); } 
     368        catch (RemoteException exc) { exc.printStackTrace(); } 
     369      } 
     370    } 
    320371  } 
    321372 
     
    364415          roiX = roiY = 0; 
    365416          roiCount = 0; 
    366           for (int h=0; h<height; h++) { 
    367             for (int w=0; w<width; w++) { 
    368               int ndx = h * width + w; 
    369               roiMask[h][w] = tri[ndx] >= 0; 
    370               if (roiMask[h][w]) { 
    371                 roiX = w; 
    372                 roiY = h; 
     417          for (int y=0; y<height; y++) { 
     418            for (int x=0; x<width; x++) { 
     419              int ndx = y * width + x; 
     420              roiMask[y][x] = tri[ndx] >= 0; 
     421              if (roiMask[y][x]) { 
     422                roiX = x; 
     423                roiY = y; 
    373424                roiCount++; 
    374425              } 
Note: See TracChangeset for help on using the changeset viewer.