importClass(Packages.icy.roi.ROIUtil) importClass(Packages.icy.roi.ROIDescriptor) importClass(Packages.icy.gui.dialog.MessageDialog) importClass(Packages.icy.sequence.Sequence) importClass(Packages.java.util.ArrayList) importClass(Packages.plugins.fab.spotDetector.detector.UDWTWavelet) importClass(Packages.plugins.kernel.roi.roi2d.ROI2DRectangle) importClass(java.awt.geom.Point2D) // this is the parameters you asked for: considering the center of mass, // the algo will look in a box of side boxSize*2+1 where the center of mass is the center of this box // // for boxSize = 2 // // ***** // ***** // **X** // ***** // ***** // // with * : pixel considered for Rectangle ROI // X: location of center of mass boxSize = 1 removePreviousRois = false // get the current sequence focused by the user sequence = getSequence() // check if the sequence exists if ( sequence == null ) { MessageDialog.showDialog("Please open an image first", MessageDialog.INFORMATION_MESSAGE); throw "no sequence"; // stops the script and say why } w = sequence.getSizeX() h = sequence.getSizeY() // get all rois rois = sequence.getROIs() // get the number of rois roiCount = rois.size() println("Number of rois: " + roiCount) // remove all existing ROI if requested if (removePreviousRois) sequence.removeAllROI() // cycle over all rois for (i = 0; i < roiCount; i++) { roi = rois.get(i) // get the spot x = ROIUtil.computeDescriptor("MassCenterX", roi, sequence).doubleValue() y = ROIUtil.computeDescriptor("MassCenterY", roi, sequence).doubleValue() surface = ROIUtil.computeDescriptor("Interior", roi, sequence).doubleValue() meanIntensity = ROIUtil.computeDescriptor("MeanIntensity", roi.getSubROI(-1, -1, 0), sequence).doubleValue() keepSpot = true // filtering // if (surface < 10) keepSpot = false // remove too small spots // if (surface > 60) keepSpot = false // remove too big spots // if (meanIntensity < 100) keepSpot = false // remove too big spots xmin = x - boxSize ymin = y - boxSize xmax = x + boxSize + 1 ymax = y + boxSize + 1 // remove spot if mass center too close from borders if (xmin < 0) keepSpot = false if (ymin < 0) keepSpot = false if (xmax > w) keepSpot = false if (ymax > h) keepSpot = false if (!keepSpot) continue // create the Rectangle ROI newRoi = new ROI2DRectangle(xmin, ymin, xmax, ymax) println(x) println(y) println(xmin) println(ymin) println(xmax) println(ymax) println(newRoi.getBounds2D()) // preserve some settings from original ROI pos = roi.getPosition5D() newRoi.setName(roi.getName() + " - fixed") newRoi.setColor(roi.getColor()) newRoi.setZ(pos.getZ()) newRoi.setT(pos.getT()) newRoi.setC(pos.getC()) // add the ROI to the sequence sequence.addROI(newRoi) }