use of org.vcell.vmicro.workflow.data.NormalizedSampleFunction in project vcell by virtualcell.
the class KenworthyWorkflowTest method analyzeKeyworthy.
/**
* Fits raw image time series data to uniform disk models (with Guassian or Uniform fluorescence).
*
* @param rawTimeSeriesImages
* @param localWorkspace
* @throws Exception
*/
private static void analyzeKeyworthy(ImageTimeSeries<UShortImage> rawTimeSeriesImages, LocalWorkspace localWorkspace) throws Exception {
new DisplayTimeSeriesOp().displayImageTimeSeries(rawTimeSeriesImages, "raw images", (WindowListener) null);
double cellThreshold = 0.5;
GeometryRoisAndBleachTiming cellROIresults = new GenerateCellROIsFromRawFrapTimeSeriesOp().generate(rawTimeSeriesImages, cellThreshold);
ROI backgroundROI = cellROIresults.backgroundROI_2D;
ROI cellROI = cellROIresults.cellROI_2D;
int indexOfFirstPostbleach = cellROIresults.indexOfFirstPostbleach;
new DisplayImageOp().displayImage(backgroundROI.getRoiImages()[0], "background ROI", null);
new DisplayImageOp().displayImage(cellROI.getRoiImages()[0], "cell ROI", null);
NormalizedFrapDataResults normResults = new GenerateNormalizedFrapDataOp().generate(rawTimeSeriesImages, backgroundROI, indexOfFirstPostbleach);
ImageTimeSeries<FloatImage> normalizedTimeSeries = normResults.normalizedFrapData;
FloatImage prebleachAvg = normResults.prebleachAverage;
FloatImage normalizedPostbleach = normalizedTimeSeries.getAllImages()[0];
new DisplayTimeSeriesOp().displayImageTimeSeries(normalizedTimeSeries, "normalized images", (WindowListener) null);
//
// create a single bleach ROI by thresholding
//
double bleachThreshold = 0.80;
ROI bleachROI = new GenerateBleachRoiOp().generateBleachRoi(normalizedPostbleach, cellROI, bleachThreshold);
//
// only use bleach ROI for fitting etc.
//
// ROI[] dataROIs = new ROI[] { bleachROI };
//
// fit 2D Gaussian to normalized data to determine center, radius and K factor of bleach (assuming exp(-exp
//
FitBleachSpotOpResults fitSpotResults = new FitBleachSpotOp().fit(NormalizedSampleFunction.fromROI(bleachROI), normalizedTimeSeries.getAllImages()[0]);
double bleachFactorK_GaussianFit = fitSpotResults.bleachFactorK_GaussianFit;
double bleachRadius_GaussianFit = fitSpotResults.bleachRadius_GaussianFit;
double bleachRadius_ROI = fitSpotResults.bleachRadius_ROI;
double centerX_GaussianFit = fitSpotResults.centerX_GaussianFit;
double centerX_ROI = fitSpotResults.centerX_ROI;
double centerY_GaussianFit = fitSpotResults.centerY_GaussianFit;
double centerY_ROI = fitSpotResults.centerY_ROI;
NormalizedSampleFunction[] sampleFunctions = new NormalizedSampleFunction[] { NormalizedSampleFunction.fromROI(bleachROI) };
//
// get reduced data and errors for each ROI
//
RowColumnResultSet reducedData = new GenerateReducedDataOp().generateReducedData(normalizedTimeSeries, sampleFunctions);
RowColumnResultSet measurementErrors = new ComputeMeasurementErrorOp().computeNormalizedMeasurementError(sampleFunctions, indexOfFirstPostbleach, rawTimeSeriesImages, prebleachAvg, null);
ErrorFunction errorFunction = new ErrorFunctionKenworthy(reducedData);
//
// 2 parameter uniform disk model
//
OptModel uniformDisk2OptModel = new OptModelKenworthyUniformDisk2P(bleachRadius_ROI);
String title_u2 = "Uniform Disk Model - 2 parameters, (Rn=" + bleachRadius_ROI + ")";
OptContext uniformDisk2Context = new Generate2DOptContextOp().generate2DOptContext(uniformDisk2OptModel, reducedData, measurementErrors, errorFunction);
new DisplayInteractiveModelOp().displayOptModel(uniformDisk2Context, sampleFunctions, localWorkspace, title_u2, null);
//
// 3 parameter uniform disk model
//
OptModel uniformDisk3OptModel = new OptModelKenworthyUniformDisk3P(bleachRadius_ROI);
OptContext uniformDisk3Context = new Generate2DOptContextOp().generate2DOptContext(uniformDisk3OptModel, reducedData, measurementErrors, errorFunction);
String title_u3 = "Uniform Disk Model - 3 parameters, (Rn=" + bleachRadius_ROI + ")";
new DisplayInteractiveModelOp().displayOptModel(uniformDisk3Context, sampleFunctions, localWorkspace, title_u3, null);
//
// GaussianFit parameter uniform disk model
//
FloatImage prebleachBleachAreaImage = new FloatImage(prebleachAvg);
// mask-out all but the bleach area
prebleachBleachAreaImage.and(bleachROI.getRoiImages()[0]);
double prebleachAvgInROI = prebleachBleachAreaImage.getImageStatistics().meanValue;
OptModel gaussian2OptModel = new OptModelKenworthyGaussian(prebleachAvgInROI, bleachFactorK_GaussianFit, bleachRadius_GaussianFit, bleachRadius_ROI);
OptContext gaussianDisk2Context = new Generate2DOptContextOp().generate2DOptContext(gaussian2OptModel, reducedData, measurementErrors, errorFunction);
String title_g2 = "Gaussian Disk Model - 2 parameters (prebleach=" + prebleachAvgInROI + ",K=" + bleachFactorK_GaussianFit + ",Re=" + bleachRadius_GaussianFit + ",Rnom=" + bleachRadius_ROI + ")";
new DisplayInteractiveModelOp().displayOptModel(gaussianDisk2Context, sampleFunctions, localWorkspace, title_g2, null);
}
use of org.vcell.vmicro.workflow.data.NormalizedSampleFunction in project vcell by virtualcell.
the class KenworthyParticleTest method analyzeKeyworthy.
/**
* Fits raw image time series data to uniform disk models (with Guassian or Uniform fluorescence).
*
* @param rawTimeSeriesImages
* @param localWorkspace
* @throws Exception
*/
private static void analyzeKeyworthy(ImageTimeSeries<UShortImage> rawTimeSeriesImages, RowColumnResultSet reducedData, LocalWorkspace localWorkspace) throws Exception {
new DisplayTimeSeriesOp().displayImageTimeSeries(rawTimeSeriesImages, "raw images", (WindowListener) null);
// double cellThreshold = 0.5;
// GeometryRoisAndBleachTiming cellROIresults = new GenerateCellROIsFromRawFrapTimeSeriesOp().generate(rawTimeSeriesImages, cellThreshold);
// ROI backgroundROI = cellROIresults.backgroundROI_2D;
// ROI cellROI = cellROIresults.cellROI_2D;
// int indexOfFirstPostbleach = cellROIresults.indexOfFirstPostbleach;
//
// new DisplayImageOp().displayImage(backgroundROI.getRoiImages()[0], "background ROI", null);
// new DisplayImageOp().displayImage(cellROI.getRoiImages()[0], "cell ROI", null);
//
// NormalizedFrapDataResults normResults = new GenerateNormalizedFrapDataOp().generate(rawTimeSeriesImages, backgroundROI, indexOfFirstPostbleach);
// ImageTimeSeries<FloatImage> normalizedTimeSeries = normResults.normalizedFrapData;
// FloatImage prebleachAvg = normResults.prebleachAverage;
// FloatImage normalizedPostbleach = normalizedTimeSeries.getAllImages()[0];
//
//
// new DisplayTimeSeriesOp().displayImageTimeSeries(normalizedTimeSeries, "normalized images", (WindowListener)null);
// //
// // create a single bleach ROI by thresholding
// //
// double bleachThreshold = 0.80;
// ROI bleachROI = new GenerateBleachRoiOp().generateBleachRoi(normalizedPostbleach, cellROI, bleachThreshold);
//
// //
// // only use bleach ROI for fitting etc.
// //
// // ROI[] dataROIs = new ROI[] { bleachROI };
//
// //
// // fit 2D Gaussian to normalized data to determine center, radius and K factor of bleach (assuming exp(-exp
// //
// FitBleachSpotOpResults fitSpotResults = new FitBleachSpotOp().fit(NormalizedSampleFunction.fromROI(bleachROI), normalizedTimeSeries.getAllImages()[0]);
// double bleachFactorK_GaussianFit = fitSpotResults.bleachFactorK_GaussianFit;
// double bleachRadius_GaussianFit = fitSpotResults.bleachRadius_GaussianFit;
// double bleachRadius_ROI = fitSpotResults.bleachRadius_ROI;
// double centerX_GaussianFit = fitSpotResults.centerX_GaussianFit;
// double centerX_ROI = fitSpotResults.centerX_ROI;
// double centerY_GaussianFit = fitSpotResults.centerY_GaussianFit;
// double centerY_ROI = fitSpotResults.centerY_ROI;
//
// NormalizedSampleFunction[] sampleFunctions = new NormalizedSampleFunction[] {
// NormalizedSampleFunction.fromROI(bleachROI)
// };
//
// get reduced data and errors for each ROI
//
// RowColumnResultSet reducedData = new GenerateReducedDataOp().generateReducedData(normalizedTimeSeries, sampleFunctions);
RowColumnResultSet measurementErrors = new RowColumnResultSet(new String[] { reducedData.getColumnDescriptions()[0].getName(), reducedData.getColumnDescriptions()[1].getName() });
for (int i = 0; i < reducedData.getRowCount(); i++) {
double[] row = new double[] { reducedData.getRow(i)[0], Math.sqrt(reducedData.getRow(i)[1]) };
measurementErrors.addRow(row);
}
new DisplayPlotOp().displayPlot(reducedData, "raw reduced data", null);
new DisplayPlotOp().displayPlot(measurementErrors, "raw reduced noise", null);
//
// find large drop and determine first post-bleach timepoint.
//
double largestDrop = -1000000;
int indexLargestDrop = -1;
for (int i = 1; i < reducedData.getRowCount(); i++) {
double drop = reducedData.getRow(i - 1)[1] - reducedData.getRow(i)[1];
if (drop > largestDrop) {
indexLargestDrop = i;
largestDrop = drop;
}
}
System.out.println("index of first postbleach is " + indexLargestDrop);
//
// normalize data and noise and start with first post-bleach index;
//
RowColumnResultSet normalizedReducedData = new RowColumnResultSet(new String[] { reducedData.getColumnDescriptions()[0].getName(), reducedData.getColumnDescriptions()[1].getName() });
RowColumnResultSet normalizedNoiseData = new RowColumnResultSet(new String[] { reducedData.getColumnDescriptions()[0].getName(), reducedData.getColumnDescriptions()[1].getName() });
for (int i = indexLargestDrop; i < reducedData.getRowCount(); i++) {
double timeAfterBleach = reducedData.getRow(i)[0] - reducedData.getRow(indexLargestDrop)[0];
double normalizedData = reducedData.getRow(i)[1] / reducedData.getRow(0)[1];
double[] newDataRow = new double[] { timeAfterBleach, normalizedData };
normalizedReducedData.addRow(newDataRow);
double normalizedNoise = measurementErrors.getRow(i)[1] / reducedData.getRow(0)[1];
double[] newNoiseRow = new double[] { timeAfterBleach, normalizedNoise };
normalizedNoiseData.addRow(newNoiseRow);
}
new DisplayPlotOp().displayPlot(normalizedReducedData, "normalized reduced data", null);
new DisplayPlotOp().displayPlot(normalizedNoiseData, "normalized reduced noise", null);
NormalizedSampleFunction[] sampleFunctions = new NormalizedSampleFunction[] { NormalizedSampleFunction.createUniform("psf", null, null, new ISize(10, 10, 1)) };
ErrorFunction errorFunction = new ErrorFunctionKenworthy(normalizedReducedData);
// ErrorFunction errorFunction = new ErrorFunctionMeanSquared();
double bleachRadius_ROI = 2;
//
// 2 parameter uniform disk model
//
OptModel uniformDisk2OptModel = new OptModelKenworthyUniformDisk2P(bleachRadius_ROI);
String title_u2 = "Uniform Disk Model - 2 parameters, (Rn=" + bleachRadius_ROI + ")";
OptContext uniformDisk2Context = new Generate2DOptContextOp().generate2DOptContext(uniformDisk2OptModel, normalizedReducedData, normalizedNoiseData, errorFunction);
new DisplayInteractiveModelOp().displayOptModel(uniformDisk2Context, sampleFunctions, localWorkspace, title_u2, null);
//
// 3 parameter uniform disk model
//
OptModel uniformDisk3OptModel = new OptModelKenworthyUniformDisk3P(bleachRadius_ROI);
OptContext uniformDisk3Context = new Generate2DOptContextOp().generate2DOptContext(uniformDisk3OptModel, normalizedReducedData, normalizedNoiseData, errorFunction);
String title_u3 = "Uniform Disk Model - 3 parameters, (Rn=" + bleachRadius_ROI + ")";
new DisplayInteractiveModelOp().displayOptModel(uniformDisk3Context, sampleFunctions, localWorkspace, title_u3, null);
ProfileData[] profileData = new RunProfileLikelihoodGeneralOp().runProfileLikihood(uniformDisk3Context, null);
new DisplayProfileLikelihoodPlotsOp().displayProfileLikelihoodPlots(profileData, "3param model", null);
//
// GaussianFit parameter uniform disk model
//
// FloatImage prebleachBleachAreaImage = new FloatImage(prebleachAvg);
// prebleachBleachAreaImage.and(bleachROI.getRoiImages()[0]); // mask-out all but the bleach area
// double prebleachAvgInROI = prebleachBleachAreaImage.getImageStatistics().meanValue;
// OptModel gaussian2OptModel = new OptModelKenworthyGaussian(prebleachAvgInROI, bleachFactorK_GaussianFit, bleachRadius_GaussianFit, bleachRadius_ROI);
// OptContext gaussianDisk2Context = new Generate2DOptContextOp().generate2DOptContext(gaussian2OptModel, reducedData, measurementErrors, errorFunction);
// String title_g2 = "Gaussian Disk Model - 2 parameters (prebleach="+prebleachAvgInROI+",K="+bleachFactorK_GaussianFit+",Re="+bleachRadius_GaussianFit+",Rnom="+bleachRadius_ROI+")";
// new DisplayInteractiveModelOp().displayOptModel(gaussianDisk2Context, sampleFunctions, localWorkspace, title_g2, null);
}
use of org.vcell.vmicro.workflow.data.NormalizedSampleFunction in project vcell by virtualcell.
the class ComputeMeasurementError method compute0.
@Override
protected void compute0(TaskContext context, final ClientTaskStatusSupport clientTaskStatusSupport) throws Exception {
ROI[] rois = context.getData(imageDataROIs);
int indexPostbleach = context.getData(indexFirstPostbleach);
ImageTimeSeries<UShortImage> rawImageDataset = context.getData(rawImageTimeSeries);
FloatImage prebleachAvgImage = context.getData(prebleachAverage);
ArrayList<NormalizedSampleFunction> roiSampleFunctions = new ArrayList<NormalizedSampleFunction>();
for (int i = 0; i < rois.length; i++) {
roiSampleFunctions.add(NormalizedSampleFunction.fromROI(rois[i]));
}
// do op
ComputeMeasurementErrorOp op = new ComputeMeasurementErrorOp();
NormalizedSampleFunction[] roiSampleFunctionArray = roiSampleFunctions.toArray(new NormalizedSampleFunction[0]);
RowColumnResultSet rowColumnResultSet = op.computeNormalizedMeasurementError(roiSampleFunctionArray, indexPostbleach, rawImageDataset, prebleachAvgImage, clientTaskStatusSupport);
// set output
context.setData(normalizedMeasurementError, rowColumnResultSet);
}
use of org.vcell.vmicro.workflow.data.NormalizedSampleFunction in project vcell by virtualcell.
the class DisplayInteractiveModel method compute0.
@Override
protected void compute0(TaskContext context, final ClientTaskStatusSupport clientTaskStatusSupport) throws Exception {
// get input
String titleString = context.getDataWithDefault(title, "no title - not connected");
OptContext optcontext = context.getData(optContext);
NormalizedSampleFunction[] roiArray = context.getData(rois);
DisplayInteractiveModelOp op = new DisplayInteractiveModelOp();
op.displayOptModel(optcontext, roiArray, context.getLocalWorkspace(), titleString, null);
// set output
context.setData(displayed, true);
}
Aggregations