use of cbit.vcell.VirtualMicroscopy.ImageDataset in project vcell by virtualcell.
the class DataSymbolsPanel method addVFrapDerivedImages.
private void addVFrapDerivedImages() {
// add special (computed) images from vFrap
AsynchClientTask[] taskArray = new AsynchClientTask[5];
// select the desired vfrap file
taskArray[0] = ChooseVFrapFile();
// load the images from the vfrap file, compute derived images, store them all in memory
taskArray[1] = new AsynchClientTask("Import images", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
public void run(Hashtable<String, Object> hashTable) throws Exception {
File vFrapFile = (File) hashTable.get("vFrapFile");
Component requesterComponent = DataSymbolsPanel.this;
DocumentWindow documentWindow = (DocumentWindow) BeanUtils.findTypeParentOfComponent(requesterComponent, DocumentWindow.class);
DocumentManager documentManager = documentWindow.getTopLevelWindowManager().getRequestManager().getDocumentManager();
if (documentManager == null) {
throw new RuntimeException("Not connected to server.");
}
// ex ccc8.vfrap
String vFrapFileNameExtended = vFrapFile.getName();
{
// we want to make sure to reload these strings from the hash later on
String initialFieldDataName = vFrapFileNameExtended.substring(0, vFrapFileNameExtended.indexOf(".vfrap"));
// we'll save here the "special" vFrap images (prebleach_avg, ...)
String mixedFieldDataName = initialFieldDataName + "Mx";
hashTable.put("initialFieldDataName", initialFieldDataName);
hashTable.put("mixedFieldDataName", mixedFieldDataName);
}
if (vFrapFileNameExtended.indexOf(".vfrap") <= -1) {
throw new RuntimeException("File extension must be .vfrap");
}
// for derived images and ROIs
checkNameAvailability(hashTable, true, documentManager, requesterComponent);
// ----- read needed info from Virtual FRAP xml file
System.out.println("Loading " + vFrapFileNameExtended + " ...");
String xmlString = XmlUtil.getXMLString(vFrapFile.getAbsolutePath());
MicroscopyXmlReader xmlReader = new MicroscopyXmlReader(true);
Element vFrapRoot = XmlUtil.stringToXML(xmlString, null).getRootElement();
// loading frap images and a ROIs subset for display purposes only (see next task)
AnnotatedImageDataset annotatedImages = xmlReader.getAnnotatedImageDataset(vFrapRoot, null);
hashTable.put("annotatedImages", annotatedImages);
ROI[] rois = xmlReader.getPrimaryROIs(XmlUtil.stringToXML(xmlString, null).getRootElement(), null);
LoadVFrapDisplayRoi(hashTable, annotatedImages, rois);
// ------ locate the special images within the vFrap files and load them in memory
if (!LoadVFrapSpecialImages(hashTable, vFrapRoot)) {
throw new RuntimeException("Unable to recover derived images from vFrap.");
}
// int startingIndexRecovery = xmlReader.getStartindIndexForRecovery(XmlUtil.stringToXML(xmlString, null).getRootElement());
// vFrapXmlHelper.LoadVFrapSpecialImages(annotatedImages, startingIndexRecovery); // prebleach average and first postbleach
// vFrapXmlHelper.LoadVFrapRoiCompositeImages(annotatedImages, rois);
}
};
// show the images from the vfrap file in an OverlayEditorPanelJAI dialog
taskArray[2] = new AsynchClientTask("Display images", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {
public void run(Hashtable<String, Object> hashTable) throws Exception {
String mixedFieldDataName = (String) hashTable.get("mixedFieldDataName");
if (mixedFieldDataName.equals("")) {
JOptionPane.showMessageDialog(DataSymbolsPanel.this, "Field Data name " + mixedFieldDataName + " already in use.");
// prevents the rest of tasks below from running
throw UserCancelException.CANCEL_GENERIC;
}
AnnotatedImageDataset annotatedImages = (AnnotatedImageDataset) hashTable.get("annotatedImages");
BufferedImage[] displayROI = (BufferedImage[]) hashTable.get("displayROI");
if (annotatedImages == null || displayROI == null) {
return;
}
// display the images
OverlayEditorPanelJAI overlayPanel = new OverlayEditorPanelJAI();
overlayPanel.setAllowAddROI(false);
ImageDataset imageDataset = annotatedImages.getImageDataset();
overlayPanel.setImages(imageDataset, 1, 0, new OverlayEditorPanelJAI.AllPixelValuesRange(1, 200));
overlayPanel.setAllROICompositeImage(displayROI, OverlayEditorPanelJAI.FRAP_DATA_INIT_PROPERTY);
int choice = DialogUtils.showComponentOKCancelDialog(DataSymbolsPanel.this, overlayPanel, "vFrap Field Data");
if (choice != JOptionPane.OK_OPTION) {
throw UserCancelException.CANCEL_GENERIC;
}
}
};
// save the ROIs, prebleach average and the first postbleach frame from memory to the database as field data
taskArray[3] = new AsynchClientTask("Saving roi masks, pre-bleach average and first post-bleach", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
public void run(Hashtable<String, Object> hashTable) throws Exception {
Component requesterComponent = DataSymbolsPanel.this;
DocumentWindow documentWindow = (DocumentWindow) BeanUtils.findTypeParentOfComponent(requesterComponent, DocumentWindow.class);
DocumentManager documentManager = documentWindow.getTopLevelWindowManager().getRequestManager().getDocumentManager();
if (documentManager == null) {
throw new RuntimeException("Not connected to server.");
}
ExternalDataIdentifier derivedEDI = SaveVFrapSpecialImagesAsFieldData(hashTable, documentManager);
hashTable.put("derivedEDI", derivedEDI);
}
};
// create the data symbols for the images saved above and display them in the tree/table
taskArray[4] = new AsynchClientTask("Display Data Symbols", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {
public void run(Hashtable<String, Object> hashTable) throws Exception {
ExternalDataIdentifier derivedEDI = (ExternalDataIdentifier) hashTable.get("derivedEDI");
BioModel bioModel = simulationContext.getBioModel();
CreateSaveVFrapDataSymbols(hashTable, bioModel, derivedEDI);
}
};
// save the ROIs, prebleach average and the first postbleach frame from memory to the database as field data
// taskArray[4] = new AsynchClientTask("Saving roi masks, pre-bleach average and first post-bleach", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
// public void run(Hashtable<String, Object> hashTable) throws Exception {
// File vFrapFile = (File)hashTable.get("vFrapFile");
// if(vFrapFile == null) {
// return;
// }
// AnnotatedImageDataset annotatedImages = (AnnotatedImageDataset)hashTable.get("annotatedImages");
// String initialFieldDataName = (String)hashTable.get("initialFieldDataName");
//
// DocumentWindow documentWindow = (DocumentWindow)BeanUtils.findTypeParentOfComponent(DataSymbolsPanel.this, DocumentWindow.class);
// DocumentManager dm = documentWindow.getTopLevelWindowManager().getRequestManager().getDocumentManager();
// if(dm == null){
// throw new RuntimeException("not connected to server");
// }
//
// // mesh
// ImageDataset imageDataset = annotatedImages.getImageDataset();
// Extent extent = imageDataset.getExtent();
// ISize isize = imageDataset.getISize();
// Origin origin = new Origin(0,0,0);
// CartesianMesh cartesianMesh = CartesianMesh.createSimpleCartesianMesh(origin, extent,isize,
// new RegionImage( new VCImageUncompressed(null, new byte[isize.getXYZ()], extent,
// isize.getX(),isize.getY(),isize.getZ()),0,null,null,RegionImage.NO_SMOOTHING));
// double[] firstPostBleach = (double[])hashTable.get("firstPostBleach");
// double[] prebleachAvg = (double[])hashTable.get("prebleachAverage");
// ROI[] rois = (ROI[])hashTable.get("rois");
//
// int NumTimePoints = 1;
// int NumChannels = 2+rois.length; // prebleach, postbleach, roi1, roi2 ... roiN
// String[] channelNames = new String[NumChannels];
// VariableType[] channelTypes = new VariableType[NumChannels];
// DataSymbolType[] channelVFrapImageType = new DataSymbolType[NumChannels];
// double[][][] pixData = new double[NumTimePoints][NumChannels][];
// pixData[0][0] = firstPostBleach;
// channelNames[0] = "firstPostBleach";
// channelTypes[0] = VariableType.VOLUME;
// channelVFrapImageType[0] = DataSymbolType.VFRAP_FIRST_POSTBLEACH;
// pixData[0][1] = prebleachAvg;
// channelNames[1] = "prebleachAverage";
// channelTypes[1] = VariableType.VOLUME;
// channelVFrapImageType[1] = DataSymbolType.VFRAP_PREBLEACH_AVG;
// int index = 0;
// for (ROI roi : rois){
// short[] ushortPixels = roi.getPixelsXYZ();
// double[] doublePixels = new double[ushortPixels.length];
// for (int i = 0; i < ushortPixels.length; i++) {
// doublePixels[i] = ((int)ushortPixels[i])&0xffff;
// }
// pixData[0][index+2] = doublePixels;
// channelNames[index+2] = "roi_"+index;
// channelTypes[index+2] = VariableType.VOLUME;
// channelVFrapImageType[index+2] = DataSymbolType.VFRAP_ROI;
// index++;
// }
// double[] times = new double[] { 0.0 };
//
// FieldDataFileOperationSpec vfrapMiscFieldDataOpSpec = new FieldDataFileOperationSpec();
// vfrapMiscFieldDataOpSpec.opType = FieldDataFileOperationSpec.FDOS_ADD;
// vfrapMiscFieldDataOpSpec.cartesianMesh = cartesianMesh;
// vfrapMiscFieldDataOpSpec.doubleSpecData = pixData;
// vfrapMiscFieldDataOpSpec.specEDI = null;
// vfrapMiscFieldDataOpSpec.varNames = channelNames;
// vfrapMiscFieldDataOpSpec.owner = dm.getUser();
// vfrapMiscFieldDataOpSpec.times = times;
// vfrapMiscFieldDataOpSpec.variableTypes = channelTypes;
// vfrapMiscFieldDataOpSpec.origin = origin;
// vfrapMiscFieldDataOpSpec.extent = extent;
// vfrapMiscFieldDataOpSpec.isize = isize;
// // localWorkspace.getDataSetControllerImpl().fieldDataFileOperation(fdos);
//
// // String formattedDate = (String)hashTable.get("formattedDate");
// // String fieldDataName = initialFieldDataName + "_vfrapMisc_" + formattedDate;
// String mixedFieldDataName = (String)hashTable.get("mixedFieldDataName");
// ExternalDataIdentifier vfrapMisc = dm.saveFieldData(vfrapMiscFieldDataOpSpec, mixedFieldDataName);
//
// hashTable.put("channelNames", channelNames);
// hashTable.put("channelVFrapImageType", channelVFrapImageType);
// hashTable.put("vfrapMisc", vfrapMisc);
// }
// };
// create the data symbols for the images saved above and display them in the tree/table
// taskArray[5] = new AsynchClientTask("Display Data Symbols", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {
// public void run(Hashtable<String, Object> hashTable) throws Exception {
//
// // --- create the data symbols associated with the time series
// String initialFieldDataName = (String)hashTable.get("initialFieldDataName");
// String mixedFieldDataName = (String)hashTable.get("mixedFieldDataName");
// String formattedDate = (String)hashTable.get("formattedDate");
// ImageDataset imageDataset = (ImageDataset)hashTable.get("imageDataset");
// ExternalDataIdentifier timeSeriesEDI = (ExternalDataIdentifier)hashTable.get("timeSeriesEDI");
//
// for (double time : imageDataset.getImageTimeStamps()){
// // String fluorName = TokenMangler.fixTokenStrict("fluor_"+time+"_");
// // while (simulationContext.getDataContext().getDataSymbol(fluorName)!=null){
// // fluorName = TokenMangler.getNextEnumeratedToken(fluorName);
// // }
// DecimalFormat df = new DecimalFormat("0.##");
// // String fluorName = "fluor_" + df.format(time) + "_" + formattedDate;
// String fluorName = "fluor_" + df.format(time) + "_" + initialFieldDataName;
// // FieldFunctionArguments fluorFFArgs = new FieldFunctionArguments(timeSeriesEDI.getName(), fluorName, new Expression(time), VariableType.VOLUME);
// DataSymbol fluorDataSymbol = new FieldDataSymbol( fluorName, DataSymbolType.VFRAP_TIMEPOINT,
// simulationContext.getDataContext(), VCUnitDefinition.UNIT_TBD,
// timeSeriesEDI, fluorName, VariableType.VOLUME.getTypeName(), time);
// simulationContext.getDataContext().addDataSymbol(fluorDataSymbol);
// }
// // --- create the vFrap-specific symbols (ROIs, first postbleach, prebleach average)
// String[] channelNames = (String[])hashTable.get("channelNames");
// DataSymbolType[] channelVFrapImageType = (DataSymbolType[])hashTable.get("channelVFrapImageType");
// ExternalDataIdentifier vfrapMisc = (ExternalDataIdentifier)hashTable.get("vfrapMisc");
//
// for (int i=0; i<channelNames.length; i++) {
// String dataSymbolID = channelNames[i] + "_" + mixedFieldDataName;
// // while (simulationContext.getDataContext().getDataSymbol(dataSymbolID)!=null){
// // dataSymbolID = TokenMangler.getNextEnumeratedToken(dataSymbolID);
// // }
// // FieldFunctionArguments prebleachFFArgs = new FieldFunctionArguments(vfrapMisc.getName(), channelNames[i], new Expression(0.0), VariableType.VOLUME);
// // DataSymbol dataSymbol = new FieldDataSymbol(channelNames[i], channelVFrapImageType[i],
// // DataSymbol dataSymbol = new FieldDataSymbol(dataSymbolID + "_" + formattedDate, channelVFrapImageType[i],
// DataSymbol dataSymbol = new FieldDataSymbol(dataSymbolID, channelVFrapImageType[i],
// simulationContext.getDataContext(), VCUnitDefinition.UNIT_TBD,
// vfrapMisc, channelNames[i], VariableType.VOLUME.getTypeName(), 0D);
// simulationContext.getDataContext().addDataSymbol(dataSymbol);
// }
// }
// };
Hashtable<String, Object> hash = new Hashtable<String, Object>();
ClientTaskDispatcher.dispatch(this, hash, taskArray, false, true, null);
}
use of cbit.vcell.VirtualMicroscopy.ImageDataset in project vcell by virtualcell.
the class VFrap_OverlayEditorPanelJAI method getImportROIMaskButton.
public JButton getImportROIMaskButton() {
if (importROIMaskButton == null) {
importROIMaskButton = new JButton(new ImageIcon(getClass().getResource("/images/importROI.gif")));
importROIMaskButton.setPreferredSize(new Dimension(32, 32));
importROIMaskButton.setMargin(new Insets(2, 2, 2, 2));
importROIMaskButton.setToolTipText("Import ROI mask from file");
importROIMaskButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
File inputFile = null;
try {
int option = openJFileChooser.showOpenDialog(VFrap_OverlayEditorPanelJAI.this);
if (option == JFileChooser.APPROVE_OPTION) {
inputFile = openJFileChooser.getSelectedFile();
} else {
throw UserCancelException.CANCEL_GENERIC;
}
if (!customROIImport.importROI(inputFile)) {
ImageDataset importImageDataset = ImageDatasetReaderService.getInstance().getImageDatasetReader().readImageDataset(inputFile.getAbsolutePath(), null);
if (importImageDataset.getISize().getX() * importImageDataset.getISize().getY() != getImagePane().getHighlightImage().getWidth() * getImagePane().getHighlightImage().getHeight()) {
throw new Exception("Imported ROI mask size (" + importImageDataset.getISize().getX() + "," + importImageDataset.getISize().getY() + ")" + " does not match current Frap DataSet size (" + getImagePane().getHighlightImage().getWidth() + "," + getImagePane().getHighlightImage().getHeight() + ")");
}
// BufferedImage roiMaskImage = BufferedImageReader.makeBufferedImageReader(iFormatReader).openImage(0);
UShortImage roiMaskImage = importImageDataset.getImage(0, 0, 0);
int maskColor = highlightColor.getRGB();
for (int y = 0; y < importImageDataset.getISize().getY(); y++) {
for (int x = 0; x < importImageDataset.getISize().getX(); x++) {
if ((roiMaskImage.getPixel(x, y, 0) & 0xFFFF) != 0) {
getImagePane().getHighlightImage().setRGB(x, y, maskColor);
}
}
}
getImagePane().refreshImage();
}
} catch (UserCancelException uce) {
// Do Nothing
} catch (Exception e1) {
e1.printStackTrace();
DialogUtils.showErrorDialog(VFrap_OverlayEditorPanelJAI.this, "Error importing ROI" + e1.getMessage());
}
}
});
}
return importROIMaskButton;
}
use of cbit.vcell.VirtualMicroscopy.ImageDataset in project vcell by virtualcell.
the class ClientRequestManager method createNewGeometryTasks.
public AsynchClientTask[] createNewGeometryTasks(final TopLevelWindowManager requester, final VCDocument.DocumentCreationInfo documentCreationInfo, final AsynchClientTask[] afterTasks, final String okButtonText) {
if (!isImportGeometryType(documentCreationInfo)) {
throw new IllegalArgumentException("Analytic geometry not implemented.");
}
final String IMPORT_SOURCE_NAME = "IMPORT_SOURCE_NAME";
// Get image from file
AsynchClientTask selectImageFileTask = new AsynchClientTask("select image file", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
File imageFile = DatabaseWindowManager.showFileChooserDialog(requester, null, getUserPreferences(), JFileChooser.FILES_AND_DIRECTORIES);
hashTable.put("imageFile", imageFile);
hashTable.put(IMPORT_SOURCE_NAME, "File: " + imageFile.getName());
}
};
final String FDFOS = "FDFOS";
final String INITIAL_ANNOTATION = "INITIAL_ANNOTATION";
final String ORIG_IMAGE_SIZE_INFO = "ORIG_IMAGE_SIZE_INFO";
final String NEW_IMAGE_SIZE_INFO = "NEW_IMAGE_SIZE_INFO";
final String DIR_FILES = "DIR_FILES";
final String FD_MESH = "FD_MESH";
final String FD_MESHISIZE = "FD_MESHISIZE";
final String FD_TIMEPOINTS = "FD_TIMEPOINTS";
AsynchClientTask parseImageTask = new AsynchClientTask("read and parse image file", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
@Override
public void run(final Hashtable<String, Object> hashTable) throws Exception {
final Component guiParent = (Component) hashTable.get(ClientRequestManager.GUI_PARENT);
try {
FieldDataFileOperationSpec fdfos = null;
if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FIJI_IMAGEJ) {
hashTable.put("imageFile", ImageJHelper.vcellWantImage(getClientTaskStatusSupport(), "Image for new VCell geometry"));
}
if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_BLENDER) {
hashTable.put("imageFile", ImageJHelper.vcellWantSurface(getClientTaskStatusSupport(), "Image for new VCell geometry"));
}
if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FILE || documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FIJI_IMAGEJ || documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_BLENDER) {
File imageFile = (File) hashTable.get("imageFile");
if (imageFile == null) {
throw new Exception("No file selected");
}
if (ExtensionFilter.isMatchingExtension(imageFile, ".nrrd")) {
DataInputStream dis = null;
try {
dis = new DataInputStream(new BufferedInputStream(new FileInputStream(imageFile)));
int xsize = 1;
int ysize = 1;
int zsize = 1;
double xspace = 1.0;
double yspace = 1.0;
double zspace = 1.0;
NRRDTYPE type = null;
NRRDENCODING encoding = null;
int dimension = -1;
// read header lines
while (true) {
@SuppressWarnings("deprecation") String line = dis.readLine();
if (line == null || line.length() == 0) {
break;
}
StringTokenizer stringTokenizer = new StringTokenizer(line, ": ");
String headerParam = stringTokenizer.nextToken();
// System.out.println(headerParam);
if (headerParam.equals("sizes")) {
if (dimension != -1) {
xsize = Integer.parseInt(stringTokenizer.nextToken());
if (dimension >= 2) {
ysize = Integer.parseInt(stringTokenizer.nextToken());
}
if (dimension >= 3) {
zsize = Integer.parseInt(stringTokenizer.nextToken());
}
for (int i = 4; i < dimension; i++) {
if (Integer.parseInt(stringTokenizer.nextToken()) != 1) {
throw new Exception("Dimensions > 3 not supported");
}
}
} else {
throw new Exception("dimension expected to be set before reading sizes");
}
} else if (headerParam.equals("spacings")) {
if (dimension != -1) {
xspace = Double.parseDouble(stringTokenizer.nextToken());
if (dimension >= 2) {
yspace = Double.parseDouble(stringTokenizer.nextToken());
}
if (dimension >= 3) {
zspace = Double.parseDouble(stringTokenizer.nextToken());
}
// ignore other dimension spacings
} else {
throw new Exception("dimension expected to be set before reading spacings");
}
} else if (headerParam.equals("type")) {
String nextToken = stringTokenizer.nextToken();
if (nextToken.equalsIgnoreCase("double")) {
type = NRRDTYPE.DOUBLE;
} else if (nextToken.equalsIgnoreCase("float")) {
type = NRRDTYPE.FLOAT;
} else if (nextToken.equalsIgnoreCase("unsigned")) {
nextToken = stringTokenizer.nextToken();
if (nextToken.equalsIgnoreCase("char")) {
type = NRRDTYPE.UNSIGNEDCHAR;
} else {
throw new Exception("Unknown nrrd data type=" + nextToken);
}
} else {
throw new Exception("Unknown nrrd data type=" + nextToken);
}
} else if (headerParam.equals("dimension")) {
dimension = Integer.parseInt(stringTokenizer.nextToken());
if (dimension < 1) {
throw new Exception("unexpected dimension=" + dimension);
}
} else if (headerParam.equals("encoding")) {
encoding = NRRDENCODING.valueOf(stringTokenizer.nextToken().toUpperCase());
}
}
BufferedInputStream bis = null;
if (encoding == NRRDENCODING.GZIP) {
dis.close();
bis = new BufferedInputStream(new FileInputStream(imageFile));
boolean bnewLine = false;
while (true) {
int currentChar = bis.read();
if (currentChar == '\n') {
if (bnewLine) {
// 2 newlines end header
break;
}
bnewLine = true;
} else {
bnewLine = false;
}
}
GZIPInputStream gzipInputStream = new GZIPInputStream(bis);
dis = new DataInputStream(gzipInputStream);
}
double[] data = new double[xsize * ysize * zsize];
double minValue = Double.POSITIVE_INFINITY;
double maxValue = Double.NEGATIVE_INFINITY;
for (int i = 0; i < data.length; i++) {
if (i % 262144 == 0) {
if (getClientTaskStatusSupport() != null) {
getClientTaskStatusSupport().setMessage("Reading " + encoding + " " + type + " NRRD data " + (((long) i * (long) 100) / (long) data.length) + " % done.");
}
}
if (type == NRRDTYPE.DOUBLE) {
data[i] = dis.readDouble();
} else if (type == NRRDTYPE.FLOAT) {
data[i] = dis.readFloat();
} else if (type == NRRDTYPE.UNSIGNEDCHAR) {
data[i] = dis.readUnsignedByte();
} else {
throw new Exception("Unexpected data type=" + type.toString());
}
minValue = Math.min(minValue, data[i]);
maxValue = Math.max(maxValue, data[i]);
}
dis.close();
if (getClientTaskStatusSupport() != null) {
getClientTaskStatusSupport().setMessage("Scaling " + encoding + " " + type + " NRRD data.");
}
short[] dataToSegment = new short[data.length];
double scaleShort = Math.pow(2, Short.SIZE) - 1;
for (int i = 0; i < data.length; i++) {
dataToSegment[i] |= (int) ((data[i] - minValue) / (maxValue - minValue) * scaleShort);
}
fdfos = new FieldDataFileOperationSpec();
fdfos.origin = new Origin(0, 0, 0);
fdfos.extent = new Extent((xsize == 1 ? .5 : (xsize) * xspace), (ysize == 1 ? .5 : (ysize) * yspace), (zsize == 1 ? .5 : (zsize) * zspace));
fdfos.isize = new ISize(xsize, ysize, zsize);
fdfos.shortSpecData = new short[][][] { { dataToSegment } };
} finally {
if (dis != null) {
try {
dis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
} else if ((fdfos = createFDOSFromSurfaceFile(imageFile)) != null) {
// try surface file formats
// work already done at this point
} else {
File[] dirFiles = null;
ImageSizeInfo origImageSizeInfo = null;
if (imageFile.isDirectory()) {
dirFiles = imageFile.listFiles(new java.io.FileFilter() {
public boolean accept(File pathname) {
// exclude windows Thumbs.db
return pathname.isFile() && !pathname.isHidden();
}
});
if (dirFiles.length == 0) {
throw new Exception("No valid files in selected directory");
}
String fileExt0 = null;
for (int i = 0; i < dirFiles.length; i++) {
int lastDot = dirFiles[i].getName().lastIndexOf('.');
String fileExt = (lastDot != -1 ? dirFiles[i].getName().substring(lastDot) : null);
if (dirFiles[i].isDirectory()) {
fileExt = "dir";
}
if (i == 0) {
fileExt0 = fileExt;
} else if (!Compare.isEqualOrNull(fileExt, fileExt0)) {
String result = DialogUtils.showWarningDialog(requester.getComponent(), "Files in '" + imageFile.getAbsolutePath() + "' have different name extensions, continue?", new String[] { "OK", "Cancel" }, "Cancel");
if (!"OK".equals(result)) {
throw UserCancelException.CANCEL_FILE_SELECTION;
}
break;
}
}
hashTable.put(IMPORT_SOURCE_NAME, "Directory: " + imageFile.getAbsolutePath());
origImageSizeInfo = ImageDatasetReaderService.getInstance().getImageDatasetReader().getImageSizeInfoForceZ(dirFiles[0].getAbsolutePath(), dirFiles.length);
if (dirFiles.length > 1) {
final String importZ = "Import Z-Sections";
final String cancelOption = "Cancel";
String result = DialogUtils.showWarningDialog(guiParent, "Import all files in directory '" + imageFile.getAbsolutePath() + "' as Z-Sections", new String[] { importZ, cancelOption }, importZ);
if (result.equals(cancelOption)) {
throw UserCancelException.CANCEL_GENERIC;
}
}
hashTable.put(DIR_FILES, dirFiles);
} else {
origImageSizeInfo = ImageDatasetReaderService.getInstance().getImageDatasetReader().getImageSizeInfo(imageFile.getAbsolutePath());
hashTable.put(IMPORT_SOURCE_NAME, "File: " + imageFile.getAbsolutePath());
}
hashTable.put(ORIG_IMAGE_SIZE_INFO, origImageSizeInfo);
return;
}
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FIELDDATA) {
getClientTaskStatusSupport().setMessage("Reading data from VCell server.");
VCDocument.GeomFromFieldDataCreationInfo docInfo = (VCDocument.GeomFromFieldDataCreationInfo) documentCreationInfo;
PDEDataContext pdeDataContext = getMdiManager().getFieldDataWindowManager().getPDEDataContext(docInfo.getExternalDataID(), null);
ImageSizeInfo newImageSizeInfo = (ImageSizeInfo) hashTable.get(NEW_IMAGE_SIZE_INFO);
pdeDataContext.setVariableNameAndTime(docInfo.getVarName(), newImageSizeInfo.getTimePoints()[newImageSizeInfo.getSelectedTimeIndex()]);
double[] data = pdeDataContext.getDataValues();
hashTable.put(INITIAL_ANNOTATION, hashTable.get(IMPORT_SOURCE_NAME));
CartesianMesh mesh = (CartesianMesh) hashTable.get(FD_MESH);
ISize meshISize = (ISize) hashTable.get(FD_MESHISIZE);
double minValue = Double.POSITIVE_INFINITY;
double maxValue = Double.NEGATIVE_INFINITY;
for (int i = 0; i < data.length; i++) {
minValue = Math.min(minValue, data[i]);
maxValue = Math.max(maxValue, data[i]);
}
short[] dataToSegment = new short[data.length];
double scaleShort = Math.pow(2, Short.SIZE) - 1;
for (int i = 0; i < data.length; i++) {
dataToSegment[i] |= (int) ((data[i] - minValue) / (maxValue - minValue) * scaleShort);
}
fdfos = new FieldDataFileOperationSpec();
fdfos.origin = mesh.getOrigin();
fdfos.extent = mesh.getExtent();
fdfos.isize = meshISize;
fdfos.shortSpecData = new short[][][] { { dataToSegment } };
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FROM_SCRATCH) {
ISize isize = getISizeFromUser(guiParent, new ISize(256, 256, 8), "Enter # of pixels for x,y,z (e.g. 3D{256,256,8}, 2D{256,256,1}, 1D{256,1,1})");
fdfos = new FieldDataFileOperationSpec();
fdfos.origin = new Origin(0, 0, 0);
fdfos.extent = new Extent(1, 1, 1);
fdfos.isize = isize;
hashTable.put(IMPORT_SOURCE_NAME, "Scratch: New Geometry");
// final int SCRATCH_SIZE_LIMIT = 512*512*20;
// if(isize.getXYZ() > (SCRATCH_SIZE_LIMIT)){
// throw new Exception("Total pixels (x*y*z) cannot be >"+SCRATCH_SIZE_LIMIT+".");
// }
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FROM_WORKSPACE_ANALYTIC) {
if (hashTable.get(ClientRequestManager.GEOM_FROM_WORKSPACE) != null) {
Geometry workspaceGeom = (Geometry) hashTable.get(ClientRequestManager.GEOM_FROM_WORKSPACE);
ISize defaultISize = workspaceGeom.getGeometrySpec().getDefaultSampledImageSize();
ISize isize = getISizeFromUser(guiParent, defaultISize, "Warning: converting analytic expression geometry into an image based geometry\nwill remove analytic expressions after new image is created.\n\n" + "Enter size (x,y,z) for new geometry image (e.g. " + defaultISize.getX() + "," + defaultISize.getY() + "," + defaultISize.getZ() + ")");
hashTable.put(IMPORT_SOURCE_NAME, "Workspace from Analytic Geometry");
VCImage img = workspaceGeom.getGeometrySpec().createSampledImage(isize);
Enumeration<SubVolume> enumSubvolume = workspaceGeom.getGeometrySpec().getAnalyticOrCSGSubVolumes();
ArrayList<VCPixelClass> vcPixelClassArrList = new ArrayList<VCPixelClass>();
while (enumSubvolume.hasMoreElements()) {
SubVolume subVolume = enumSubvolume.nextElement();
vcPixelClassArrList.add(new VCPixelClass(null, subVolume.getName(), subVolume.getHandle()));
}
if (vcPixelClassArrList.size() > img.getPixelClasses().length) {
String result = DialogUtils.showOKCancelWarningDialog(requester.getComponent(), null, "Warning: sampling size is too small to include all subvolumes.");
if (result == null || !result.equals(SimpleUserMessage.OPTION_OK)) {
throw UserCancelException.CANCEL_GENERIC;
}
}
hashTable.put(VCPIXELCLASSES, vcPixelClassArrList.toArray(new VCPixelClass[0]));
fdfos = createFDOSFromVCImage(img);
} else {
throw new Exception("Expecting image source for GEOM_OPTION_FROM_WORKSPACE_ANALYTIC");
}
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FROM_WORKSPACE_IMAGE) {
if (hashTable.get(ClientRequestManager.GEOM_FROM_WORKSPACE) != null) {
Geometry workspaceGeom = (Geometry) hashTable.get(ClientRequestManager.GEOM_FROM_WORKSPACE);
hashTable.put(IMPORT_SOURCE_NAME, "Workspace Image");
fdfos = createFDOSFromVCImage(workspaceGeom.getGeometrySpec().getImage());
if (workspaceGeom.getGeometrySpec().getImage().getDescription() != null) {
hashTable.put(INITIAL_ANNOTATION, workspaceGeom.getGeometrySpec().getImage().getDescription());
}
hashTable.put(VCPIXELCLASSES, workspaceGeom.getGeometrySpec().getImage().getPixelClasses());
} else {
throw new Exception("Expecting image source for GEOM_OPTION_FROM_WORKSPACE");
}
}
hashTable.put(FDFOS, fdfos);
} catch (DataFormatException ex) {
throw new Exception("Cannot read image file.\n" + ex.getMessage());
}
}
};
AsynchClientTask getFieldDataImageParams = new AsynchClientTask("Getting DB Image parameters...", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
VCDocument.GeomFromFieldDataCreationInfo docInfo = (VCDocument.GeomFromFieldDataCreationInfo) documentCreationInfo;
PDEDataContext pdeDataContext = getMdiManager().getFieldDataWindowManager().getPDEDataContext(docInfo.getExternalDataID(), null);
CartesianMesh mesh = pdeDataContext.getCartesianMesh();
ISize meshISize = new ISize(mesh.getSizeX(), mesh.getSizeY(), mesh.getSizeZ());
double[] timePoints = pdeDataContext.getTimePoints();
hashTable.put(FD_MESH, mesh);
hashTable.put(FD_MESHISIZE, meshISize);
hashTable.put(FD_TIMEPOINTS, timePoints);
}
};
AsynchClientTask queryImageResizeTask = new AsynchClientTask("Query File Image Resize...", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
String importSourceName = (String) hashTable.get(IMPORT_SOURCE_NAME);
if ((ImageSizeInfo) hashTable.get(ORIG_IMAGE_SIZE_INFO) != null) {
// from file
ImageSizeInfo newImagesiSizeInfo = queryImageResize(requester.getComponent(), (ImageSizeInfo) hashTable.get(ORIG_IMAGE_SIZE_INFO), true);
hashTable.put(NEW_IMAGE_SIZE_INFO, newImagesiSizeInfo);
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FIELDDATA) {
// from fielddata
VCDocument.GeomFromFieldDataCreationInfo docInfo = (VCDocument.GeomFromFieldDataCreationInfo) documentCreationInfo;
double[] fieldDataTimes = (double[]) hashTable.get(FD_TIMEPOINTS);
hashTable.remove(FD_TIMEPOINTS);
ISize fieldDataISize = (ISize) hashTable.get(FD_MESHISIZE);
ImageSizeInfo origImageSizeInfo = new ImageSizeInfo(importSourceName, fieldDataISize, 1, fieldDataTimes, null);
ImageSizeInfo newImagesiSizeInfo = queryImageResize(requester.getComponent(), origImageSizeInfo, true);
hashTable.put(NEW_IMAGE_SIZE_INFO, newImagesiSizeInfo);
hashTable.put(IMPORT_SOURCE_NAME, "FieldData: " + docInfo.getExternalDataID().getName() + " varName=" + docInfo.getVarName() + " timeIndex=" + newImagesiSizeInfo.getTimePoints()[newImagesiSizeInfo.getSelectedTimeIndex()]);
}
}
};
AsynchClientTask importFileImageTask = new AsynchClientTask("Importing Image from File...", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FILE && hashTable.get(FDFOS) == null) {
ImageSizeInfo origImageSizeInfo = (ImageSizeInfo) hashTable.get(ORIG_IMAGE_SIZE_INFO);
ImageSizeInfo newImageSizeInfo = (ImageSizeInfo) hashTable.get(NEW_IMAGE_SIZE_INFO);
File[] dirFiles = (File[]) hashTable.get(DIR_FILES);
File imageFile = (File) hashTable.get("imageFile");
FieldDataFileOperationSpec fdfos = null;
boolean bMergeChannels = origImageSizeInfo.getNumChannels() != newImageSizeInfo.getNumChannels();
ISize resize = (origImageSizeInfo.getiSize().compareEqual(newImageSizeInfo.getiSize()) ? null : newImageSizeInfo.getiSize());
if (dirFiles != null) {
Arrays.sort(dirFiles, new Comparator<File>() {
public int compare(File o1, File o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
});
hashTable.put(INITIAL_ANNOTATION, dirFiles[0].getAbsolutePath() + "\n.\n.\n.\n" + dirFiles[dirFiles.length - 1].getAbsolutePath());
short[][] dataToSegment = null;
ISize isize = null;
Origin origin = null;
Extent extent = null;
int sizeXY = 0;
ISize firstImageISize = null;
for (int i = 0; i < dirFiles.length; i++) {
ImageDataset[] imageDatasets = ImageDatasetReaderService.getInstance().getImageDatasetReader().readImageDatasetChannels(dirFiles[i].getAbsolutePath(), null, bMergeChannels, null, resize);
for (int c = 0; c < imageDatasets.length; c++) {
if (imageDatasets[c].getSizeZ() != 1 || imageDatasets[c].getSizeT() != 1) {
throwImportWholeDirectoryException(imageFile, dirFiles[i].getAbsolutePath() + " has Z=" + imageDatasets[c].getSizeZ() + " T=" + imageDatasets[c].getSizeT());
}
if (isize == null) {
firstImageISize = imageDatasets[c].getISize();
sizeXY = imageDatasets[c].getISize().getX() * imageDatasets[c].getISize().getY();
dataToSegment = new short[imageDatasets.length][sizeXY * dirFiles.length];
isize = new ISize(imageDatasets[c].getISize().getX(), imageDatasets[c].getISize().getY(), dirFiles.length);
origin = imageDatasets[c].getAllImages()[0].getOrigin();
extent = imageDatasets[c].getExtent();
}
if (!firstImageISize.compareEqual(imageDatasets[c].getISize())) {
throwImportWholeDirectoryException(imageFile, dirFiles[0].getAbsolutePath() + " " + firstImageISize + " does not equal " + dirFiles[i].getAbsolutePath() + " " + imageDatasets[c].getISize());
}
System.arraycopy(imageDatasets[c].getImage(0, 0, 0).getPixels(), 0, dataToSegment[c], sizeXY * i, sizeXY);
}
}
fdfos = new FieldDataFileOperationSpec();
fdfos.origin = origin;
fdfos.extent = extent;
fdfos.isize = isize;
fdfos.shortSpecData = new short[][][] { dataToSegment };
} else {
hashTable.put(INITIAL_ANNOTATION, imageFile.getAbsolutePath());
Integer userPreferredTimeIndex = null;
if (origImageSizeInfo.getTimePoints().length > 1) {
userPreferredTimeIndex = newImageSizeInfo.getSelectedTimeIndex();
}
getClientTaskStatusSupport().setMessage("Reading file...");
ImageDataset[] imageDatasets = ImageDatasetReaderService.getInstance().getImageDatasetReader().readImageDatasetChannels(imageFile.getAbsolutePath(), null, bMergeChannels, userPreferredTimeIndex, resize);
fdfos = ClientRequestManager.createFDOSWithChannels(imageDatasets, null);
}
hashTable.put(FDFOS, fdfos);
hashTable.remove(NEW_IMAGE_SIZE_INFO);
hashTable.remove(ORIG_IMAGE_SIZE_INFO);
hashTable.remove(DIR_FILES);
}
}
};
AsynchClientTask resizeImageTask = new AsynchClientTask("Resizing Image...", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
ImageSizeInfo newImageSizeInfo = (ImageSizeInfo) hashTable.get(NEW_IMAGE_SIZE_INFO);
FieldDataFileOperationSpec fdfos = (FieldDataFileOperationSpec) hashTable.get(FDFOS);
if (newImageSizeInfo != null && fdfos != null && !fdfos.isize.compareEqual(newImageSizeInfo.getiSize())) {
resizeImage((FieldDataFileOperationSpec) hashTable.get(FDFOS), newImageSizeInfo.getiSize(), documentCreationInfo.getOption());
}
}
};
AsynchClientTask finishTask = new AsynchClientTask("Finishing...", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
@Override
public void run(final Hashtable<String, Object> hashTable) throws Exception {
getClientTaskStatusSupport().setMessage("Initializing...");
final ROIMultiPaintManager roiMultiPaintManager = new ROIMultiPaintManager();
roiMultiPaintManager.initROIData((FieldDataFileOperationSpec) hashTable.get(FDFOS));
final Geometry[] geomHolder = new Geometry[1];
final VCPixelClass[] postProcessPixelClasses = (VCPixelClass[]) hashTable.get(VCPIXELCLASSES);
AsynchClientTask task1 = new AsynchClientTask("edit geometry", AsynchClientTask.TASKTYPE_SWING_BLOCKING, false) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
geomHolder[0] = roiMultiPaintManager.showGUI(okButtonText, (String) hashTable.get(IMPORT_SOURCE_NAME), (Component) hashTable.get(GUI_PARENT), (String) hashTable.get(INITIAL_ANNOTATION), postProcessPixelClasses, getUserPreferences());
}
};
AsynchClientTask task2 = new AsynchClientTask("update geometry", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
// Create default name for image
String dateTimeString = BeanUtils.generateDateTimeString();
geomHolder[0].getGeometrySpec().getImage().setName("img_" + dateTimeString);
geomHolder[0].setName("geom_" + dateTimeString);
// cause update in this thread so later swing threads won't be delayed
geomHolder[0].precomputeAll(new GeometryThumbnailImageFactoryAWT());
hashTable.put("doc", geomHolder[0]);
}
};
AsynchClientTask[] finalTasks = afterTasks;
if (finalTasks == null) {
finalTasks = new AsynchClientTask[] { getSaveImageAndGeometryTask() };
}
AsynchClientTask[] tasks = new AsynchClientTask[2 + finalTasks.length];
tasks[0] = task1;
tasks[1] = task2;
System.arraycopy(finalTasks, 0, tasks, 2, finalTasks.length);
ClientTaskDispatcher.dispatch((Component) hashTable.get(GUI_PARENT), hashTable, tasks, false, false, null, true);
}
};
Vector<AsynchClientTask> tasksV = new Vector<AsynchClientTask>();
if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FROM_SCRATCH) {
tasksV.addAll(Arrays.asList(new AsynchClientTask[] { parseImageTask, finishTask }));
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FROM_WORKSPACE_ANALYTIC) {
tasksV.addAll(Arrays.asList(new AsynchClientTask[] { parseImageTask, finishTask }));
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FROM_WORKSPACE_IMAGE) {
tasksV.addAll(Arrays.asList(new AsynchClientTask[] { parseImageTask, finishTask }));
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FILE) {
tasksV.addAll(Arrays.asList(new AsynchClientTask[] { selectImageFileTask, parseImageTask, queryImageResizeTask, importFileImageTask, /*resizes*/
finishTask }));
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FIJI_IMAGEJ || documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_BLENDER) {
tasksV.addAll(Arrays.asList(new AsynchClientTask[] { parseImageTask, queryImageResizeTask, importFileImageTask, /*resizes*/
finishTask }));
} else if (documentCreationInfo.getOption() == VCDocument.GEOM_OPTION_FIELDDATA) {
tasksV.addAll(Arrays.asList(new AsynchClientTask[] { getFieldDataImageParams, queryImageResizeTask, parseImageTask, resizeImageTask, finishTask }));
}
return tasksV.toArray(new AsynchClientTask[0]);
}
use of cbit.vcell.VirtualMicroscopy.ImageDataset in project vcell by virtualcell.
the class BioformatsImageDatasetReader method readImageDatasetFromMultiFiles.
@Override
public ImageDataset readImageDatasetFromMultiFiles(File[] files, ClientTaskStatusSupport status, boolean isTimeSeries, double timeInterval) throws Exception {
try (TTransport transport = new TSocket("localhost", port)) {
transport.open();
TProtocol protocol = new TBinaryProtocol(transport);
ImageDatasetService.Client client = new ImageDatasetService.Client(protocol);
ArrayList<String> fileList = new ArrayList<String>();
for (File f : files) {
fileList.add(f.getAbsolutePath());
}
org.vcell.imagedataset.ImageDataset t_imageDataset = client.readImageDatasetFromMultiFiles(fileList, isTimeSeries, timeInterval);
ImageDataset imageDataset = getImageDataset(t_imageDataset);
return imageDataset;
}
}
use of cbit.vcell.VirtualMicroscopy.ImageDataset in project vcell by virtualcell.
the class ClientRequestManager method createFDOSFromImageFile.
// public void prepareDocumentToLoad(VCDocument doc) throws Exception {
// Simulation[] simulations = null;
// if (doc instanceof MathModel) {
// Geometry geometry = ((MathModel)doc).getMathDescription().getGeometry();
// geometry.precomputeAll();
// simulations = ((MathModel)doc).getSimulations();
// } else if (doc instanceof Geometry) {
// ((Geometry)doc).precomputeAll();
// } else if (doc instanceof BioModel) {
// BioModel bioModel = (BioModel)doc;
// SimulationContext[] simContexts = bioModel.getSimulationContexts();
// for (SimulationContext simContext : simContexts) {
// simContext.getGeometry().precomputeAll();
// }
// simulations = ((BioModel)doc).getSimulations();
// }
// if (simulations != null) {
// // preload simulation status
// VCSimulationIdentifier simIDs[] = new VCSimulationIdentifier[simulations.length];
// for (int i = 0; i < simulations.length; i++){
// simIDs[i] = simulations[i].getSimulationInfo().getAuthoritativeVCSimulationIdentifier();
// }
// getDocumentManager().preloadSimulationStatus(simIDs);
// }
// }
public static FieldDataFileOperationSpec createFDOSFromImageFile(File imageFile, boolean bCropOutBlack, Integer saveOnlyThisTimePointIndex) throws DataFormatException, ImageException {
try {
ImageDatasetReader imageDatasetReader = ImageDatasetReaderService.getInstance().getImageDatasetReader();
ImageDataset[] imagedataSets = imageDatasetReader.readImageDatasetChannels(imageFile.getAbsolutePath(), null, false, saveOnlyThisTimePointIndex, null);
if (imagedataSets != null && bCropOutBlack) {
for (int i = 0; i < imagedataSets.length; i++) {
Rectangle nonZeroRect = imagedataSets[i].getNonzeroBoundingRectangle();
if (nonZeroRect != null) {
imagedataSets[i] = imagedataSets[i].crop(nonZeroRect);
}
}
}
return createFDOSWithChannels(imagedataSets, null);
} catch (Exception e) {
e.printStackTrace(System.out);
throw new DataFormatException(e.getMessage());
}
}
Aggregations