// F-LSFtxtTranslate.js script function by Christophe Leterrier // Translate single-channel txt localization files from Sandrine to .xls ThunderSTORM localization files importClass(Packages.java.io.File); importClass(Packages.java.io.FileReader); importClass(Packages.java.io.FileWriter); importClass(Packages.java.io.BufferedReader); importClass(Packages.java.io.BufferedWriter); importClass(Packages.ij.IJ); importClass(Packages.java.lang.Double); function RiesCSVTranslate(inPath, outDir, outFormat, pxSize) { // is there a header? var inHeader = true; var FWHM = 2.355; var crlbF = 0.4; // to go from crlb to uncertainty in sigma var Bgstd = 25 // background standard deviation in photons (fixed because not in Ries csv file) var Sigma = 160 // sigma for x and y psd width (not in Ries csv file) // Header format (if exists) if (inHeader == true) var inHeaderNS = ["frame", "x_pix", "y_pix", "z_nm", "photons", "background", "crlb_x", "crlb_y", "crlb_z", "crlb_photons", "crlb_background", "logLikelyhood"]; var inSep = ","; // Assign the indexes for all columns in the input format iF = 0; iXp = 1; // X coordinate in pixels iYp = 2; // Y coodrinate in pixels iZ = 3; // z coordinate in nanometrers iP = 4; // photon number iB = 5; // backgound (in photons) = offset on TS iUXp = 6; // crlb X uncertainty in pixels iUYp = 7; // crlb Y uncertainty in pixels iUZ = 8; // crlb Z uncertainty in nanometers // Define input file path var inFile = new File(inPath); var inName = inFile.getName(); var inNameExt = getExt("" + inName); IJ.log(" inName: " + inName); // Open input File reader var br = new BufferedReader(new FileReader(inFile)); // Pass header line if (inHeader == true) inLine = br.readLine(); // ThunderSTORM 3D format if (outFormat == "csv") { var sep = ","; var outHeader = ["\"frame\"","\"x [nm]\"","\"y [nm]\"","\"z [nm]\"","\"sigma1 [nm]\"","\"sigma2 [nm]\"","\"intensity [photon]\"","\"offset [photon]\"","\"bkgstd [photon]\"","\"uncertainty_xy [nm]\"", "\"uncertainty_z [nm]\""]; var outSuffix = "_TS3D"; var includeHeader = true; var outExt = ".csv"; } // Prepare output file path var outName = inName.substring(0, inName.length()-4) + outSuffix + outExt; var outPath = outDir + outName; var outFile = new File(outPath); if (!outFile.exists()) { outFile.createNewFile(); } IJ.log(" outName: " + outName); // Open output File writer var bw = new BufferedWriter(new FileWriter(outFile)); // Write new Header if (includeHeader == true) { var outLine = makeLineFromArray(outHeader, sep); bw.write(outLine); bw.newLine(); } // Write the output file line by line var m = 0; while ((inLine = br.readLine()) != null) { m++; var inCells = inLine.split(inSep); Frame = parseInt(inCells[iF]); // convert X and Y coordinates in nanometers Xn = parseFloat(inCells[iXp]) * pxSize; Yn = parseFloat(inCells[iYp]) * pxSize; Zn = parseFloat(inCells[iZ]); // convert uncertainites in nanometers, and adjust them with the factor given by Jonas (0.4) UXn = parseFloat(inCells[iUXp]) * pxSize * crlbF; UYn = parseFloat(inCells[iUYp]) * pxSize * crlbF; UXYn = Math.max(UXn, UYn); UZn = parseFloat(inCells[iUZ]) * crlbF; Iphot = parseFloat(inCells[iP]); Offset = parseFloat(inCells[iB]); // ThunderSTORM xls format if (outFormat == "csv") { // Build results line // 3D case // peak width: TS has Wx and Wy (astigmatism-deformed PSF), but N-STORM has only one width W and an axial ratio Ax // so we calculate Wx and Wy from W and Ax outLine = "" + Frame + sep + Xn + sep + Yn + sep + Zn + sep + Sigma + sep + Sigma + sep + Iphot + sep + Offset + sep + Bgstd + sep + UXYn + sep + UZn; } if (Xn != "�") { bw.write(outLine); bw.newLine(); } } br.close(); bw.close(); } function makeLineFromArray(ar, se) { ol = "" + ar[0]; for (t = 1; t < ar.length; t++) { ol = ol + se + ar[t]; } return ol; } function getExt(filestring){ var namearray = filestring.split("."); var shortname = ""; for (var f = 0; f < namearray.length - 1; f++) { shortname = shortname + namearray[f]; } return [shortname, namearray[namearray.length - 1]]; }