Search in sources :

Example 1 with RegionImage

use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.

the class RunRefSimulationOp method saveExternalData.

private static void saveExternalData(Image image, String varName, ExternalDataIdentifier newROIExtDataID, LocalWorkspace localWorkspace) throws ObjectNotFoundException, ImageException, IOException {
    Extent extent = image.getExtent();
    Origin origin = image.getOrigin();
    ISize isize = image.getISize();
    VCImage vcImage = new VCImageUncompressed(null, new byte[isize.getXYZ()], extent, isize.getX(), isize.getY(), isize.getZ());
    RegionImage regionImage = new RegionImage(vcImage, 0, null, null, RegionImage.NO_SMOOTHING);
    CartesianMesh simpleCartesianMesh = CartesianMesh.createSimpleCartesianMesh(origin, extent, isize, regionImage);
    int NumTimePoints = 1;
    int NumChannels = 1;
    // dimensions: time points, channels, whole image ordered by z slices.
    double[][][] pixData = new double[NumTimePoints][NumChannels][];
    pixData[0][0] = image.getDoublePixels();
    FieldDataFileOperationSpec fdos = new FieldDataFileOperationSpec();
    fdos.opType = FieldDataFileOperationSpec.FDOS_ADD;
    fdos.cartesianMesh = simpleCartesianMesh;
    fdos.doubleSpecData = pixData;
    fdos.specEDI = newROIExtDataID;
    fdos.varNames = new String[] { varName };
    fdos.owner = LocalWorkspace.getDefaultOwner();
    fdos.times = new double[] { 0.0 };
    fdos.variableTypes = new VariableType[] { VariableType.VOLUME };
    fdos.origin = origin;
    fdos.extent = extent;
    fdos.isize = isize;
    localWorkspace.getDataSetControllerImpl().fieldDataFileOperation(fdos);
}
Also used : Origin(org.vcell.util.Origin) CartesianMesh(cbit.vcell.solvers.CartesianMesh) Extent(org.vcell.util.Extent) ISize(org.vcell.util.ISize) FieldDataFileOperationSpec(cbit.vcell.field.io.FieldDataFileOperationSpec) RegionImage(cbit.vcell.geometry.RegionImage) VCImage(cbit.image.VCImage) VCImageUncompressed(cbit.image.VCImageUncompressed)

Example 2 with RegionImage

use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.

the class VFrapXmlHelper method LoadVFrapSpecialImages.

// // load and compute prebleach average and first postbleach images
// public void LoadVFrapSpecialImages(AnnotatedImageDataset annotatedImages, int startingIndexRecovery)
// {
// // unnormalized prebleach average
// prebleachAvg = new double[annotatedImages.getImageDataset().getImage(0, 0, startingIndexRecovery).getNumXYZ()];
// for(int j = 0; j < prebleachAvg.length; j++)
// {
// double pixelTotal = 0;
// for(int i = 0 ; i < startingIndexRecovery; i++)
// {
// pixelTotal = pixelTotal + (annotatedImages.getImageDataset().getImage(0, 0, i).getPixels()[j] & 0x0000FFFF);
// }
// prebleachAvg[j] = pixelTotal/startingIndexRecovery;
// }
// 
// // unnormalized first post bleach
// firstPostBleach = new double[annotatedImages.getImageDataset().getImage(0, 0, startingIndexRecovery).getNumXYZ()];
// short[] pixels = annotatedImages.getImageDataset().getImage(0, 0, startingIndexRecovery).getPixels();
// for(int i = 0; i< pixels.length; i++)
// {
// firstPostBleach[i] = pixels[i] & 0x0000FFFF;
// }
// }
// 
// Locate the special images within the vFrap files and load them in memory
// 
public static boolean LoadVFrapSpecialImages(Hashtable<String, Object> hashTable, Element vFrapRoot) throws IOException, DataAccessException, MathException, ImageException {
    // ------ parse the vfrap file and the log/zip files referred within -----
    // many channels of 1 timepoint each
    int NumTimePoints = 1;
    // the channels: prebleach, postbleach, roi1, roi2 ... roiN
    int NumChannels = tokenNames.length;
    String[] channelNames = new String[NumChannels];
    VariableType[] channelTypes = new VariableType[NumChannels];
    DataSymbolType[] channelVFrapImageType = new DataSymbolType[NumChannels];
    double[][][] pixData = new double[NumTimePoints][NumChannels][];
    // get the path of the file tagged with "ROIExternalDataInfoTag" and open it
    Element roiExternalDataInfoElement = vFrapRoot.getChild(MicroscopyXMLTags.ROIExternalDataInfoTag);
    if (roiExternalDataInfoElement == null) {
        // can't load FieldData for some reason, fall back to importing the biomodel only
        return false;
    }
    // <ROIExternalDataInfo Filename="c:\vFrap\VirtualMicroscopy\SimulationData\SimID_1282941232246_0_.log">
    // <ExternalDataIdentifier Name="timeData" KeyValue="1282941232246" OwnerName="SimulationData" OwnerKey="0" />
    // </ImageDatasetExternalDataInfo>
    // c:\VirtualMicroscopy\SimulationData\SimID_1284149203811_0_.log
    String filename = (roiExternalDataInfoElement).getAttributeValue("Filename");
    Element childElement = (roiExternalDataInfoElement).getChild("ExternalDataIdentifier");
    if (childElement == null) {
        // can't load FieldData for some reason, fall back to importing the biomodel only
        return false;
    }
    StringTokenizer tokens = new StringTokenizer(filename, "/\\.");
    final ArrayList<String> tokenArray = new ArrayList<String>();
    while (tokens.hasMoreElements()) {
        tokenArray.add(tokens.nextToken());
    }
    final String dataID = tokenArray.get(tokenArray.size() - 2);
    final String userName = tokenArray.get(tokenArray.size() - 3);
    VCDataIdentifier vcDataIdentifier = new VCDataIdentifier() {

        public String getID() {
            return dataID;
        }

        public KeyValue getDataKey() {
            return null;
        }

        public User getOwner() {
            return new User(userName, new KeyValue("123345432334"));
        }
    };
    // ------- recover simulation data for this user name, load the images in memory ------------
    // ex  c:\\VirtualMicroscopy\\SimulationData
    String userDirName = filename.substring(0, filename.indexOf(dataID) - 1);
    File userDir = new File(userDirName);
    SimulationData.SimDataAmplistorInfo simDataAmplistorInfo = AmplistorUtils.getSimDataAmplistorInfoFromPropertyLoader();
    SimulationData simData = new SimulationData(vcDataIdentifier, userDir, null, simDataAmplistorInfo);
    // build a valid mesh in 2 steps, what we have in simData is incomplete
    CartesianMesh incompleteMesh = simData.getMesh();
    Extent extent = incompleteMesh.getExtent();
    ISize isize = new ISize(incompleteMesh.getSizeX(), incompleteMesh.getSizeY(), incompleteMesh.getSizeZ());
    Origin origin = new Origin(0, 0, 0);
    CartesianMesh mesh = 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));
    DataIdentifier[] dataIdentifiers = simData.getVarAndFunctionDataIdentifiers(null);
    double[] times = simData.getDataTimes();
    for (int i = 0; i < dataIdentifiers.length; i++) {
        // ex: prebleach_avg, postbleach_first, postbleach_last, bleached_mask, cell_mask, ring1_mask,... ring8_mask
        System.out.println(dataIdentifiers[i].getName());
        for (double time : times) {
            // this loops only once, we have just 1 timepoint for each "special" image
            SimDataBlock simDataBlock = simData.getSimDataBlock(null, dataIdentifiers[i].getName(), time);
            channelNames[i] = dataIdentifiers[i].getName();
            channelTypes[i] = VariableType.VOLUME;
            channelVFrapImageType[i] = SymbolEquivalence.typeFromToken(dataIdentifiers[i].getName());
            pixData[0][i] = simDataBlock.getData();
            // var = prebleach_avg, time = 0.0, data = { 1.0832530361887216 1.0832530361887216 1.0832530361887216 1.0 .... }
            System.out.print("var = " + dataIdentifiers[i].getName() + ", time = " + time + ", data = { ");
            // show a few
            for (int j = 0; j < 5; j++) {
                System.out.print(pixData[0][i][j] + " ");
            }
            // show a few
            ;
            // show a few
            System.out.println(" ... ");
        }
    }
    hashTable.put("mesh", mesh);
    hashTable.put("pixData", pixData);
    hashTable.put("channelNames", channelNames);
    hashTable.put("channelTypes", channelTypes);
    hashTable.put("channelVFrapImageType", channelVFrapImageType);
    return true;
}
Also used : Origin(org.vcell.util.Origin) User(org.vcell.util.document.User) KeyValue(org.vcell.util.document.KeyValue) VCDataIdentifier(org.vcell.util.document.VCDataIdentifier) DataIdentifier(cbit.vcell.simdata.DataIdentifier) ExternalDataIdentifier(org.vcell.util.document.ExternalDataIdentifier) Extent(org.vcell.util.Extent) ISize(org.vcell.util.ISize) Element(org.jdom.Element) ArrayList(java.util.ArrayList) SimDataBlock(cbit.vcell.simdata.SimDataBlock) VariableType(cbit.vcell.math.VariableType) VCImageUncompressed(cbit.image.VCImageUncompressed) StringTokenizer(java.util.StringTokenizer) CartesianMesh(cbit.vcell.solvers.CartesianMesh) SimulationData(cbit.vcell.simdata.SimulationData) DataSymbolType(cbit.vcell.data.DataSymbol.DataSymbolType) RegionImage(cbit.vcell.geometry.RegionImage) VCDataIdentifier(org.vcell.util.document.VCDataIdentifier) File(java.io.File)

