=2) {
imageCalculator("Min create", "FinalResult","Merged" + toString(i));
rename("FinalResulttemp");
selectWindow("FinalResult");
close();
selectWindow("FinalResulttemp");
rename("FinalResult");
selectWindow("Merged" + toString(i));
close();
}
}
setColor(0,0,0);
setFont("Monospaced", 20,"bold");
drawString("XY", 115, 240);
drawString("XZ", 115+StackImageWidth, 240);
drawString("YZ", 115+2*StackImageWidth, 240);
saveAs("Tiff", ReadDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_1umBead_result.tif");
if (UpdateWWWSite == true)
saveAs("jpeg", WWWDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_1umBead_result.jpg");
close();
// merge original images as RGB and save as TIFF/JPEG images
if (BeadChannelNo == 2)
run("Merge Channels...", "red=*None* green=ChannelOriResult1 blue=ChannelOriResult0 gray=*None*");
else if (BeadChannelNo > 2)
run("Merge Channels...", "red=ChannelOriResult2 green=ChannelOriResult1 blue=ChannelOriResult0 gray=*None*");
setColor(255,255,255);
setFont("Monospaced", 20,"bold");
drawString("XY", 115,240 );
drawString("XZ", 115+StackImageWidth, 240);
drawString("YZ", 115+2*StackImageWidth, 240);
saveAs("Tiff", ReadDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText +"_1umBead_ori.tif");
// Website bead string update
if (UpdateWWWSite == true){
saveAs("jpeg", WWWDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_1umBead_ori.jpg");
WWWBeadString = " | \n";
WWWBeadString = WWWBeadString + " | \n";
}
while (nImages >= 1)
close();
// Calculate distances between individual centroids in XY and Z
print("\n");
if (BeadChannelNo == 2) {
tempCalc = sqrt(pow(BeadArray[0]-BeadArray[4],2)+pow(BeadArray[1]-BeadArray[5],2));
print("XY distance ", BeadArray[3]," - ", BeadArray[7], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = ""+BeadArray[3]+"-"+BeadArray[7]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = BeadArray[2]-BeadArray[6];
print("Z distance ", BeadArray[3]," - ", BeadArray[7], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um | ";
}
if (BeadChannelNo == 3) {
tempCalc = sqrt(pow(BeadArray[0]-BeadArray[4],2)+pow(BeadArray[1]-BeadArray[5],2));
print("XY distance ", BeadArray[3]," - ", BeadArray[7], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = ""+BeadArray[3]+"-"+BeadArray[7]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = abs(BeadArray[2]-BeadArray[6]);
print("Z distance ", BeadArray[3]," - ", BeadArray[7], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um ";
print("\n");
tempCalc = sqrt(pow(BeadArray[0]-BeadArray[8],2)+pow(BeadArray[1]-BeadArray[9],2));
print("XY distance ", BeadArray[3]," - ", BeadArray[11], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString +""+BeadArray[3]+"-"+BeadArray[11]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = abs(BeadArray[2]-BeadArray[10]);
print("Z distance ", BeadArray[3]," - ", BeadArray[11], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um ";
print("\n");
tempCalc = sqrt(pow(BeadArray[4]-BeadArray[8],2)+pow(BeadArray[5]-BeadArray[9],2));
print("XY distance ", BeadArray[7]," - ", BeadArray[11], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString +""+BeadArray[7]+"-"+BeadArray[11]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = abs(BeadArray[6]-BeadArray[10]);
print("Z distance ", BeadArray[7]," - ", BeadArray[11], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um | ";
}
if (BeadChannelNo == 4) {
tempCalc = sqrt(pow(BeadArray[0]-BeadArray[4],2)+pow(BeadArray[1]-BeadArray[5],2));
print("XY distance ", BeadArray[3]," - ", BeadArray[7], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = ""+BeadArray[3]+"-"+BeadArray[7]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = abs(BeadArray[2]-BeadArray[6]);
print("Z distance ", BeadArray[3]," - ", BeadArray[7], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um ";
print("\n");
tempCalc = sqrt(pow(BeadArray[0]-BeadArray[8],2)+pow(BeadArray[1]-BeadArray[9],2));
print("XY distance ", BeadArray[3]," - ", BeadArray[11], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString+""+BeadArray[3]+"-"+BeadArray[11]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = abs(BeadArray[2]-BeadArray[10]);
print("Z distance ", BeadArray[3]," - ", BeadArray[11], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um ";
print("\n");
tempCalc = sqrt(pow(BeadArray[0]-BeadArray[12],2)+pow(BeadArray[1]-BeadArray[13],2));
print("XY distance ", BeadArray[3]," - ", BeadArray[15], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString+""+BeadArray[3]+"-"+BeadArray[15]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = abs(BeadArray[2]-BeadArray[14]);
print("Z distance ", BeadArray[3]," - ", BeadArray[15], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um ";
print("\n");
tempCalc = sqrt(pow(BeadArray[4]-BeadArray[8],2)+pow(BeadArray[5]-BeadArray[9],2));
print("XY distance ", BeadArray[7]," - ", BeadArray[11], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString+""+BeadArray[7]+"-"+BeadArray[11]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = abs(BeadArray[6]-BeadArray[10]);
print("Z distance ", BeadArray[7]," - ", BeadArray[11], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um ";
print("\n");
tempCalc = sqrt(pow(BeadArray[4]-BeadArray[12],2)+pow(BeadArray[5]-BeadArray[13],2));
print("XY distance ", BeadArray[7]," - ", BeadArray[15], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString+""+BeadArray[7]+"-"+BeadArray[15]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = abs(BeadArray[6]-BeadArray[14]);
print("Z distance ", BeadArray[7]," - ", BeadArray[15], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um ";
print("\n");
tempCalc = sqrt(pow(BeadArray[8]-BeadArray[12],2)+pow(BeadArray[9]-BeadArray[13],2));
print("XY distance ", BeadArray[11]," - ", BeadArray[15], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString+""+BeadArray[11]+"-"+BeadArray[15]+"nm XY: "+d2s(tempCalc,3)+"um";
tempCalc = abs(BeadArray[10]-BeadArray[14]);
print("Z distance ", BeadArray[11]," - ", BeadArray[15], "nm [um]","\t",d2s(tempCalc,3));
WWWDistanceString = WWWDistanceString + " Z: "+d2s(tempCalc,3)+"um | ";
}
if (UpdateWWWSite == true)
WWWBeadString = WWWBeadString + WWWDistanceString;
bead_analysis = 1;
setBatchMode(false);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// End of 1um bead colocalisation analysis
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Start Field illumination analysis
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
field405passed = false;
field488passed = false;
field543passed = false;
field561passed = false;
field633passed = false;
WWWFieldString = "";
// First checking that 'field' images are present in the selected file format:
for (fd=0; fd -1) {
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblVoxelX 0",wtmp);
FieldVoxelXY = parseFloat(wtmp)*1000000;
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblZoom 0",wtmp);
FieldZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblPinholeAiry 0",wtmp);
FieldPinhole = parseFloat(wtmp);
setBatchMode(true);
run("Bio-Formats Importer", "open=" + path +" view=[Standard ImageJ] stack_order=Default split_channels series_"+toString(seriesFound));
}
}
// Checking in Leica SP1/SP2 LEI file format
else if (ReadFormat == "lei") {
if (indexOf(LeicaText, "Series Name:\tfield" + laserlines[fd]) != -1) {
FieldText = substring (LeicaText, indexOf(LeicaText, "Series Name:\tfield"+laserlines[fd]));
FieldVoxelWidth = substring (FieldText, indexOf(FieldText, "Voxel-Width"), indexOf(FieldText,"Voxel-Height"));
FieldVoxelWidth = substring (FieldVoxelWidth, indexOf(FieldVoxelWidth, "]")+2);
FieldVoxelXY = parseFloat(FieldVoxelWidth);
FieldZoom = substring (FieldText, indexOf(FieldText, "Zoom"), indexOf(FieldText,"Scan-Direction"));
FieldZoom = substring (FieldZoom, indexOf(FieldZoom, "Zoom")+4);
FieldZoom = parseFloat(FieldZoom);
FieldPinhole = substring (FieldText, indexOf(FieldText, "Pinhole [airy]"), indexOf(FieldText,"Size-Width"));
FieldPinhole = substring (FieldPinhole, indexOf(FieldPinhole, "]")+2);
FieldPinhole = parseFloat(FieldPinhole);
setBatchMode(true);
ReadFileName="field"+laserlines[fd];
ReadChannel = "ch00";
OpenSeries();
}
}
// Checking for field images in Deltavision file format
else if (ReadFormat == "dv") {
}
// Checking for field images in Zeiss 510 LSM file format
else if (ReadFormat == "lsm") {
if (File.exists(ReadDir + "\\"+"field"+laserlines[fd]+".lsm") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"field"+laserlines[fd]+".lsm");
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"field"+laserlines[fd]+".lsm");
getPixelSize(unit, FieldVoxelXY, pixelheight);
Ext.getSeriesMetadataValue("Recording #1 Zoom X",wtmp);
FieldZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("DetectionChannel #1 Pinhole Diameter",wtmp);
FieldPinhole = parseFloat(wtmp);
}
}
// Checking for field images in Zeiss LSM780 file format
else if (ReadFormat == "czi") {
if (File.exists(ReadDir + "\\"+"field"+laserlines[fd]+".czi") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"field"+laserlines[fd]+".czi")
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"field"+laserlines[fd]+".czi")
rename("Channel");
getPixelSize(unit, FieldVoxelXY, pixelheight);
Ext.getMetadataValue("Experiment|AcquisitionBlock|AcquisitionModeSetup|ZoomX|0",wtmp);
FieldZoom = parseFloat(wtmp);
Ext.getMetadataValue("Information|Image|Channel|PinholeSize|0",wtmp);
FieldPinhole = parseFloat(wtmp);
}
}
// Checking for field images in Nikon ND2 file format
else if (ReadFormat == "nd2"){
if (File.exists(ReadDir + "\\"+"field"+laserlines[fd] + ".nd2") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"field"+laserlines[fd]+".nd2")
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"field"+laserlines[fd]+".nd2");
run("8-bit");
rename("Channel");
getPixelSize(unit, FieldVoxelXY, pixelheight);
Ext.getMetadataValue("ImagingZoom",wtmp);
FieldZoom = parseFloat(wtmp);
Ext.getMetadataValue("PinholeSize",wtmp);
FieldPinhole = parseFloat(wtmp);
}
}
// Checking for field TIF images and manually enter the required parameters once, assuming all images recorded with same settings !
else if (ReadFormat == "tif"){
if (File.exists(ReadDir + "\\"+"field"+laserlines[fd]+".tif") == 1) {
if (fd == 0) {
FieldVoxelXY = getNumber("Field illumination: Enter XY pixelsize [um]", 0.2);
FieldZoom = getNumber("Field illumination: Enter Zoom factor.", 1);
FieldPinhole = getNumber("Field illumination: Enter pinhole diameter [airy units]", 1);
}
open(ReadDir + "\\"+"field"+laserlines[fd]+".tif");
}
}
// if field images present continue with processing
if (nImages > 0) {
setBatchMode(true);
print("\nMeasurement field illumination "+laserlines[fd]+"nm");
print("------------------------------------------------------ \n");
print("XY dimension [um]:" ,"\t" ,d2s(FieldVoxelXY,8));
print("Zoom Factor :" , "\t" , d2s(FieldZoom,3));
if (ReadFormat == "czi" || ReadFormat == "lsm" || ReadFormat == "nd2")
print("Pinhole diameter [um]:", "\t", d2s(FieldPinhole,3));
else
print("Pinhole diameter [airy]:", "\t", d2s(FieldPinhole,3));
print("\n");
//Smoothen image
run("Mean...", "sigma=5");
// get X Intensity profile averaged over 10 lines to reduce noise further
xWidth = getWidth();
XProfile = newArray(xWidth);
yStart = (getHeight()/2)-5;
for (x = 0; x < xWidth; x++) {
tempXY = 0;
for (y = yStart; y < (yStart + 10); y++) {
tempXY = tempXY + getPixel(x, y);
}
tempXY = tempXY / 10;
XProfile[x] = round(tempXY);
}
// get Y Intensity profile averaged over 10 lines to reduce noise furthere
yWidth = getHeight();
YProfile = newArray(yWidth);
xStart = (yWidth/2)-5;
for (y = 0; y < yWidth; y++) {
tempXY = 0;
for (x = xStart; x < (xStart + 10); x++) {
tempXY = tempXY + getPixel(x, y);
}
tempXY = tempXY / 10;
YProfile[y] = round(tempXY);
}
// Contrast stretching of original image
getStatistics(area, mean, min, max, std, histogram);
MaxIntensity=max;
MinIntensity=min;
setMinAndMax(MinIntensity, MaxIntensity);
run("Apply LUT");
// Plot black lines indicating position of line profiles
setColor(0);
setLineWidth(3);
drawLine(0, yStart+5, xWidth, yStart+5);
drawLine(xStart+5, 0, xStart+5, yWidth);
run("Select All");
run("Copy");
close();
newImage("Field_result", "8-bit black", xWidth+512,yWidth,1);
makeRectangle(0,0, xWidth,yWidth);
run("Paste");
// Get min and max intensities from X and Y intensity profiles
XStats = newArray(3);
XStats = GetLineStats(XProfile);
minX = XStats[0];
maxX = XStats[1];
print("Minimum Intensity X Profile :" , "\t" , toString(minX));
print("Maximum Intensity X Profile :" , "\t" , toString(maxX));
dIntX = 100*(1-(minX/maxX));
print("dIntensity X [%]:"+ "\t", d2s(dIntX,1));
YStats = newArray(3);
YStats = GetLineStats(YProfile);
minY = YStats[0];
maxY = YStats[1];
print("Minimum Intensity Y Profile :" , "\t" , toString(minY));
print("Maximum Intensity Y Profile :" , "\t" , toString(maxY));
dIntY = 100*(1-(minY/maxY));
print("dIntensity Y [%]:"+ "\t", d2s(dIntY,1));
if (minY <= minX)
minX = minY;
if (maxY >= maxX)
maxX = maxY;
// Create plots
run("Profile Plot Options...", "width=" + xWidth-78 +" height=201 minimum=0 maximum=0 interpolate draw");
Plot.create("Profiles", "Pixel", "Intensity");
Plot.setLimits(0, xWidth, minX, maxX);
Plot.setLineWidth(2);
Plot.setColor("lightGray");
Plot.add("line", XProfile);
Plot.setColor("Black");
Plot.add("line", YProfile);
Plot.show();
run("8-bit");
run("Select All");
run("Copy");
close();
selectWindow("Field_result");
makeRectangle(xWidth,0, xWidth,256);
run("Paste");
run("Select None");
Plot.create("Profiles", "Pixel", "Intensity");
Plot.setLimits(0, xWidth, 0, 255);
Plot.setLineWidth(2);
Plot.setColor("lightGray");
Plot.add("line", XProfile);
Plot.setColor("Black");
Plot.add("line", YProfile);
Plot.show();
run("8-bit");
run("Select All");
run("Copy");
close();
selectWindow("Field_result");
makeRectangle(xWidth,256, xWidth,256);
run("Paste");
run("Select None");
setColor(140);
setFont("SansSerif", 14, "bold");
drawString("X profile dInt=" + d2s(dIntX,1)+ " %" , 580, 40);
setColor(0);
drawString("Y profile dInt=" + d2s(dIntY,1)+ " %", 580, 55);
drawString(laserlines[fd]+"nm", 10,20);
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText + "_field_"+laserlines[fd]+"nm_result.tif");
// Website field string update
if (UpdateWWWSite == true){
saveAs("jpeg", WWWDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_field_"+laserlines[fd]+"nm_result.jpg");
if (laserlines[fd] == "405")
field405passed = true;
if (laserlines[fd] == "488")
field488passed = true;
if (laserlines[fd] == "543")
field543passed = true;
if (laserlines[fd] == "561")
field561passed = true;
if (laserlines[fd] == "633")
field633passed = true;
}
while (nImages >= 1)
close();
field_analysis = 1;
}
setBatchMode(false);
}
if (UpdateWWWSite == true){
if (field405passed == true)
WWWFieldString = WWWFieldString+ " | \n";
else
WWWFieldString = WWWFieldString+ " | \n";
if (field488passed == true)
WWWFieldString = WWWFieldString+ " | \n";
else
WWWFieldString = WWWFieldString+ " | \n";
if (field543passed == true && field561passed == false)
WWWFieldString = WWWFieldString+ " | \n";
if (field543passed == false && field561passed == true)
WWWFieldString = WWWFieldString+ " | \n";
if (field543passed == false && field561passed == false)
WWWFieldString = WWWFieldString+ " | \n";
if (field633passed == true)
WWWFieldString = WWWFieldString+ " | \n";
else
WWWFieldString = WWWFieldString+ " | \n";
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// End Field illumination analysis
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Start PSF measurements
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// First checking that 'psf' image series is present: wtmp > 0
// Checking in Leica SP5 LIF file format
if (ReadFormat == "lif") {
seriesFound = findSeries("psf");
if ( seriesFound > -1) {
// Obtain recording parameters
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblVoxelX 0",wtmp);
PSFVoxelXY = parseFloat(wtmp)*1000000;
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblVoxelZ 0",wtmp);
PSFVoxelZ = parseFloat(wtmp)*1000000;
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblZoom 0",wtmp);
PSFZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblPinholeAiry 0",wtmp);
PSFPinhole = parseFloat(wtmp);
setBatchMode(true);
run("Bio-Formats Importer", "open=" + path +" view=[Standard ImageJ] stack_order=Default split_channels series_"+toString(seriesFound));
}
}
// Checking in Leica SP1/SP2 LEI file format
else if (ReadFormat == "lei") {
if (indexOf(LeicaText, "Series Name:\tpsf") != -1) {
PSFText = substring (LeicaText, indexOf(LeicaText, "Series Name:\tpsf"));
// Obtain recording parameters
PSFVoxelWidth = substring (PSFText, indexOf(PSFText, "Voxel-Width"), indexOf(PSFText,"Voxel-Height"));
PSFVoxelWidth = substring (PSFVoxelWidth, indexOf(PSFVoxelWidth, "]")+2);
PSFVoxelXY = parseFloat(PSFVoxelWidth);
PSFZoom = substring (PSFText, indexOf(PSFText, "Zoom"), indexOf(PSFText,"Scan-Direction"));
PSFZoom = substring (PSFZoom, indexOf(PSFZoom, "Zoom")+4);
PSFZoom = parseFloat(PSFZoom);
PSFPinhole = substring (PSFText, indexOf(PSFText, "Pinhole [airy]"), indexOf(PSFText,"Size-Width"));
PSFPinhole = substring (PSFPinhole, indexOf(PSFPinhole, "]")+2);
PSFPinhole = parseFloat(PSFPinhole);
PSFVoxelDepth = substring (PSFText, indexOf(PSFText, "Voxel-Depth"), indexOf(PSFText,"Zoom"));
PSFVoxelDepth = substring (PSFVoxelDepth, indexOf(PSFVoxelDepth, "]")+2);
PSFVoxelZ = parseFloat(PSFVoxelDepth);
setBatchMode(true);
ReadFileName="psf";
ReadChannel = "ch00";
OpenSeries();
}
}
// Checking for psf image stack in Deltavision file format
else if (ReadFormat == "dv") {
}
// Checking for psf image stack in Zeiss 510 LSM file format
else if (ReadFormat == "lsm") {
if (File.exists(ReadDir + "\\"+"psf.lsm") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"psf.lsm");
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"psf.lsm")
getVoxelSize(PSFVoxelXY, height, PSFVoxelZ, unit);
Ext.getSeriesMetadataValue("Recording #1 Zoom X",wtmp);
PSFZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("DetectionChannel #1 Pinhole Diameter",wtmp);
PSFPinhole = parseFloat(wtmp);
}
}
// Checking for psf images in Zeiss LSM780 file format
else if (ReadFormat == "czi") {
if (File.exists(ReadDir + "\\"+"psf.czi") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"psf.czi")
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"psf.czi")
getVoxelSize(PSFVoxelXY, height, PSFVoxelZ, unit);
Ext.getMetadataValue("Experiment|AcquisitionBlock|AcquisitionModeSetup|ZoomX|0",wtmp);
PSFZoom = parseFloat(wtmp);
Ext.getMetadataValue("Information|Image|Channel|PinholeSize|0",wtmp);
PSFPinhole = parseFloat(wtmp);
}
}
// Checking psf images in Nikon ND2 file format
else if (ReadFormat == "nd2"){
if (File.exists(ReadDir + "\\"+"psf.nd2") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"psf.nd2");
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"psf.nd2");
getVoxelSize(PSFVoxelXY, height, BeadVoxelZ, unit);
Ext.getMetadataValue("dZStep",wtmp);
PSFVoxelZ= parseFloat(wtmp);
Ext.getMetadataValue("ImagingZoom",wtmp);
PSFZoom = parseFloat(wtmp);
Ext.getMetadataValue("PinholeSize",wtmp);
PSFPinhole = parseFloat(wtmp);
minTemp=100000;
maxTemp=0;
for (t=1;t<=nSlices; t++) {
setSlice(t);
getStatistics(area, mean, min, max);
if (min < minTemp)
minTemp = min;
if (max > maxTemp)
maxTemp = max;
}
setMinAndMax(minTemp, maxTemp);
run("8-bit");
}
}
// Checking for psf TIF image stack and manually enter the required parameters
else if (ReadFormat == "tif"){
if (File.exists(ReadDir + "\\"+"psf.tif") == 1) {
setBatchMode(true);
PSFVoxelXY = getNumber("PSF measurements: Enter XY pixelsize [um]", 0.2);
PSFVoxelZ = getNumber("PSF measurements: Enter Z step size [um]", 0.2);
PSFZoom = getNumber("PSF measurements: Enter Zoom factor.", 1);
PSFPinhole = getNumber("PSF measurements: Enter pinhole diameter [airy units]", 1);
open(ReadDir + "\\"+"psf.tif");
}
}
// if psf images present continue with processing
if (nImages > 0) {
XZScalingFactor = round(PSFVoxelZ/PSFVoxelXY);
print("\nResolution measurements using PSF "+ PsfLaser +"nm");
print("------------------------------------------------------ \n");
print("XY dimension [um]:" ,"\t" ,d2s(PSFVoxelXY,3));
print("Z dimension [um]:" ,"\t" ,d2s(PSFVoxelZ,3));
print("Zoom Factor :" , "\t" , d2s(PSFZoom,3));
if (ReadFormat == "czi" || ReadFormat == "lsm" || ReadFormat == "nd2")
print("Pinhole diameter [um]:", "\t", d2s(PSFPinhole,3));
else
print("Pinhole diameter [airy]:", "\t", d2s(PSFPinhole,3));
print("\n");
// Check for Bitdepth
info = getImageInfo();
BitDepth = substring(info, lastIndexOf(info,"Bits per pixel:"));
BitDepth = substring(BitDepth,16, indexOf(BitDepth," ("));
// Create array: xy + z resolution + colour
PSFArray = newArray(3);
StackID = getImageID();
StackImageWidth = getWidth();
StackNoSlices = nSlices;
//duplicate stack to keep original image stack for later analysis
StackWindowName = getTitle();
run("Duplicate...", "title=[StackWindowName] duplicate");
rename ("Original");
OriStackID = getImageID();
selectImage(StackID);
FindBrightestSlice();
InFocusSlice = getSliceNumber();
// Dialogbox to select laserline
PSFArray[2] = PsfLaser;
// binarise image stack (threshold = half maximal intensity) and calculate centroid
getStatistics(area, mean, min, max, std, histogram);
ChannelThreshold = round(max/2);
setThreshold(ChannelThreshold, 255);
run("Convert to Mask", " ");
CalculateCentroid();
close();
selectWindow("Original");
x = round(Centroid[0]);
oriXPos = x;
y = round(Centroid[1]);
oriYPos = y;
zProfileX = newArray(StackNoSlices); // Z-position
zProfileY = newArray(StackNoSlices); // Intensity
zFitX = newArray(StackNoSlices); // Fitted curve
// Obtain Z intensity profile at xy centroid coordinates
for (i=0; i \n";
WWWPsfString = WWWPsfString + " | \n";
WWWPsfString = WWWPsfString + " | \n";
WWWPsfString = WWWPsfString + " | \n";
}
while (nImages > 0)
close();
setBatchMode(false);
psf_analysis = 1;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// End PSF measurements
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Start grid analysis
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// First checking that 'grid' image is present: wtmp > 0
// Checking in Leica SP5 LIF file format
if (ReadFormat == "lif") {
seriesFound = findSeries("grid");
if ( seriesFound > -1) {
// Obtain recording parameters
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblZoom 0",wtmp);
GridZoom = parseFloat(wtmp);
setBatchMode(true);
run("Bio-Formats Importer", "open=" + path +" view=[Standard ImageJ] stack_order=Default split_channels series_"+toString(seriesFound));
}
}
// Checking in Leica SP1/SP2 LEI file format
else if (ReadFormat == "lei") {
if (indexOf(LeicaText, "Series Name:\tgrid") != -1) {
GridText = substring (LeicaText, indexOf(LeicaText, "Series Name:\tgrid"));
GridZoom = substring (GridText, indexOf(GridText, "Zoom"), indexOf(GridText,"Scan-Direction"));
GridZoom = substring (GridZoom, indexOf(GridZoom, "Zoom")+4);
GridZoom = parseFloat(GridZoom);
setBatchMode(true);
open(ReadDir + "\\" + substring(ReadName, 0,lastIndexOf(ReadName, "."))+"_grid_ch00.tif");
}
}
// not applicable to Deltavision system
else if (ReadFormat == "dv") {
}
// Checking in Zeiss 510 LSM file format
else if (ReadFormat == "lsm") {
if (File.exists(ReadDir + "\\"+"grid.lsm") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"grid.lsm");
Ext.setSeries(0);
setBatchMode(true);
run("Bio-Formats Importer", "open="+ReadDir + "\\"+"grid.lsm" + " color_mode=Default view=[Standard ImageJ] stack_order=Default");
Ext.getSeriesMetadataValue("Recording #1 Zoom X",wtmp);
GridZoom = parseFloat(wtmp);
}
}
// Checking in Zeiss LSM780 file format
else if (ReadFormat == "czi") {
if (File.exists(ReadDir + "\\"+"grid.czi") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"grid.czi")
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"grid.czi")
Ext.getMetadataValue("Experiment|AcquisitionBlock|AcquisitionModeSetup|ZoomX|0",wtmp);
GridZoom = parseFloat(wtmp);
}
}
// Checking for grid images in Nikon ND2 file format
else if (ReadFormat == "nd2"){
if (File.exists(ReadDir + "\\"+"grid.nd2") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"grid.nd2")
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"grid.nd2");
Ext.getMetadataValue("ImagingZoom",wtmp);
GridZoom = parseFloat(wtmp);
}
}
// Checking for grid TIF image and manually enter the required parameters
else if (ReadFormat == "tif"){
if (File.exists(ReadDir + "\\"+"grid.tif") == 1) {
setBatchMode(true);
GridZoom = getNumber("Grid Scan: Enter Zoom factor.", 1);
open(ReadDir + "\\"+"grid.tif");
}
}
// if grid image present continue with processing
if (nImages > 0) {
print("\nMeasurement grid symmetry");
print("------------------------------------------------------ \n");
print("Zoom Factor :" , "\t" , d2s(GridZoom,3));
// Contrast enhancement and save result images as TIFF and JPEG files
getStatistics(area, mean, min, max, std, histogram);
setMinAndMax(min, max);
run("8-bit");
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText + "_grid_result.tif");
// Website grid string update
if (UpdateWWWSite == true){
saveAs("jpeg", WWWDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_grid_result.jpg");
WWWGridString = " | \n";
}
while (nImages > 0)
close();
setBatchMode(false);
grid_analysis = 1;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// End grid analysis
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Start Zgalvo stability measurement
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Test that zgalvo images are present first
// Checking in Leica SP5 LIF file format
if (ReadFormat == "lif") {
seriesFound = findSeries("zgalvo");
if ( seriesFound > -1) {
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblVoxelY 0",wtmp);
ZGalvoVoxelXY = parseFloat(wtmp)*1000000;
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblZoom 0",wtmp);
ZGalvoZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblPinholeAiry 0",wtmp);
ZGalvoPinhole = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|nDelayTime_s 0",wtmp);
ZGalvoTime = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|nDelayTime_ms 0",wtmp);
if (wtmp > 0)
ZGalvoTime = ZGalvoTime+parseFloat(wtmp)/1000;
setBatchMode(true);
run("Bio-Formats Importer", "open=" + path +" view=[Standard ImageJ] stack_order=Default split_channels series_"+toString(seriesFound));
rename("Zgalvo");
}
}
// Checking in Leica SP1/SP2 LEI file format
else if (ReadFormat == "lei") {
if (indexOf(LeicaText, "Series Name:\tzgalvo") != -1) {
ZGalvoText = substring (LeicaText, indexOf(LeicaText, "Series Name:\tzgalvo"));
ZGalvoVoxelWidth = substring (ZGalvoText, indexOf(ZGalvoText, "Voxel-Height"), indexOf(ZGalvoText,"Zoom"));
ZGalvoVoxelWidth = substring (ZGalvoVoxelWidth, indexOf(ZGalvoVoxelWidth, "]")+2);
ZGalvoVoxelXY = parseFloat(ZGalvoVoxelWidth);
ZGalvoZoom = substring (ZGalvoText, indexOf(ZGalvoText, "Zoom"), indexOf(ZGalvoText,"Scan-Direction"));
ZGalvoZoom = substring (ZGalvoZoom, indexOf(ZGalvoZoom, "Zoom")+4);
ZGalvoZoom = parseFloat(ZGalvoZoom);
ZGalvoPinhole = substring (ZGalvoText, indexOf(ZGalvoText, "Pinhole [airy]"), indexOf(ZGalvoText,"Size-Width"));
ZGalvoPinhole = substring (ZGalvoPinhole, indexOf(ZGalvoPinhole, "]")+2);
ZGalvoPinhole = parseFloat(ZGalvoPinhole);
ZGalvoTime = substring (ZGalvoText, indexOf(ZGalvoText, "Delay[s]"), indexOf(ZGalvoText,"Format-Width"));
ZGalvoTime = substring (ZGalvoTime, indexOf(ZGalvoTime, "]")+5);
ZGalvoTime = parseInt(ZGalvoTime);
setBatchMode(true);
ReadFileName="zgalvo";
ReadChannel = "ch00";
OpenSeries();
// changed for Bioformats 4.4.8
// seriesFound = findSeries("zgalvo");
// run("Bio-Formats Importer", "open=[" + path +"] view=[Standard ImageJ] stack_order=Default split_channels series_"+toString(seriesFound));
rename("Zgalvo");
}
}
// not applicable to Deltavision system
else if (ReadFormat == "dv") {
}
// not applicable to Zeiss 510 system
else if (ReadFormat == "lsm") {
}
// not applicable to Zeiss 780 system
else if (ReadFormat == "czi") {
}
// not applicable to Nikon Air system
else if (ReadFormat == "nd2") {
}
// Checking for Z galvo TIF stack and manually enter the required parameters
else if (ReadFormat == "tif"){
if (File.exists(ReadDir + "\\"+"zgalvo.tif") == 1) {
setBatchMode(true);
ZGalvoVoxelXY = getNumber("Z-galvo measurements: Enter Y pixelsize [um]", 0.2);
ZGalvoZoom = getNumber("Z-galvo measurements: Enter Zoom factor.", 1);
ZGalvoPinhole = getNumber("Z-galvo measurements: Enter pinhole diameter [airy units]", 1);
ZGalvoTime = getNumber("Z-galvo measurements: Enter image time interval [s]", 1);
open(ReadDir + "\\"+"zgalvo.tif");
rename("Zgalvo");
}
}
// if zgalvo images present continue with processing
if (nImages > 0) {
print("\nMeasurement Z Galvo stability");
print("------------------------------------------------------ \n");
print("Z dimension [um]:" ,"\t" ,d2s(ZGalvoVoxelXY,3));
print("Zoom Factor :" , "\t" , toString(ZGalvoZoom));
print("Pinhole diameter [airy]:", "\t", d2s(ZGalvoPinhole,3));
print("Time interval [s]:","\t", toString(ZGalvoTime));
print("\n");
XWidth = getWidth();
YWidth = getHeight();
TimePoints = nSlices;
IntensityArray = newArray(YWidth);
PositionArray = newArray(TimePoints);
tmpPeakFWHM = newArray(2);
FWHMArray = newArray(TimePoints);
FWHMMeanArray = newArray(TimePoints);
MeanArray = newArray(TimePoints);
TimeArray = newArray(TimePoints);
xCoord = round(XWidth/2); // X position for line profile
tempLineStats = newArray(3);
TempFWHMleftPosInt=newArray(1);
TempFWHMleftPos=newArray(1);
TempFWHMrightPosInt=newArray(1);
TempFWHMrightPos=newArray(1);
//loop by number of timepoints - obtain Peakposition and FWHM
selectWindow("Zgalvo");
for (i=1; i<=TimePoints; i++) {
setSlice(i);
for (y = 0; y < YWidth; y++) {
tempXY = 0;
for (x = xCoord-10; x < (xCoord+10); x++)
tempXY = tempXY + getPixel(x, y);
tempXY = tempXY / 20;
IntensityArray[y] = tempXY;
}
tmpPeakFWHM = GetPeakFWHM(IntensityArray);
PositionArray[i-1]= (YWidth-1) * ZGalvoVoxelXY - tmpPeakFWHM[0]*ZGalvoVoxelXY;
FWHMArray[i-1] = tmpPeakFWHM[1]*ZGalvoVoxelXY;
}
selectWindow("Zgalvo");
close();
tempLineStats = GetLineStats(PositionArray);
TempMin = tempLineStats[0];
TempMax = tempLineStats[1];
TempMean =tempLineStats[2];
for (i=0; i 0.8){
Plot.setLimits(0,maxTime, 0, max);
}
Plot.setColor("orange");
Plot.setLineWidth(1);
Plot.add("curve", TimeArray, FWHMMeanArray);
Plot.setColor("black");
Plot.setLineWidth(1);
Plot.add("curve", TimeArray, FWHMArray);
Text = "FWHM";
Plot.addText(Text, 0.01,0.07);
Plot.show;
newImage("Zgalvo_result", "RGB White",678,620,1);
makeRectangle(0,0, 678,310);
run("Paste");
selectWindow("FWHM");
run("Select All");
run("Copy");
close();
selectWindow("Zgalvo_result");
makeRectangle(0,310,678,310);
run("Paste");
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText + "_Zgalvo_result.tif");
// Website grid string update
if (UpdateWWWSite == true){
saveAs("jpeg", WWWDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_Zgalvo_result.jpg");
WWWZgalvoString = " | \n";
}
while (nImages > 0)
close();
run("Clear Results");
//save all peak position and FWHM data in a tab delimited text file
TempString = "TIME[s]\tPEAK POSITION[um]\tFWHM[um]\n";
for (t=0; t -1) {
// Obtain recording parameters
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblZoom 0",wtmp);
LambdaZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblPinholeAiry 0",wtmp);
LambdaPinhole = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblLambdaBeginLeft_0 0",wtmp);
LambdaStart = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblLambdaBeginRight_0 0",wtmp);
LambdaWindow = parseFloat(wtmp);
LambdaWindow = parseInt(LambdaWindow) - parseInt(LambdaStart);
LambdaStart = LambdaStart + LambdaWindow/2;
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblLambdaEndLeft_0 0",wtmp);
LambdaEnd = parseFloat(wtmp)+LambdaWindow/2;
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|nLambdaSections 0",wtmp);
LambdaStep = parseInt(wtmp);
LambdaStepsize = round((parseInt(LambdaEnd)-parseInt(LambdaStart)) / LambdaStep);
setBatchMode(true);
p = 0;
PMTGainOffset = "";
do {
p = p + 1;
seriesFound = findSeries("scanpmt"+toString(p));
if ( seriesFound > -1) {
run("Bio-Formats Importer", "open=" + path +" view=[Standard ImageJ] stack_order=Default series_"+toString(seriesFound));
rename("PMT"+toString(p));
Ext.getSeriesMetadataValue("HardwareSetting|FilterSettingRecord|PMT "+toString(p) + " (HV) 0",wtmp);
PMTGainOffset = PMTGainOffset + "PMT" + toString(p) + " Gain [V]:\t" + d2s(wtmp,2) + "\n";
Ext.getSeriesMetadataValue("HardwareSetting|FilterSettingRecord|PMT "+toString(p) + " (Offs.) 0",wtmp);
PMTGainOffset = PMTGainOffset + "PMT" + toString(p) + " Offset:\t" + d2s(wtmp,2)+"\n";
}
}
while (nImages == p);
}
}
// Checking in Leica SP1/SP2 LEI file format
else if (ReadFormat == "lei") {
if (indexOf(LeicaText, "Series Name:\tscanpmt1") != -1) {
LambdaText = substring (LeicaText, indexOf(LeicaText, "Series Name:\tscanpmt1"));
LambdaZoom = substring (LambdaText, indexOf(LambdaText, "Zoom"), indexOf(LambdaText,"Scan-Direction"));
LambdaZoom = substring (LambdaZoom, indexOf(LambdaZoom, "Zoom")+4);
LambdaZoom = parseFloat(LambdaZoom);
LambdaPinhole = substring (LambdaText, indexOf(LambdaText, "Pinhole [airy]"), indexOf(LambdaText,"Size-Width"));
LambdaPinhole = substring (LambdaPinhole, indexOf(LambdaPinhole, "]")+2);
LambdaPinhole = parseFloat(LambdaPinhole);
LambdaStart = substring (LambdaText, indexOf(LambdaText, "[LambdaBeginLeft 1]"), indexOf(LambdaText,"[LambdaBeginRight 1]"));
LambdaStart = substring (LambdaStart, indexOf(LambdaStart, "]")+2);
LambdaStart = parseFloat(LambdaStart);
LambdaWindow = substring (LambdaText, indexOf(LambdaText, "[LambdaBeginRight 1]"), indexOf(LambdaText,"[LambdaEndLeft 1]"));
LambdaWindow = substring (LambdaWindow, indexOf(LambdaWindow, "]")+2);
LambdaWindow = parseFloat(LambdaWindow);
LambdaWindow = LambdaWindow - LambdaStart;
LambdaEnd = substring (LambdaText, indexOf(LambdaText, "[LambdaEndLeft 1]"), indexOf(LambdaText,"[LambdaEndRight 1]"));
LambdaEnd = substring (LambdaEnd, indexOf(LambdaEnd, "]")+2);
LambdaEnd = parseFloat(LambdaEnd);
LambdaStep = substring (LambdaText, indexOf(LambdaText, "Lambda-Sections"), indexOf(LambdaText,"TIME"));
LambdaStep = substring (LambdaStep, indexOf(LambdaStep, "s")+2);
LambdaStep = parseInt(LambdaStep);
LambdaStepsize = (LambdaEnd-LambdaStart) / LambdaStep;
setBatchMode(true);
PMTGainOffset = "";
p = 1;
while (indexOf(LeicaText, "Series Name:\tscanpmt"+toString(p)) != -1) {
run("Image Sequence...", "open=" + ReadDir + "\\" + substring(ReadName, 0,lastIndexOf(ReadName, "."))+"_scanpmt"+toString(p) + "_la000_ch00.tif number=1000 starting=1 increment=1 scale=100 file=scanpmt"+toString(p)+"_la or=[] sort");
rename("PMT"+toString(p));
//obtain Gain and Offset setting for PMTs
PMTText = substring (LeicaText, indexOf(LeicaText, "Series Name:\tscanpmt"+toString(p)),indexOf(LeicaText, "Series Name:\tscanpmt"+toString(p))+600);
PMTOffsetText = substring (PMTText, indexOf(PMTText, "PMT "+toString(p)+" (Offs.)")+14,indexOf(PMTText,"PMT "+toString(p)+" (HV)"));
PMTOffset = parseFloat(PMTOffsetText);
PMTGainText = substring (PMTText, indexOf(PMTText,"PMT "+toString(p)+" (HV)")+10, indexOf(PMTText,"PMT "+toString(p)+" (HV)")+22);
PMTGain = parseFloat(PMTGainText);
PMTGainOffset = PMTGainOffset + "PMT" + toString(p) + " Gain [V]:\t" + d2s(PMTGain,2) + "\n";
PMTGainOffset = PMTGainOffset + "PMT" + toString(p) + " Offset:\t" + d2s(PMTOffset,2)+"\n";
p=p+1;
}
}
}
if (nImages > 0){
// Print parameters in Log window
print("\nLambda scan measurements ");
print("------------------------------------------------------ \n");
print("Zoom Factor :" , "\t" , toString(LambdaZoom));
print("Pinhole diameter [airy]:", "\t", d2s(LambdaPinhole,3));
print("Scan start [nm]:","\t", toString(LambdaStart));
print("Scan end [nm]:","\t", toString(LambdaEnd));
print("Scan window width [nm]:","\t", toString(LambdaWindow));
print("Scan step size [nm]:","\t", toString(LambdaStepsize));
print("\n");
PMTNumber = nImages;
XWidth = getWidth();
YWidth = getHeight();
LambdaStep = nSlices();
print (PMTGainOffset);
print("\n");
// Create arrays for intensity and wavelength (lambda)
IntensityArray = newArray(LambdaStep);
LambdaArray = newArray(LambdaStep);
TempIntensityArray = newArray(20);
TempLambdaArray = newArray(20);
for (j=0; j \n";
}
while (nImages > 0)
close();
run("Clear Results");
setBatchMode(false);
lambda_analysis = 1;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// End lambda scan measurement
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Start laser stability measurement
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// First checking that 'laser' image series is present:
// Checking in Leica SP5 LIF file format
if (ReadFormat == "lif") {
seriesFound = findSeries("laser");
if ( seriesFound > -1) {
setBatchMode(true);
run("Bio-Formats Importer", "open=" + path +" view=[Standard ImageJ] stack_order=Default split_channels series_"+toString(seriesFound));
LaserChannelNo = nImages;
for (i=0; i<=(LaserChannelNo-1); i++) {
if (seriesCount == 1) {
selectWindow(ReadName + " - C=" + toString(i));
rename("Channel"+toString(i));
}
else {
selectWindow(ReadName + " - laser - C=" + toString(i));
rename("Channel"+toString(i));
}
}
// Obtain recording parameters
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblVoxelX 0",wtmp);
LaserVoxelXY = parseFloat(wtmp)*1000000;
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblZoom 0",wtmp);
LaserZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|nDelayTime_s 0",wtmp);
LaserTime = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|FilterSettingRecord|Scan Speed 0",wtmp);
LaserScanSpeed = wtmp;
}
}
// Checking in Leica SP1/SP2 LEI file format
else if (ReadFormat == "lei") {
if (indexOf(LeicaText, "Series Name:\tlaser") != -1) {
LaserText = substring (LeicaText, indexOf(LeicaText, "Series Name:\tlaser"));
LaserVoxelWidth = substring (LaserText, indexOf(LaserText, "Voxel-Width"), indexOf(LaserText,"Voxel-Height"));
LaserVoxelWidth = substring (LaserVoxelWidth, indexOf(LaserVoxelWidth, "]")+2);
LaserVoxelXY = parseFloat(LaserVoxelWidth);
LaserZoom = substring (LaserText, indexOf(LaserText, "Zoom"), indexOf(LaserText,"Scan-Direction"));
LaserZoom = substring (LaserZoom, indexOf(LaserZoom, "Zoom")+4);
LaserZoom = parseFloat(LaserZoom);
LaserTime = substring (LaserText, indexOf(LaserText, "Delay[s]"), indexOf(LaserText,"Format-Width"));
LaserTime = substring (LaserTime, indexOf(LaserTime, "]")+5);
LaserTime = parseInt(LaserTime);
LaserChannels = substring (LeicaText, indexOf(LeicaText, "Series Name:\tlaser")-300, indexOf(LeicaText,"Series Name:\tlaser"));
LaserChannels = substring (LaserChannels, indexOf(LaserChannels, "Dimension_2"), indexOf(LaserChannels,"Physical Length"));
LaserChannels = substring (LaserChannels, indexOf(LaserChannels, "Logical Size:")+13, lengthOf(LaserChannels)-1);
LaserChannelNo = parseInt(LaserChannels);
LaserScanSpeed = substring (LaserText, indexOf(LaserText, "Scan Speed")+11, indexOf(LaserText,"Phase"));
LaserScanSpeed = parseInt(LaserScanSpeed);
setBatchMode(true);
for (i=0; i<=(LaserChannelNo-1); i++) {
ReadFileName=substring(ReadName, 0,lastIndexOf(ReadName, "."))+"_laser";
ReadChannel = "ch0" + toString(i);
OpenSeries();
rename("Channel"+toString(i));
}
}
}
// Checking for laser images in Zeiss 510 LSM file format
else if (ReadFormat == "lsm") {
if (File.exists(ReadDir + "\\"+"laser.lsm") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"laser.lsm");
Ext.setSeries(0);
run("Bio-Formats Importer", "open="+ReadDir + "\\"+"laser.lsm" + " color_mode=Default split_channels view=[Standard ImageJ] stack_order=Default");
LaserChannelNo = nImages;
for (i=0; i<=(LaserChannelNo-1); i++) {
selectWindow("laser.lsm - C=" + toString(i));
rename("Channel"+toString(i));
}
getPixelSize(unit, LaserVoxelXY, pixelHeight);
Ext.getPixelsTimeIncrement(LaserTime);
LaserTime = parseInt(LaserTime);
Ext.getSeriesMetadataValue("Recording #1 Zoom X",wtmp);
LaserZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("Track #1 Pixel Time",wtmp);
PixelTime = parseFloat(wtmp);
XWidth = getWidth();
// Laser scan speed in Hz interpolated from Pixel dwell time obtained from metadata
LaserScanSpeed = 1/(PixelTime*XWidth/1000000);
}
}
// Checking in Zeiss LSM780 file format
else if (ReadFormat == "czi") {
if (File.exists(ReadDir + "\\"+"laser.czi") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"laser.czi")
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"laser.czi")
run("Split Channels");
LaserChannelNo = nImages;
for (i=1; i<=LaserChannelNo; i++) {
selectWindow("C" + toString(i)+"-laser.czi");
rename("Channel"+toString(i-1));
}
getPixelSize(unit, LaserVoxelXY, pixelHeight);
LaserTime = getNumber("Laser stability: Enter time interval between images [s]", 20.0);
Ext.getMetadataValue("Experiment|AcquisitionBlock|AcquisitionModeSetup|PixelPeriod|0",wtmp);
PixelTime = parseFloat(wtmp);
XWidth = getWidth();
// Laser scan speed in Hz interpolated from Pixel dwell time obtained from metadata
LaserScanSpeed = parseInt(1/(PixelTime*XWidth));
Ext.getMetadataValue("Experiment|AcquisitionBlock|AcquisitionModeSetup|ZoomX|0",wtmp);
LaserZoom = parseFloat(wtmp);
}
}
// Checking in Nikon ND2 file format
else if (ReadFormat == "nd2"){
if (File.exists(ReadDir + "\\"+"laser.nd2") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"laser.nd2");
Ext.setSeries(0);
Ext.openImagePlus(ReadDir + "\\"+"laser.nd2")
run("Split Channels");
LaserChannelNo = nImages;
selectWindow("C1-laser.nd2");
close();
selectWindow("C2-laser.nd2");
rename("Channel0");
getPixelSize(unit, LaserVoxelXY, pixelHeight);
Ext.getMetadataValue("dPeriod",wtmp);
LaserTime = parseFloat(wtmp);
LaserTime = LaserTime/1000.0;
Ext.getMetadataValue("ImagingZoom",wtmp);
LaserZoom = parseFloat(wtmp);
XWidth = getWidth();
PixelTime = getNumber("Laser stability: Enter laser pixel dwell time [us]", 1.2);
// Laser scan speed in Hz interpolated from Pixel dwell time obtained from metadata
LaserScanSpeed = parseInt(1/(PixelTime*XWidth));
}
}
// not applicable to Deltavision system
else if (ReadFormat == "dv") {
}
// Checking for laser composite TIF stack and manually enter the required parameters
else if (ReadFormat == "tif"){
if (File.exists(ReadDir + "\\"+"laser.tif") == 1) {
LaserVoxelXY = getNumber("Laser stability: Enter XY pixelsize [um]", 0.2);
LaserZoom = getNumber("Laser stability: Enter Zoom Factor", 16.0);
LaserScanSpeed = getNumber("Laser stability: Enter laser scan speed [Hz]", 400.0);
LaserTime = getNumber("Laser stability: Enter time interval between images [s]", 20.0);
setBatchMode(true);
open(ReadDir + "\\"+"laser.tif");
rename("Channel");
getDimensions(width, height, channels, slices, frames);
if (channels > 1) {
run("Split Channels");
LaserChannelNo = nImages;
for (i=0; i<=(LaserChannelNo-1); i++) {
selectWindow("C"+toString(i+1)+"-Channel");
rename("Channel"+toString(i));
}
}
else
rename("Channel0");
}
}
// if laser images present continue with processing
if (nImages > 0) {
LaserChannelNo = nImages;
XWidth = getWidth();
YWidth = getHeight();
XLineArray = newArray(XWidth);
for (i=0; i 100)
AnalysisPoints = 100;
else
AnalysisPoints = TimePoints;
// Create arrays for average intensity , stdDev and time
MeanIntensityArray = newArray(TimePoints);
StdDevIntensityArray = newArray(TimePoints);
MeanResultArray = newArray(TimePoints*LaserChannelNo);
StdDevResultArray = newArray(TimePoints*LaserChannelNo);
TimeArray = newArray(TimePoints);
for (j=0; j 600)
tenMinuteProcessedArray = newArray(TimePoints*LaserChannelNo-LaserChannelNo*600/LaserTime);
// only create if more than 1h timecourse
if (LaserDuration > 3600)
hourProcessedArray = newArray(TimePoints*LaserChannelNo-LaserChannelNo*3600/LaserTime);
// Array with channels: colour
LaserArray = newArray(LaserChannelNo);
dIntArray = newArray(LaserChannelNo);
// Print parameters in Log window
print("\nLaser stability measurements ");
print("------------------------------------------------------ \n");
print("XY dimension [um]:" ,"\t" ,d2s(LaserVoxelXY,3));
print("Zoom Factor :" , "\t" , d2s(LaserZoom,3));
if (ReadFormat == "czi")
print("Pixel dwell time [us]:", "\t", d2s(PixelTime*1000000,3));
else if (ReadFormat == "lsm")
print("Pixel dwell time [us]:", "\t", d2s(PixelTime,3));
else if (ReadFormat == "nd2")
print("Pixel dwell time [us]:", "\t", d2s(PixelTime,3));
else
print("Laser Scan Speed [Hz]:", "\t", toString(LaserScanSpeed));
print("Time interval [s]:","\t", toString(LaserTime));
print("Total duration [min]:","\t",d2s(LaserTime*TimePoints/60,0));
print("\n");
// Loop by number of channels/lasers
for (i=0; i 600){
stepsize = 600/LaserTime;
l = 0;
for (i=0; i 3600){
stepsize = 3600/LaserTime;
l = 0;
for (i=0; i 600){
l = 0;
for (j=0; j 3600){
l = 0;
for (j=0; j 600)
drawString("10 Minutes", 447, 185);
if (LaserDuration > 3600)
drawString("1 hour", 447, 340);
selectWindow("Noise_Channel"+toString(i));
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText +"_Laserstability_" +toString(LaserArray[i])+"nm.tif");
// Website lambda string update
if (UpdateWWWSite == true)
saveAs("jpeg", WWWDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_Laserstability_" +toString(LaserArray[i])+"nm.jpg");
close();
}
print("Laser noise in single horizontal line scan:");
print("------------------------------------------------------ \n");
// Obtain Min and Max intensity values for line plots
LineMin = 255;
LineMax = 0;
for (i=0; i= LineMax)
LineMax = max;
}
for (i=0; i 255)
Plot.setLimits(0, TimePoints*LaserTime/60, 0, max);
else
Plot.setLimits(0, TimePoints*LaserTime/60, 0, 255);
Colour = SelectPlotColour(LaserArray[i]);
Plot.setColor(Colour);
Plot.setLineWidth(1);
Plot.add("curve", TimeArray, MeanIntensityArray);
Text = toString(LaserArray[i]) +"nm"+" dInt="+d2s(dIntArray[i],1)+"%";
Plot.addText(Text, 0.01,0.07+i*0.05);
Plot.show;
// Generate intensity plots with different colours for each laser - rescaled between total min and max intensities
run("Profile Plot Options...", "width=600 height=255 minimum=0 maximum=255 fixed interpolate draw");
Plot.create("LaserpowerMeanRescaled"+toString(i), "Time [min]", "Intensity");
Array.getStatistics(MeanResultArray, min, max, mean, stdDev);
Plot.setLimits(0, TimePoints*LaserTime/60, min, max);
Colour = SelectPlotColour(LaserArray[i]);
Plot.setColor(Colour);
Plot.setLineWidth(1);
Plot.add("curve", TimeArray, MeanIntensityArray);
Text = toString(LaserArray[i]) +"nm"+" dInt="+d2s(dIntArray[i],1)+"%";
Plot.addText(Text, 0.01,0.07+i*0.05);
Plot.show;
// Generate intensity plots with different colours for each laser - rescaled between total min and max intensities
run("Profile Plot Options...", "width=600 height=255 minimum=0 maximum=255 fixed interpolate draw");
Plot.create("LaserpowerStdDev"+toString(i), "Time [min]", "StdDev");
Array.getStatistics(StdDevResultArray, min, max, mean, stdDev);
if (min < 1 && max < 1)
Plot.setLimits(0, TimePoints*LaserTime/60, min, max);
else
Plot.setLimits(0, TimePoints*LaserTime/60, min-1, max+1);
Colour = SelectPlotColour(LaserArray[i]);
Plot.setColor(Colour);
Plot.setLineWidth(1);
Plot.add("curve", TimeArray, StdDevIntensityArray);
Text = toString(LaserArray[i]) +"nm";
Plot.addText(Text, 0.01,0.07+i*0.05);
Plot.show;
}
// Merge plots and save result images as TIFF and JPEG files
for (j=1; j \n";
for (j=0; j
\n";
else
WWWLaserString = WWWLaserString + " | \n";
if (laser488passed == true)
WWWLaserString = WWWLaserString + " | \n";
else
WWWLaserString = WWWLaserString + " | \n";
if (laser543passed == true)
WWWLaserString = WWWLaserString + " | \n";
if (laser561passed == true)
WWWLaserString = WWWLaserString + " | \n";
if (laser543passed == false && laser561passed == false )
WWWLaserString = WWWLaserString + " | \n";
if (laser594passed == true)
WWWLaserString = WWWLaserString + " | \n";
else
WWWLaserString = WWWLaserString + " | \n";
if (laser633passed == true)
WWWLaserString = WWWLaserString + " | \n";
else
WWWLaserString = WWWLaserString + " | \n";
}
selectWindow("LaserpowerStdDev0");
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText +"_Laserpower_StdDev_Intensity_rescaled.tif");
selectWindow("LaserpowerLine0");
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText +"_Laserpower_LineScan_Intensity_rescaled.tif");
while (nImages > 0)
close();
run("Clear Results");
//save all intensity and stdDev data in a tab delimited text file
String.resetBuffer;
String.append("TIME[s]\t");
for (j=0; j -1) {
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblVoxelX 0",wtmp);
StageVoxelXY = parseFloat(wtmp)*1000000;
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblZoom 0",wtmp);
StageZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblPinholeAiry 0",wtmp);
StagePinhole = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|nDelayTime_s 0",wtmp);
StageTime = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|nDelayTime_ms 0",wtmp);
if (wtmp > 0)
StageTime = StageTime+parseFloat(wtmp)/1000;
setBatchMode(true);
StagePositionText = "";
s = 1;
while (s <= 3) {
// Open 'stage' image sequence, one window for each stage position, done individually as separate recordings
seriesFound = findSeries("stage"+toString(s));
if (seriesFound > -1){
Ext.getSeriesMetadataValue("HardwareSetting|FilterSettingRecord|DMI6000 Stage Pos x 0hgd",wtmp);
if (wtmp == 0)
Ext.getPlanePositionX(wtmp,1);
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(wtmp*1000,6) + "\n";
Ext.getSeriesMetadataValue("HardwareSetting|FilterSettingRecord|DMI6000 Stage Pos y 0htgs",wtmp);
if (wtmp == 0)
Ext.getPlanePositionY(wtmp,1);
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(wtmp*1000,6)+ "\n";
run("Bio-Formats Importer", "open=" + path +" view=[Standard ImageJ] stack_order=Default series_"+toString(seriesFound));
rename("Position"+toString(s));
}
s = s + 1;
}
}
}
// Checking in Zeiss 510 LSM file format
else if (ReadFormat == "lsm") {
if (File.exists(ReadDir + "\\"+"stage.lsm") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"stage.lsm");
Ext.getSeriesCount(StagePositions);
StagePositionText = "";
wtmp = 0;
s = 1;
while (s <= StagePositions) {
Ext.setSeries(s-1);
Ext.getPlanePositionX(wtmp,1);
if (wtmp == 0)
Ext.getSeriesMetadataValue("X position for position #"+toString(s),wtmp);
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(wtmp*1000,6) + "\n";
Ext.getPlanePositionY(wtmp,1);
if (wtmp == 0)
Ext.getSeriesMetadataValue("Y position for position #"+toString(s),wtmp);
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(wtmp*1000,6)+ "\n";
run("Bio-Formats Importer", "open="+ReadDir+"\\"+"stage.lsm"+" autoscale color_mode=Default view=Hyperstack stack_order=XYCZT series_"+toString(s));
rename("Position"+toString(s));
s=s+1;
}
getPixelSize(unit, StageVoxelXY, pixelHeight);
Ext.getPlaneTimingDeltaT(deltaT, 1);
StageTime = parseFloat(deltaT);
Ext.getSeriesMetadataValue("Recording #1 Zoom X",wtmp);
StageZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("DetectionChannel #1 Pinhole Diameter",wtmp);
StagePinhole = parseFloat(wtmp);
}
}
// Checking in Zeiss LSM780 file format
else if (ReadFormat == "czi") {
if (File.exists(ReadDir + "\\"+"stage.czi") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"stage.czi")
Ext.getSeriesCount(StagePositions);
StagePositionText = "";
wtmp = 0;
s = 1;
while (s <= StagePositions) {
Ext.setSeries(s-1);
Ext.getPlanePositionX(wtmp,1);
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(wtmp*1000,6) + "\n";
Ext.getPlanePositionY(wtmp,1);
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(wtmp*1000,6)+ "\n";
run("Bio-Formats Importer", "open="+ReadDir+"\\"+"stage.czi"+" autoscale color_mode=Default view=Hyperstack stack_order=XYCZT series_"+toString(s));
rename("Position"+toString(s));
s=s+1;
}
getPixelSize(unit, StageVoxelXY, pixelHeight);
StageTime = getNumber("Stage performance: Enter time interval between images [s]", 20.0);
Ext.getMetadataValue("Information|Image|Channel|PinholeSize|0",wtmp);
StagePinhole = parseFloat(wtmp);
Ext.getMetadataValue("Experiment|AcquisitionBlock|AcquisitionModeSetup|ZoomX|0",wtmp);
StageZoom = parseFloat(wtmp);
}
}
// Checking stage images in Nikon ND2 file format
else if (ReadFormat == "nd2"){
if (File.exists(ReadDir + "\\"+"stage.nd2") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"stage.nd2");
Ext.getSizeZ(StagePositions);
wtmp = 0;
StagePositionText = "";
s = 1;
while (s <= StagePositions) {
Ext.getPlanePositionX(wtmp,s);
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(wtmp/1000,6) + "\n";
Ext.getPlanePositionY(wtmp,s);
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(wtmp/1000,6)+ "\n";
s=s+1;
}
run("Bio-Formats Importer", "open="+ReadDir + "\\"+"stage.nd2"+" autoscale color_mode=Default split_focal view=[Standard ImageJ] stack_order=Default");
for (s=1; s<=nImages; s++) {
selectWindow("stage.nd2 - Z="+toString(s-1));
rename("Position"+toString(s));
minTemp=100000;
maxTemp=0;
for (t=1;t<=nSlices; t++) {
setSlice(t);
getStatistics(area, mean, min, max);
if (min < minTemp)
minTemp = min;
if (max > maxTemp)
maxTemp = max;
}
setMinAndMax(minTemp, maxTemp);
run("8-bit");
}
getPixelSize(unit, StageVoxelXY, pixelHeight);
Ext.getMetadataValue("dAvgPeriodDiff",wtmp);
StageTime = parseFloat(wtmp)/1000;
Ext.getMetadataValue("PinholeSize",wtmp);
StagePinhole = parseFloat(wtmp);
Ext.getMetadataValue("ImagingZoom",wtmp);
StageZoom = parseFloat(wtmp);
}
}
// Checking whether images in Deltavision DV file format present
else if (ReadFormat == "dv"){
if (File.exists(ReadDir + "\\"+"stage1_R3D.dv") == 1) {
Ext.setId(ReadDir + "\\"+"stage1_R3D.dv");
Ext.setSeries(0);
wtmp = 0;
Ext.getMetadataValue("Image Properties Pixel Size",wtmp);
StageVoxelXY = substring (wtmp,0,indexOf(wtmp," "));
StageZoom = "1.0";
StagePinhole = "10.0";
Ext.getPlaneTimingDeltaT(StageTime, 1);
LogFile = File.openAsString(ReadDir + "\\"+"stage1_R3D.dv.log");
CheckForPointlist = substring(LogFile, indexOf(LogFile,"#KEY DO_POINT_VISITING")+23,indexOf(LogFile,"#KEY DO_POINT_VISITING")+24);
if (CheckForPointlist == "F")
DVStagePositions = 1;
else if (CheckForPointlist == "T")
DVStagePositions = parseInt (substring(LogFile, indexOf(LogFile,"#KEY POINT_VISIT_LIST 1-")+24,indexOf(LogFile,"#KEY POINT_VISIT_LIST 1-")+25));
setBatchMode(true);
StagePositionText = "";
for (s=1; s<= DVStagePositions; s++) {
Ext.setId(ReadDir+"\\"+"stage"+toString(s)+"_R3D.dv");
Ext.setSeries(0);
Ext.getMetadataValue("Image 1. Stage coordinates",wtmp);
xtmp = parseFloat(substring(wtmp,indexOf(wtmp,"(")+1,indexOf(wtmp,",")));
ytmp = parseFloat(substring(wtmp,indexOf(wtmp,",")+1,lastIndexOf(wtmp,",")));
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(xtmp/1000,6) + "\n";
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(ytmp/1000,6)+ "\n";
run("Bio-Formats Importer", "open="+ReadDir+"\\"+"stage"+toString(s)+"_R3D.dv"+" view=[Standard ImageJ] stack_order=Default");
rename("Position"+toString(s));
resetMinAndMax();
run("Flip Vertically", "stack");
}
}
}
// Checking for stage images TIF files and manually enter the required parameters
else if (ReadFormat == "tif"){
if (File.exists(ReadDir + "\\"+"stage1.tif") == 1) {
StageVoxelXY = getNumber("XY stage repeatability: Enter XY pixelsize [um]", 0.1);
StageZoom = getNumber("XY stage repeatability: Enter Zoom Factor", 16.0);
StageTime = getNumber("XY stage repeatability: Enter time interval between images [s]", 20.0);
StagePinhole = getNumber("XY stage repeatability: Enter pinhole diameter [airy units]", 1);
QueryStagePositions = 1;
for (st=2; st <= 3; st++){
if (File.exists(ReadDir + "\\"+"stage"+toString(st)+".tif") == 1)
QueryStagePositions = QueryStagePositions + 1;
}
setBatchMode(true);
StagePositionText = "";
for (st=1; st <= QueryStagePositions; st++){
open(ReadDir + "\\"+"stage"+toString(st)+".tif");
rename("Position"+toString(st));
StagePositionText = StagePositionText + "Stage position "+toString(st)+ ": X [mm]\t"+ "---\n";
StagePositionText = StagePositionText + "Stage position "+toString(st)+ ": Y [mm]\t"+ "---\n";
}
}
}
// open stage images in other file format supported by LOCI and manually enter the required parameters
else {
}
// if stage images present continue with processing
if (nImages > 0) {
print("\nMeasurement XY stage repeatability");
print("------------------------------------------------------ \n");
print("XY dimension [um]:" ,"\t" ,d2s(StageVoxelXY,3));
print("Zoom Factor :" , "\t" , d2s(StageZoom,2));
if (ReadFormat == "czi" || ReadFormat == "lsm" || ReadFormat == "nd2" )
print("Pinhole diameter [um]:", "\t", d2s(StagePinhole,3));
else
print("Pinhole diameter [airy]:", "\t", d2s(StagePinhole,3));
print("Time interval [s]:","\t", toString(StageTime));
print("Number of repeats:","\t", nSlices);
print("\n");
StagePositions = nImages;
XYMaxDimension = getWidth()*StageVoxelXY;
XCoordArray = newArray(nSlices);
YCoordArray = newArray(nSlices);
XmeanArray = newArray(1);
YmeanArray = newArray(1);
XstdDevArray = newArray(1);
YstdDevArray = newArray(1);
IntensityArray = newArray(nSlices);
TimeArray = newArray(nSlices);
LaserArray = newArray(nImages);
TimePoints = nSlices;
print(StagePositionText+"\n");
for (i=1; i<=StagePositions; i++) {
selectWindow("Position"+toString(i));
TempString = "TIME[s]\tXCOORD[um]\tYCOORD[um]\tMIN INT\tMAX INT\tAVERAGE INT\n";
for (t=1; t<= nSlices; t++) {
selectWindow("Position"+toString(i));
setSlice(t);
getStatistics(area, mean, min, max, std, histogram);
SliceThreshold = round(max/2);
TrackedBeadStats(SliceThreshold);
IntensityArray[t-1] = ImageStats[2];
TimeArray[t-1] = (t-1)*StageTime/60;
XCoordArray[t-1]= Centroid2D[0]*StageVoxelXY;
YCoordArray[t-1] = XYMaxDimension - Centroid2D[1]*StageVoxelXY;
TempString=TempString+d2s((t-1)*StageTime,3) +"\t"+d2s(XCoordArray[t-1],3)+"\t"+ d2s(YCoordArray[t-1],3)+"\t"+ d2s(ImageStats[0],0)+"\t"+ d2s(ImageStats[1],0)+ "\t"+ d2s(ImageStats[2],3)+"\n";
}
// Generate plots of XY coordinates of bead at different timepoints; red dot marks mean XY coordinates; rectangle +/- StdDev for X and Y
Array.getStatistics(XCoordArray, min, max, mean, stdDev);
XmeanArray[0] = mean;
XstdDevArray[0] = stdDev;
Array.getStatistics(YCoordArray, min, max, mean, stdDev);
YmeanArray[0] = mean;
YstdDevArray[0] = stdDev;
run("Profile Plot Options...", "width=400 height=400 minimum="+toString(XmeanArray[0]-6*XstdDevArray[0])+" maximum="+toString(XmeanArray[0]+6*XstdDevArray[0])+" draw");
Plot.create("Stageposition"+toString(i), "X [um]", "Y [um]");
Plot.setLimits(XmeanArray[0]-6*XstdDevArray[0], XmeanArray[0]+6*XstdDevArray[0],YmeanArray[0]-6*XstdDevArray[0], YmeanArray[0]+6*XstdDevArray[0]);
Plot.setLineWidth(8);
Plot.setColor("red");
Plot.add("dots", XmeanArray, YmeanArray);
Plot.setLineWidth(1);
Plot.drawLine(XmeanArray[0]-XstdDevArray[0], YmeanArray[0]-YstdDevArray[0], XmeanArray[0]+XstdDevArray[0], YmeanArray[0]-YstdDevArray[0]);
Plot.drawLine(XmeanArray[0]+XstdDevArray[0], YmeanArray[0]-YstdDevArray[0],XmeanArray[0]+XstdDevArray[0] , YmeanArray[0]+YstdDevArray[0]);
Plot.drawLine(XmeanArray[0]+XstdDevArray[0], YmeanArray[0]+YstdDevArray[0],XmeanArray[0]-XstdDevArray[0] , YmeanArray[0]+YstdDevArray[0]);
Plot.drawLine(XmeanArray[0]-XstdDevArray[0], YmeanArray[0]+YstdDevArray[0],XmeanArray[0]-XstdDevArray[0] , YmeanArray[0]-YstdDevArray[0]);
Plot.setLineWidth(1);
Plot.setColor("black");
Plot.add("crosses", XCoordArray, YCoordArray);
Plot.setColor("black");
Text = toString("Position "+toString(i));
Plot.addText(Text, 0.01,0.07);
Plot.show;
selectWindow("Stageposition"+toString(i));
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText + "_Stageposition"+toString(i)+"_XYplot.tif");
if (UpdateWWWSite == true)
saveAs("jpeg", WWWDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_Stageposition"+toString(i)+"_XYplot.jpg");
run("Close");
// Generate intensity plots with different colours
Array.getStatistics(IntensityArray, min, max, mean, std);
if (i==1){
dvMin = mean-0.3*mean;
dvMax = mean+0.3*mean;
}
if (ReadFormat == "dv")
run("Profile Plot Options...", "width=600 height=255 minimum="+toString(dvMin)+" maximum="+toString(dvMax)+" fixed interpolate draw");
else
run("Profile Plot Options...", "width=600 height=255 minimum=0 maximum=255 fixed interpolate draw");
Plot.create("Stageposition"+toString(i), "Time [min]", "Intensity");
if (ReadFormat == "dv")
Plot.setLimits(0, TimePoints*StageTime/60, dvMin, dvMax);
else
Plot.setLimits(0, TimePoints*StageTime/60, 0, 255);
Plot.setColor(TextColour[i]);
Plot.setLineWidth(2);
Plot.add("curve", TimeArray, IntensityArray);
Text = toString("Position "+toString(i));
Plot.addText(Text, 0.01,0.07+i*0.05);
Plot.show;
selectWindow("Position"+toString(i));
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText + "_Stageposition"+toString(i)+".tif");
File.saveString(TempString, ReadDir+"\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText +"_Stageposition"+toString(i)+"_data.txt");
Array.getStatistics(XCoordArray, min, max, mean, stdDev);
print("Bead position "+toString(i)+ ": Repeatability X mean [um ]", "\t", d2s(mean,3));
print("Bead position "+toString(i)+ ": Repeatability X StdDev [um ]", "\t", d2s(stdDev,3));
Array.getStatistics(YCoordArray, min, max, mean, stdDev);
print("Bead position "+toString(i)+ ": Repeatability Y mean [um ]", "\t", d2s(mean,3));
print("Bead position "+toString(i)+ ": Repeatability Y StdDev [um ]", "\t", d2s(stdDev,3));
print("\n");
}
// Merge plots and save result images as TIFF and JPEG files
j=1;
do {
imageCalculator("AND", "Stageposition1","Stageposition"+toString(j));
j=j+1;
}
while (j<= StagePositions);
selectWindow("Stageposition1");
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText +"_Bead_intensity_result.tif");
if (UpdateWWWSite == true){
saveAs("jpeg", WWWDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_Bead_intensity_result.jpg");
WWWBeadRepeatString = "";
for (j=1; j<=StagePositions; j++){
WWWBeadRepeatString = WWWBeadRepeatString+" | \n";
}
if (StagePositions == 2)
WWWBeadRepeatString = WWWBeadRepeatString+" | \n";
WWWBeadRepeatString = WWWBeadRepeatString + " | \n";
}
while (nImages > 0)
close();
stage_analysis = 1;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// End XY stage repeatability measurements
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Start XY stage accuracy measurements
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Test that stage images are present first
// Checking in Leica SP5 LIF file format
if (ReadFormat == "lif") {
seriesFound = findSeries("stageacc1");
if ( seriesFound > -1) {
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblVoxelX 0",wtmp);
StageVoxelXY = parseFloat(wtmp)*1000000;
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblZoom 0",wtmp);
StageZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|dblPinholeAiry 0",wtmp);
StagePinhole = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|nDelayTime_s 0",wtmp);
StageTime = parseFloat(wtmp);
Ext.getSeriesMetadataValue("HardwareSetting|ScannerSettingRecord|nDelayTime_ms 0",wtmp);
if (wtmp > 0)
StageTime = StageTime+parseFloat(wtmp)/1000;
setBatchMode(true);
StagePositionText = "";
XStagePosition = newArray(3);
YStagePosition = newArray(3);
s = 1;
while (s <= 3) {
// Open 'stage' image sequence, one window for each stage position, done individually as separate recordings
seriesFound = findSeries("stageacc"+toString(s));
if (seriesFound > -1){
Ext.getSeriesMetadataValue("HardwareSetting|FilterSettingRecord|DMI6000 Stage Pos x 0",wtmp);
if (wtmp == 0)
Ext.getPlanePositionX(wtmp,1);
XStagePosition[s-1] = parseFloat(wtmp)*1000000;
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(wtmp*1000,6) + "\n";
Ext.getSeriesMetadataValue("HardwareSetting|FilterSettingRecord|DMI6000 Stage Pos y 0",wtmp);
if (wtmp == 0)
Ext.getPlanePositionY(wtmp,1);
YStagePosition[s-1] = parseFloat(wtmp)*1000000;
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(wtmp*1000,6)+ "\n";
run("Bio-Formats Importer", "open=" + path +" view=[Standard ImageJ] stack_order=Default series_"+toString(seriesFound));
rename("Position"+toString(s));
}
s = s + 1;
}
}
}
// Checking whether images in Deltavision DV file format present
if (ReadFormat == "dv"){
if (File.exists(ReadDir + "\\"+"stageacc1_R3D.dv") == 1) {
Ext.setId(ReadDir + "\\"+"stageacc1_R3D.dv");
Ext.setSeries(0);
wtmp = 0;
Ext.getMetadataValue("Image Properties Pixel Size",wtmp);
StageVoxelXY = substring (wtmp,0,indexOf(wtmp," "));
StageZoom = "1.0";
StagePinhole = "10.0";
Ext.getPlaneTimingDeltaT(StageTime, 1);
XStagePosition = newArray(3);
YStagePosition = newArray(3);
LogFile = File.openAsString(ReadDir + "\\"+"stageacc1_R3D.dv.log");
CheckForPointlist = substring(LogFile, indexOf(LogFile,"#KEY DO_POINT_VISITING")+23,indexOf(LogFile,"#KEY DO_POINT_VISITING")+24);
if (CheckForPointlist == "F")
DVStagePositions = 1;
else if (CheckForPointlist == "T")
DVStagePositions = parseInt (substring(LogFile, indexOf(LogFile,"#KEY POINT_VISIT_LIST 1-")+24,indexOf(LogFile,"#KEY POINT_VISIT_LIST 1-")+25));
setBatchMode(true);
StagePositionText = "";
for (s=1; s<= DVStagePositions; s++) {
Ext.setId(ReadDir+"\\"+"stageacc"+toString(s)+"_R3D.dv");
Ext.setSeries(0);
Ext.getMetadataValue("Image 1. Stage coordinates",wtmp);
xtmp = parseFloat(substring(wtmp,indexOf(wtmp,"(")+1,indexOf(wtmp,",")));
ytmp = parseFloat(substring(wtmp,indexOf(wtmp,",")+1,lastIndexOf(wtmp,",")));
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(xtmp/1000,6) + "\n";
XStagePosition[s-1] = xtmp;
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(ytmp/1000,6)+ "\n";
YStagePosition[s-1] = ytmp;
run("Bio-Formats Importer", "open="+ReadDir+"\\"+"stageacc"+toString(s)+"_R3D.dv"+" view=[Standard ImageJ] stack_order=Default");
rename("Position"+toString(s));
resetMinAndMax();
run("Flip Vertically", "stack");
}
}
}
// Checking in Zeiss 510 LSM file format
else if (ReadFormat == "lsm") {
if (File.exists(ReadDir + "\\"+"stageacc.lsm") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"stageacc.lsm");
Ext.getSeriesCount(StagePositions);
StagePositionText = "";
XStagePosition = newArray(3);
YStagePosition = newArray(3);
wtmp = 0;
s = 1;
while (s <= StagePositions) {
Ext.setSeries(s-1);
Ext.getPlanePositionX(wtmp,1);
if (wtmp == 0)
Ext.getSeriesMetadataValue("stageacc #"+toString(s)+" Recording #1 Sample 0X",wtmp);
XStagePosition[s-1] = parseFloat(wtmp)*1000000;
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(wtmp*1000,6) + "\n";
Ext.getPlanePositionY(wtmp,1);
if (wtmp == 0)
Ext.getSeriesMetadataValue("stageacc #"+toString(s)+" Recording #1 Sample 0Y",wtmp);
YStagePosition[s-1] = parseFloat(wtmp)*1000000;
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(wtmp*1000,6)+ "\n";
run("Bio-Formats Importer", "open="+ReadDir+"\\"+"stageacc.lsm"+" autoscale color_mode=Default view=Hyperstack stack_order=XYCZT series_"+toString(s));
rename("Position"+toString(s));
s=s+1;
}
getPixelSize(unit, StageVoxelXY, pixelHeight);
Ext.getPlaneTimingDeltaT(deltaT, 1);
StageTime = parseFloat(deltaT);
Ext.getSeriesMetadataValue("Recording #1 Zoom X",wtmp);
StageZoom = parseFloat(wtmp);
Ext.getSeriesMetadataValue("DetectionChannel #1 Pinhole Diameter",wtmp);
StagePinhole = parseFloat(wtmp);
}
}
// Checking in Zeiss LSM780 file format
else if (ReadFormat == "czi") {
if (File.exists(ReadDir + "\\"+"stageacc.czi") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"stageacc.czi")
Ext.getSeriesCount(StagePositions);
StagePositionText = "";
XStagePosition = newArray(StagePositions);
YStagePosition = newArray(StagePositions);
wtmp = 0;
s = 1;
while (s <= StagePositions) {
Ext.setSeries(s-1);
Ext.getPlanePositionX(wtmp,1);
if (wtmp == 0)
Ext.getMetadataValue("Metadata Experiment ExperimentBlocks AcquisitionBlock AcquisitionModeSetup OffsetX 0",wtmp);
XStagePosition[s-1] = parseFloat(wtmp)*1000;
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(wtmp*1000,6) + "\n";
Ext.getPlanePositionY(wtmp,1);
if (wtmp == 0)
Ext.getMetadataValue("Metadata Experiment ExperimentBlocks AcquisitionBlock AcquisitionModeSetup OffsetY0",wtmp);
YStagePosition[s-1] = parseFloat(wtmp)*1000;
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(wtmp*1000,6)+ "\n";
run("Bio-Formats Importer", "open="+ReadDir+"\\"+"stageacc.czi"+" autoscale color_mode=Default view=Hyperstack stack_order=XYCZT series_"+toString(s));
rename("Position"+toString(s));
s=s+1;
}
getPixelSize(unit, StageVoxelXY, pixelHeight);
StageTime = getNumber("Stage performance: Enter time interval between images [s]", 20.0);
Ext.getMetadataValue("Information|Image|Channel|PinholeSize|0",wtmp);
StagePinhole = parseFloat(wtmp);
Ext.getMetadataValue("Experiment|AcquisitionBlock|AcquisitionModeSetup|ZoomX|0",wtmp);
StageZoom = parseFloat(wtmp);
}
}
// Checking stage images in Nikon ND2 file format
else if (ReadFormat == "nd2"){
if (File.exists(ReadDir + "\\"+"stageacc.nd2") == 1) {
setBatchMode(true);
Ext.setId(ReadDir + "\\"+"stageacc.nd2");
Ext.getSizeZ(StagePositions);
XStagePosition = newArray(StagePositions);
YStagePosition = newArray(StagePositions);
StagePositionText = "";
wtmp = 0;
s = 1;
while (s <= StagePositions) {
Ext.getPlanePositionX(wtmp,s);
XStagePosition[s-1] = parseFloat(wtmp)*1000;
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": X [mm]\t"+ d2s(wtmp/1000,6) + "\n";
Ext.getPlanePositionY(wtmp,s);
YStagePosition[s-1] = parseFloat(wtmp)*1000;
StagePositionText = StagePositionText + "Stage position "+toString(s)+ ": Y [mm]\t"+ d2s(wtmp/1000,6)+ "\n";
s=s+1;
}
run("Bio-Formats Importer", "open="+ReadDir + "\\"+"stageacc.nd2"+" autoscale color_mode=Default split_focal view=[Standard ImageJ] stack_order=Default");
for (s=1; s<=nImages; s++) {
selectWindow("stageacc.nd2 - Z="+toString(s-1));
rename("Position"+toString(s));
minTemp=100000;
maxTemp=0;
for (t=1;t<=nSlices; t++) {
setSlice(t);
getStatistics(area, mean, min, max);
if (min < minTemp)
minTemp = min;
if (max > maxTemp)
maxTemp = max;
}
setMinAndMax(minTemp, maxTemp);
run("8-bit");
}
getPixelSize(unit, StageVoxelXY, pixelHeight);
Ext.getMetadataValue("dAvgPeriodDiff",wtmp);
StageTime = parseFloat(wtmp)/1000;
Ext.getMetadataValue("PinholeSize",wtmp);
StagePinhole = parseFloat(wtmp);
Ext.getMetadataValue("ImagingZoom",wtmp);
StageZoom = parseFloat(wtmp);
}
}
// Checking for stage images TIF files and manually enter the required parameters
else if (ReadFormat == "tif"){
if (File.exists(ReadDir + "\\"+"stageacc1.tif") == 1) {
StageVoxelXY = getNumber("XY stage accuracy: Enter XY pixelsize [um]", 0.1);
StageZoom = getNumber("XY stage accuracy: Enter Zoom Factor", 16.0);
StageTime = getNumber("XY stage accuracy: Enter time interval between images [s]", 20.0);
StagePinhole = getNumber("XY stage accuracy: Enter pinhole diameter [airy units]", 1);
QueryStagePositions = 1;
for (st=2; st <= 3; st++){
if (File.exists(ReadDir + "\\"+"stageacc"+toString(st)+".tif") == 1)
QueryStagePositions = QueryStagePositions + 1;
}
setBatchMode(true);
XStagePosition = newArray(QueryStagePositions);
YStagePosition = newArray(QueryStagePositions);
StagePositionText = "";
for (st=1; st <= QueryStagePositions; st++){
open(ReadDir + "\\"+"stageacc"+toString(st)+".tif");
rename("Position"+toString(st));
StagePositionText = StagePositionText + "Stage position "+toString(st)+ ": X [mm]\t"+ "---\n";
StagePositionText = StagePositionText + "Stage position "+toString(st)+ ": Y [mm]\t"+ "---\n";
XStagePosition[st-1] = 0;
YStagePosition[st-1] = 0;
}
}
}
// open stage images in any other file format supported by LOCI and manually enter the required parameters
else {
}
// if stage images present continue with processing
if (nImages > 0) {
print("\nMeasurement XY stage accuracy");
print("------------------------------------------------------ \n");
print("XY dimension [um]:" ,"\t" ,d2s(StageVoxelXY,3));
print("Zoom Factor :" , "\t" , d2s(StageZoom,2));
if (ReadFormat == "czi" || ReadFormat == "lsm" || ReadFormat == "nd")
print("Pinhole diameter [um]:", "\t", d2s(StagePinhole,3));
else
print("Pinhole diameter [airy]:", "\t", d2s(StagePinhole,3));
print("Time interval [s]:","\t", toString(StageTime));
print("Number of repeats:","\t", nSlices);
print("\n");
StagePositions = nImages;
XYMaxDimension = getWidth()*StageVoxelXY;
XCoordArray = newArray(nSlices);
YCoordArray = newArray(nSlices);
XCoordArrayAll = newArray(nSlices*StagePositions);
YCoordArrayAll = newArray(nSlices*StagePositions);
IntensityArrayAll = newArray(nSlices*StagePositions);
DistanceArrayAll = newArray(nSlices*StagePositions);
XmeanArray = newArray(1);
YmeanArray = newArray(1);
XstdDevArray = newArray(1);
YstdDevArray = newArray(1);
IntensityArray = newArray(nSlices);
TimeArray = newArray(nSlices);
LaserArray = newArray(nImages);
TimePoints = nSlices;
print(StagePositionText+"\n");
for (i=1; i<=StagePositions; i++) {
selectWindow("Position"+toString(i));
for (t=1; t<= TimePoints; t++) {
selectWindow("Position"+toString(i));
setSlice(t);
getStatistics(area, mean, min, max, std, histogram);
SliceThreshold = round(max/2);
TrackedBeadStats(SliceThreshold);
XCoordArray[t-1] = Centroid2D[0]*StageVoxelXY;
XCoordArrayAll[(t-1)+(i-1)*nSlices] = Centroid2D[0]*StageVoxelXY;
IntensityArray[t-1] = ImageStats[2];
IntensityArrayAll[(t-1)+(i-1)*nSlices] = ImageStats[2];
YCoordArray[t-1] = XYMaxDimension - Centroid2D[1]*StageVoxelXY;
YCoordArrayAll[(t-1)+(i-1)*nSlices] = XYMaxDimension - Centroid2D[1]*StageVoxelXY;
TimeArray[t-1] = (t-1)*StageTime/60;
}
// Generate plots of XY coordinates of bead at different timepoints; red dot marks mean XY coordinates; rectangle +/- StdDev for X and Y
Array.getStatistics(XCoordArray, min, max, mean, stdDev);
XmeanArray[0] = mean;
XstdDevArray[0] = stdDev;
print("Bead position "+toString(i)+ ": Repeatability X mean [um ]", "\t", d2s(mean,3));
print("Bead position "+toString(i)+ ": Repeatability X StdDev [um ]", "\t", d2s(stdDev,3));
Array.getStatistics(YCoordArray, min, max, mean, stdDev);
YmeanArray[0] = mean;
YstdDevArray[0] = stdDev;
print("Bead position "+toString(i)+ ": Repeatability Y mean [um ]", "\t", d2s(mean,3));
print("Bead position "+toString(i)+ ": Repeatability Y StdDev [um ]", "\t", d2s(stdDev,3));
print("\n");
run("Profile Plot Options...", "width=400 height=400 minimum="+toString(XmeanArray[0]-6*XstdDevArray[0])+" maximum="+toString(XmeanArray[0]+6*XstdDevArray[0])+" draw");
Plot.create("Stageposition"+toString(i), "X [um]", "Y [um]");
Plot.setLimits(XmeanArray[0]-6*XstdDevArray[0], XmeanArray[0]+6*XstdDevArray[0],YmeanArray[0]-6*XstdDevArray[0], YmeanArray[0]+6*XstdDevArray[0]);
Plot.setLineWidth(8);
Plot.setColor("red");
Plot.add("dots", XmeanArray, YmeanArray);
Plot.setLineWidth(1);
Plot.drawLine(XmeanArray[0]-XstdDevArray[0], YmeanArray[0]-YstdDevArray[0], XmeanArray[0]+XstdDevArray[0], YmeanArray[0]-YstdDevArray[0]);
Plot.drawLine(XmeanArray[0]+XstdDevArray[0], YmeanArray[0]-YstdDevArray[0],XmeanArray[0]+XstdDevArray[0] , YmeanArray[0]+YstdDevArray[0]);
Plot.drawLine(XmeanArray[0]+XstdDevArray[0], YmeanArray[0]+YstdDevArray[0],XmeanArray[0]-XstdDevArray[0] , YmeanArray[0]+YstdDevArray[0]);
Plot.drawLine(XmeanArray[0]-XstdDevArray[0], YmeanArray[0]+YstdDevArray[0],XmeanArray[0]-XstdDevArray[0] , YmeanArray[0]-YstdDevArray[0]);
Plot.setLineWidth(1);
Plot.setColor("black");
Plot.add("crosses", XCoordArray, YCoordArray);
Plot.setColor("black");
Text = toString("Position "+toString(i));
Plot.addText(Text, 0.01,0.07);
Plot.show;
selectWindow("Stageposition"+toString(i));
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText + "_StageAccuracy_Position"+toString(i)+"_XYplot.tif");
if (UpdateWWWSite == true)
saveAs("jpeg", WWWDir + "\\"+SystemName +"_" + MagText + "x_" + NAText + "_" + DateText + "_StageAccuracy_Position"+toString(i)+"_XYplot.jpg");
run("Close");
// Generate intensity plots with different colours for each position
Array.getStatistics(IntensityArray, min, max, mean, std);
if (i==1){
dvMin = mean-0.3*mean;
dvMax = mean+0.3*mean;
}
if (ReadFormat == "dv")
run("Profile Plot Options...", "width=600 height=255 minimum="+toString(dvMin)+" maximum="+toString(dvMax)+" fixed interpolate draw");
else
run("Profile Plot Options...", "width=600 height=255 minimum=0 maximum=255 fixed interpolate draw");
Plot.create("Stageposition"+toString(i), "Time [min]", "Intensity");
if (ReadFormat == "dv")
Plot.setLimits(0, TimePoints*StageTime/60, dvMin, dvMax);
else
Plot.setLimits(0, TimePoints*StageTime/60, 0, 255);
Plot.setColor(TextColour[i]);
Plot.setLineWidth(2);
Plot.add("curve", TimeArray, IntensityArray);
Text = toString("Position "+toString(i));
Plot.addText(Text, 0.01,0.07+i*0.05);
Plot.show;
}
// Merge plots and images and save result images
j=1;
do {
imageCalculator("AND", "Stageposition1","Stageposition"+toString(j));
j=j+1;
}
while (j<= StagePositions);
j=1;
do {
j=j+1;
imageCalculator("Max create stack", "Position1", "Position"+toString(j));
rename("Position1temp");
selectWindow("Position1");
close();
selectWindow("Position1temp");
rename("Position1");
}
while (j< StagePositions);
selectWindow("Stageposition1");
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText +"_StageAccuracy_Bead_intensity.tif");
selectWindow("Position1");
saveAs("Tiff", ReadDir + "\\"+SystemName + "_" + MagText + "x_" + NAText + "_" + DateText + "_StageAccuracy_Bead_images.tif");
while (nImages > 0)
close();
// Calculate distances between bead centroids and save as text file
for (i=0; i 0)
close();
BeadMovement = 0;
BeadError = 0;
if (StagePositions == 2){
StageMovement = CalculateDistance(XStagePosition[0],YStagePosition[0], XStagePosition[1],YStagePosition[1]);
print("Distance between stage positions [um]:\t", d2s(StageMovement,3));
for (i=0; i
\n";
if (StagePositions == 2)
WWWBeadAccString = WWWBeadAccString+" | \n";
}
stageacc_analysis = 1;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// End XY stage accuracy measurements
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Summary of checks performed and saving of measurement text (log) file
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// close unused windows
list = getList("window.titles");
if (list.length > 0) {
for (i=0; i\n";
if (axial_analysis == 1)
WWWAmendString = WWWAmendString + WWWAxialString;
else
WWWAmendString = WWWAmendString + " | \n | \n";
if (bead_analysis == 1)
WWWAmendString = WWWAmendString + WWWBeadString;
else
WWWAmendString = WWWAmendString + " | \n | \n | \n";
if (field_analysis == 1)
WWWAmendString = WWWAmendString + WWWFieldString;
else
WWWAmendString = WWWAmendString + " | \n | \n | \n | \n";
if (psf_analysis == 1)
WWWAmendString = WWWAmendString + WWWPsfString;
else
WWWAmendString = WWWAmendString + " | \n | \n | \n | \n";
if (grid_analysis == 1)
WWWAmendString = WWWAmendString + WWWGridString;
else
WWWAmendString = WWWAmendString + " | \n";
if (zgalvo_analysis == 1)
WWWAmendString = WWWAmendString + WWWZgalvoString;
else
WWWAmendString = WWWAmendString + " | \n";
if (lambda_analysis == 1)
WWWAmendString = WWWAmendString + WWWLambdaString;
else
WWWAmendString = WWWAmendString + " | \n";
if (laser_analysis == 1)
WWWAmendString = WWWAmendString + WWWLaserString;
else
WWWAmendString = WWWAmendString + " | \n | \n | \n | \n | \n | \n";
if (stage_analysis == 1)
WWWAmendString = WWWAmendString + WWWBeadRepeatString;
else
WWWAmendString = WWWAmendString + " | \n | \n | \n | \n";
if (stageacc_analysis == 1)
WWWAmendString = WWWAmendString + WWWBeadAccString;
else
WWWAmendString = WWWAmendString + " | \n | \n | \n | \n";
WWWAmendString = WWWAmendString + "