function gyTestAllBF(fname,dFLIMImageData,dFLIMXYTData,dFLIMHistoData) % dFLIM.ome.tif format % save a single dFLIM acquisition (contents of a .dFLIM.mat file) to % the OME-Tiff format. % series 0 = dFLIM_Image (XYCTZ, with subchannels of C) % series 1 = dFLIM_XYT (XYtCZ) % series 2 = dFLIM_Histo (xyCTZ, where x=t and y=1) %% first figure out the sizes and numbers to be saved sz=size(dFLIMImageData); % number of Z slices szZ=1; % for test % number of dFLIM channels nChan=size(dFLIMImageData,1)/3; % for test % size of images szX = size(dFLIMImageData{1,1},1); szY = size(dFLIMImageData{1,1},2); nFrames = size(dFLIMImageData,2); % histo info nBins = numel(dFLIMHistoData{1,1}); % XYT available? xytAvail = ~isempty(dFLIMXYTData); tic; %% Create metadata % Fix from Ian Munro for duplicate XML writing java.lang.System.setProperty('javax.xml.transform.TransformerFactory', ... 'com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl'); % global state toInt = @(x) ome.xml.model.primitives.PositiveInteger(java.lang.Integer(x)); OMEXMLService = loci.formats.services.OMEXMLServiceImpl(); metadata = OMEXMLService.createOMEXMLMetadata(); metadata.createRoot(); dimensionOrderEnumHandler = ome.xml.model.enums.handlers.DimensionOrderEnumHandler(); experimentTypeEnumHandler = ome.xml.model.enums.handlers.ExperimentTypeEnumHandler(); experimentType = experimentTypeEnumHandler.getEnumeration('FluorescenceLifetime'); pixelTypeEnumHandler = ome.xml.model.enums.handlers.PixelTypeEnumHandler(); dimOrder = {'XYCTZ', 'XYTCZ', 'XYCTZ'}; % by series for series=0:2 sSeries=num2str(series); metadata.setImageID(['Image:' sSeries], series); metadata.setPixelsID(['Pixels:' sSeries], series); metadata.setPixelsBinDataBigEndian (java.lang.Boolean.TRUE, series, 0); % (java.lang.Boolean.TRUE, 0, 0); NOT SURE ABOUT THIRD PARAMETER USAGE % Set dimension order and experiment type for the series dimensionOrder = dimensionOrderEnumHandler.getEnumeration(dimOrder{series+1}); % GY (ip.Results.dimensionOrder); metadata.setPixelsDimensionOrder(dimensionOrder, series); if series==0 metadata.setExperimentType(experimentType,series); % TODO - duplicated header string % metadata.setExperimenterID(state.dFLIM.filename,0); metadata.setExperimentID('dFLIM_v2.1', series); metadata.setExperimentDescription('short description to save space', series); %dF_makeheaderstr, series); end % Set pixels type if series==2 pixelsType = pixelTypeEnumHandler.getEnumeration('double'); else pixelsType = pixelTypeEnumHandler.getEnumeration('uint16'); end metadata.setPixelsType(pixelsType, series); switch series case 0 % dFLIMImages szXYZCT = [szX szY szZ 3*nChan nFrames]; case 1 % XYT if xytAvail szXYZCT = [szX szY szZ nChan nBins]; else szXYZCT = [0 0 0 0 0]; end case 2 % Histos szXYZCT = [nBins 1 szZ nChan nFrames]; end % switch series (size assignment) metadata.setPixelsSizeX(toInt(szXYZCT(1)), series); metadata.setPixelsSizeY(toInt(szXYZCT(2)), series); metadata.setPixelsSizeZ(toInt(szXYZCT(3)), series); metadata.setPixelsSizeC(toInt(szXYZCT(4)), series); metadata.setPixelsSizeT(toInt(szXYZCT(5)), series); % Set channels ID and samples per pixel suffix={':img' ':nmg' ':tmg'}; for i = 1:nChan chID = num2str((i),'%02i'); if series==0 for j=1:3 ch = (i-1)*3+j-1; chname = ['dChannel:' chID suffix{j}]; % chname = ['Channel:' chID(2) ':' num2str(j-1)]; metadata.setChannelID(chname, series, ch); % (['Channel:0:' num2str(i-1)], 0, i-1); metadata.setChannelFluor(chname, series, ch); metadata.setChannelSamplesPerPixel(toInt(1), series, ch); end else ch = (i-1); chname = ['dChannel:' chID ]; metadata.setChannelID(chname, series, ch); % (['Channel:0:' num2str(i-1)], 0, i-1); metadata.setChannelFluor(chname, series, ch); metadata.setChannelSamplesPerPixel(toInt(1), series, ch); end end % for channels avail end % for series %% metadata are created, now write the metadata and the data % Create ImageWriter writer = loci.formats.ImageWriter(); writer.setWriteSequentially(true); writer.setMetadataRetrieve(metadata); % available compression 'JPEG' 'JPEG-2000' 'JPEG-2000 Lossy' 'LZW' 'Uncompressed' 'zlib' writer.setCompression('LZW'); writer.getWriter(fname).setBigTiff(true); writer.setId(fname); % fix suggested by Sebastien and Melissa ifd = loci.formats.tiff.IFD(); disp(ifd.getIFDValue(ifd.ROWS_PER_STRIP)); ifd.putIFDValue(ifd.ROWS_PER_STRIP, szY); owriter = writer.getWriter(fname); verbose=0; %% SERIES 0 [dFLIM_Images] % define the data conversion getBytes = @(x) loci.common.DataTools.shortsToBytes(x(:), 0); owriter.setSeries(0); index=0; for z=1:szZ for frame=1:nFrames for ch=1:nChan infostr=['DFI: z=' num2str(z) '/' num2str(szZ) '; ' ... 'fr=' num2str(frame) '/' num2str(nFrames) '; ' ... 'dChannel=' num2str(ch) ' [' num2str(ch) '/' num2str(nChan) ']; ']; if verbose, disp([num2str(index) ' ' infostr]); end % first the .img owriter.saveBytes(index, getBytes(uint16(dFLIMImageData{3*ch-2,frame}')),ifd); index=index+1; % then the .nmg owriter.saveBytes(index, getBytes(uint16(dFLIMImageData{3*ch-1,frame}')),ifd); index=index+1; % then the .adjusted tmg owriter.saveBytes(index, getBytes(uint16(dFLIMImageData{3*ch-0,frame}')),ifd); index=index+1; end end end %% SERIES 1 [dFLIM_XYTs] % define the data conversion getBytes = @(x) loci.common.DataTools.shortsToBytes(x(:), 0); % owriter.setId([fname0 '_XYT.ome.tif']); % (outputPath); owriter.setSeries(1); index=0; for z=1:szZ for ch=1:nChan for bin=1:nBins infostr=['XYT: z=' num2str(z) '/' num2str(szZ) '; ' ... 'bin=' num2str(bin) '/' num2str(nBins) '; ' ... 'dChannel=' num2str(ch) ' [' num2str(ch) '/' num2str(nChan) ']; ']; if verbose, disp([num2str(index) ' ' infostr]); end % extract the xy plane for this bin plane = uint16(dFLIMXYTData{ch}(:,:,bin)); % not bothering to flip xy here owriter.saveBytes(index, getBytes(plane(:)),ifd); index=index+1; end end end %% SERIES 2 [dFLIM_Histos] % define the data conversion getBytes = @(x) loci.common.DataTools.doublesToBytes(x(:), 0); % owriter.setId([fname0 '_Histos.ome.tif']); % (outputPath); owriter.setSeries(2); index=0; for z=1:szZ for frame=1:nFrames for ch=1:nChan % get the histo data structure (not shifted!!) dfh = dFLIMHistoData{ch,frame}; infostr=['Histo: z=' num2str(z) '/' num2str(szZ) '; ' ... 'fr=' num2str(frame) '/' num2str(nFrames) '; ' ... 'dChannel=' num2str(ch) ' [' num2str(ch) '/' num2str(nChan) ']; ']; if verbose, disp([num2str(index) ' ' infostr]); end % write the "xy plane" for this histo owriter.saveBytes(index, getBytes(dfh)); index=index+1; end end end owriter.close(); toc; end % function [dF_saveDataToOMETiff]