Example 3 with RegionImage

use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.

the class ROIMultiPaintManager method createFD.

private void createFD(boolean isFromSimulation, String fieldName, String annotation, Extent extent, Origin origin, String[] varNames, double[] times, ISize isize) throws Exception {
    FieldDataFileOperationSpec fdos = null;
    try {
        // temp-------
        FieldDataDBOperationSpec listExtDataIDSpec = FieldDataDBOperationSpec.createGetExtDataIDsSpec(documentManager.getUser());
        FieldDataDBOperationResults fdDBOperation = documentManager.fieldDataDBOperation(listExtDataIDSpec);
        for (int i = 0; i < fdDBOperation.extDataIDArr.length; i++) {
            if (fdDBOperation.extDataIDArr[i].getName().equals("fd")) {
                FieldDataDBOperationSpec createDeleteExtDataIDSpec = FieldDataDBOperationSpec.createDeleteExtDataIDSpec(fdDBOperation.extDataIDArr[i]);
                documentManager.fieldDataDBOperation(createDeleteExtDataIDSpec);
                break;
            }
        }
        // 
        // -----------
        FieldDataDBOperationSpec newExtDataIDSpec = FieldDataDBOperationSpec.createSaveNewExtDataIDSpec(documentManager.getUser(), fieldName, annotation);
        FieldDataDBOperationResults fieldDataDBOperation = documentManager.fieldDataDBOperation(newExtDataIDSpec);
        fdos = new FieldDataFileOperationSpec();
        fdos.opType = FieldDataFileOperationSpec.FDOS_ADD;
        fdos.variableTypes = new VariableType[] { VariableType.VOLUME };
        fdos.owner = documentManager.getUser();
        fdos.isize = isize;
        fdos.shortSpecData = new short[1][1][fdos.isize.getXYZ()];
        UShortImage[] allImages = initImageDataSetChannels[0].getAllImages();
        for (int i = 0; i < allImages.length; i++) {
            allImages[i].getPixels();
            System.arraycopy(allImages[i].getPixels(), 0, fdos.shortSpecData[0][0], i * allImages[i].getPixels().length, allImages[i].getPixels().length);
        }
        fdos.specEDI = fieldDataDBOperation.extDataID;
        fdos.annotation = annotation;
        if (!isFromSimulation) {
            fdos.extent = extent;
            fdos.origin = origin;
            fdos.varNames = varNames;
            fdos.times = times;
            // 
            // Subvolumes and Regions NOT implemented now
            // 
            fdos.cartesianMesh = CartesianMesh.createSimpleCartesianMesh(fdos.origin, fdos.extent, fdos.isize, new RegionImage(new // empty regions
            VCImageUncompressed(// empty regions
            null, // empty regions
            new byte[fdos.isize.getXYZ()], fdos.extent, fdos.isize.getX(), fdos.isize.getY(), fdos.isize.getZ()), 0, null, null, RegionImage.NO_SMOOTHING));
        }
        // Add to Server Disk
        documentManager.fieldDataFileOperation(fdos);
    // //Update FieldData window
    // Window[] windows = Window.getWindows();
    // for(int i=0;i<windows.length;i++) {
    // if(windows[i] instanceof FieldDataWindow) {
    // ((FieldDataWindow)windows[i]).getFieldDataWindowManger().fieldDataDBEvent(new FieldDataDBEvent(ROIMultiPaintManager.this));
    // break;
    // }
    // }
    } catch (Exception e) {
        try {
            // try to cleanup new ExtDataID
            if (fdos != null && fdos.specEDI != null) {
                documentManager.fieldDataDBOperation(FieldDataDBOperationSpec.createDeleteExtDataIDSpec(fdos.specEDI));
            }
        } catch (Exception e2) {
            e2.printStackTrace();
        }
        throw e;
    }
}
Also used : FieldDataFileOperationSpec(cbit.vcell.field.io.FieldDataFileOperationSpec) RegionImage(cbit.vcell.geometry.RegionImage) UShortImage(cbit.vcell.VirtualMicroscopy.UShortImage) FieldDataDBOperationResults(cbit.vcell.field.FieldDataDBOperationResults) FieldDataDBOperationSpec(cbit.vcell.field.FieldDataDBOperationSpec) Point(java.awt.Point) ImageException(cbit.image.ImageException) UtilCancelException(org.vcell.util.UtilCancelException) UserCancelException(org.vcell.util.UserCancelException)

Example 4 with RegionImage

use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.

the class ROIMultiPaintManager method getImportSTLtasks.

