macro "Pomegranate Width Analysis Tool" { versionFIJI = "1.53b"; requires(versionFIJI); // Title Pop Up showMessage("Pomegranate Analysis Extension Tool", "" +"
Pomegranate
" +"
Analysis Extension Tool
" +"
" +"
Virginia Tech, Blacksburg, Virginia
" +"
Department of Biological Sciences - Hauf Lab
" +"
" +"
Please read accompanying documentation
" +"
[Erod Keaton Baybay - erodb@vt.edu]
"); showMessageWithCancel("Prerun Cleanup","This macro performs a prerun clean up\nThis will close all currently open images without saving\nClick OK to Continue"); cleanAll(); roiManager("Associate", "true"); roiManager("UseNames", "true"); run("Options...", "iterations=1 count=1 black do=Nothing"); run("Set Measurements...", "area mean standard modal min centroid center perimeter fit shape feret's median stack limit display redirect=None decimal=3"); transpMode = false; confirmWindow = false; Atype = -1; Dialog.create("Input Type"); Dialog.addChoice("Analysis Type", newArray("Batch Mode (Multiple Pomegranate Analyses)","Single Mode (One Pomegranate Analysis)")); Dialog.addCheckbox("Transparent Mode", transpMode); Dialog.show(); Atype = Dialog.getChoice(); transpMode = Dialog.getCheckbox(); if (Atype == "Batch Mode (Multiple Pomegranate Analyses)") runMode = true; else runMode = false; if(runMode) confirmWindow = getBoolean("Batch mode (Multiple Pomegranate Analyses)\nShow confirmation window with each analysis?"); // ----------------------------------------------------------------------------------------------------------------------------------------------- // Designate Input Directory Dialog.create("Input Directory"); Dialog.addMessage("Analysis Type: " + Atype); Dialog.addChoice("Input Method", newArray("Select Input Directory","Manually Enter Path")); Dialog.show(); if (Dialog.getChoice() == "Select Input Directory") directoryHolder = getDirectory("Choose an Input Directory"); else directoryHolder = getString("Image Path", "/Users/hauflab/Documents"); if (runMode) inputList = getFileList(directoryHolder); else inputList = Array.concat(newArray(), directoryHolder); if (!transpMode) setBatchMode(true); for (m = 0; m < inputList.length; m++) { if(runMode) directoryMain = directoryHolder + inputList[m]; else directoryMain = inputList[m]; directoryResults = directoryMain + "Results"; directoryROIs = directoryMain + "ROIs"; nameLabel = replace(replace(File.getName(directoryMain), "/", ""),".","_"); if (File.exists(directoryMain + "/Binaries/Whole_Cell_RGB.tif")) { open(directoryMain + "/Binaries/Whole_Cell_RGB.tif"); getVoxelSize(vx, vy, vz, unit); run("8-bit"); setThreshold(1, 255); setOption("BlackBackground", true); run("Convert to Mask", "method=Default background=Dark black"); run("Z Project...", "projection=[Max Intensity]"); binary = getTitle(); // ----------------------------------------------------------------------------------------------------------------------------------------------- roiList = getFileList(directoryROIs); for (i = 0; i < roiList.length; i++) if (endsWith(roiList[i],"_Filtered_Reconstruction_Output_Whole_Cell_ROIs.zip")) { roiPath = directoryROIs + "/" + roiList[i]; imageName = rsFileExt(replace(roiList[i],"_Filtered_Reconstruction_Output_Whole_Cell_ROIs.zip","")); } roiManager("Open", roiPath); n = roiManager("Count"); if (n > 0) { // Table Headers print("\\Clear"); print("Image,Object_ID,Type,Radius,X,Y,voxelSize_X,voxelSize_Y,voxelSize_Z,voxelSize_unit"); // Quantify Widths selectImage(binary); for (i = 0; i < n; i++) { roiManager("Select", i); if ((startsWith(call("ij.plugin.frame.RoiManager.getName", i), "WC")) & (Roi.getProperty("Mid_Slice") == 1)) { run("Duplicate...", "title=Extract"); setBackgroundColor(0, 0, 0); run("Clear Outside"); // Distance Map selectImage("Extract"); run("Duplicate...", "duplicate title=Distance_Map"); run("Distance Map", "stack"); // Skeleton Image selectImage("Extract"); run("Duplicate...", "duplicate title=Skeleton"); run("Skeletonize", "stack"); run("Analyze Skeleton (2D/3D)", "prune=none"); // Isolate Cell Tips selectWindow("Tagged skeleton"); run("Duplicate...", "duplicate title=Cell_Tip_Binary"); setThreshold(1, 35); setOption("BlackBackground", true); run("Convert to Mask", "method=Default background=Dark black"); // Isolate Cell Body selectWindow("Tagged skeleton"); run("Duplicate...", "duplicate title=Cell_Body_Binary"); setThreshold(35, 255); setOption("BlackBackground", true); run("Convert to Mask", "method=Default background=Dark black"); // Skeleton Image AND Distance Map imageCalculator("AND create stack", "Distance_Map","Cell_Body_Binary"); rename("Merge_Body"); // Cell Tips Image AND Distance Map imageCalculator("AND create stack", "Distance_Map","Cell_Tip_Binary"); rename("Merge_Tips"); selectImage("Merge_Body"); roiManager("Select", i); Roi.getContainedPoints(rxp, ryp); for (j = 0; j < rxp.length; j++) { I = getPixel(rxp[j], ryp[j]); if (I != 0) print(imageName + "," + Roi.getProperty("Object_ID") + ",Body," + I + "," + rxp[j] + "," + ryp[j] + "," + vx + "," + vy + "," + vz + "," + unit); } selectImage("Merge_Tips"); roiManager("Select", i); Roi.getContainedPoints(rxp, ryp); for (j = 0; j < rxp.length; j++) { I = getPixel(rxp[j], ryp[j]); if (I != 0) print(imageName + "," + Roi.getProperty("Object_ID") + ",Tip," + I + "," + rxp[j] + "," + ryp[j] + "," + vx + "," + vy + "," + vz + "," + unit); } // Cleanup selectImage(binary); close("\\Others"); } } // Result File Export [OVERWRITE] logFile = directoryResults + "/" + nameLabel + "_Width_Profile.csv"; selectWindow("Log"); if (File.exists(logFile)) { showMessageWithCancel("Prerun Cleanup","There is an existing Width Profile file for this Pomegranate Analysis. Overwrite?"); saveAs("Text", logFile); } else saveAs("Text", logFile); close("Results"); if (confirmWindow) showMessageWithCancel("[" + nameLabel + "]\nCompleted " + (m + 1) + " out of " + inputList.length + " analyses\nContinuing to next analysis."); cleanAll(); } else { showMessageWithCancel("Pomegranate Error", "Error: No ROIs in ROI Manager\nResponse: Ending Analysis"); cleanAll(); exit(); } } else { showMessageWithCancel("Pomegranate Error", "Error: Unable to find Whole Cell RGB Image\nResponse: Ending Analysis"); cleanAll(); exit(); } } showMessageWithCancel("Analysis is complete\nPlease review files in your output directory"); } // ----------------------------------------------------------------------------------------------------------------------------------------------- // Clean Up Function function cleanAll() { close('*'); run("Clear Results"); roiManager("Reset"); print("\\Clear"); } // Restore File extension - Undoes replace(File.getName(x),".","_") function rsFileExt(string) { arr = split(string, "_"); arrNoExt = Array.deleteIndex(arr, arr.length - 1); extension = arr[arr.length - 1]; stringNoExt = String.join(arrNoExt,"_"); output = stringNoExt + "." + extension; return output; }