|
/**
|
|
* MRI MS2 QUANT PRE-PROCESSING
|
|
*
|
|
* Do the preprocessing for MS2Quant
|
|
* - concatenate stacks
|
|
* - measure and report the mean intensity in a 3D background region
|
|
* - crop 4D cells and save them in separate files
|
|
* - allow to outline and save transcription sites, nuclei and control regions as input to ms2quant
|
|
*
|
|
* written 2013-14 by Volker Baecker (INSERM) at Montpellier RIO Imaging (www.mri.cnrs.fr)
|
|
*/
|
|
|
|
var _SLICES = 12;
|
|
var _FRAMES = 304;
|
|
var sourceDir = "";
|
|
var _COUNTER = 0;
|
|
var _CELL_FOLDER;
|
|
var _CELL_NAME;
|
|
var _ENHANCE_CONTRAST = 1;
|
|
var _MARK = "PST";
|
|
var _IS_FOR_BATCH = false;
|
|
|
|
var helpURL = "http://dev.mri.cnrs.fr/projects/imagej-macros/wiki/MS2Quant_Pre-Processing";
|
|
|
|
macro "run tests [f12]" {
|
|
runTests();
|
|
}
|
|
|
|
macro "MS2 Quant PP Help [f1]" {
|
|
showHelp();
|
|
}
|
|
|
|
macro "MS2 Quant PP concatenate stacks [f2]" {
|
|
ms2quantPPConcatenateStacks();
|
|
}
|
|
|
|
macro "MS2 Quant PP measure background [f3]" {
|
|
ms2quantPPMeasureMeanBackground();
|
|
}
|
|
|
|
macro "MS2 Quant PP crop and save cell [f4]" {
|
|
ms2quantPPCropAndSave();
|
|
}
|
|
|
|
macro "MS2 Quant PP add selection [f5]" {
|
|
ms2quantPPAddRoi();
|
|
}
|
|
|
|
macro "MS2 Quant PP add selections [f6]" {
|
|
ms2quantPPAddRois();
|
|
}
|
|
|
|
macro "MS2 Quant PP save selections [f7]" {
|
|
ms2quantPPSaveRois();
|
|
}
|
|
|
|
macro "Unused Tool - C037" { }
|
|
|
|
macro "MS2 Quant PP Help (f1) Action Tool - C037T0d08MT8d08STed082"{
|
|
showHelp();
|
|
}
|
|
|
|
macro 'MS2 Quant PP Help (f1) Action Tool Options...' {
|
|
Dialog.create("MS2QuantPP Options");
|
|
Dialog.addNumber("z-slices: ", _SLICES);
|
|
Dialog.addNumber("time-frames: ", _FRAMES);
|
|
Dialog.addNumber("enhance contrast (%saturated): ", _ENHANCE_CONTRAST);
|
|
Dialog.addString("mark: ", _MARK);
|
|
Dialog.addCheckbox("is for batch: ", _IS_FOR_BATCH);
|
|
Dialog.show();
|
|
_SLICES = Dialog.getNumber();
|
|
_FRAMES = Dialog.getNumber();
|
|
_ENHANCE_CONTRAST = Dialog.getNumber();
|
|
_MARK = Dialog.getString();
|
|
_IS_FOR_BATCH = Dialog.getCheckbox();
|
|
}
|
|
|
|
macro "concatenate stacks (f2) Action Tool - C037T0d14cTad14s" {
|
|
ms2quantPPConcatenateStacks();
|
|
}
|
|
|
|
macro "measure background (f3) Action Tool - C037T0d14mTcd14b" {
|
|
ms2quantPPMeasureMeanBackground();
|
|
}
|
|
|
|
macro "crop and save cell (f4) Action Tool - C037T0d09cT5d09rT8d09oTdd09p" {
|
|
ms2quantPPCropAndSave();
|
|
}
|
|
|
|
macro "add selection (f5) Action Tool - C037T0d09+T6d09rTad09oTfd09i" {
|
|
ms2quantPPAddRoi();
|
|
}
|
|
|
|
macro "add selections (f6) Action Tool - C037T0d09rT5d09oTbd09iTdd09s" {
|
|
ms2quantPPAddRois();
|
|
}
|
|
|
|
macro "save selections (f7) Action Tool - C037T0d09sT5d09aTbd09vTdd09e" {
|
|
ms2quantPPSaveRois();
|
|
}
|
|
|
|
function showHelp() {
|
|
run('URL...', 'url='+helpURL);
|
|
}
|
|
|
|
function ms2quantPPAddRoi() {
|
|
count = roiManager("count");
|
|
if (count==3) roiManager("reset");
|
|
count = roiManager("count");
|
|
name = "T";
|
|
if (count == 1) name = "N";
|
|
if (count == 2) name = "C";
|
|
roiManager("Add");
|
|
roiManager("Deselect");
|
|
roiManager("Show None");
|
|
roiManager("Show All");
|
|
run("Select None");
|
|
roiManager("Select", count);
|
|
roiManager("Rename", name);
|
|
roiManager("Deselect");
|
|
roiManager("Show None");
|
|
roiManager("Show All");
|
|
if (count == 2) {
|
|
roiManager("Save", _CELL_FOLDER + "/RoiSet.zip");
|
|
title = _CELL_NAME + ".tif";
|
|
closeImageAndProjections(title);
|
|
run("Add Selection...");
|
|
}
|
|
}
|
|
|
|
function ms2quantPPAddRois() {
|
|
count = roiManager("count");
|
|
if ((count % 3) == 0) name = "T";
|
|
if ((count % 3) == 1) name = "N";
|
|
if ((count % 3) == 2) name = "C";
|
|
name = name + "_" + floor(count / 3) + 1;
|
|
roiManager("Add");
|
|
roiManager("Deselect");
|
|
roiManager("Show None");
|
|
roiManager("Show All");
|
|
run("Select None");
|
|
roiManager("Select", count);
|
|
roiManager("Rename", name);
|
|
roiManager("Deselect");
|
|
roiManager("Show None");
|
|
roiManager("Show All");
|
|
}
|
|
|
|
function closeImageAndProjections(title) {
|
|
selectImage(title);
|
|
close();
|
|
selectImage("MAX_"+title);
|
|
close();
|
|
selectImage("MAX_MAX_"+title);
|
|
close();
|
|
}
|
|
|
|
function ms2quantPPSaveRois() {
|
|
roiManager("Save", sourceDir + "/" + "MAX_" + _CELL_NAME +"_RoiSet.zip");
|
|
title = _CELL_NAME + ".tif";
|
|
selectImage("MAX_" + title);
|
|
save(sourceDir + "/" + "MAX_" + title);
|
|
closeImageAndProjections(title);
|
|
}
|
|
|
|
function ms2quantPPCropAndSave() {
|
|
sourceDir = getDirectory("image");
|
|
title = getTitle();
|
|
parts = split(title, ".");
|
|
cellNumber = getCellNumber(sourceDir, parts[0]);
|
|
_CELL_NAME = parts[0];
|
|
if (!_IS_FOR_BATCH) _CELL_NAME = _CELL_NAME + "_c" + cellNumber;
|
|
newTitle = _CELL_NAME + ".tif";
|
|
run("Duplicate...", "title="+newTitle+" duplicate range=1-" + nSlices);
|
|
run("Select None");
|
|
run("Remove Overlay");
|
|
if (!_IS_FOR_BATCH) {
|
|
if (!File.exists(sourceDir + newTitle)) File.makeDirectory(sourceDir + _CELL_NAME);
|
|
_CELL_FOLDER = sourceDir + _CELL_NAME;
|
|
save(_CELL_FOLDER + "/" + newTitle);
|
|
}
|
|
showHyperstackAndProjections();
|
|
roiManager("Reset");
|
|
}
|
|
|
|
function showHyperstackAndProjections() {
|
|
run("Stack to Hyperstack...", "order=xyczt(default) channels=1 slices="+_SLICES+" frames="+_FRAMES+" display=Color");
|
|
run("Enhance Contrast", "saturated=" + _ENHANCE_CONTRAST);
|
|
getDimensions(width, height, channels, slices, frames);
|
|
run("Z Project...", "start=1 stop="+slices+" projection=[Max Intensity] all");
|
|
run("Enhance Contrast", "saturated=" + _ENHANCE_CONTRAST);
|
|
run("Z Project...", "start=1 stop="+frames+" projection=[Max Intensity]");
|
|
run("Enhance Contrast", "saturated=" + _ENHANCE_CONTRAST);
|
|
run("Tile");
|
|
setTool("freehand");
|
|
}
|
|
|
|
function ms2quantPPMeasureMeanBackground() {
|
|
setBatchMode(true);
|
|
sourceDir = getDirectory("Choose the source directory");
|
|
files = getFileList(sourceDir);
|
|
images = filterTifFiles(files);
|
|
_COUNTER = 0
|
|
logStart("MEASURE BACKGROUND");
|
|
for(i=0; i<images.length; i++) {
|
|
logUpdate(i, images);
|
|
measureBackgoundOnStack(images[i]);
|
|
}
|
|
if (isOpen("Background")) {
|
|
print("Saving measurements");
|
|
selectWindow("Background");
|
|
saveAs("Text", sourceDir + "Background.xls");
|
|
}
|
|
setBatchMode("exit and display");
|
|
logEnd("MEASURE BACKGROUND");
|
|
}
|
|
|
|
function ms2quantPPConcatenateStacks() {
|
|
print("\\Clear");
|
|
setBatchMode(true);
|
|
sourceDir = getDirectory("Choose the source directory");
|
|
files = getFileList(sourceDir);
|
|
files = filterFiles(files);
|
|
run("Clear Results");
|
|
logStart("CONCATENATE STACKS");
|
|
for(i=0; i<files.length; i++) {
|
|
logUpdate(i, files);
|
|
handleStack(files[i]);
|
|
}
|
|
setBatchMode("exit and display");
|
|
logEnd("CONCATENATE STACKS");
|
|
}
|
|
|
|
function getCellNumber(sourceDir, name) {
|
|
counter = 0;
|
|
files = getFileList(sourceDir);
|
|
for (i=0; i<files.length; i++) {
|
|
file = files[i];
|
|
if (File.isDirectory(sourceDir+ file) && startsWith(file, name + "_c")) counter++;
|
|
}
|
|
return counter + 1;
|
|
}
|
|
|
|
function measureBackgoundOnStack(file) {
|
|
open(file);
|
|
id = getImageID();
|
|
loadRois(file);
|
|
numberOfRois = roiManager("count");
|
|
if (numberOfRois != 1) {
|
|
print ("No selection for: " + file);
|
|
selectImage(id);
|
|
close();
|
|
return;
|
|
}
|
|
roiManager("Select", 0);
|
|
run("Clear Results");
|
|
if (!isOpen("Background")) {
|
|
run("Table...", "name=Background width=350 height=250");
|
|
print("[Background]", "\\Headings:n\timage\tmean background");
|
|
}
|
|
title = getTitle();
|
|
run("Set Measurements...", " mean display redirect=None decimal=3");
|
|
run("Plot Z-axis Profile");
|
|
run("Summarize");
|
|
res = getResult("Mean", nResults-4);
|
|
title = getTitle();
|
|
selectWindow(title);
|
|
close();
|
|
_COUNTER++;
|
|
print("[Background]", _COUNTER + "\t" + file + "\t"+ res);
|
|
selectImage(id);
|
|
close();
|
|
}
|
|
|
|
function handleStack(file) {
|
|
otherFile = otherStackFor(file);
|
|
open(file);
|
|
title1 = getTitle();
|
|
open(otherFile);
|
|
title2 = getTitle();
|
|
resultTitle = title1;
|
|
run("Concatenate...", " title=" + resultTitle + " image1=" + title1 + " image2=" + title2 + " image3=[-- None --]");
|
|
imageID = getImageID();
|
|
if (!File.exists(sourceDir+"STACKS")) File.makeDirectory(sourceDir+"STACKS");
|
|
saveAs("Tiff", sourceDir+"STACKS/" + resultTitle);
|
|
selectImage(imageID);
|
|
close();
|
|
}
|
|
|
|
function otherStackFor(file) {
|
|
preFix =beforeMajorNumber(file);
|
|
postFix = afterMajorNumber(file);
|
|
majorNumber = getMajorNumber(file);
|
|
nextMajorNumber = substring(majorNumber, 0, 2) + "2";
|
|
return "" + preFix + nextMajorNumber + postFix;
|
|
}
|
|
|
|
function filterFiles(files) {
|
|
count = countInterestingFiles(files);
|
|
filteredFiles = newArray(count);
|
|
counter = 0;
|
|
for(i=0; i<files.length; i++) {
|
|
if (isInteresting(files[i])) {
|
|
filteredFiles[counter] = files[i];
|
|
counter++;
|
|
}
|
|
}
|
|
return filteredFiles;
|
|
}
|
|
|
|
function filterTifFiles(files) {
|
|
count = 0;
|
|
for (i=0; i<files.length; i++) {
|
|
if (isTifFile(files[i])) count = count + 1;
|
|
}
|
|
images = newArray(count);
|
|
count = 0;
|
|
for (i=0; i<files.length; i++) {
|
|
if (isTifFile(files[i])) {
|
|
images[count] = files[i];
|
|
count = count + 1;
|
|
}
|
|
}
|
|
return images;
|
|
}
|
|
|
|
function countInterestingFiles(files) {
|
|
counter = 0;
|
|
for (i=0; i<files.length; i++) {
|
|
file = files[i];
|
|
if (isInteresting(file)) counter++;
|
|
}
|
|
return counter;
|
|
}
|
|
|
|
function isInteresting(file) {
|
|
if (!isImageFile(file)) return false;
|
|
majorNumber = getMajorNumber(file);
|
|
minorNumber = getMinorNumber(file);
|
|
if (!endsWith(majorNumber, "1") ) return false;
|
|
// if (minorNumber!="2") return false;
|
|
otherStack = otherStackFor(file);
|
|
fullPath = "" + sourceDir + otherStack;
|
|
if (!File.exists(fullPath)) return false;
|
|
return true;
|
|
}
|
|
|
|
function isImageFile(file) {
|
|
extensions = imageFileExtensions();
|
|
for (i=0; i<extensions.length; i++) {
|
|
extension = extensions[i];
|
|
if (endsWith(file, extension)) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function isTifFile(file) {
|
|
extensions = newArray(".tif", ".TIF", ".tiff", ".TIFF");
|
|
for (i=0; i<extensions.length; i++) {
|
|
extension = extensions[i];
|
|
if (endsWith(file, extension)) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function imageFileExtensions() {
|
|
exts = newArray(".dv");
|
|
return exts;
|
|
}
|
|
|
|
function afterMajorNumber(file) {
|
|
index = lastIndexOf(file, "_"+_MARK+"_");
|
|
result = substring(file, index + 5 + 3, lengthOf(file));
|
|
return result;
|
|
}
|
|
|
|
function beforeMajorNumber(file) {
|
|
index = lastIndexOf(file, "_"+_MARK+"_");
|
|
result = substring(file, 0, index+5);
|
|
return result;
|
|
}
|
|
|
|
function getMajorNumber(file) {
|
|
index = lastIndexOf(file, "_"+_MARK+"_");
|
|
number = substring(file, index+5, index + 5 + 3);
|
|
return number;
|
|
}
|
|
|
|
function getMinorNumber(file) {
|
|
index = lastIndexOf(file, "_"+_MARK+"_");
|
|
offset = 12;
|
|
if (indexOf(file, "_pt_")==-1) offset=9;
|
|
number = substring(file, index+offset, index + offset + 1);
|
|
return number;
|
|
}
|
|
|
|
function logStart(nameOfMacro) {
|
|
print("\\Clear");
|
|
getDateAndTime(year, month, dayOfWeek, dayOfMonth, hour, minute, second, msec);
|
|
print("" + dayOfMonth + "-" + (month+1) + "-" + year + " " + hour + ":" + minute + ":" + second + "." + msec + " " + nameOfMacro + " STARTED");
|
|
}
|
|
|
|
function logUpdate(i, files) {
|
|
print("\\Update1:Processing image " + (i+1) +" of "+ files.length);
|
|
print(files[i]);
|
|
}
|
|
|
|
function logEnd(nameOfMacro) {
|
|
print("FINISHED " + nameOfMacro);
|
|
getDateAndTime(year, month, dayOfWeek, dayOfMonth, hour, minute, second, msec);
|
|
print("" + dayOfMonth + "-" + (month+1) + "-" + year + " " + hour + ":" + minute + ":" + second + "." + msec);
|
|
}
|
|
|
|
|
|
function loadRois(file) {
|
|
roiFile = sourceDir + file + ".zip";
|
|
roiManager("Reset");
|
|
if (File.exists(roiFile)) {
|
|
roiManager("Open", roiFile);
|
|
roiManager("Show None");
|
|
roiManager("Show All");
|
|
}
|
|
}
|
|
|
|
// Unit tests
|
|
|
|
function runTests() {
|
|
sourceDir = "/media/donnees/mri/in/tantale/1-2-3/";
|
|
print("START OF TESTRUN");
|
|
result = "failed";
|
|
if (testGetMinorNumber()) result = "ok";
|
|
print ("testGetMinorNumber - " + result);
|
|
result = "failed";
|
|
if (testGetMajorNumber()) result = "ok";
|
|
print ("testGetMajorNumber - " + result);
|
|
result = "failed";
|
|
if (testOtherStackFor()) result = "ok";
|
|
print ("testOtherStackFor - " + result);
|
|
result = "failed";
|
|
if (testAfterMajorNumber()) result = "ok";
|
|
print ("testAfterMajorNumber - " + result);
|
|
result = "failed";
|
|
if (testBeforeMajorNumber()) result = "ok";
|
|
print ("testBeforeMajorNumber - " + result);
|
|
result = "failed";
|
|
if (testIsImageFile()) result = "ok";
|
|
print ("testIsImageFile - " + result);
|
|
result = "failed";
|
|
if (testIsInteresting()) result = "ok";
|
|
print ("testIsInteresting - " + result);
|
|
result = "failed";
|
|
if (testFilterFiles()) result = "ok";
|
|
print ("testFilterFiles - " + result);
|
|
result = "failed";
|
|
if (testIsTifFile()) result = "ok";
|
|
print ("testIsTifFile - " + result);
|
|
print("END OF TESTRUN");
|
|
}
|
|
|
|
function testGetMinorNumber() {
|
|
result = true;
|
|
minorNumber = getMinorNumber("20130816_100x_Movie_Calibration_RI510_128_PST_002_3.dv");
|
|
result = result && (minorNumber== "3");
|
|
return result;
|
|
}
|
|
|
|
function testGetMajorNumber() {
|
|
result = true;
|
|
majorNumber = getMajorNumber("20130816_100x_Movie_Calibration_RI510_128_PST_002_3.dv");
|
|
result = result && (majorNumber == "002");
|
|
return result;
|
|
}
|
|
|
|
function testOtherStackFor() {
|
|
result = true;
|
|
other = otherStackFor("20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2.dv");
|
|
result = result && (other == "20130816_100x_Movie_Calibration_RI510_128_PST_002_pt_2.dv");
|
|
return result;
|
|
}
|
|
|
|
function testAfterMajorNumber() {
|
|
result = true;
|
|
after = afterMajorNumber("20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2.dv");
|
|
result = result && (after=="_pt_2.dv");
|
|
return result;
|
|
}
|
|
|
|
function testBeforeMajorNumber() {
|
|
result = true;
|
|
before = beforeMajorNumber("20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2.dv");
|
|
result = result && (before=="20130816_100x_Movie_Calibration_RI510_128_PST_");
|
|
return result;
|
|
}
|
|
|
|
function testIsImageFile() {
|
|
result = true;
|
|
result = result && (!isImageFile("20130816_100x_Movie_Calibration_RI510_128_PST_001.log"));
|
|
result = result && (isImageFile("20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2.dv"));
|
|
return result;
|
|
}
|
|
|
|
function testIsInteresting() {
|
|
result = true;
|
|
result = result && (isInteresting("20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2.dv"));
|
|
result = result && (!isInteresting("20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2_PRJ.dv"));
|
|
return result;
|
|
}
|
|
|
|
function testIsTifFile() {
|
|
result = true;
|
|
result = result && (isTifFile("20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2.tif"));
|
|
result = result && (!isTifFile("20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2.tif.zip"));
|
|
return result;
|
|
}
|
|
|
|
function testFilterFiles() {
|
|
files = newArray("20130816_100x_Movie_Calibration_RI510_128_PST_001.log",
|
|
"20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2.dv",
|
|
"20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2_PRJ.dv",
|
|
"20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2_task.sh.joblog",
|
|
"20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_3.dv",
|
|
"20130816_100x_Movie_Calibration_RI510_128_PST_002_pt_2.dv");
|
|
filtered = filterFiles(files);
|
|
result = true;
|
|
result = result && (filtered.length == 2);
|
|
result = result && (filtered[0] == "20130816_100x_Movie_Calibration_RI510_128_PST_001_pt_2.dv");
|
|
return result;
|
|
}
|
|
|