use of org.vcell.util.Origin in project vcell by virtualcell.
the class GenerateTrivial2DPsfOp method generateTrivial2D_Psf.
public UShortImage generateTrivial2D_Psf() {
// psf image is now expecting a 3x3 image that are all zeros with a 1 in the middle (Kronecker delta)
short[] pixels = new short[] { 0, 0, 0, 0, 1, 0, 0, 0, 0 };
Origin origin = new Origin(0, 0, 0);
Extent extent = new Extent(1, 1, 1);
ISize isize = new ISize(3, 3, 1);
UShortImage psfImage;
try {
psfImage = new UShortImage(pixels, origin, extent, isize.getX(), isize.getY(), isize.getZ());
} catch (ImageException e) {
e.printStackTrace();
throw new RuntimeException("unexpected image exception: " + e.getMessage(), e);
}
return psfImage;
}
use of org.vcell.util.Origin in project vcell by virtualcell.
the class FitBleachSpotOp method main.
public static void main(String[] args) {
try {
int numX = 100;
int numY = 100;
double center_i = 52.44;
double center_j = 51.39;
double K = 30;
double high = 0.9;
double sigma2 = 4;
float[] pixels = new float[numX * numY];
Origin origin = new Origin(0, 0, 0);
Extent extent = new Extent(1, 1, 1);
FloatImage image = new FloatImage(pixels, origin, extent, numX, numY, 1);
int index = 0;
for (int j = 0; j < numY; j++) {
for (int i = 0; i < numX; i++) {
double radius = ((i - center_i) * (i - center_i) + (j - center_j) * (j - center_j));
pixels[index++] = (float) (high - FastMath.exp(-K * FastMath.exp(-radius / sigma2)));
}
}
double init_center_i = 50;
double init_center_j = 50;
double init_sigma2 = 2;
GaussianFitResults fitResults = fitToGaussian(init_center_i, init_center_j, init_sigma2, image);
System.out.println(fitResults);
} catch (Exception e) {
e.printStackTrace();
}
}
use of org.vcell.util.Origin in project vcell by virtualcell.
the class FitBleachSpotOp method fit.
public FitBleachSpotOpResults fit(NormalizedSampleFunction bleachROI, FloatImage normImage) {
//
// find initial guess by centroid from bleach ROI and total area of bleach ROI (assuming a circle of radius R)
//
ISize size = bleachROI.getISize();
if (size.getZ() > 1) {
throw new RuntimeException("expecting 2D bleach region ROI");
}
short[] pixels = bleachROI.toROI(1e-5).getBinaryPixelsXYZ(1);
long numPixelsInROI = 0;
Extent extent = bleachROI.getExtent();
double totalX_um = 0.0;
double totalY_um = 0.0;
double total_I = 0.0;
double total_J = 0.0;
int pixelIndex = 0;
for (int i = 0; i < size.getX(); i++) {
double x = extent.getX() * (i + 0.5) / (size.getX() - 1);
for (int j = 0; j < size.getY(); j++) {
if (pixels[pixelIndex] != 0) {
double y = extent.getY() * (j + 0.5) / (size.getY() - 1);
totalX_um += x;
totalY_um += y;
total_I += i;
total_J += j;
numPixelsInROI++;
}
pixelIndex++;
}
}
Origin origin = bleachROI.getOrigin();
double roiCenterX_um = origin.getX() + totalX_um / numPixelsInROI;
double roiCenterY_um = origin.getY() + totalY_um / numPixelsInROI;
double roiCenterI_pixelscale = total_I / numPixelsInROI;
double roiCenterJ_pixelscale = total_J / numPixelsInROI;
// Area = PI * R^2
// R = sqrt(Area/PI)
double roiBleachSpotArea_um2 = (extent.getX() * extent.getY() * numPixelsInROI) / (size.getX() * size.getY());
double roiBleachRadius_um = Math.sqrt(roiBleachSpotArea_um2 / Math.PI);
double roiBleachRadius_pixelscale = Math.sqrt(numPixelsInROI / Math.PI);
FitBleachSpotOpResults results = new FitBleachSpotOpResults();
results.bleachRadius_ROI = roiBleachRadius_um;
results.centerX_ROI = roiCenterX_um;
results.centerY_ROI = roiCenterY_um;
GaussianFitResults gfresults = fitToGaussian(roiCenterI_pixelscale, roiCenterJ_pixelscale, roiBleachRadius_pixelscale * roiBleachRadius_pixelscale, normImage);
results.bleachFactorK_GaussianFit = gfresults.K;
results.bleachRadius_GaussianFit = Math.sqrt(gfresults.radius2);
results.centerX_GaussianFit = origin.getX() + extent.getX() * (gfresults.centerI + 0.5) / size.getX();
results.centerY_GaussianFit = origin.getY() + extent.getY() * (gfresults.centerJ + 0.5) / size.getY();
return results;
}
use of org.vcell.util.Origin in project vcell by virtualcell.
the class RunFakeSimOp method runRefSimulation.
public ImageTimeSeries<UShortImage> runRefSimulation(LocalWorkspace localWorkspace, Simulation simulation, double max_intensity, double bleachBlackoutStartTime, double bleachBlackoutStopTime, boolean hasNoise, ClientTaskStatusSupport progressListener) throws Exception {
User owner = LocalWorkspace.getDefaultOwner();
KeyValue simKey = LocalWorkspace.createNewKeyValue();
runFVSolverStandalone(new File(localWorkspace.getDefaultSimDataDirectory()), simulation, progressListener);
Extent extent = simulation.getMathDescription().getGeometry().getExtent();
Origin origin = simulation.getMathDescription().getGeometry().getOrigin();
VCDataIdentifier vcDataIdentifier = new VCSimulationDataIdentifier(new VCSimulationIdentifier(simulation.getKey(), simulation.getVersion().getOwner()), 0);
CartesianMesh mesh = localWorkspace.getDataSetControllerImpl().getMesh(vcDataIdentifier);
ISize isize = new ISize(mesh.getSizeX(), mesh.getSizeY(), mesh.getSizeZ());
double[] dataTimes = localWorkspace.getDataSetControllerImpl().getDataSetTimes(vcDataIdentifier);
DataProcessingOutputDataValues dataProcessingOutputDataValues = (DataProcessingOutputDataValues) localWorkspace.getDataSetControllerImpl().doDataOperation(new DataProcessingOutputDataValuesOP(vcDataIdentifier, SimulationContext.FLUOR_DATA_NAME, TimePointHelper.createAllTimeTimePointHelper(), DataIndexHelper.createSliceDataIndexHelper(0), null, null));
ArrayList<SourceDataInfo> sourceDataInfoArr = dataProcessingOutputDataValues.createSourceDataInfos(new ISize(mesh.getSizeX(), mesh.getSizeY(), 1), origin, extent);
// find scale factor to scale up the data to avoid losing precision when casting double to short
double maxDataValue = 0;
for (int i = 0; i < dataTimes.length; i++) {
if (sourceDataInfoArr.get(i).getMinMax() != null) {
maxDataValue = Math.max(maxDataValue, sourceDataInfoArr.get(i).getMinMax().getMax());
} else {
double[] doubleData = (double[]) sourceDataInfoArr.get(i).getData();
for (int j = 0; j < doubleData.length; j++) {
maxDataValue = Math.max(maxDataValue, doubleData[j]);
}
}
}
double scale = max_intensity / maxDataValue;
ArrayList<UShortImage> outputImages = new ArrayList<UShortImage>();
ArrayList<Double> outputTimes = new ArrayList<Double>();
for (int i = 0; i < dataTimes.length; i++) {
if (dataTimes[i] < bleachBlackoutStartTime || dataTimes[i] > bleachBlackoutStopTime) {
// saving each time step 2D double array to a UShortImage
double[] doubleData = (double[]) sourceDataInfoArr.get(i).getData();
short[] shortData = new short[isize.getX() * isize.getY()];
for (int j = 0; j < shortData.length; j++) {
double dData = doubleData[j] * scale;
if (dData < 0 || dData > 65535.0) {
throw new RuntimeException("scaled pixel out of range of unsigned 16 bit integer, original simulated value = " + doubleData[j] + ", scale = " + scale + ", scaled value = " + dData);
}
short sData = (short) (0x0000ffff & ((int) dData));
if (hasNoise && dData > 0.0) {
if (dData > 20) {
shortData[j] = (short) (0x0000ffff & (int) RandomVariable.normal(dData, Math.sqrt(dData)));
} else {
shortData[j] = (short) (0x0000ffff & RandomVariable.poisson(dData));
}
} else {
shortData[j] = sData;
}
}
outputTimes.add(dataTimes[i]);
outputImages.add(new UShortImage(shortData, sourceDataInfoArr.get(i).getOrigin(), sourceDataInfoArr.get(i).getExtent(), sourceDataInfoArr.get(i).getXSize(), sourceDataInfoArr.get(i).getYSize(), 1));
if (progressListener != null) {
int progress = (int) (((i + 1) * 1.0 / dataTimes.length) * 100);
progressListener.setProgress(progress);
}
}
}
double[] outputTimesArray = new double[outputTimes.size()];
for (int i = 0; i < outputTimes.size(); i++) {
outputTimesArray[i] = outputTimes.get(i);
}
ImageTimeSeries<UShortImage> fakeFluorTimeSeries = new ImageTimeSeries<UShortImage>(UShortImage.class, outputImages.toArray(new UShortImage[0]), outputTimesArray, 1);
return fakeFluorTimeSeries;
}
Aggregations