// private File lastImportDir;
private ArrayList<AsynchClientTask> getImportSTLtasks(File[] selectedFiles, Vect3d primarySampleSizes, Vect3d subSampleOffset) {
    // try {
    final RegionImage currRegionImage = regionImage;
    final TreeMap<Integer, String> newROIindexes = new TreeMap<>();
    final TreeMap<BoundingBox, Object[]> regionBounds = new TreeMap<>(new Comparator<BoundingBox>() {

        @Override
        public int compare(BoundingBox arg0, BoundingBox arg1) {
            if (arg1 == arg0) {
                return 0;
            }
            if (arg0.getLoX() == arg1.getLoX() && arg0.getLoY() == arg1.getLoY() && arg0.getLoZ() == arg1.getLoZ() && arg0.getHiX() == arg1.getHiX() && arg0.getHiY() == arg1.getHiY() && arg0.getHiZ() == arg1.getHiZ()) {
                return 0;
            }
            return (arg0.getLoX() >= arg1.getLoX() && arg0.getLoY() >= arg1.getLoY() && arg0.getLoZ() >= arg1.getLoZ() && arg0.getHiX() <= arg1.getHiX() && arg0.getHiY() <= arg1.getHiY() && arg0.getHiZ() <= arg1.getHiZ() ? -1 : +1);
        }
    });
    AsynchClientTask sampleSTLtask = new AsynchClientTask("importSTLtask", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {

        @Override
        public void run(Hashtable<String, Object> hashTable) throws Exception {
            StatsHelper statsHelper = calcMinMax(selectedFiles);
            Vect3d worldOrigin = new Vect3d(statsHelper.xmin, statsHelper.ymin, statsHelper.zmin);
            Vect3d worldCollapsedBoundingBox = new Vect3d(statsHelper.xmax - statsHelper.xmin, statsHelper.ymax - statsHelper.ymin, statsHelper.zmax - statsHelper.zmin);
            Vect3d scale = new Vect3d(worldCollapsedBoundingBox.getX() / (2.0 * primarySampleSizes.getX()), worldCollapsedBoundingBox.getY() / (2.0 * primarySampleSizes.getY()), worldCollapsedBoundingBox.getZ() / (2.0 * primarySampleSizes.getZ()));
            // }
            if (scale.getX() != 0 && scale.getX() <= (scale.getY() == 0 ? scale.getX() : scale.getY()) && scale.getX() <= (scale.getZ() == 0 ? scale.getX() : scale.getZ())) {
                scale = new Vect3d(scale.getX(), scale.getX(), scale.getX());
            } else if (scale.getY() != 0 && scale.getY() <= (scale.getX() == 0 ? scale.getY() : scale.getX()) && scale.getY() <= (scale.getZ() == 0 ? scale.getY() : scale.getZ())) {
                scale = new Vect3d(scale.getY(), scale.getY(), scale.getY());
            } else if (scale.getZ() != 0 && scale.getZ() <= (scale.getY() == 0 ? scale.getZ() : scale.getY()) && scale.getZ() <= (scale.getX() == 0 ? scale.getZ() : scale.getX())) {
                scale = new Vect3d(scale.getZ(), scale.getZ(), scale.getZ());
            }
            for (int j = 0; j < selectedFiles.length; j++) {
                // ClientRequestManager.createSurfaceCollectionFromSurfaceFile(selectedFile);
                SurfaceCollection surfaceCollection = statsHelper.recalSurfs.get(j);
                for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
                    Surface surface = surfaceCollection.getSurfaces(i);
                    // System.out.println("surface "+i);
                    // Vect3d xyzLow = new Vect3d(surface.getPolygons(0).getNodes(0).getX(),surface.getPolygons(0).getNodes(1).getX(),surface.getPolygons(0).getNodes(2).getX());
                    // Vect3d xyzHigh = new Vect3d(xyzLow);
                    ComboboxROIName[] existingRoiNames = overlayEditorPanelJAI.getAllCompositeROINamesAndColors();
                    int newIndex = getUnusedROIColorIndex(existingRoiNames, newROIindexes.keySet());
                    newROIindexes.put(newIndex, selectedFiles[j].getName());
                    byte value = (byte) newIndex;
                    // overlayEditorPanelJAI.addROIName(roiName, true, roiName, true, value);
                    for (int k = 0; k < surface.getPolygonCount(); k++) {
                        Polygon polygon = surface.getPolygons(k);
                        // for (Node pnode:polygon.getNodes()) {
                        // xyzLow.set(Math.min(xyzLow.getX(), pnode.getX()),Math.min(xyzLow.getY(), pnode.getY()),Math.min(xyzLow.getZ(), pnode.getZ()));
                        // xyzHigh.set(Math.max(xyzHigh.getX(), pnode.getX()),Math.max(xyzHigh.getY(), pnode.getY()),Math.max(xyzHigh.getZ(), pnode.getZ()));
                        // }
                        // if(k%10000 == 0){
                        // System.out.println("progress= file "+(j+1)+" of "+selectedFiles.length+" "+((k*100)/surface.getPolygonCount())+"%");
                        // }
                        // System.out.println("  polygon "+j+" "+polygon.getNodes(0)+" "+polygon.getNodes(1)+" "+polygon.getNodes(2));
                        Vect3d line1 = new Vect3d(polygon.getNodes(0));
                        Vect3d end1 = new Vect3d(polygon.getNodes(2));
                        Vect3d incr1 = Vect3d.sub(end1, line1);
                        incr1.unit();
                        incr1.set(incr1.getX() * scale.getX(), incr1.getY() * scale.getY(), incr1.getZ() * scale.getZ());
                        Vect3d line2 = new Vect3d(line1);
                        Vect3d end2 = new Vect3d(polygon.getNodes(1));
                        Vect3d incr2 = Vect3d.sub(end2, line2);
                        incr2.unit();
                        incr2.set(incr2.getX() * scale.getX(), incr2.getY() * scale.getY(), incr2.getZ() * scale.getZ());
                        while (true) {
                            Vect3d line3 = new Vect3d(line1);
                            Vect3d end3 = new Vect3d(line2);
                            Vect3d incr3 = Vect3d.sub(end3, line3);
                            if (incr3.length() != 0) {
                                incr3.unit();
                                incr3.set(incr3.getX() * scale.getX(), incr3.getY() * scale.getY(), incr3.getZ() * scale.getZ());
                            }
                            while (true) {
                                calcXYZ(line3, worldOrigin, worldCollapsedBoundingBox, primarySampleSizes, subSampleOffset, value);
                                line3.add(incr3);
                                Vect3d check = Vect3d.sub(end3, line3);
                                if ((check.length() == 0) || Math.signum(check.getX()) != Math.signum(incr3.getX()) || Math.signum(check.getY()) != Math.signum(incr3.getY()) || Math.signum(check.getZ()) != Math.signum(incr3.getZ())) {
                                    calcXYZ(end3, worldOrigin, worldCollapsedBoundingBox, primarySampleSizes, subSampleOffset, value);
                                    break;
                                }
                            }
                            if (line1.equals(end1) && line2.equals(end2)) {
                                break;
                            }
                            line1.add(incr1);
                            Vect3d check = Vect3d.sub(end1, line1);
                            if (check.length() == 0 || Math.signum(check.getX()) != Math.signum(incr1.getX()) || Math.signum(check.getY()) != Math.signum(incr1.getY()) || Math.signum(check.getZ()) != Math.signum(incr1.getZ())) {
                                line1 = new Vect3d(end1);
                            }
                            line2.add(incr2);
                            check = Vect3d.sub(end2, line2);
                            if (check.length() == 0 || Math.signum(check.getX()) != Math.signum(incr2.getX()) || Math.signum(check.getY()) != Math.signum(incr2.getY()) || Math.signum(check.getZ()) != Math.signum(incr2.getZ())) {
                                line2 = new Vect3d(end2);
                            }
                        }
                    }
                // regionBounds.put(new BoundingBox(xyzLow.getX(), xyzHigh.getX(),xyzLow.getY(), xyzHigh.getY(),xyzLow.getZ(), xyzHigh.getZ()),new Object[] {new int[] {j,i},roiName});
                }
            }
            // for(BoundingBox bb:regionBounds.keySet()){
            // System.out.println(((int[])regionBounds.get(bb)[0])[0]+","+((int[])regionBounds.get(bb)[0])[1]+" name="+((String)regionBounds.get(bb)[1])+" bound="+bb.getLoX()+","+bb.getHiX()+" "+bb.getLoY()+","+bb.getHiY()+" "+bb.getLoZ()+","+bb.getHiZ());
            // }
            updateAuxiliaryInfo(originalISize, getClientTaskStatusSupport());
        // }
        }
    };
    final int[] checkHolder = new int[1];
    final String[] cleanupHolder = new String[1];
    final String YES = "Yes";
    final ComboboxROIName[] cbxHolder = new ComboboxROIName[1];
    final String CHECK = "check";
    AsynchClientTask addROInamesTask = new AsynchClientTask("Add new ROI names...", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {

        @Override
        public void run(Hashtable<String, Object> hashTable) throws Exception {
            int i = 0;
            for (Integer newIndex : newROIindexes.keySet()) {
                String roiName = FilenameUtils.getBaseName(newROIindexes.get(newIndex));
                roiName = TokenMangler.fixTokenStrict(roiName, 6);
                roiName += "_" + i++;
                overlayEditorPanelJAI.addROIName(roiName, true, roiName, true, newIndex);
            }
            cleanupHolder[0] = DialogUtils.showWarningDialog(overlayEditorPanelJAI, "Cleanup imported geometry?", new String[] { YES, "No" }, YES);
            if (!YES.equals(cleanupHolder[0])) {
                return;
            }
            checkHolder[0] = getUnusedROIColorIndex(overlayEditorPanelJAI.getAllCompositeROINamesAndColors(), null);
            overlayEditorPanelJAI.addROIName(CHECK, true, CHECK, true, checkHolder[0]);
            ComboboxROIName[] temp = overlayEditorPanelJAI.getAllCompositeROINamesAndColors();
            for (ComboboxROIName cbx : temp) {
                if (cbx.getROIName().equals(CHECK)) {
                    cbxHolder[0] = cbx;
                    break;
                }
            }
        }
    };
    // AsynchClientTask removeCheckROI = new AsynchClientTask("Remove check...",AsynchClientTask.TASKTYPE_SWING_BLOCKING) {
    // 
    // @Override
    // public void run(Hashtable<String, Object> hashTable) throws Exception {
    // ComboboxROIName[] regNames = overlayEditorPanelJAI.getAllCompositeROINamesAndColors();
    // for(ComboboxROIName cbx:regNames){
    // if(cbx.get)
    // }
    // }
    // };
    final AsynchClientTask mergeBackgroundRegions = new AsynchClientTask("Merge background regions...", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {

        @Override
        public void run(Hashtable<String, Object> hashTable) throws Exception {
            if (!YES.equals(cleanupHolder[0])) {
                return;
            }
            // long start = System.currentTimeMillis();
            // while(currRegionImage == regionImage){
            // int dur = (int)((System.currentTimeMillis()-start)/1000);
            // if(dur > 10){
            // return;
            // }
            // System.out.println("trying..."+dur);
            // Thread.sleep(1000);
            // }
            final TreeMap<RegionInfo, Vect3d[]> regTobb = new TreeMap<>(new Comparator<RegionInfo>() {

                @Override
                public int compare(RegionInfo arg0, RegionInfo arg1) {
                    return arg0.getRegionIndex() - arg1.getRegionIndex();
                }
            });
            Hashtable<String, Object> newRegionImgHolder = new Hashtable<>();
            createRegionImageTask.run(newRegionImgHolder);
            RegionImage newRegionImage = (RegionImage) newRegionImgHolder.get(LOCAL_REGION_IMAGE);
            // ArrayList<RegionInfo> remainingRegionInfos = new ArrayList<>(Arrays.asList(newRegionImage.getRegionInfos()));
            // BoundingBox bb = new BoundingBox(0, newRegionImage.getNumX()-1, 0, newRegionImage.getNumY()-1, 0, newRegionImage.getNumZ()-1);
            // int currIndex = 0;
            // for (int z = 0; z <= bb.getHiZ(); z++) {
            // for (int y = 0; y <= bb.getHiY(); y++) {
            // for (int x = 0; x <= bb.getHiX(); x++) {
            // ArrayList<RegionInfo> tempRegionInfos = (ArrayList<RegionInfo>)remainingRegionInfos.clone();
            // if(x==0 || x == bb.getHiX() || y==0 || y == bb.getHiY() || z==0 || z == bb.getHiZ()){
            // for(RegionInfo reg:tempRegionInfos){
            // if(reg.getPixelValue() == 0 && reg.isIndexInRegion(currIndex)){
            // remainingRegionInfos.remove(reg);
            // break;
            // }
            // }
            // }else{
            // for(RegionInfo reg:tempRegionInfos){
            // if(reg.getPixelValue() == 0 && reg.isIndexInRegion(currIndex)){
            // remainingRegionInfos.remove(reg);
            // break;
            // }
            // }
            // }
            // currIndex++;
            // }
            // }
            // }
            // Remove unfilled regions (background) that touch the whole region border
            int allPixCnt = 0;
            ArrayList<RegionInfo> excluded = new ArrayList<>();
            for (int z = 0; z < newRegionImage.getNumZ(); z++) {
                for (int y = 0; y < newRegionImage.getNumY(); y++) {
                    for (int x = 0; x < newRegionImage.getNumX(); x++) {
                        RegionInfo regInfo = newRegionImage.getRegionInfoFromOffset(allPixCnt);
                        allPixCnt += 1;
                        if (excluded.contains(regInfo)) {
                            continue;
                        }
                        if (regInfo.getPixelValue() == 0 && (x == 0 || x == newRegionImage.getNumX() - 1 || y == 0 || y == newRegionImage.getNumY() - 1 || z == 0 || z == newRegionImage.getNumZ() - 1)) {
                            excluded.add(regInfo);
                            if (regTobb.containsKey(regInfo)) {
                                regTobb.remove(regInfo);
                            }
                            continue;
                        }
                        Vect3d[] bounds = regTobb.get(regInfo);
                        if (bounds == null) {
                            bounds = new Vect3d[] { new Vect3d(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY), new Vect3d(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY) };
                            regTobb.put(regInfo, bounds);
                        }
                        bounds[0].set(Math.min(bounds[0].getX(), x), Math.min(bounds[0].getY(), y), Math.min(bounds[0].getZ(), z));
                        bounds[1].set(Math.max(bounds[1].getX(), x), Math.max(bounds[1].getY(), y), Math.max(bounds[1].getZ(), z));
                    }
                }
            }
            // ArrayList<Object[]> tree = new ArrayList<>();//arraylist<object[]>,regionInfo
            // ArrayList<RegionInfo> bucket = new ArrayList<>(regTobb.keySet());
            // tree.add(new Object[] {null,regTobb.firstKey()});
            // //				ArrayList<Object[]> stack = new ArrayList<>();
            // //				stack.add(tree.get(0));
            // while(bucket.size() > 0){
            // //					Object[] next = stack.remove(0);
            // RegionInfo next = bucket.remove(0);
            // Vect3d[] o2v = (Vect3d[])regTobb.get(regTobb.get(next));
            // for(Object[] objArr:tree){
            // //						if(((RegionInfo)next[1]).getRegionIndex() != reg.getRegionIndex()){
            // //								for(RegionInfo bucketReg:bucket){
            // Vect3d[] o1v = (Vect3d[])regTobb.get(objArr[1]);
            // if(	o1v[0].getX() >= o2v[0].getX() && o1v[0].getX() <= o2v[1].getX() &&
            // o1v[0].getY() >= o2v[0].getY() && o1v[0].getY() <= o2v[1].getY() &&
            // o1v[0].getZ() >= o2v[0].getZ() && o1v[0].getZ() <= o2v[1].getZ()
            // ){
            // 
            // }
            // //								}
            // //						}
            // }
            // }
            // Sort filled/unfilled regions by boundingbox
            ArrayList<RegionInfo> sortedRegionInfos = new ArrayList<>(Arrays.asList(regTobb.keySet().toArray(new RegionInfo[0])));
            Collections.sort(sortedRegionInfos, new Comparator<RegionInfo>() {

                @Override
                public int compare(RegionInfo o1, RegionInfo o2) {
                    Vect3d[] o1v = (Vect3d[]) regTobb.get(o1);
                    Vect3d[] o2v = (Vect3d[]) regTobb.get(o2);
                    // }
                    if (o1v[0].getX() == o2v[0].getX() && o1v[1].getX() == o2v[1].getX() && o1v[0].getY() == o2v[0].getY() && o1v[1].getY() == o2v[1].getY() && o1v[0].getZ() >= o2v[0].getZ() && o1v[1].getZ() == o2v[1].getZ()) {
                        System.out.println(o1.getRegionIndex() + " == " + o2.getRegionIndex());
                        return 0;
                    } else if (o1v[0].getX() >= o2v[0].getX() && o1v[0].getX() <= o2v[1].getX() && // o1v[1].getX() >= o2v[0].getX() && o1v[1].getX() <= o2v[1].getX() &&
                    o1v[0].getY() >= o2v[0].getY() && o1v[0].getY() <= o2v[1].getY() && // o1v[1].getY() >= o2v[0].getY() && o1v[1].getY() <= o2v[1].getY() &&
                    o1v[0].getZ() >= o2v[0].getZ() && o1v[0].getZ() <= o2v[1].getZ()) // && o1v[1].getZ() >= o2v[0].getZ() && o1v[1].getZ() <= o2v[1].getZ()
                    {
                        System.out.println(o1.getRegionIndex() + " > " + o2.getRegionIndex());
                        return 1;
                    } else if (o1v[0].getX() <= o2v[0].getX() && o1v[1].getX() >= o2v[1].getX() && o1v[0].getY() <= o2v[0].getY() && o1v[1].getY() >= o2v[1].getY() && o1v[0].getZ() <= o2v[0].getZ() && o1v[1].getZ() >= o2v[1].getZ()) // (o1v[0].getX() < o2v[0].getX() && o1v[1].getX() < o2v[0].getX()) ||
                    // (o1v[0].getX() > o2v[1].getX() && o1v[1].getX() > o2v[1].getX()) ||
                    // 
                    // (o1v[0].getY() < o2v[0].getY() && o1v[1].getY() < o2v[0].getY()) ||
                    // (o1v[0].getY() > o2v[1].getY() && o1v[1].getY() > o2v[1].getY()) ||
                    // 
                    // (o1v[0].getZ() < o2v[0].getZ() && o1v[1].getZ() < o2v[0].getZ()) ||
                    // (o1v[0].getZ() > o2v[1].getZ() && o1v[1].getZ() > o2v[1].getZ())
                    // 
                    // /*	(o1v[0].getX() < o2v[0].getX() && o1v[0].getX() > o2v[1].getX() &&
                    // o1v[1].getX() < o2v[0].getX() && o1v[1].getX() > o2v[1].getX()) ||
                    // (o1v[0].getY() < o2v[0].getY() && o1v[0].getY() > o2v[1].getY() &&
                    // o1v[1].getY() < o2v[0].getY() && o1v[1].getY() > o2v[1].getY()) ||
                    // (o1v[0].getZ() < o2v[0].getZ() && o1v[0].getZ() > o2v[1].getZ() &&
                    // o1v[1].getZ() < o2v[0].getZ() && o1v[1].getZ() > o2v[1].getZ())*/
                    {
                        System.out.println(o1.getRegionIndex() + " <a " + o2.getRegionIndex());
                        return -1;
                    } else if ((o1v[0].getX() < o2v[0].getX() && o1v[1].getX() < o2v[0].getX()) || (o1v[0].getX() > o2v[1].getX() && o1v[1].getX() > o2v[1].getX()) || (o1v[0].getY() < o2v[0].getY() && o1v[1].getY() < o2v[0].getY()) || (o1v[0].getY() > o2v[1].getY() && o1v[1].getY() > o2v[1].getY()) || (o1v[0].getZ() < o2v[0].getZ() && o1v[1].getZ() < o2v[0].getZ()) || (o1v[0].getZ() > o2v[1].getZ() && o1v[1].getZ() > o2v[1].getZ())) {
                        System.out.println(o1.getRegionIndex() + " <b " + o2.getRegionIndex());
                        return -1;
                    }
                    System.out.println("inconclusive " + o1.getRegionIndex() + " == " + o2.getRegionIndex());
                    return 0;
                // System.out.println("inconclusive "+o1.getRegionIndex()+" "+(o1.getNumPixels() - o2.getNumPixels()<0?"<":(o1.getNumPixels() - o2.getNumPixels()>0?">":"=="))+" "+o2.getRegionIndex());
                // return o1.getNumPixels() - o2.getNumPixels();
                // System.out.println("inconclusive "+o1.getRegionIndex()+" "+(o1.getRegionIndex()-o2.getRegionIndex()<0?"<":(o1.getRegionIndex()-o2.getRegionIndex()>0?">":"=="))+" "+o2.getRegionIndex());
                // return o1.getRegionIndex()-o2.getRegionIndex();
                // if(o1v[0].getZ() != o2v[0].getZ()){
                // return (int)(o1v[0].getZ() - o2v[0].getZ());
                // }else if(o1v[0].getY() != o2v[0].getY()){
                // return (int)(o1v[0].getY() - o2v[0].getY());
                // }else if(o1v[0].getX() != o2v[0].getX()){
                // return (int)(o1v[0].getX() - o2v[0].getX());
                // }else
                // return 0;
                }
            });
            // Convert unfilled regions into parent regions
            int currColorIndex = -1;
            // for (int i = sortedRegionInfos.size()-1; i >= 0; i--) {
            for (int i = 0; i < sortedRegionInfos.size(); i++) {
                RegionInfo regInfo = sortedRegionInfos.get(i);
                Vect3d[] o1v = (Vect3d[]) regTobb.get(regInfo);
                ComboboxROIName cbxroiName = overlayEditorPanelJAI.getComboboxROIName(regInfo);
                // System.out.println(cbxroiName+" colorIndex="+regInfo.getPixelValue()+" regIndex="+regInfo.getRegionIndex()+" pixels="+regInfo.getNumPixels()+" "+o1v[0]+" "+o1v[1]);
                if (cbxroiName != null) {
                    currColorIndex = cbxroiName.getContrastColorIndex();
                    continue;
                }
                allPixCnt = 0;
                for (int z = 0; z < newRegionImage.getNumZ(); z++) {
                    for (int y = 0; y < newRegionImage.getNumY(); y++) {
                        for (int x = 0; x < newRegionImage.getNumX(); x++) {
                            if (regInfo.isIndexInRegion(allPixCnt)) {
                                BufferedImage plane = roiComposite[z];
                                byte[] data = ((DataBufferByte) plane.getRaster().getDataBuffer()).getData();
                                data[x + (plane.getWidth() * y)] = (byte) currColorIndex;
                            }
                            allPixCnt++;
                        }
                    }
                }
            }
            // for(RegionInfo regInfo:regTobb.keySet()){
            // Vect3d[] varr = regTobb.get(regInfo);
            // ComboboxROIName cbxroiName = overlayEditorPanelJAI.getComboboxROIName(regInfo);
            // regionBounds.put(new BoundingBox(varr[0].getX(), varr[1].getX(),varr[0].getY(), varr[1].getY(),varr[0].getZ(), varr[1].getZ()),new Object[] {cbxroiName});
            // }
            // for(BoundingBox bb:regionBounds.keySet()){
            // ComboboxROIName cbxroiName = ((ComboboxROIName)regionBounds.get(bb)[0]);
            // System.out.println(cbxroiName+" bound="+bb.getLoX()+","+bb.getHiX()+" "+bb.getLoY()+","+bb.getHiY()+" "+bb.getLoZ()+","+bb.getHiZ());
            // 
            // }
            // Make sure every pixel has only 1 kind of neighbor
            // createRegionImageTask.run(newRegionImgHolder);
            // newRegionImage = (RegionImage)newRegionImgHolder.get(LOCAL_REGION_IMAGE);
            boolean bHasCheck = false;
            VCImage checkImage = ROIMultiPaintManager.createVCImageFromBufferedImages(ROIMultiPaintManager.DEFAULT_EXTENT, roiComposite);
            newRegionImage = new RegionImage(checkImage, 0, /*0 means generate no surfacecollection*/
            checkImage.getExtent(), ROIMultiPaintManager.DEFAULT_ORIGIN, RegionImage.NO_SMOOTHING, null);
            TreeSet<Integer> diffNeighbors = new TreeSet<>();
            int[][] offsets = new int[][] { { -1, 0, 0 }, { 1, 0, 0 }, { 0, -1, 0 }, { 0, 1, 0 }, { 0, 0, -1 }, { 0, 0, 1 } };
            for (int z = 0; z < newRegionImage.getNumZ(); z++) {
                BufferedImage plane = roiComposite[z];
                byte[] data = ((DataBufferByte) plane.getRaster().getDataBuffer()).getData();
                allPixCnt = 0;
                for (int y = 0; y < newRegionImage.getNumY(); y++) {
                    for (int x = 0; x < newRegionImage.getNumX(); x++) {
                        diffNeighbors.clear();
                        RegionInfo regInfo = newRegionImage.getRegionInfoFromOffset(allPixCnt);
                        if (regInfo.getPixelValue() == 0) {
                            allPixCnt++;
                            continue;
                        }
                        if (x == 19 && y == 15) {
                            System.out.println("here");
                        }
                        for (int i = 0; i < offsets.length; i++) {
                            int tmpx = offsets[i][0] + x;
                            if (tmpx < 0 || tmpx >= newRegionImage.getNumX()) {
                                continue;
                            }
                            int tmpy = offsets[i][1] + y;
                            if (tmpy < 0 || tmpy >= newRegionImage.getNumY()) {
                                continue;
                            }
                            int tmpz = offsets[i][2] + z;
                            if (tmpz < 0 || tmpz >= newRegionImage.getNumZ()) {
                                continue;
                            }
                            BufferedImage plane0 = roiComposite[tmpz];
                            byte[] data0 = ((DataBufferByte) plane.getRaster().getDataBuffer()).getData();
                            byte shiftb = data0[tmpx + (tmpy * newRegionImage.getNumX())];
                            if (shiftb != regInfo.getPixelValue()) {
                                diffNeighbors.add(0x000000FF & shiftb);
                            }
                        }
                        // for (int z0 = -1; z0 <= 1; z0+=2) {
                        // int tmpz = z+z0;
                        // if(tmpz < 0 || tmpz >= newRegionImage.getNumZ()){
                        // continue;
                        // }
                        // //								tmpz = allPixCnt+(z0*newRegionImage.getNumXY());
                        // BufferedImage plane0 = roiComposite[z+z0];
                        // byte[] data0 = ((DataBufferByte)plane.getRaster().getDataBuffer()).getData();
                        // for (int y0 = -1; y0 <= 1; y0+=2) {
                        // int tmpy = y+y0;
                        // if(tmpy < 0 || tmpy >= newRegionImage.getNumY()){
                        // continue;
                        // }
                        // //									tmpy = tmpz+(y0*newRegionImage.getNumX());
                        // for (int x0 = -1; x0 <= 1; x0+=2) {
                        // int tmpx = x+x0;
                        // if(tmpx < 0 || tmpx >= newRegionImage.getNumX()){
                        // continue;
                        // }
                        // //										tmpx = tmpy+(x0);
                        // byte shiftb = data0[tmpx+(tmpy*newRegionImage.getNumX())];
                        // if(shiftb != regInfo.getPixelValue()){
                        // diffNeighbors.add(0x000000FF&shiftb);
                        // }
                        // }
                        // }
                        // }
                        allPixCnt++;
                        if (diffNeighbors.size() > 1) {
                            bHasCheck = true;
                            data[x + y * newRegionImage.getNumX()] = (byte) checkHolder[0];
                        }
                    }
                }
            }
            if (!bHasCheck && cbxHolder[0] != null) {
                SwingUtilities.invokeAndWait(new Runnable() {

                    @Override
                    public void run() {
                        overlayEditorPanelJAI.deleteROIName(cbxHolder[0]);
                    }
                });
            }
        }
    };
    // }).start();
    return new ArrayList<>(Arrays.asList(new AsynchClientTask[] { sampleSTLtask, addROInamesTask, mergeBackgroundRegions, getUpdateDisplayAfterCropTask() }));
// JFileChooser importJFC = new JFileChooser(ClientRequestManager.getPreferredPath(UserPreferences.getLastUserPreferences()));
// importJFC.setDialogTitle("Choose .stl file to import");
// importJFC.setMultiSelectionEnabled(true);
// int result = importJFC.showOpenDialog(overlayEditorPanelJAI);
// if(result == JFileChooser.APPROVE_OPTION){
// File[] selectedFiles = importJFC.getSelectedFiles();
// if(statsHelper == null){
// statsHelper = calcMinMax(selectedFiles);
// }
// ClientRequestManager.setPreferredPath(UserPreferences.getLastUserPreferences(), selectedFiles[0]);
// 
// Vect3d worldOrigin = new Vect3d(statsHelper.xmin, statsHelper.ymin, statsHelper.zmin);
// Vect3d worldCollapsedBoundingBox = new Vect3d(statsHelper.xmax-statsHelper.xmin, statsHelper.ymax-statsHelper.ymin, statsHelper.zmax-statsHelper.zmin);
// Vect3d scale = new Vect3d(worldCollapsedBoundingBox.getX()/(2.0*primarySampleSizes.getX()), worldCollapsedBoundingBox.getY()/(2.0*primarySampleSizes.getY()), worldCollapsedBoundingBox.getZ()/(2.0*primarySampleSizes.getZ()));
// //				if(scale.getX() !=0 && scale.getX() >= (scale.getY()==0?scale.getX():scale.getY()) && scale.getX() >= (scale.getZ()==0?scale.getX():scale.getZ())){
// //					scale = new Vect3d(scale.getX(), scale.getX(), scale.getX());
// //				}else if(scale.getY() !=0 && scale.getY() >= (scale.getX()==0?scale.getY():scale.getX()) && scale.getY() >= (scale.getZ()==0?scale.getY():scale.getZ())){
// //					scale = new Vect3d(scale.getY(), scale.getY(), scale.getY());
// //				}else if(scale.getZ() !=0 && scale.getZ() >= (scale.getY()==0?scale.getZ():scale.getY()) && scale.getZ() >= (scale.getX()==0?scale.getZ():scale.getX())){
// //					scale = new Vect3d(scale.getZ(), scale.getZ(), scale.getZ());
// //				}
// if(scale.getX() !=0 && scale.getX() <= (scale.getY()==0?scale.getX():scale.getY()) && scale.getX() <= (scale.getZ()==0?scale.getX():scale.getZ())){
// scale = new Vect3d(scale.getX(), scale.getX(), scale.getX());
// }else if(scale.getY() !=0 && scale.getY() <= (scale.getX()==0?scale.getY():scale.getX()) && scale.getY() <= (scale.getZ()==0?scale.getY():scale.getZ())){
// scale = new Vect3d(scale.getY(), scale.getY(), scale.getY());
// }else if(scale.getZ() !=0 && scale.getZ() <= (scale.getY()==0?scale.getZ():scale.getY()) && scale.getZ() <= (scale.getX()==0?scale.getZ():scale.getX())){
// scale = new Vect3d(scale.getZ(), scale.getZ(), scale.getZ());
// }
// TreeMap<BoundingBox,Object[]> regionBounds = new TreeMap<>(new Comparator<BoundingBox>() {
// @Override
// public int compare(BoundingBox arg0, BoundingBox arg1) {
// if(arg1 == arg0){
// return 0;
// }
// if(arg0.getLoX() == arg1.getLoX() &&
// arg0.getLoY() == arg1.getLoY() &&
// arg0.getLoZ() == arg1.getLoZ() &&
// arg0.getHiX() == arg1.getHiX() &&
// arg0.getHiY() == arg1.getHiY() &&
// arg0.getHiZ() == arg1.getHiZ()){
// return 0;
// }
// return (arg0.getLoX() >= arg1.getLoX() &&
// arg0.getLoY() >= arg1.getLoY() &&
// arg0.getLoZ() >= arg1.getLoZ() &&
// arg0.getHiX() <= arg1.getHiX() &&
// arg0.getHiY() <= arg1.getHiY() &&
// arg0.getHiZ() <= arg1.getHiZ()?-1:+1);
// }
// });
// for (int j = 0; j < selectedFiles.length; j++) {
// SurfaceCollection surfaceCollection = statsHelper.recalSurfs.get(j);//ClientRequestManager.createSurfaceCollectionFromSurfaceFile(selectedFile);
// for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
// Surface surface = surfaceCollection.getSurfaces(i);
// System.out.println("surface "+i);
// Vect3d xyzLow = new Vect3d(surface.getPolygons(0).getNodes(0).getX(),surface.getPolygons(0).getNodes(1).getX(),surface.getPolygons(0).getNodes(2).getX());
// Vect3d xyzHigh = new Vect3d(xyzLow);
// ComboboxROIName[] existingRoiNames = overlayEditorPanelJAI.getAllCompositeROINamesAndColors();
// byte value = (byte)getUnusedROIColorIndex(existingRoiNames);
// String roiName = FilenameUtils.getBaseName(selectedFiles[j].getName());
// roiName = TokenMangler.fixTokenStrict(roiName, 6);
// roiName+= "_"+i;
// overlayEditorPanelJAI.addROIName(roiName, true, roiName, true, value);
// for (int k = 0; k < surface.getPolygonCount(); k++){
// Polygon polygon = surface.getPolygons(k);
// //							for (Node pnode:polygon.getNodes()) {
// //								xyzLow.set(Math.min(xyzLow.getX(), pnode.getX()),Math.min(xyzLow.getY(), pnode.getY()),Math.min(xyzLow.getZ(), pnode.getZ()));
// //								xyzHigh.set(Math.max(xyzHigh.getX(), pnode.getX()),Math.max(xyzHigh.getY(), pnode.getY()),Math.max(xyzHigh.getZ(), pnode.getZ()));
// //							}
// if(k%10000 == 0){
// System.out.println("progress= file "+(j+1)+" of "+selectedFiles.length+" "+((k*100)/surface.getPolygonCount())+"%");
// }
// //							System.out.println("  polygon "+j+" "+polygon.getNodes(0)+" "+polygon.getNodes(1)+" "+polygon.getNodes(2));
// Vect3d line1 = new Vect3d(polygon.getNodes(0));
// Vect3d end1 = new Vect3d(polygon.getNodes(2));
// Vect3d incr1 = Vect3d.sub(end1,line1);
// incr1.unit();
// incr1.set(incr1.getX()*scale.getX(), incr1.getY()*scale.getY(), incr1.getZ()*scale.getZ());
// Vect3d line2 = new Vect3d(line1);
// Vect3d end2 = new Vect3d(polygon.getNodes(1));
// Vect3d incr2 = Vect3d.sub(end2,line2);
// incr2.unit();
// incr2.set(incr2.getX()*scale.getX(), incr2.getY()*scale.getY(), incr2.getZ()*scale.getZ());
// while(true){
// Vect3d line3 = new Vect3d(line1);
// Vect3d end3 = new Vect3d(line2);
// Vect3d incr3 = Vect3d.sub(end3,line3);
// if(incr3.length() != 0){
// incr3.unit();
// incr3.set(incr3.getX()*scale.getX(), incr3.getY()*scale.getY(), incr3.getZ()*scale.getZ());
// }
// while(true){
// calcXYZ(line3, worldOrigin, worldCollapsedBoundingBox, primarySampleSizes,subSampleOffset,value);
// line3.add(incr3);
// Vect3d check =  Vect3d.sub(end3, line3);
// if((check.length()==0) || Math.signum(check.getX()) != Math.signum(incr3.getX()) || Math.signum(check.getY()) != Math.signum(incr3.getY()) || Math.signum(check.getZ()) != Math.signum(incr3.getZ())){
// calcXYZ(end3, worldOrigin, worldCollapsedBoundingBox, primarySampleSizes,subSampleOffset,value);
// break;
// }
// }
// if(line1.equals(end1) && line2.equals(end2)){
// break;
// }
// 
// line1.add(incr1);
// Vect3d check =  Vect3d.sub(end1, line1);
// if(check.length()==0 || Math.signum(check.getX()) != Math.signum(incr1.getX()) || Math.signum(check.getY()) != Math.signum(incr1.getY()) || Math.signum(check.getZ()) != Math.signum(incr1.getZ())){
// line1 = new Vect3d(end1);
// }
// line2.add(incr2);
// check =  Vect3d.sub(end2, line2);
// if(check.length()==0 || Math.signum(check.getX()) != Math.signum(incr2.getX()) || Math.signum(check.getY()) != Math.signum(incr2.getY()) || Math.signum(check.getZ()) != Math.signum(incr2.getZ())){
// line2 = new Vect3d(end2);
// }
// }
// }
// //						regionBounds.put(new BoundingBox(xyzLow.getX(), xyzHigh.getX(),xyzLow.getY(), xyzHigh.getY(),xyzLow.getZ(), xyzHigh.getZ()),new Object[] {new int[] {j,i},roiName});
// }
// }
// //				for(BoundingBox bb:regionBounds.keySet()){
// //					System.out.println(((int[])regionBounds.get(bb)[0])[0]+","+((int[])regionBounds.get(bb)[0])[1]+" name="+((String)regionBounds.get(bb)[1])+" bound="+bb.getLoX()+","+bb.getHiX()+" "+bb.getLoY()+","+bb.getHiY()+" "+bb.getLoZ()+","+bb.getHiZ());
// //				}
// updateAuxiliaryInfo(originalISize, null);
// getUpdateDisplayAfterCropTask().run(null);
// 
// new Thread(new Runnable() {
// @Override
// public void run() {
// while(ClientTaskDispatcher.isBusy()){
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// TreeMap<RegionInfo, Vect3d[]> regTobb = new TreeMap<>(new Comparator<RegionInfo>() {
// @Override
// public int compare(RegionInfo arg0, RegionInfo arg1) {
// return arg0.getRegionIndex()-arg1.getRegionIndex();
// }
// });
// int allPixCnt = regionImage.getNumX()*regionImage.getNumY()*regionImage.getNumZ();
// for (int z = 0; z < regionImage.getNumZ(); z++) {
// for (int y = 0; y < regionImage.getNumY(); y++) {
// for (int x = 0; x < regionImage.getNumX(); x++) {
// allPixCnt-=1;
// RegionInfo regInfo = regionImage.getRegionInfoFromOffset(allPixCnt);
// Vect3d[] bounds = regTobb.get(regInfo);
// if(bounds == null){
// bounds = new Vect3d[] {new Vect3d(),new Vect3d()};
// regTobb.put(regInfo, bounds);
// }
// bounds[0].set(Math.min(bounds[0].getX(), x),Math.min(bounds[0].getY(), y),Math.min(bounds[0].getZ(), z));
// bounds[1].set(Math.max(bounds[1].getX(), x),Math.max(bounds[1].getY(), y),Math.max(bounds[1].getZ(), z));
// 
// }
// }
// }
// for(RegionInfo regInfo:regTobb.keySet()){
// Vect3d[] varr = regTobb.get(regInfo);
// ComboboxROIName cbxroiName = overlayEditorPanelJAI.getComboboxROIName(regInfo);
// regionBounds.put(new BoundingBox(varr[0].getX(), varr[1].getX(),varr[0].getY(), varr[1].getY(),varr[0].getZ(), varr[1].getZ()),new Object[] {cbxroiName});
// }
// for(BoundingBox bb:regionBounds.keySet()){
// ComboboxROIName cbxroiName = ((ComboboxROIName)regionBounds.get(bb)[0]);
// System.out.println(cbxroiName+" bound="+bb.getLoX()+","+bb.getHiX()+" "+bb.getLoY()+","+bb.getHiY()+" "+bb.getLoZ()+","+bb.getHiZ());
// 
// }
// }
// }).start();
// }
// }catch (Exception e) {
// e.printStackTrace();
// DialogUtils.showErrorDialog(overlayEditorPanelJAI, e.getMessage());
// }
}
Also used : AsynchClientTask(cbit.vcell.client.task.AsynchClientTask) ArrayList(java.util.ArrayList) RegionInfo(cbit.vcell.geometry.RegionImage.RegionInfo) VCImage(cbit.image.VCImage) DataBufferByte(java.awt.image.DataBufferByte) BufferedImage(java.awt.image.BufferedImage) Surface(cbit.vcell.geometry.surface.Surface) OrigSurface(cbit.vcell.geometry.surface.OrigSurface) TreeSet(java.util.TreeSet) BoundingBox(cbit.vcell.geometry.surface.BoundingBox) Polygon(cbit.vcell.geometry.surface.Polygon) SurfaceCollection(cbit.vcell.geometry.surface.SurfaceCollection) Hashtable(java.util.Hashtable) TreeMap(java.util.TreeMap) Point(java.awt.Point) Vect3d(cbit.vcell.render.Vect3d) RegionImage(cbit.vcell.geometry.RegionImage)

Example 5 with RegionImage

use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.

the class ROIMultiPaintManager method mergeResolvedSelections.

private void mergeResolvedSelections(final RegionInfo[] selectedRegionInfos) throws Exception {
    if (selectedRegionInfos == null || selectedRegionInfos.length == 0) {
        return;
    }
    // final String UNUSED_ROI_PIXVAL = "UNUSED_ROI_INDEX";
    // final String MULTI_NEIGHBOR_MERGE = "MultiNeighborMerge";
    AsynchClientTask mergeTask = new AsynchClientTask("Merging " + selectedRegionInfos.length + " regions...", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {

        @Override
        public void run(Hashtable<String, Object> hashTable) throws Exception {
            // make new RegionImage with all selections converted to a single temporary ROI
            // 
            // if(isROINameUsed(overlayEditorPanelJAI.getAllCompositeROINamesAndColors(), MULTI_NEIGHBOR_MERGE)){
            // throw new Exception(MULTI_NEIGHBOR_MERGE+" exists, they must be reconciled before any new merge");
            // }
            // sort selected region index for fast lookup
            TreeSet<Integer> selectedRegionIndexesTS = new TreeSet<Integer>();
            for (int i = 0; i < selectedRegionInfos.length; i++) {
                selectedRegionIndexesTS.add(selectedRegionInfos[i].getRegionIndex());
            }
            // //find unused index we can use for temporary ROI
            // BitSet usedROIIndexes = new BitSet();
            // for (int i = 0; i < roiComposite.length; i++) {
            // byte[] sliceBytes = ((DataBufferByte)roiComposite[i].getRaster().getDataBuffer()).getData();
            // for (int j = 0; j < sliceBytes.length; j++) {
            // usedROIIndexes.set((int)(sliceBytes[j]&0x000000FF));
            // }
            // }
            int unusedROIPixelValue = getUnusedROIColorIndex(overlayEditorPanelJAI.getAllCompositeROINamesAndColors(), null);
            // if(usedROIIndexes.get(unusedROIPixelValue)){
            // throw new Exception("Error: Found unused color index but that ROI pixel value exists");
            // }
            // find image indexes of selected regions and fill new ROIImage with temporary ROI Index
            byte[] shortEncodedRegionIndexArr = regionImage.getShortEncodedRegionIndexImage();
            BufferedImage[] tempROI = new BufferedImage[roiComposite.length];
            int count = 0;
            for (int i = 0; i < tempROI.length; i++) {
                byte[] roiBytes = ((DataBufferByte) roiComposite[i].getRaster().getDataBuffer()).getData();
                tempROI[i] = new BufferedImage(roiComposite[i].getWidth(), roiComposite[i].getHeight(), BufferedImage.TYPE_BYTE_INDEXED, getContrastIndexColorModel());
                byte[] sliceBytes = ((DataBufferByte) tempROI[i].getRaster().getDataBuffer()).getData();
                System.arraycopy(roiBytes, 0, sliceBytes, 0, roiBytes.length);
                for (int j = 0; j < sliceBytes.length; j++) {
                    int regionIndex = (int) ((0x000000ff & shortEncodedRegionIndexArr[2 * count]) | ((0x000000ff & shortEncodedRegionIndexArr[2 * count + 1]) << 8));
                    if (selectedRegionIndexesTS.contains(regionIndex)) {
                        sliceBytes[j] = (byte) unusedROIPixelValue;
                    }
                    count++;
                }
            }
            if (getClientTaskStatusSupport() != null) {
                getClientTaskStatusSupport().setProgress(10);
            }
            // release memory
            shortEncodedRegionIndexArr = null;
            // get new regionImage and new selectedRegionInfos
            VCImage tempImage = ROIMultiPaintManager.createVCImageFromBufferedImages(ROIMultiPaintManager.DEFAULT_EXTENT, tempROI);
            RegionImage tempRegionImage = new RegionImage(tempImage, 0, /*0 means generate no surfacecollection*/
            tempImage.getExtent(), ROIMultiPaintManager.DEFAULT_ORIGIN, RegionImage.NO_SMOOTHING, null);
            // release memory
            tempImage = null;
            RegionInfo[] tempRegionInfos = tempRegionImage.getRegionInfos();
            if (tempRegionInfos.length == 1) {
                throw new Exception("No unselected neighbors to merge with.");
            }
            if (getClientTaskStatusSupport() != null) {
                getClientTaskStatusSupport().setProgress(20);
            }
            Vector<RegionImage.RegionInfo> tempSelectedRegionInfos = new Vector<RegionImage.RegionInfo>();
            HighlightROIInfo highlightROIInfo = generateHighlightROIInfo((byte) -1, tempROI, tempRegionImage, RegionAction.createCheckNeighborsOnlyRegionAction(tempRegionInfos), null);
            boolean bHasSelectionWithMoreThanOneNeighbor = false;
            for (int i = 0; i < tempRegionInfos.length; i++) {
                if (tempRegionInfos[i].getPixelValue() == unusedROIPixelValue) {
                    tempSelectedRegionInfos.add(tempRegionInfos[i]);
                // if (highlightROIInfo.neighborsForRegionsMap.get(tempRegionInfos[i]).size() > 1) {
                // hashTable.put(UNUSED_ROI_PIXVAL, new Integer(unusedROIPixelValue));
                // bHasSelectionWithMoreThanOneNeighbor = true;
                // } else {
                // tempSelectedRegionInfos.add(tempRegionInfos[i]);
                // }
                }
            }
            if (getClientTaskStatusSupport() != null) {
                getClientTaskStatusSupport().setProgress(50);
            }
            // final merge
            updateUndo(UNDO_INIT.ALLZ);
            generateHighlightROIInfo((byte) unusedROIPixelValue, tempROI, tempRegionImage, RegionAction.createMergeSelectedWithNeighborsRegionAction(tempRegionInfos, tempSelectedRegionInfos, highlightROIInfo.neighborsForRegionsMap), null);
            // copy merged bytes back to ROI
            for (int i = 0; i < tempROI.length; i++) {
                byte[] roiBytes = ((DataBufferByte) roiComposite[i].getRaster().getDataBuffer()).getData();
                byte[] sliceBytes = ((DataBufferByte) tempROI[i].getRaster().getDataBuffer()).getData();
                // for (int j = 0; j < sliceBytes.length; j++) {
                // if(sliceBytes[j] == (byte)unusedROIPixelValue){
                // System.out.println("Bad");
                // }
                // }
                System.arraycopy(sliceBytes, 0, roiBytes, 0, roiBytes.length);
            }
            if (getClientTaskStatusSupport() != null) {
                getClientTaskStatusSupport().setProgress(90);
            }
        }
    };
    AsynchClientTask updateGUITask = new AsynchClientTask("Updating display...", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {

        @Override
        public void run(Hashtable<String, Object> hashTable) throws Exception {
            // Integer unusedROIIndex = (Integer)hashTable.get(UNUSED_ROI_PIXVAL);
            // if(unusedROIIndex != null){
            // overlayEditorPanelJAI.addROIName(MULTI_NEIGHBOR_MERGE, true, MULTI_NEIGHBOR_MERGE,true,/*true,true,*/OverlayEditorPanelJAI.CONTRAST_COLORS[unusedROIIndex]);
            // }
            overlayEditorPanelJAI.setHighliteInfo(null, OverlayEditorPanelJAI.FRAP_DATA_RESOLVEDMERGE_PROPERTY);
            updateUndoAfterPrivate(true, false);
        }
    };
    Vector<AsynchClientTask> asynchClientTaskV = new Vector<AsynchClientTask>();
    asynchClientTaskV.add(mergeTask);
    asynchClientTaskV.add(updateGUITask);
    asynchClientTaskV.addAll(Arrays.asList(getRefreshObjectsTasks()));
    ClientTaskDispatcher.dispatch(overlayEditorPanelJAI, new Hashtable<String, Object>(), asynchClientTaskV.toArray(new AsynchClientTask[0]), true, false, null, true);
}
Also used : AsynchClientTask(cbit.vcell.client.task.AsynchClientTask) Hashtable(java.util.Hashtable) VCImage(cbit.image.VCImage) RegionInfo(cbit.vcell.geometry.RegionImage.RegionInfo) DataBufferByte(java.awt.image.DataBufferByte) Point(java.awt.Point) BufferedImage(java.awt.image.BufferedImage) ImageException(cbit.image.ImageException) UtilCancelException(org.vcell.util.UtilCancelException) UserCancelException(org.vcell.util.UserCancelException) TreeSet(java.util.TreeSet) RegionImage(cbit.vcell.geometry.RegionImage) Vector(java.util.Vector)

Aggregations

RegionImage (cbit.vcell.geometry.RegionImage)38 VCImageUncompressed (cbit.image.VCImageUncompressed)21 ISize (org.vcell.util.ISize)20 CartesianMesh (cbit.vcell.solvers.CartesianMesh)19 Extent (org.vcell.util.Extent)17 FieldDataFileOperationSpec (cbit.vcell.field.io.FieldDataFileOperationSpec)14 Origin (org.vcell.util.Origin)14 VCImage (cbit.image.VCImage)13 UserCancelException (org.vcell.util.UserCancelException)8 Point (java.awt.Point)7 ImageException (cbit.image.ImageException)6 AsynchClientTask (cbit.vcell.client.task.AsynchClientTask)6 VariableType (cbit.vcell.math.VariableType)6 ExternalDataIdentifier (org.vcell.util.document.ExternalDataIdentifier)6 SimDataBlock (cbit.vcell.simdata.SimDataBlock)5 ArrayList (java.util.ArrayList)5 RegionInfo (cbit.vcell.geometry.RegionImage.RegionInfo)4 BufferedImage (java.awt.image.BufferedImage)4 Hashtable (java.util.Hashtable)4 ImageDataset (cbit.vcell.VirtualMicroscopy.ImageDataset)3