Changeset 2485


Ignore:
Timestamp:
03/20/07 12:57:14 (13 years ago)
Author:
curtis
Message:

Reenable multi-exponential fitting. Switch multi-exponential fit to have only
one C (offset), rather than one per exponential component. Normalize chi2 value
based on graph height magnitude per channel and number of degrees of freedom.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/apps/slim/SlimPlotter.java

    r2479 r2485  
    806806      miscRow3.add(scalePanel); 
    807807      miscRow3.add(Box.createHorizontalStrut(5)); 
     808      miscRow3.add(numCurves); 
     809      miscRow3.add(Box.createHorizontalStrut(5)); 
    808810      miscRow3.add(exportData); 
    809       //miscRow3.add(numCurves); 
    810811 
    811812      JPanel miscPanel = new JPanel(); 
     
    11561157      samps = new float[numChanVis * timeBins]; 
    11571158      maxVal = 0; 
     1159      float[] maxVals = new float[numChanVis]; 
    11581160      for (int c=0, cc=0; c<channels; c++) { 
    11591161        if (!cVisible[c]) continue; 
     
    11721174          if (doLog) samps[ndx] = (float) Math.log(samps[ndx] + 1); 
    11731175          if (samps[ndx] > maxVal) maxVal = samps[ndx]; 
     1176          if (samps[ndx] > maxVals[cc]) maxVals[cc] = samps[ndx]; 
    11741177          setProgress(progress, ++p); 
    11751178          if (progress.isCanceled()) plotCanceled = true; 
     
    11891192        for (int c=0; c<channels; c++) Arrays.fill(tau[c], Float.NaN); 
    11901193        ExpFunction func = new ExpFunction(numExp); 
    1191         float[] params = new float[3 * numExp]; 
     1194        float[] params = new float[2 * numExp + 1]; 
    11921195        if (numExp == 1) { 
    1193           params[0] = maxVal; 
     1196          //params[0] = maxVal; 
    11941197          params[1] = picoToBins(1000); 
    11951198          params[2] = 0; 
    11961199        } 
    11971200        else if (numExp == 2) { 
    1198           params[0] = maxVal / 2; 
     1201          //params[0] = maxVal / 2; 
    11991202          params[1] = picoToBins(800); 
    1200           params[2] = 0; 
    1201           params[0] = maxVal / 2; 
    1202           params[1] = picoToBins(2000); 
    1203           params[2] = 0; 
    1204         } 
    1205         //for (int i=0; i<numExp; i++) { 
    1206         //  // initial guess for (a, b, c) 
    1207         //  int e = 3 * i; 
    1208         //  params[e] = (numExp - i) * maxVal / (numExp + 1); 
    1209         //  params[e + 1] = picoToBins(1000 * (i + 1)); 
    1210         //  params[e + 2] = 0; 
    1211         //} 
     1203          //params[2] = maxVal / 2; 
     1204          params[3] = picoToBins(2000); 
     1205          params[4] = 0; 
     1206        } 
    12121207        int num = timeBins - maxPeak; 
    12131208 
     
    12241219        float[] weights = new float[num]; 
    12251220        Arrays.fill(weights, 1); // no weighting 
    1226         log("Computing fit parameters: y(t) = a * e^(-t/" + TAU + ") + c"); 
     1221        StringBuffer equation = new StringBuffer(); 
     1222        equation.append("y(t) = "); 
     1223        for (int i=0; i<numExp; i++) { 
     1224          equation.append("a"); 
     1225          equation.append(i + 1); 
     1226          equation.append(" * e^(-t/"); 
     1227          equation.append(TAU); 
     1228          equation.append(i + 1); 
     1229          equation.append(") + "); 
     1230        } 
     1231        equation.append("c"); 
     1232        log("Computing fit parameters: " + equation.toString()); 
    12271233        for (int c=0, cc=0; c<channels; c++) { 
    12281234          if (!cVisible[c]) { 
     
    12331239          System.arraycopy(samps, timeBins * cc + maxPeak, yVals, 0, num); 
    12341240          LMA lma = null; 
     1241          for (int i=0; i<numExp; i++) { 
     1242            int e = 2 * i; 
     1243            params[e] = maxVals[cc] / numExp; 
     1244          } 
    12351245          lma = new LMA(func, params, new float[][] {xVals, yVals}, 
    12361246            weights, new JAMAMatrix(params.length, params.length)); 
    12371247          lma.fit(); 
    12381248          log("\t\titerations=" + lma.iterationCount); 
     1249          // normalize chi2 by the channel's peak value 
     1250          if (maxVals[cc] != 0) lma.chi2 /= maxVals[cc]; 
     1251          // scale chi2 by degrees of freedom 
     1252          lma.chi2 /= num - params.length; 
    12391253          log("\t\tchi2=" + lma.chi2); 
    12401254          for (int i=0; i<numExp; i++) { 
    1241             int e = 3 * i; 
    1242             log("\t\ta" + i + "=" + lma.parameters[e]); 
     1255            int e = 2 * i; 
     1256            log("\t\ta" + (i + 1) + "=" + lma.parameters[e]); 
    12431257            tau[c][i] = binsToPico((float) (1 / lma.parameters[e + 1])); 
    1244             log("\t\t" + TAU + i + "=" + tau[c][i] + " ps"); 
    1245             log("\t\tc" + i + "=" + lma.parameters[e + 2]); 
     1258            log("\t\t" + TAU + (i + 1) + "=" + tau[c][i] + " ps"); 
    12461259          } 
     1260          log("\t\tc=" + lma.parameters[2 * numExp]); 
    12471261          fitResults[c] = lma.parameters; 
    12481262          setProgress(progress, ++p); 
     
    13371351                float sum = 0; 
    13381352                for (int i=0; i<numExp; i++) { 
    1339                   int e = 3 * i; 
    1340                   sum += (float) (q[e] * Math.exp(-q[e + 1] * et) + q[e + 2]); 
     1353                  int e = 2 * i; 
     1354                  sum += (float) (q[e] * Math.exp(-q[e + 1] * et)); 
    13411355                } 
     1356                sum += (float) q[2 * numExp]; 
    13421357                fitSamps[ndx] = sum; 
    13431358                residuals[ndx] = samps[ndx] - fitSamps[ndx]; 
     
    15861601      double sum = 0; 
    15871602      for (int i=0; i<numExp; i++) { 
    1588         int e = 3 * i; 
    1589         sum += a[e] * Math.exp(-a[e + 1] * x) + a[e + 2]; 
    1590       } 
     1603        int e = 2 * i; 
     1604        sum += a[e] * Math.exp(-a[e + 1] * x); 
     1605      } 
     1606      sum += a[2 * numExp]; 
    15911607      return sum; 
    15921608    } 
    15931609 
    15941610    public double getPartialDerivate(double x, double[] a, int parameterIndex) { 
    1595       int e = parameterIndex / 3; 
    1596       int off = parameterIndex % 3; 
     1611      if (parameterIndex == 2 * numExp) return 1; // c 
     1612      int e = parameterIndex / 2; 
     1613      int off = parameterIndex % 2; 
    15971614      switch (off) { 
    1598         case 0: return Math.exp(-a[e + 1] * x); 
    1599         case 1: return -a[e] * x * Math.exp(-a[e + 1] * x); 
    1600         case 2: return 1; 
    1601         default: 
    1602           throw new RuntimeException("No such parameter index: " + 
    1603             parameterIndex); 
    1604       } 
     1615        case 0: 
     1616          return Math.exp(-a[e + 1] * x); // a 
     1617        case 1: 
     1618          return -a[e] * x * Math.exp(-a[e + 1] * x); // b 
     1619      } 
     1620      throw new RuntimeException("No such parameter index: " + 
     1621        parameterIndex); 
    16051622    } 
    16061623  } 
Note: See TracChangeset for help on using the changeset viewer.