////////////////////////////////////////////////////////////////////////////////////////// // Plugin "ReadPlate 3.0" // // This macro measures absorbance values from an image of a multi-well plate // // ReadPlate 3.0 version incorporates the capability of reading multi-well plates of 6 (3x2), // 12 (4x3), 24 (6x4), 48 (8x6) and 96 (12x8) wells. An new user-friendly interface facilitates // image analysis. This version allows new user-defined features to optimize blank correction. // Multiple readings of the same plate has also considerably been facilitated, appending // the full parameter file to the results and log file, 08-15-2020; // ReadPlate 2.1 version incorporates an improved blank correction algorithm, 02-16-2018; // ReadPlate 2.0 version incorporates blank correction, 04-15-2016; // Original ReadPlate 1.0 version, 12-16-2015; // // ReadPlate 3.0 was tested with ImageJ 1.53c, Wayne Rasband, NIH (26 June 2020), and // Java 1.8.0_101 (64-bit) in a MacBook Pro (Retina, 13-inch, Early 2013), // running OS X El Capitan, version 10.11.6 // // Jose Maria Delfino, PhD // Department of Biological Chemistry and Institute of Biochemistry and Biophysics (IQUIFIB) // School of Pharmacy & Biochemistry // University of Buenos Aires and CONICET // Junin 956, C1113AAD Buenos Aires, Argentina // E-mail: delfino@qb.ffyb.uba.ar // Phone: 54 11 4962 5506, extension 116 // ////////////////////////////////////////////////////////////////////////////////////////// // // INSTALLATION: // ImageJ is a high-quality public domain software very useful for image processing. // Download the software from the imagej.nih.gov site (contact person Wayne S Rasband) // You should have ImageJ installed in your machine in the first place. // This plugin is a script written in ImageJ macro language (.ijm file). // After opening ImageJ, install this plugin by doing Plugins > Install and choosing // ReadPlate from the appropriate directory. // The plugin ReadPlate should now appear listed under the Plugins menu, and is ready to // be launched by clicking Plugins > ReadPlate. // ////////////////////////////////////////////////////////////////////////////////////////// // // Example image: http://imagej.nih.gov/ij/macros/images/plate.jpg // ////////////////////////////////////////////////////////////////////////////////////////// // // Relevant literature reference: // // Carla R. Angelani, Pablo Carabias, Karen M. Cruz, Jose M. Delfino, Marilina de Sautu, // Maria V. Espelt, Mariela S. Ferreira-Gomes, Gabriela E. Gomez, Irene C. Mangialavori, // Malena Manzi, Maria F. Pignataro, Nicolas A. Saffioti, Damiana M. Salvatierra Frechou, // Javier Santos, Pablo J. Schwarzbaum // "A Metabolic Control Analysis Approach to Introduce the Study of Systems in Biochemistry: // the Glycolytic Pathway in the Red Blood Cell" // Biochemistry and Molecular Biology Education, Volume 46, Issue5, September/October 2018, // Pages 502-515 https://doi.org/10.1002/bmb.21139 // ////////////////////////////////////////////////////////////////////////////////////////// //Clearing table with results and removing overlay run("Clear Results"); run("Remove Overlay"); ////////////////////////////////////////////////////////////////////////////////////////// message = "STEP-BY-STEP INSTRUCTIONS FOR USE: \n" +"Before starting, please set the following parameters for measurements: \n" +" (Analyze > Set Measurements). The following should be selected: \n" +" Area / Standard Deviation / Min & Max Gray Value/ Mean Gray Value/ Modal Gray Value/ \n" +" Add to Overlay (very important!) / Redirect to None / Decimal Places (0-9): 3 \n" +" \n" +"1.- Take a color photograph of the plate centered at the middle point (for details see the plugin \n" +" presentation at https://imagej.nih.gov/ij/plugins/readplate/index.html \n" +" and supplementary material of the relevant literature reference cited therein). \n" +" Make sure plate borders are aligned parallel to the edges of the photograph. \n" +" Export image as a .jpg file. \n" +"2.- Open the .jpg image from within the ImageJ software installed in your computer. \n" +"3.- Run the plugin ReadPlate (by launching Plugins > ReadPlate). \n" +" Select the correct plate format: 6(3x2), 12(4x3), 24(6x4), 48(8x6) or 96(12x8) wells. \n" +" Make a center-to-center rectangular selection of wells (upper-left and lower-right corners).\n" +" Select the desired color channel (Red, Green, Blue or Gray) for measurements. \n" +" Choose the appropriate parameters for the grid of circles to be measured. \n" +" Each circle needs not be too large, because enough color information is coded in pixels \n" +" covering a relatively small area. The final grid should show main circles centered on each \n" +" well surrounded by ancillary circles located outside. The latter are used by the blank \n" +" correction algorithm to compensate for any difference in local light intensity. \n" +" Check the fit of the final grid onto the plate image. If it looks right, then proceed to collect \n" +" measurements. A table of results will appear next. This includes number, alphanumeric \n" +" label and area of each well, light intensity measurements (Mean, StdDev, Mode, Min, Max), \n" +" and absorbance values. Corrected absorbance values (Acorr) result from applying the blank \n" +" suppression algorithm. \n" +" By default, results are formatted as .csv files, readily interpretable by Excel. \n" +" \n" +" ReadPlate 3.0 (August 2020) \n" +" Jose Maria Delfino, PhD \n" +" Department of Biological Chemistry and Institute of Biochemistry and Biophysics (IQUIFIB), \n" +" School of Pharmacy and Biochemistry, University of Buenos Aires and CONICET, \n" +" Junin 956, C1113AAD Buenos Aires, Argentina. \n" +" delfino@qb.ffyb.uba.ar \n" +" Please see the plugin presentation and header for the full relevant literature reference \n" +" Your feedback will be greatly appreciated! \n" showMessage ("ReadPlate", message); ////////////////////////////////////////////////////////////////////////////////////////// //Opening a color photograph of the multi-well plate requires("1.43h"); // required for the Array functions used below if (bitDepth!=24) exit("This macro requires an RGB image"); ////////////////////////////////////////////////////////////////////////////////////////// //Choice of plate format plateformat=newArray("96", "48", "24", "12", "6"); Dialog.create("Plate format"); Dialog.addChoice("Number of wells:", plateformat, "96"); Dialog.show(); plateformat = Dialog.getChoice(); if (plateformat== "6") { ncol=3; nrow=2; } else if (plateformat== "12") { ncol=4; nrow=3; } else if (plateformat== "24") { ncol=6; nrow=4; } else if (plateformat== "48") { ncol=8; nrow=6; } else {ncol=12; nrow=8; } ////////////////////////////////////////////////////////////////////////////////////////// //Waiting to make a rectangular selection on the plate title = "Rectangular selection"; msg = "Make a center-to-center rectangular selection on the plate \n" +"(wells in the upper-left and lower-right corners) \n" +"Once you are done, press OK \n"; waitForUser(title, msg); ////////////////////////////////////////////////////////////////////////////////////////// //After making a rectangular selection on the plate getSelectionCoordinates(x, y); for (i=0; i ncol) exit ("The number of columns is too high"); nr=Dialog.getNumber(); if (nr!=round(nr)) exit ("The number of rows should be an integer value"); if (nr < 1) exit ("The number of rows should be at least one"); if (nr > nrow) exit ("The number of rows is too high"); xo=Dialog.getNumber(); if (xo!=round(xo)) exit ("The X origin should be an integer value"); if (xo < 0) exit ("The X origin should be positive"); yo=Dialog.getNumber(); if (yo!=round(yo)) exit ("The Y origin should be an integer value"); if (yo < 0) exit ("The Y origin should be positive"); xf=Dialog.getNumber(); if (xf!=round(xf)) exit ("The X end should be an integer value"); if (xf < xo) exit ("The X end should be higher than the X origin"); yf=Dialog.getNumber(); if (yf!=round(yf)) exit ("The Y end should be an integer value"); if (yf < yo) exit ("The Y end should be higher than the Y origin"); mcsize=Dialog.getNumber(); if (mcsize!=round(mcsize)) exit ("The circle diameter should be an integer value"); if (mcsize < 1) exit ("The circle diameter should be at least one pixel"); f=Dialog.getNumber(); if (f > 1 || f < 0.7) exit ("The proximity factor should lie within the range 0.7-1"); g=Dialog.getNumber(); if (g > 1 || g < 0.5) exit ("The size factor should lie within the range 0.5-1"); nanc = Dialog.getChoice(); num=parseInt(nanc); /////////////////////////////////////////////////////////////////////////////////////// //Calculating the x and y distance between adjoining wells csepx=(xf - xo)/(ncol -1); csepy=(yf - yo)/(nrow -1); /////////////////////////////////////////////////////////////////////////////////////// //Building the grid x=xo-mcsize/2; y=yo-mcsize/2; //f scales the distance between the main central circle and the ancillary circles a=0.5*f; //g scales the size (diameter) of the ancillary circles relative to that of the main central circle acsize=mcsize*g; for (i=0; i