// Generate_LUTs macro by Christophe Leterrier // // Take an input file (txt or csv) and generate an ImageJ LUT file // option to switch from normalized (0-1) RGB values to 0-255 // option to generate a macro that calls the LUT // 30/11/2021 macro "Generate_LUTs" { //*************** Initialization *************** // Define choice variables and default values MACRO_NAME = "Generate LUTs"; INPUT_FORMAT_ARRAY = newArray("tab-delimited txt", "csv", "lut"); INPUT_FORMAT_DEF = "csv"; HEADER_DEF = false; COL_DEF = false; NORM_DEF = true; MACRO_DEF = true; // Get the folder name INPUT_DIR=getDirectory("Select the input directory"); print("\n\n\n*** " + MACRO_NAME + " Log ***"); print(""); print("INPUT_DIR :"+INPUT_DIR); //*************** Dialog *************** // Creation of the dialog box Dialog.create(MACRO_NAME + " Options"); Dialog.addChoice("Input file format", INPUT_FORMAT_ARRAY, INPUT_FORMAT_DEF); Dialog.addCheckbox("Skip header", HEADER_DEF); Dialog.addCheckbox("Skip first column", COL_DEF); Dialog.addCheckbox("Normalize from 0-1 to 0-255", NORM_DEF); Dialog.addCheckbox("Create LUTs macros", MACRO_DEF); Dialog.show(); // Feeding variables from dialog choices INPUT_FORMAT = Dialog.getChoice(); HEADER = Dialog.getCheckbox(); COL = Dialog.getCheckbox(); NORM = Dialog.getCheckbox(); MACRO = Dialog.getCheckbox(); // Generate variables depending on chosen options if (HEADER == true) LINE_START = 1; else LINE_START = 0; if (COL == true) COL_START = 1; else COL_START = 0; if (NORM == true) NORM_FACTOR = 255; else NORM_FACTOR = 1; if (INPUT_FORMAT == "tab-delimited txt") { EXT = ".txt"; SEP = "\t"; } else if (INPUT_FORMAT == "csv") { EXT = ".csv"; SEP = ","; } else { EXT = ".lut"; SEP = "\t"; } //*************** Prepare processing *************** setBatchMode(true); // Get all file names ALL_NAMES = getFileList(INPUT_DIR); Array.sort(ALL_NAMES); N_LENGTH = ALL_NAMES.length; ALL_SHORTNAMES = newArray(N_LENGTH); ALL_EXT = newArray(N_LENGTH); // Create extensions array for (i = 0; i < N_LENGTH; i++) { // print(ALL_NAMES[i]); ALL_NAMES_PARTS = getFileExtension(ALL_NAMES[i]); ALL_SHORTNAMES[i] = ALL_NAMES_PARTS[0]; ALL_EXT[i] = ALL_NAMES_PARTS[1]; } // Create the LUT output folder if (INPUT_FORMAT != "lut") { LUTFOLDER_NAME = "LUTs"; LUTOUTPUT_DIR = File.getParent(INPUT_DIR); LUTOUTPUT_NAME = File.getName(INPUT_DIR); LUTOUTPUT_SHORTA = split(LUTOUTPUT_NAME, " "); LUTOUTPUT_SHORT = LUTOUTPUT_SHORTA[0]; LUTOUTPUT_DIR = LUTOUTPUT_DIR + File.separator + LUTOUTPUT_SHORT + " " + LUTFOLDER_NAME + File.separator; if (File.isDirectory(LUTOUTPUT_DIR) == false) { File.makeDirectory(LUTOUTPUT_DIR); } // print("LUTOUTPUT_DIR: " + LUTOUTPUT_DIR); } // Create the Macro output folder if (MACRO == true || INPUT_FORMAT == "lut") { MACROFOLDER_NAME = "Macros"; MACROOUTPUT_DIR = File.getParent(INPUT_DIR); MACROOUTPUT_NAME = File.getName(INPUT_DIR); MACROOUTPUT_SHORTA = split(MACROOUTPUT_NAME, " "); MACROOUTPUT_SHORT = MACROOUTPUT_SHORTA[0]; MACROOUTPUT_DIR = MACROOUTPUT_DIR + File.separator + MACROOUTPUT_SHORT + " " + MACROFOLDER_NAME + File.separator; if (File.isDirectory(MACROOUTPUT_DIR) == false) { File.makeDirectory(MACROOUTPUT_DIR); } // print("MACROOUTPUT_DIR: " + MACROOUTPUT_DIR); } //*************** Processing Loop *************** // Loop on all .csv or txt extensions that have C1_STRING in the name for (n = 0; n < N_LENGTH; n++) { print(ALL_EXT[n]); if (ALL_EXT[n] == EXT) { // Get the file path FILE_PATH = INPUT_DIR + ALL_NAMES[n]; // Store components of the file name FILE_NAME = File.getName(FILE_PATH); FILE_DIR = File.getParent(FILE_PATH); FILE_SEP = getFileExtension(FILE_NAME); FILE_SHORTNAME = FILE_SEP[0]; FILE_EXT = FILE_SEP[1]; //*************** Specific processing *************** if (INPUT_FORMAT != "lut") { INPUT_STRING = File.openAsString(FILE_PATH); INPUT_LINES = split(INPUT_STRING, "\n"); OUTPUT_STRING = ""; for (l = LINE_START; l LINE_START) OUTPUT_STRING += "\n"; LINE_ELEMENTS = split(INPUT_LINES[l], SEP); for (c = COL_START; c < LINE_ELEMENTS.length; c++) { if (c > COL_START) OUTPUT_STRING += "\t"; OUTPUT_STRING += d2s(LINE_ELEMENTS[c] * NORM_FACTOR, 0); } } // Create output LUT file path and save LUTOUTPUT_PATH = LUTOUTPUT_DIR + FILE_SHORTNAME + ".lut"; File.saveString(OUTPUT_STRING, LUTOUTPUT_PATH); print("LUTOUTPUT_PATH: " + LUTOUTPUT_PATH); } if (MACRO == true || INPUT_FORMAT == "lut") { // Create output macro MACRO_STRING = "run(\""+ FILE_SHORTNAME + "\");"; // Create output macro file path and save MACROOUTPUT_NAME = FILE_SHORTNAME + "_.ijm"; MACROOUTPUT_PATH = MACROOUTPUT_DIR + MACROOUTPUT_NAME; File.saveString(MACRO_STRING, MACROOUTPUT_PATH); print("MACROOUTPUT_PATH: " + MACROOUTPUT_PATH); } }// end of IF loop on file extension }// end of FOR loop on all files setBatchMode("exit and display"); print(""); print("*** " + MACRO_NAME + " end ***"); showStatus(MACRO_NAME + " finished"); } //*************** Functions *************** function getFileExtension(Name) { nameparts = split(Name, "."); shortname = nameparts[0]; if (nameparts.length > 2) { for (k = 1; k < nameparts.length - 1; k++) { shortname += "." + nameparts[k]; } } extname = "." + nameparts[nameparts.length - 1]; namearray = newArray(shortname, extname); return namearray; }