public boolean beadCalibration3d() { imp = IJ.getImage(); if (imp == null) { IJ.noImage(); return false; } else if (imp.getStackSize() == 1) { IJ.error("Stack required"); return false; } else if (imp.getType() != ImagePlus.GRAY8 && imp.getType() != ImagePlus.GRAY16) { // In order to support 32bit images, pict[] must be changed to float[], and getPixel(x, y); // requires a Float.intBitsToFloat() conversion IJ.error("8 or 16 bit greyscale image required"); return false; } width = imp.getWidth(); height = imp.getHeight(); nslices = imp.getStackSize(); imtitle = imp.getTitle(); models[0] = "*None*"; models[1] = "line"; models[2] = "2nd degree polynomial"; models[3] = "3rd degree polynomial"; models[4] = "4th degree polynomial"; GenericDialog gd = new GenericDialog("3D PALM calibration"); gd.addNumericField("Maximum FWHM (in px)", prefs.get("QuickPALM.3Dcal_fwhm", 20), 0); gd.addNumericField( "Particle local threshold (% maximum intensity)", prefs.get("QuickPALM.pthrsh", 20), 0); gd.addNumericField("Z-spacing (nm)", prefs.get("QuickPALM.z-step", 10), 2); gd.addNumericField("Calibration Z-smoothing (radius)", prefs.get("QuickPALM.window", 1), 0); gd.addChoice("Model", models, prefs.get("QuickPALM.model", models[3])); gd.addCheckbox( "Show divergence of bead positions against model", prefs.get("QuickPALM.3Dcal_showDivergence", false)); gd.addCheckbox("Show extra particle info", prefs.get("QuickPALM.3Dcal_showExtraInfo", false)); gd.addMessage("\n\nDon't forget to save the table in the end..."); gd.showDialog(); if (gd.wasCanceled()) return false; fwhm = gd.getNextNumber(); prefs.set("QuickPALM.QuickPALM.3Dcal_fwhm", fwhm); pthrsh = gd.getNextNumber() / 100; prefs.set("QuickPALM.pthrsh", pthrsh * 100); cal_z = gd.getNextNumber(); prefs.set("QuickPALM.z-step", cal_z); window = (int) gd.getNextNumber(); prefs.set("QuickPALM.window", window); model = gd.getNextChoice(); prefs.set("QuickPALM.model", model); part_divergence = gd.getNextBoolean(); prefs.set("QuickPALM.3Dcal_showDivergence", part_divergence); part_extrainfo = gd.getNextBoolean(); prefs.set("QuickPALM.3Dcal_showExtraInfo", part_extrainfo); return true; }
void interpolate() { Roi roi = imp.getRoi(); if (roi == null) { noRoi("Interpolate"); return; } if (roi.getType() == Roi.POINT) return; if (IJ.isMacro() && Macro.getOptions() == null) Macro.setOptions("interval=1"); GenericDialog gd = new GenericDialog("Interpolate"); gd.addNumericField("Interval:", 1.0, 1, 4, "pixel"); gd.addCheckbox("Smooth", IJ.isMacro() ? false : smooth); gd.showDialog(); if (gd.wasCanceled()) return; double interval = gd.getNextNumber(); smooth = gd.getNextBoolean(); Undo.setup(Undo.ROI, imp); FloatPolygon poly = roi.getInterpolatedPolygon(interval, smooth); int t = roi.getType(); int type = roi.isLine() ? Roi.FREELINE : Roi.FREEROI; if (t == Roi.POLYGON && interval > 1.0) type = Roi.POLYGON; if ((t == Roi.RECTANGLE || t == Roi.OVAL || t == Roi.FREEROI) && interval >= 5.0) type = Roi.POLYGON; if ((t == Roi.LINE || t == Roi.FREELINE) && interval >= 5.0) type = Roi.POLYLINE; if (t == Roi.POLYLINE && interval >= 1.0) type = Roi.POLYLINE; ImageCanvas ic = imp.getCanvas(); if (poly.npoints <= 150 && ic != null && ic.getMagnification() >= 12.0) type = roi.isLine() ? Roi.POLYLINE : Roi.POLYGON; Roi p = new PolygonRoi(poly, type); if (roi.getStroke() != null) p.setStrokeWidth(roi.getStrokeWidth()); p.setStrokeColor(roi.getStrokeColor()); p.setName(roi.getName()); transferProperties(roi, p); imp.setRoi(p); }
public void run(String arg) { Frame[] niframes = WindowManager.getNonImageWindows(); String[] titles = new String[niframes.length + 1]; for (int i = 0; i < niframes.length; i++) { titles[i] = niframes[i].getTitle(); } titles[niframes.length] = "Clipboard"; GenericDialog gd = new GenericDialog("Windows"); boolean importfile = false; gd.addCheckbox("Import from file?", importfile); gd.addChoice("Windows", titles, titles[0]); boolean hasxvals = false; gd.addCheckbox("X Vals Column?", hasxvals); boolean multix = false; gd.addCheckbox("Multi_X_Columns?", multix); boolean skipendzeros = false; gd.addCheckbox("Skip_end_zeros?", skipendzeros); String[] delimiters = {"Tab", "Comma", "Space"}; gd.addChoice("Delimiter", delimiters, delimiters[0]); gd.showDialog(); if (gd.wasCanceled()) { return; } importfile = gd.getNextBoolean(); int index = gd.getNextChoiceIndex(); hasxvals = gd.getNextBoolean(); multix = gd.getNextBoolean(); skipendzeros = gd.getNextBoolean(); int delimindex = gd.getNextChoiceIndex(); if (multix) hasxvals = true; String textdata = ""; if (importfile) { OpenDialog od = new OpenDialog("Open File", "", ".txt"); String directory = od.getDirectory(); String name = od.getFileName(); if (name == null) { return; } try { File infile = new File(directory + name); BufferedReader b = new BufferedReader(new FileReader(infile)); textdata = (new jdataio()).readstringfile(b); b.close(); } catch (IOException e) { return; } } else { if (index == niframes.length) { // here we get the data from the clipboard Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); try { if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) { textdata = (String) t.getTransferData(DataFlavor.stringFlavor); } } catch (UnsupportedFlavorException e) { } catch (IOException e) { } if (textdata.equals("")) { IJ.error("Error copying from clipboard."); return; } } else { if (niframes[index] instanceof Editor) { Editor tw = (Editor) niframes[index]; textdata = tw.getText(); } else { if (niframes[index] instanceof TextWindow) { TextWindow tw = (TextWindow) niframes[index]; textdata = tw.getTextPanel().getText(); } else { IJ.showMessage("Not a valid text window"); return; } } } } if (textdata == null) { IJ.showMessage("Error in Obtaining String"); return; } if (textdata.indexOf("\r") >= 0) { textdata = textdata.replace('\r', '\n'); } char[] delims = {'\t', ',', ' '}; delimit_string ds = new delimit_string(delims[delimindex]); String[] rows = ds.getrows(textdata); int lines = rows.length; int columns = ds.getnumcolumns(rows[0]); int ycolumns = columns; if (hasxvals) { if (multix) { ycolumns /= 2; } else { ycolumns--; } } if (multix) { float[][] ydata = new float[ycolumns][lines]; float[][] xdata = new float[ycolumns][lines]; for (int i = 0; i < lines; i++) { float[] temp = ds.delim2float(rows[i], columns); for (int j = 0; j < ycolumns; j++) { ydata[j][i] = temp[2 * j + 1]; xdata[j][i] = temp[2 * j]; } } int[] npts = new int[ycolumns]; for (int i = 0; i < ycolumns; i++) { npts[i] = lines; } if (skipendzeros) { for (int i = 0; i < ycolumns; i++) { int counter = lines - 1; while ((xdata[i][counter] == 0.0f || Float.isNaN(xdata[i][counter])) && counter > 0) { xdata[i][counter] = 0.0f; ydata[i][counter] = 0.0f; npts[i]--; counter--; } } } (new PlotWindow4("Text Plot", "x", "y", xdata, ydata, npts)).draw(); } else { float[][] tempydata = new float[ycolumns][lines]; float[] tempxdata = new float[lines]; float[][] xdata = null; float[][] ydata = null; int startcolumn = 0; if (hasxvals) startcolumn = 1; for (int i = 0; i < lines; i++) { float[] temp = ds.delim2float(rows[i], columns); if (hasxvals) { tempxdata[i] = temp[0]; } else { tempxdata[i] = (float) (i + 1); } for (int j = 0; j < ycolumns; j++) { tempydata[j][i] = temp[j + startcolumn]; } } int[] npts = new int[ycolumns]; npts[0] = lines; if (skipendzeros) { int maxpts = 0; for (int i = 0; i < ycolumns; i++) { int counter = lines - 1; npts[i] = lines; while ((tempydata[i][counter] == 0.0f || Float.isNaN(tempydata[i][counter])) && counter > 0) { npts[i]--; counter--; } if (npts[i] > maxpts) maxpts = npts[i]; IJ.log("" + npts[i]); } ydata = new float[ycolumns][maxpts]; xdata = new float[ycolumns][maxpts]; for (int i = 0; i < ycolumns; i++) { // npts[i]=npts[0]; System.arraycopy(tempxdata, 0, xdata[i], 0, npts[i]); System.arraycopy(tempydata[i], 0, ydata[i], 0, npts[i]); } } else { ydata = tempydata; xdata = new float[ycolumns][]; for (int i = 0; i < ycolumns; i++) { npts[i] = npts[0]; xdata[i] = tempxdata.clone(); } } (new PlotWindow4("Text Plot", "x", "y", xdata, ydata, npts)).draw(); } }
public boolean analyseParticles(MyFunctions f) { GenericDialog gd = new GenericDialog("Analyse PALM/STORM Particles"); gd.addNumericField("Minimum SNR", prefs.get("QuickPALM.snr", 5), 2); gd.addNumericField("Maximum FWHM (in px)", prefs.get("QuickPALM.fwhm", 4), 0); gd.addNumericField("Image plane pixel size (nm)", prefs.get("QuickPALM.pixelsize", 106), 2); gd.addCheckbox("Smart SNR", prefs.get("QuickPALM.smartsnr", true)); gd.addCheckbox( "3D PALM (astigmatism) - will require calibration file", prefs.get("QuickPALM.is3d", false)); gd.addCheckbox("Online rendering", prefs.get("QuickPALM.view", true)); gd.addCheckbox("Attach to running acquisition", prefs.get("QuickPALM.attach", false)); gd.addCheckbox("Stream particle info directly into file", prefs.get("QuickPALM.stream", true)); gd.addMessage("\n"); // ----------------------------------------- gd.addMessage("-- Online rendering settings (used only if selected) --"); gd.addMessage("\n"); gd.addNumericField("Pixel size of rendered image (nm)", 30, 2); gd.addNumericField("Accumulate last (0 to accumulate all frames)", 0, 0); gd.addNumericField("Update every (frames)", 10, 0); // gd.addNumericField("Allow color saturation (%)", 50, 0); gd.addMessage("\n"); // ----------------------------------------- gd.addMessage("-- Attach to running acquisition settings (used only if selected) --"); gd.addMessage("\n"); gd.addStringField( "_Image name pattern (NN...NN represents the numerical change)", prefs.get("QuickPALM.pattern", "imgNNNNNNNNN.tif"), 20); gd.addNumericField("Start NN...NN with", 0, 0); gd.addNumericField("In acquisition max. wait time for new image (ms)", 50, 0); gd.addMessage("\n"); // ----------------------------------------- gd.addMessage("-- Advanced settings (don't normally need to be changed) --"); gd.addMessage("\n"); gd.addNumericField("_Minimum symmetry (%)", prefs.get("QuickPALM.symmetry", 50), 0); gd.addNumericField( "Local threshold (% maximum intensity)", prefs.get("QuickPALM.lthreshold", 20), 0); gd.addNumericField("_Maximum iterations per frame", prefs.get("QuickPALM.maxiter", 1000), 0); gd.addNumericField( "Threads (each takes ~3*[frame size] in memory)", prefs.get("QuickPALM.nthreads", 50), 0); gd.addMessage("\n\nDon't forget to save the table in the end..."); gd.showDialog(); if (gd.wasCanceled()) return false; snr = (int) gd.getNextNumber(); prefs.set("QuickPALM.snr", snr); fwhm = gd.getNextNumber(); prefs.set("QuickPALM.fwhm", fwhm); pixelsize = gd.getNextNumber(); prefs.set("QuickPALM.pixelsize", pixelsize); smartsnr = gd.getNextBoolean(); prefs.set("QuickPALM.smartsnr", smartsnr); is3d = gd.getNextBoolean(); prefs.set("QuickPALM.is3d", is3d); view = gd.getNextBoolean(); prefs.set("QuickPALM.view", view); attach = gd.getNextBoolean(); prefs.set("QuickPALM.attach", attach); if (gd.getNextBoolean()) { f.psave = new ParticleSaver(); f.psave.setup(); prefs.set("QuickPALM.stream", true); } else prefs.set("QuickPALM.stream", false); // -- magn = pixelsize / gd.getNextNumber(); viewer_accumulate = (int) gd.getNextNumber(); viewer_update = (int) gd.getNextNumber(); // -- pattern = gd.getNextString().trim(); prefs.set("QuickPALM.pattern", pattern); prefix = pattern.substring(0, pattern.indexOf("N")); sufix = pattern.substring(pattern.lastIndexOf("N") + 1, pattern.length()); nimchars = pattern.split("N").length - 1; nimstart = (int) gd.getNextNumber(); waittime = (int) gd.getNextNumber(); // -- symmetry = gd.getNextNumber() / 100; prefs.set("QuickPALM.symmetry", symmetry); pthrsh = gd.getNextNumber() / 100; prefs.set("QuickPALM.lthreshold", pthrsh * 100); maxpart = (int) gd.getNextNumber(); prefs.set("QuickPALM.maxiter", maxpart); threads = (int) gd.getNextNumber(); prefs.set("QuickPALM.nthreads", threads); return true; }
public boolean reconstructDataset() { view_modes[0] = "3D color"; view_modes[1] = "2D histogram"; view_modes[2] = "2D particle intensity (16-bit)"; view_modes[3] = "2D particle intensity (8-bit)"; GenericDialog gd = new GenericDialog("Reconstruct PALM/STORM Dataset"); gd.addNumericField( "Target pixel size for the rendered image (nm)", prefs.get("QuickPALM.viewer_tpixelsize", 30), 2); gd.addNumericField("Original image width (px)", prefs.get("QuickPALM.viewer_owidth", 512), 2); gd.addNumericField("Original image height (px)", prefs.get("QuickPALM.viewer_oheight", 512), 2); gd.addChoice("View mode", view_modes, prefs.get("QuickPALM.view_mode", view_modes[1])); // gd.addNumericField("Allow image saturation (%)", prefs.get("QuickPALM.saturation", 50), 0); gd.addCheckbox( "Simulate sub-difraction spot (gaussian convolution - only 2D)", prefs.get("QuickPALM.viewer_doConvolve", true)); // gd.addCheckbox("Make 3D stack", prefs.get("QuickPALM.viewer_do3d", false)); // gd.addCheckbox("Make movie", prefs.get("QuickPALM.viewer_doMovie", false)); gd.addCheckbox("Make 3D stack", false); gd.addCheckbox("Make movie", false); // gd.addCheckbox("Save only and don't show", prefs.get("QuickPALM.viewer_doSave", false)); gd.addMessage("\n"); // ----------------------------------------- gd.addMessage("-- Simulate sub-difraction spot settings (used only if selected) --"); gd.addNumericField("FWHM of the spot", prefs.get("QuickPALM.viewer_fwhm", 30), 2); gd.addMessage("\n"); // ----------------------------------------- gd.addMessage("-- Make 3D stack settings (used only if selected) --"); gd.addNumericField("Z-spacing between slices (nm)", prefs.get("QuickPALM.viewer_zstep", 50), 2); gd.addNumericField( "Merge particle Z-position above (nm - 0 for full Z range)", prefs.get("QuickPALM.viewer_mergeabove", 0), 2); gd.addNumericField( "Merge particle Z-position bellow (nm - 0 for full Z range)", prefs.get("QuickPALM.viewer_mergebellow", 0), 2); gd.addMessage("\n"); // ----------------------------------------- gd.addMessage("-- Make movie settings (used only if selected) --"); gd.addNumericField( "Make a reconstruction in every N frames", prefs.get("QuickPALM.viewer_update", 10), 0); gd.addNumericField( "Accumulate N neighboring frames for each reconstruction\n(set to 0 to accumulate all the preceding frames)", prefs.get("QuickPALM.viewer_accumulate", 100), 0); gd.showDialog(); if (gd.wasCanceled()) return false; viewer_tpixelsize = gd.getNextNumber(); prefs.set("QuickPALM.viewer_tpixelsize", viewer_tpixelsize); viewer_owidth = (int) gd.getNextNumber(); prefs.set("QuickPALM.viewer_owidth", viewer_owidth); viewer_oheight = (int) gd.getNextNumber(); prefs.set("QuickPALM.viewer_oheight", viewer_oheight); view_mode = gd.getNextChoice(); prefs.set("QuickPALM.view_mode", view_mode); viewer_doConvolve = gd.getNextBoolean(); prefs.set("QuickPALM.viewer_doConvolve", viewer_doConvolve); viewer_do3d = gd.getNextBoolean(); prefs.set("QuickPALM.viewer_do3d", viewer_do3d); viewer_doMovie = gd.getNextBoolean(); prefs.set("QuickPALM.viewer_doMovie", viewer_doMovie); // viewer_doSave = gd.getNextBoolean(); // prefs.set("QuickPALM.viewer_doSave", viewer_doSave); // -- Simulate sub-difraction spot viewer_fwhm = gd.getNextNumber(); prefs.set("QuickPALM.viewer_fwhm", viewer_fwhm); // -- Show B&W // viewer_is8bit = gd.getNextBoolean(); // prefs.set("QuickPALM.viewer_is8bit", viewer_is8bit); // -- Make 3D stack viewer_zstep = gd.getNextNumber(); prefs.set("QuickPALM.viewer_zstep", viewer_zstep); viewer_mergeabove = gd.getNextNumber(); prefs.set("QuickPALM.viewer_mergeabove", viewer_mergeabove); viewer_mergebellow = gd.getNextNumber(); prefs.set("QuickPALM.viewer_mergebellow", viewer_mergebellow); // -- Make Movie viewer_update = (int) gd.getNextNumber(); prefs.set("QuickPALM.viewer_update", viewer_update); viewer_accumulate = (int) gd.getNextNumber(); prefs.set("QuickPALM.viewer_accumulate", viewer_accumulate); return true; }
public void run(String arg) { String[] labels = { "Masked_Chromosomes", "Unmixed_Image", "Spectral_Image(optional)", "Spectra(optional)" }; ImagePlus[] imps = jutils.selectImages(true, 4, labels); if (imps == null) { return; } if (imps[0] == null) { return; } float[] mask = (float[]) imps[0].getStack().getPixels(2); findblobs3 fb = new findblobs3(imps[0].getWidth(), imps[0].getHeight()); float[] objects = fb.dofindblobs(mask, 0.5f); WaitForUserDialog dg = new WaitForUserDialog( "Optional Input", "Place RoiManager Points on Chromosome Segments (if desired)"); dg.show(); if (!dg.escPressed()) { RoiManager rman = RoiManager.getInstance(); while (rman != null && rman.getCount() > 1) { Roi[] rois = rman.getRoisAsArray(); int[] ids = new int[rois.length]; for (int i = 0; i < rois.length; i++) { Rectangle r = rois[i].getBounds(); ids[i] = (int) objects[r.x + fb.width * r.y]; } objects = fb.link_objects(objects, ids); rman.reset(); dg = new WaitForUserDialog( "Optional Input", "Place More RoiManager Points on Chromosome Segments (if desired)"); dg.show(); if (dg.escPressed()) break; } } int[] areas = fb.get_areas(objects); int[] temprank = jsort.get_javasort_order(areas); int[] arearank = jsort.get_javasort_order(temprank); for (int i = 0; i < fb.nobjects; i++) { arearank[i] = fb.nobjects - arearank[i] - 1; } // if the spectra are available, get them float[][][] spectra = null; Object[] data = null; if (imps[1] != null && imps[2] != null && imps[3] != null) { ImageWindow iw = imps[3].getWindow(); if (iw.getClass().getName().equals("jguis.PlotWindow4")) { float[][] yvals = (float[][]) jutils.runPW4VoidMethod(iw, "getYValues"); data = jutils.stack2array(imps[2].getStack()); Object[] coef = jutils.stack2array(imps[1].getStack()); spectra = new float[fb.nobjects][2][]; for (int i = 0; i < fb.nobjects; i++) { spectra[i][0] = fb.get_object_spectrum(objects, (i + 1), data, "Sum"); spectra[i][1] = new float[yvals[0].length]; float[] tempcoef = fb.get_object_spectrum(objects, (i + 1), coef, "Sum"); for (int j = 0; j < yvals[0].length; j++) { for (int k = 0; k < 5; k++) { spectra[i][1][j] += tempcoef[k] * yvals[k][j]; } } } } } CompositeImage imp = (CompositeImage) imps[0]; imp.setPosition(1, 1, 1); LUT graylut = jutils.get_lut_for_color(Color.white); imp.setChannelColorModel(graylut); imp.setPosition(2, 1, 1); LUT redlut = jutils.get_lut_for_color(Color.red); imp.setChannelColorModel(redlut); imp.setPosition(1, 1, 1); imp.updateAndRepaintWindow(); SkyPanel_v3 sp = new SkyPanel_v3(); int skychan = 6; if (imps[1] != null) skychan = imps[1].getNChannels(); // assume that the sky image has 6 channels and that the second is the unknown green // shift the unknown green to the end ImagePlus skyimp = null; if (imps[1] != null) { Object[] skystack = jutils.stack2array(imps[1].getStack()); // Object[] // skystack2={skystack[0],skystack[2],skystack[3],skystack[4],skystack[5],skystack[1]}; Object[] skystack2 = null; if (skychan == 6) skystack2 = new Object[] {skystack[0], skystack[2], skystack[3], skystack[4], skystack[5]}; else skystack2 = new Object[] {skystack[0], skystack[1], skystack[2], skystack[3], skystack[4]}; skyimp = new ImagePlus( "rearranged", jutils.array2stack(skystack2, imps[1].getWidth(), imps[1].getHeight())); } int nch = 5; if (skyimp != null) nch = skyimp.getStack().getSize(); GenericDialog gd2 = new GenericDialog("Options"); gd2.addNumericField("Area Accuracy (percent)", 30, 0); for (int i = 0; i < nch; i++) { gd2.addNumericField("Ch_" + (i + 1) + "_Contr_Thresh", 0.35, 5, 15, null); } // gd2.addNumericField("Contribution Threshold",0.35,5,15,null); gd2.addCheckbox("Mouse?", false); gd2.addNumericField("Box_Width", 150, 0); gd2.addNumericField("Box_Height", 100, 0); gd2.showDialog(); if (gd2.wasCanceled()) { return; } sp.areathresh = (float) gd2.getNextNumber(); sp.objthresh2 = new float[nch]; for (int i = 0; i < nch; i++) sp.objthresh2[i] = (float) gd2.getNextNumber(); // sp.objthresh=(float)gd2.getNextNumber(); boolean mouse = gd2.getNextBoolean(); int bwidth = (int) gd2.getNextNumber(); int bheight = (int) gd2.getNextNumber(); int[] colorindices = {4, 1, 2, 6, 3}; GenericDialog gd3 = new GenericDialog("Color Options"); for (int i = 0; i < 5; i++) gd3.addChoice( "Ch" + (i + 1) + " Color", SkyPanel_v3.colornames, SkyPanel_v3.colornames[colorindices[i]]); gd3.showDialog(); if (gd3.wasCanceled()) return; for (int i = 0; i < 5; i++) colorindices[i] = gd3.getNextChoiceIndex(); sp.colorindices = colorindices; sp.nch = 5; sp.dapilast = false; sp.cellwidth = bwidth; sp.cellheight = bheight; sp.init(imps[0], skyimp, objects, areas, arearank, fb, true, spectra, data, mouse); SkyPanel_v3.launch_frame(sp); }