macro "Pomegranate Analysis Revision Tool"
{
versionFIJI = "1.53b";
requires(versionFIJI);
// Title Pop Up
showMessage("Pomegranate Analysis Revision Tool", ""
+"
Pomegranate
"
+"Analysis Revision Tool
"
+"
"
+"Virginia Tech, Blacksburg, Virginia"
+"Department of Biological Sciences - Hauf Lab"
+""
+"- FIJI Version Required: " + versionFIJI
+"
"
+"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");
// -----------------------------------------------------------------------------------------------------------------------------------------------
// Designate Existing Output File
Dialog.create("Existing Results File");
Dialog.addChoice("Input Method", newArray("Select Existing Output File from Directory","Manually Enter Path"));
Dialog.show();
if (Dialog.getChoice() == "Select Existing Output File from Directory") oldPath = getDirectory("Choose Existing Output File");
else oldPath = getString("File Path", "/Users/hauflab/Documents");
// Output Directory
oldDirectoryMain = oldPath +"/";
// Old ROI Directory
oldDirectoryROI = oldDirectoryMain + "ROIs/";
if (!File.exists(oldDirectoryROI)) exit("Error: Missing ROI Directory\nResponse: Ending Analysis");
// Old Binary Directory
oldDirectoryBinary = oldDirectoryMain + "Binaries/";
if (!File.exists(oldDirectoryROI)) exit("Error: Missing Binaries Directory\nResponse: Ending Analysis");
// Identify ROI Files
unuclei = -1;
fnuclei = -1;
uinput = -1;
finput = -1;
uoutput = -1;
foutput = -1;
roiList = getFileList(oldDirectoryROI);
for (i = 0; i < roiList.length; i++)
{
if (endsWith(roiList[i], "_Unfiltered_Nuclear_ROIs.zip")) unuclei = roiList[i];
if (endsWith(roiList[i], "_Filtered_Nuclear_ROIs.zip")) fnuclei = roiList[i];
if (endsWith(roiList[i], "_Unfiltered_Reconstruction_Input_Whole_Cell_ROIs.zip")) uinput = roiList[i];
if (endsWith(roiList[i], "_Filtered_Reconstruction_Input_Whole_Cell_ROIs.zip")) finput = roiList[i];
if (endsWith(roiList[i], "_Unfiltered_Reconstruction_Output_Whole_Cell_ROIs.zip")) uoutput = roiList[i];
if (endsWith(roiList[i], "_Filtered_Reconstruction_Output_Whole_Cell_ROIs.zip")) foutput = roiList[i];
}
// Run Mode Detection
if ((unuclei != -1) & (fnuclei != -1) & (uinput != -1) & (finput != -1) & (uoutput != -1) & (foutput != -1))
{
runMode = "BOTH";
runModeText = "Detected Analysis Type: Nuclear and Wholecell";
}
else if ((unuclei != -1) & (fnuclei != -1) & (uinput == -1) & (finput == -1) & (uoutput == -1) & (foutput == -1))
{
runMode = "NUCL";
runModeText = "Detected Analysis Type: Nuclear Only";
}
else if ((unuclei == -1) & (fnuclei == -1) & (uinput != -1) & (finput != -1) & (uoutput != -1) & (foutput != -1))
{
runMode = "WLCL";
runModeText = "Detected Analysis Type: Whole Cell Only";
}
else
{
showMessageWithCancel("Pomegranate Error", "Error: Invalid ROI file configuration. Check files in ROI directory.\nResponse: Ending Analysis");
cleanAll();
exit();
}
transpMode = false;
segMode = false;
importModeList = newArray("Single Multi-Channel Image", "Multiple Single-Channel Images");
Dialog.create("Pomegranate Run Parameters");
Dialog.addMessage(runModeText);
Dialog.addChoice("Import Type", importModeList);
Dialog.addCheckbox("Ignore Measurement Channel", segMode);
Dialog.addCheckbox("Transparent Mode", transpMode);
Dialog.show();
importMode = Dialog.getChoice();
segMode = Dialog.getCheckbox();
transpMode = Dialog.getCheckbox();
if (importMode == importModeList[0]) importMode = "MERGED";
else if (importMode == importModeList[1]) importMode = "UNMERGED";
// -----------------------------------------------------------------------------------------------------------------------------------------------
// Designate Input Image
if (importMode == "MERGED")
{
// Designate Input Image
Dialog.create("Input Image");
Dialog.addChoice("Input Method", newArray("Select Image from Directory","Manually Enter Path"));
Dialog.show();
if (Dialog.getChoice() == "Select Image from Directory") imagePath = File.openDialog("Choose an Input File");
else imagePath = getString("Image Path", "/Users/hauflab/Documents");
imageName = File.getName(imagePath);
if (endsWith(imageName,".tif")) open(imagePath);
else run("Bio-Formats Importer", "open=" + imagePath + " autoscale color_mode=Composite view=Hyperstack stack_order=XYCZT");
if (!isOpen(imageName))
{
showMessageWithCancel("Pomegranate Error", "Error: Unable to Open Image\nResponse: Ending Analysis");
cleanAll();
exit();
}
// Get Image Dimensions
getDimensions(width, height, channels, slices, frames);
getVoxelSize(vx, vy, vz, unit);
// Quick Check
getVoxelSize(vx, vy, vz, unit);
print("Voxel Size: " + vx + " " + unit + ", " + vy + " " + unit + ", " + vz + " " + unit);
if (channels > 1)
{
channelList = newArray(channels);
for (i = 1; i <= channels; i++) channelList[i-1] = "" + i;
// Assign Channels
channelHold = true;
while (channelHold)
{
Dialog.create("Channel Selection");
if (!segMode) Dialog.addChoice("Measurement Channel", channelList, 1);
if (runMode != "WLCL") Dialog.addChoice("Nuclear Marker Channel", channelList, 1);
if (runMode != "NUCL") Dialog.addChoice("Bright-Field Channel", channelList, 1);
Dialog.show();
if (!segMode) chparamMS = Dialog.getChoice();
if (runMode != "WLCL") chparamNC = Dialog.getChoice();
if (runMode != "NUCL") chparamWC = Dialog.getChoice();
if (!segMode) msChannel = parseInt(chparamMS); // Measurement Channel
else msChannel = -1;
if (runMode != "WLCL") nmChannel = parseInt(chparamNC); // Nuclear Marker Channel
else nmChannel = -2;
if (runMode != "NUCL") bfChannel = parseInt(chparamWC); // Bright-Field Channel
else bfChannel = -3;
print("\n[Run Parameters]");
if (!segMode) print("Measurement Channel: " + msChannel);
if (runMode != "WLCL") print("Nuclear Marker Channel: " + nmChannel);
if (runMode != "NUCL") print("Bright-Field Channel: " + bfChannel);
// Only Generate Folders for Valid Inputs
if ((nmChannel != bfChannel) && (msChannel != bfChannel) && (nmChannel != msChannel)) channelHold = false; // * * *
else showMessageWithCancel("Pomegranate Error", "Error: Invalid Channel Selection\nResponse: Returning to Channel Selection");
}
}
else if ((channels < 2) && (runMode == "BOTH"))
{
showMessageWithCancel("Pomegranate Error", "Error: Insufficient Channels for Analysis\nResponse: Ending Analysis");
cleanAll();
exit();
}
else if ((channels < 2) && (!segMode))
{
showMessageWithCancel("Pomegranate Error", "Error: Insufficient Channels for Analysis\nResponse: Ending Analysis");
cleanAll();
exit();
}
run("Split Channels");
if (!segMode) msChannel = "C"+msChannel+"-"+imageName;
if (runMode != "WLCL") nmChannel = "C"+nmChannel+"-"+imageName;
if (runMode != "NUCL") bfChannel = "C"+bfChannel+"-"+imageName;
}
else if (importMode == "UNMERGED")
{
// Measurement Channel Import
if (!segMode)
{
Dialog.create("Input Image");
Dialog.addMessage("Measurement Signal Input Image (Measurement Channel)");
Dialog.addChoice("Input Method", newArray("Select Image from Directory","Manually Enter Path"));
Dialog.show();
if (Dialog.getChoice() == "Select Image from Directory") imagePath = File.openDialog("Choose an Input File");
else imagePath = getString("Image Path", "/Users/hauflab/Documents");
imageName = File.getName(imagePath);
if (endsWith(imageName,".tif")) open(imagePath);
else run("Bio-Formats Importer", "open=" + imagePath + " autoscale color_mode=Composite view=Hyperstack stack_order=XYCZT");
// Check if Open
if (!isOpen(imageName))
{
showMessageWithCancel("Pomegranate Error", "Error: Unable to Open Image\nResponse: Ending Analysis");
cleanAll();
exit();
}
msChannel = getTitle();
}
// Nuclear Image Import
if (runMode != "WLCL")
{
Dialog.create("Input Image");
Dialog.addMessage("Nuclear Analysis Input Image (Nuclear Marker Channel)");
Dialog.addChoice("Input Method", newArray("Select Image from Directory","Manually Enter Path"));
Dialog.show();
if (Dialog.getChoice() == "Select Image from Directory") imagePath = File.openDialog("Choose an Input File");
else imagePath = getString("Image Path", "/Users/hauflab/Documents");
imageName = File.getName(imagePath);
if (endsWith(imageName,".tif")) open(imagePath);
else run("Bio-Formats Importer", "open=" + imagePath + " autoscale color_mode=Composite view=Hyperstack stack_order=XYCZT");
// Check if Open
if (!isOpen(imageName))
{
showMessageWithCancel("Pomegranate Error", "Error: Unable to Open Image\nResponse: Ending Analysis");
cleanAll();
exit();
}
nmChannel = getTitle();
}
// Bright-Field Import
if (runMode != "NUCL")
{
Dialog.create("Input Image");
Dialog.addMessage("Whole-Cell Analysis Input Image (Bright-field Channel)");
Dialog.addChoice("Input Method", newArray("Select Image from Directory","Manually Enter Path"));
Dialog.show();
if (Dialog.getChoice() == "Select Image from Directory") imagePath = File.openDialog("Choose an Input File");
else imagePath = getString("Image Path", "/Users/hauflab/Documents");
imageName = File.getName(imagePath);
if (endsWith(imageName,".tif")) open(imagePath);
else run("Bio-Formats Importer", "open=" + imagePath + " autoscale color_mode=Composite view=Hyperstack stack_order=XYCZT");
// Check if Open
if (!isOpen(imageName))
{
showMessageWithCancel("Pomegranate Error", "Error: Unable to Open Image\nResponse: Ending Analysis");
cleanAll();
exit();
}
bfChannel = getTitle();
}
if (!segMode) selectImage(msChannel);
else if (runMode == "NUCL") selectImage(nmChannel);
else if (runMode == "WLCL") selectImage(bfChannel);
else if (runMode == "BOTH") selectImage(bfChannel);
// Get Image Dimensions
getDimensions(width, height, channels, slices, frames);
getVoxelSize(vx, vy, vz, unit);
// Quick Check
getVoxelSize(vx, vy, vz, unit);
print("Voxel Size: " + vx + " " + unit + ", " + vy + " " + unit + ", " + vz + " " + unit);
}
// Save IDs
getDateAndTime(year, month, dayOfWeek, dayOfMonth, hour, minute, second, msec);
saveID = "" + year + "" + month + "" + dayOfMonth + "_" + hour + "" + minute + "_" + imageName;
runID = "OID" + (year - 2000) + "" + month + "" + dayOfMonth + "" + hour + "" + minute;
// Voxel Size Management
Dialog.create("Voxel Size Management");
Dialog.addNumber("Voxel Width (" + unit + ")", 0.1071);
Dialog.addNumber("Voxel Height (" + unit + ")", 0.1071);
Dialog.addNumber("Voxel Depth (" + unit + ")", 0.0659);
Dialog.show();
nvx = Dialog.getNumber();
nvy = Dialog.getNumber();
nvz = Dialog.getNumber();
if (!segMode)
{
selectImage(msChannel);
setVoxelSize(nvx, nvy, nvz, unit);
}
if (runMode != "WLCL")
{
selectImage(nmChannel);
setVoxelSize(nvx, nvy, nvz, unit);
}
if (runMode != "NUCL")
{
selectImage(bfChannel);
setVoxelSize(nvx, nvy, nvz, unit);
}
// Set Experiment Name
expName = getString("Experiment Name", imageName);
// Designate Output Directory
Dialog.create("Output Directory");
Dialog.addChoice("Output Method", newArray("Select Output Directory","Manually Enter Path"));
Dialog.show();
if (Dialog.getChoice() == "Select Output Directory") outputPath = getDirectory("Select Output Directory");
else outputPath = getString("Output Path", "/Users/hauflab/Documents");
// -----------------------------------------------------------------------------------------------------------------------------------------------
// Output Directory
directoryMain = outputPath + saveID+"/";
if (!File.exists(directoryMain)) File.makeDirectory(directoryMain);
// ROI Directory
directoryROI = directoryMain + "ROIs/";
if (!File.exists(directoryROI)) File.makeDirectory(directoryROI);
// Results Directory
directoryResults = directoryMain + "Results/";
if (!File.exists(directoryResults)) File.makeDirectory(directoryResults);
// Binary Directory
directoryBinary = directoryMain + "Binaries/";
if (!File.exists(directoryBinary)) File.makeDirectory(directoryBinary);
// -----------------------------------------------------------------------------------------------------------------------------------------------
// Choose ROI Type and get ROI File Paths
if(getBoolean("Use filtered ROIs or unfiltered ROIs?", "Filtered ROIs", "Unfiltered ROIs"))
{
if (runMode != "WLCL") npath = oldDirectoryROI + fnuclei;
if (runMode != "NUCL") wcINpath = oldDirectoryROI + finput;
if (runMode != "NUCL") wcOUTpath = oldDirectoryROI + foutput;
}
else
{
if (runMode != "WLCL") npath = oldDirectoryROI + unuclei;
if (runMode != "NUCL") wcINpath = oldDirectoryROI + uinput;
if (runMode != "NUCL") wcOUTpath = oldDirectoryROI + uoutput;
}
print("\n[ROI File Paths]");
if (runMode != "WLCL") print("Nuclear ROI File Path: " + npath);
if (runMode != "NUCL") print("Whole Cell Reconstruction Input ROI File Path: " + wcINpath);
if (runMode != "NUCL") print("Whole Cell Reconstruction Output ROI File Path: " + wcOUTpath);
// -----------------------------------------------------------------------------------------------------------------------------------------------
// Reload Nuclei and Save Copy
if (runMode != "WLCL")
{
roiManager("Open", npath);
// Nuclear ROI Export
print("\n[Exporting Nuclear ROI Files]");
nucFile = directoryROI + replace(File.getName(imagePath),'.','_') + "_Unfiltered_Nuclear_ROIs.zip";
if (!File.exists(nucFile)) roiManager("Save", nucFile);
print("File Created: " + nucFile);
roiManager("Reset");
}
// -----------------------------------------------------------------------------------------------------------------------------------------------
if (runMode != "NUCL")
{
selectImage(bfChannel);
bfbd = bitDepth();
wcChoices = newArray("Bright-field (Default 2D Segmentation)","Binary (External Segmentation Input)");
Dialog.create("Whole-Cell Only, Single Image Input");
if (bfbd == 8) Dialog.addChoice("Input Image", wcChoices, wcChoices[1]);
else Dialog.addChoice("Input Image", wcChoices, wcChoices[0]);
Dialog.show();
if (Dialog.getChoice() == wcChoices[0]) binaryMode = false;
else binaryMode = true;
redoR = getBoolean("Rerun Whole Cell Reconstruction?");
if (redoR)
{
// Make Canvas Image
selectImage(bfChannel);
run("Select None");
roiManager("Deselect");
run("Duplicate...", "duplicate");
run("Multiply...", "value=0 stack");
run("RGB Color");
rename("Canvas");
// Load Input ROIs
roiManager("Open", wcINpath);
showStatus("Pomegranate - Constructing Whole Cell Fits");
print("\n[Whole Cell Count]");
n = roiManager("Count");
finalcells = n;
print("Cells: " + n);
// Reconstruction Input ROI Export
showStatus("Pomegranate - Exporting Whole Cell ROis");
print("\n[Exporting Whole Cell ROIs]");
rinpFile = directoryROI + replace(File.getName(imagePath),'.','_') + "_Unfiltered_Reconstruction_Input_Whole_Cell_ROIs.zip";
if (!File.exists(rinpFile)) roiManager("Save", rinpFile);
print("File Created: " + rinpFile);
selectImage("Canvas");
// Project into 3D
print("\n[Whole Cell Fit Construction]");
newImage("Binary_Filtered", "8-bit black", width, height, slices);
n = roiManager("Count");
for (i = 0; i < n; i++)
{
selectImage("Binary_Filtered");
roiManager("Select", i);
ID = Roi.getProperty("Object_ID");
currentColor = Roi.getProperty("ROI_Color");
if(ID == "")
{
ID = "OID_" + i;
currentColor = randomHexColor();
Roi.setProperty("Object_ID", ID);
Roi.setProperty("ROI_Color", currentColor);
roiManager("Rename", "Y_" + ID);
roiManager("Update");
}
run("Enlarge...", "enlarge=-1 pixel");
fill();
}
// Guarentee Binary
selectImage("Binary_Filtered");
run("8-bit");
setAutoThreshold("Otsu dark");
setThreshold(1, 10e6);
run("Convert to Mask", "method=Otsu background=Dark black");
roiManager("Deselect");
run("Select None");
// Distance Map
selectImage("Binary_Filtered");
run("Duplicate...", "duplicate title=Distance_Map");
run("Distance Map", "stack");
if (transpMode) waitForUser("[Transparent Mode] Distance Map");
// Skeleton Image
selectImage("Binary_Filtered");
run("Duplicate...", "duplicate title=Skeleton");
run("Skeletonize", "stack");
if (transpMode) waitForUser("[Transparent Mode] Skeleton");
// Skeleton Image AND Distance Map
imageCalculator("AND create stack", "Distance_Map","Skeleton");
rename("Medial_Axis_Transform");
close("Skeleton");
close("Distance_Map");
if (transpMode) waitForUser("[Transparent Mode] Skeleton Distance Map Union");
selectImage("Medial_Axis_Transform");
n = roiManager("Count");
for (i = 0; i < n; i++)
{
selectImage("Medial_Axis_Transform");
roiManager("Select", i);
ID = Roi.getProperty("Object_ID");
currentColor = Roi.getProperty("ROI_Color");
setColor(currentColor);
mid = getSliceNumber();
Roi.getContainedPoints(wcxPoints, wcyPoints);
distMapValues = newArray(wcxPoints.length);
for (j = 0; j < wcxPoints.length; j++) distMapValues[j] = getPixel(wcxPoints[j], wcyPoints[j]);
selectImage("Canvas");
getVoxelSize(vx, vy, vz, unit);
for (k = 1; k <= nSlices; k++)
{
for (j = 0; j < wcxPoints.length; j++)
{
efactor = vx/vz;
rinput = distMapValues[j];
zinput = (mid - k) / efactor;
segmentRadius = crossSectionRadius(rinput, zinput) + 1;
if ((rinput != 0) & (!isNaN(segmentRadius))) print("Cell " + i + ", Slice " + k + ", Segment " + j + ") --- R0: " + rinput + ", RS: " + segmentRadius + ", Z: " + zinput );
if (segmentRadius > 2)
{
// Compound Selection
setKeyDown("Shift");
makeOval(wcxPoints[j] - segmentRadius, wcyPoints[j] - segmentRadius, segmentRadius * 2, segmentRadius * 2);
}
}
// Apply to Canvas and ROI Manager
if (selectionType() != -1)
{
Roi.setProperty("Object_ID", ID);
Roi.setProperty("ROI_Color", currentColor);
Roi.setStrokeColor(currentColor);
if ((mid - k) == 0) Roi.setProperty("Mid_Slice", true);
else Roi.setProperty("Mid_Slice", false);
Roi.setProperty("Data_Type", "Whole_Cell");
Roi.setName("WC_" + ID + "_" + k);
Roi.setPosition(k);
setSlice(k);
roiManager("Add");
fill();
}
run("Select None");
run("Remove Overlay");
}
}
close("Medial_Axis_Transform");
selectImage("Canvas");
// ROI Name Cleanup
n = roiManager("Count");
deleteList = newArray();
for (i = 0; i < n; i++) if (!startsWith(call("ij.plugin.frame.RoiManager.getName", i), "WC")) deleteList = Array.concat(deleteList, i);
// Delete Original ROIs
if (deleteList.length > 0)
{
roiManager("Select", deleteList);
roiManager("Delete");
}
roiManager("Deselect");
// Image Export
selectImage("Canvas");
run("Remove Overlay");
run("Select None");
wcbinary = directoryBinary+"/Whole_Cell_RGB.tif";
if (!File.exists(wcbinary)) saveAs(".tiff", wcbinary);
print("\n[Image Export]\nWhole Cell Binary: " + wcbinary);
// Whole Cell ROI Export
showStatus("Pomegranate - Exporting Whole Cell ROis");
print("\n[Exporting Whole Cell ROIs]");
wcFile = directoryROI + replace(File.getName(imagePath),'.','_') + "_Unfiltered_Reconstruction_Output_Whole_Cell_ROIs.zip";
if (!File.exists(wcFile)) roiManager("Save", wcFile);
print("File Created: " + wcFile);
if (transpMode) waitForUser("[Transparent Mode] Reconstruction");
if (!transpMode) setBatchMode(false);
roiManager("Reset");
}
else
{
roiManager("Open", wcOUTpath);
// Open Old Whole-Cell RGB
open(oldDirectoryBinary + "Whole_Cell_RGB.tif");
// Image Export (Copy)
wcbinary = directoryBinary+"/Whole_Cell_RGB.tif";
if (!File.exists(wcbinary)) saveAs(".tiff", wcbinary);
print("\n[Image Export]\nWhole Cell Binary: " + wcbinary);
// Whole Cell ROI Export
showStatus("Pomegranate - Exporting Whole Cell ROis");
print("\n[Exporting Whole Cell ROIs]");
wcFile = directoryROI + replace(File.getName(imagePath),'.','_') + "_Unfiltered_Reconstruction_Output_Whole_Cell_ROIs.zip";
if (!File.exists(wcFile)) roiManager("Save", wcFile);
print("File Created: " + wcFile);
roiManager("Reset");
}
}
// -----------------------------------------------------------------------------------------------------------------------------------------------
// Reload and Inspect
roiManager("Reset");
if (!segMode) selectImage(msChannel);
else
{
if ((runMode != "NUCL") & (!binaryMode)) selectImage(bfChannel);
else if ((runMode != "NUCL") & (binaryMode)) selectImage("Whole_Cell_RGB.tif");
else if (runMode != "WLCL") selectImage(nmChannel);
}
if (runMode != "NUCL") roiManager("Open", wcFile);
if (runMode != "WLCL") roiManager("Open", nucFile);
roiManager("Sort");
roiManager("Show All Without Labels");
// Hold
waitForUser("Reconstruction complete.\nClick OK to proceed to manual ROI filtering.");
// Manual Deletion
setSlice(round(nSlices/2));
manualDelete = getBoolean("Manually delete an ROI?\nClick NO to use current ROIs for quantification");
oidRecord = newArray();
deleteList = newArray();
while (manualDelete)
{
selectWindow("ROI Manager");
roiManager("Show All With Labels");
setSlice(round(nSlices/2));
waitForUser("Please select an ROI.\nClick OK to delete that ROI's object.");
if (selectionType() != -1)
{
deleteList = newArray();
deleteID = Roi.getProperty("Object_ID");
deleteType = Roi.getProperty("Data_Type");
oidRecord = Array.concat(oidRecord, deleteID);
n = roiManager("Count");
for (i = 0; i < n; i++)
{
roiManager("Select", i);
if ((Roi.getProperty("Object_ID") == deleteID) && (Roi.getProperty("Data_Type") == deleteType)) deleteList = Array.concat(deleteList, i);
}
// Clear Bad ROIs
if (deleteList.length > 0)
{
roiManager("Select", deleteList);
roiManager("Delete");
}
roiManager("Deselect");
run("Select None");
setSlice(round(nSlices/2));
manualDelete = getBoolean("Manually delete another ROI?\nClick NO to use current ROIs for quantification");
}
else manualDelete = getBoolean("Invalid selection. Try again?\nClick NO to use current ROIs for quantification");
}
if (transpMode) waitForUser("[Transparent Mode] Manual Filter");
// -----------------------------------------------------------------------------------------------------------------------------------------------
// Measure Intensity
showStatus("Pomegranate - Measuring Whole Cell ROIs");
run("Set Measurements...", "area mean standard modal min centroid center perimeter fit shape feret's median stack display redirect=None decimal=3"); // Remove Threshold Columns
setBatchMode(true);
if (!segMode) selectImage(msChannel);
else
{
if ((runMode != "NUCL") & (!binaryMode)) selectImage(bfChannel);
else if ((runMode != "NUCL") & (binaryMode)) selectImage("Whole_Cell_RGB.tif");
else if (runMode != "WLCL") selectImage(nmChannel);
}
roiManager("Deselect");
roiManager("Show All Without Labels");
roiManager("Measure");
// Append Additional Info to Output
n = roiManager("Count");
for (i = 0; i < n; i++)
{
roiManager("Select", i);
getSelectionCoordinates(xpos, ypos);
Roi.getContainedPoints(xpc, ypc);
ID = Roi.getProperty("Object_ID");
dType = Roi.getProperty("Data_Type");
midType = Roi.getProperty("Mid_Slice");
crad = Roi.getProperty("Cell_Radius");
pixelArea = xpc.length;
setResult("Object_ID", i, ID);
if (midType) setResult("ROI_Type", i, "MID");
else setResult("ROI_Type", i, "NONMID");
setResult("Data_Type", i, dType);
setResult("Image", i, imageName);
setResult("Experiment", i, expName);
setResult("xpos", i, replace(String.join(xpos)," ",""));
setResult("ypos", i, replace(String.join(ypos)," ",""));
setResult("voxelSize_X", i, nvx);
setResult("voxelSize_Y", i, nvy);
setResult("voxelSize_Z", i, nvz);
setResult("voxelSize_unit", i, unit);
setResult("Area_px", i, pixelArea);
}
// Results Export
showStatus("Pomegranate - Exporting Whole Cell Measurements");
ResultFile = directoryResults + replace(File.getName(imagePath),'.','_') + "_Results_Full.csv";
if (!File.exists(ResultFile)) saveAs("Results", ResultFile);
// [ 12 ] -----------------------------------------------------------------------------------------------------------------------------------------------
if (runMode != "NUCL")
{
if (redoR)
{
// Revise Reconstruction Input based on manual selection
roiManager("Reset");
roiManager("Open", rinpFile);
deleteList = newArray();
for (i = 0; i < roiManager("Count"); i++)
{
roiManager("Select", i);
currentID = Roi.getProperty("Object_ID");
for (j = 0; j < oidRecord.length; j++)
{
if ((currentID == oidRecord[j])) deleteList = Array.concat(deleteList, i);
}
}
// Clear Bad ROIs
if (deleteList.length > 0)
{
roiManager("Select", deleteList);
roiManager("Delete");
}
roiManager("Deselect");
run("Select None");
// Filtered Reconstruction Input ROI Export
showStatus("Pomegranate - Exporting Whole Cell ROis");
print("\n[Exporting Whole Cell ROIs]");
frinpFile = directoryROI + replace(File.getName(imagePath),'.','_') + "_Filtered_Reconstruction_Input_Whole_Cell_ROIs.zip";
if (!File.exists(frinpFile)) roiManager("Save", frinpFile);
print("File Created: " + frinpFile);
}
if (runMode == "BOTH")
{
// Revise Nuclear ROIs based on manual selection
roiManager("Reset");
roiManager("Open", nucFile);
deleteList = newArray();
for (i = 0; i < roiManager("Count"); i++)
{
roiManager("Select", i);
currentID = Roi.getProperty("Object_ID");
for (j = 0; j < oidRecord.length; j++)
{
if ((currentID == oidRecord[j])) deleteList = Array.concat(deleteList, i);
}
}
// Clear Bad ROIs
if (deleteList.length > 0)
{
roiManager("Select", deleteList);
roiManager("Delete");
}
roiManager("Deselect");
run("Select None");
// Filtered Nuclear ROI Export
print("\n[Exporting Nuclear ROI Files]");
fnucFile = directoryROI + replace(File.getName(imagePath),'.','_') + "_Filtered_Nuclear_ROIs.zip";
if (!File.exists(fnucFile)) roiManager("Save", fnucFile);
print("File Created: " + fnucFile);
}
// Revise Reconstruction Output ROIs based on manual selection
roiManager("Reset");
roiManager("Open", wcFile);
deleteList = newArray();
for (i = 0; i < roiManager("Count"); i++)
{
roiManager("Select", i);
currentID = Roi.getProperty("Object_ID");
for (j = 0; j < oidRecord.length; j++)
{
if ((currentID == oidRecord[j])) deleteList = Array.concat(deleteList, i);
}
}
// Clear Bad ROIs
if (deleteList.length > 0)
{
roiManager("Select", deleteList);
roiManager("Delete");
}
roiManager("Deselect");
run("Select None");
// Filtered Whole Cell ROI Export
showStatus("Pomegranate - Exporting Whole Cell ROis");
print("\n[Exporting Whole Cell ROIs]");
fwcFile = directoryROI + replace(File.getName(imagePath),'.','_') + "_Filtered_Reconstruction_Output_Whole_Cell_ROIs.zip";
if (!File.exists(fwcFile)) roiManager("Save", fwcFile);
print("File Created: " + fwcFile);
}
// -----------------------------------------------------------------------------------------------------------------------------------------------
// Log File Export
logFile = directoryMain + replace(File.getName(imagePath),'.','_') + "_LOG.txt";
if (!File.exists(logFile))
{
selectWindow("Log");
saveAs("Text", logFile);
}
// End Run Cleanup
cleanAll();
close("Log");
close("Results");
run("Collect Garbage");
waitForUser("Done", "Analysis revision is complete\nPlease review files in your output directory");
}
// -----------------------------------------------------------------------------------------------------------------------------------------------
// Clean Up Function
function cleanAll()
{
close('*');
run("Clear Results");
roiManager("Reset");
print("\\Clear");
}
// Radius of Spherical Cross Sections in Z
function crossSectionRadius(r,z)
{
return(sqrt(pow(r,2) - pow(z,2)));
}