From 7de5fffce2ed46cd28e35b78c20a9b48546c339b Mon Sep 17 00:00:00 2001 From: Florian Vollrath <florian.vollrath@brain.mpg.de> Date: Fri, 5 May 2023 14:47:12 +0200 Subject: [PATCH] cleaned mybfopenOnlyMetaData and added original authors --- bfmatlab/mybfopenOnlyMetaData.m | 244 +++++++++++--------------------- 1 file changed, 86 insertions(+), 158 deletions(-) diff --git a/bfmatlab/mybfopenOnlyMetaData.m b/bfmatlab/mybfopenOnlyMetaData.m index 0a51b1b..c33f75a 100644 --- a/bfmatlab/mybfopenOnlyMetaData.m +++ b/bfmatlab/mybfopenOnlyMetaData.m @@ -1,31 +1,21 @@ -function [metadatastruct] = mybfopenOnlyMetaData( fileName, varargin ) +function [metadatastruct] = mybfopenOnlyMetaData( fileName) +% Extracts Meta Data from files +% 27.05.2013 (Version 1.0) +% Authors: +% Andre Zeug (zeug.andre@mh-hannover.de) +% Malte Butzlaff (Butzlaff.Malte@mh-hannover.de) +% +% This software is for non-commercial use only. %% parsing imput parameters p = inputParser; p.StructExpand = true; % if we allow parameter structure expanding -%p.CaseSensitivity = false; % enables or disables case-sensitivity when matching entries in the argument list with argument names in the schema. Default, case-sensitive matching is disabled (false). p.KeepUnmatched = true; % controls whether MATLAB throws an error (false) or not (true) when the function being called is passed an argument that has not been defined in the inputParser schema for this file. -% p.FunctionName = ['mybfopen v.' mybfopen_version ' (' mybfopen_date ')']; % stores a function name that is to be included in error messages that might be thrown in the process of validating input arguments to the function. p.addParameter('verbose' , true , @(x)(islogical(x) || any(x==[0 1 2]))); p.addParameter('gui' , true , @(x)(islogical(x) || any(x==[0 1 2 3]))); p.addParameter('timestamp' , false , @(x)(isnumeric(x))); -%p.addParamValue('img_first' , false , @(x)(islogical(x) || (isscalar(x) && x>=0 && mod(x,1)==0))); -%p.addParamValue('img_last' , false , @(x)(islogical(x) || (isscalar(x) && x>=0 && mod(x,1)==0))); -p.parse(varargin{:}); par = p.Results; - -% setting clock -if par.verbose - if ~par.timestamp - par.timestamp = tic; - end - t1 = toc(par.timestamp); % starts timer for verbose -end -% fprintf('\n') -% if par.verbose; t1 = output(sprintf('mybfopen: Start mybfopen v. %s (%s)!',... -% mybfopen_version ,mybfopen_date), whos, toc(par.timestamp), t1); end - % add unmached structure elements s = fieldnames(p.Unmatched); for n=1:length(s) @@ -40,22 +30,20 @@ if (nargin == 0) else par.fname = fileName; %[pwd '\' fileName]; % require to replace since receive error when fileName contains full path end -% if par.verbose; t1 = output(sprintf('mybfopen: read file ''%s''',fileName), whos, toc(par.timestamp), t1); end jPath = javaclasspath('-all'); isLociTools = cellfun(@(x) ~isempty(regexp(x, '.*bioformats_package.jar$', 'once')),jPath); -if ~any(isLociTools); +if ~any(isLociTools) locipath = which('bioformats_package.jar'); if isempty(locipath) locipath = fullfile(fileparts(mfilename('fullpath')), 'bioformats_package.jar'); end assert(exist(locipath, 'file') == 2, 'Cannot automatically locate bioformats_package.jar'); - + % Add loci_tools to dynamic Java class path javaaddpath(locipath); -% if par.verbose; t1 = output('mybfopen: added ''bioformats_package.jar'' to java path', whos, toc(par.timestamp), t1); end + % if par.verbose; t1 = output('mybfopen: added ''bioformats_package.jar'' to java path', whos, toc(par.timestamp), t1); end end -% if par.verbose; t1 = output('mybfopen: generate loci class object', whos, toc(par.timestamp), t1); end % Create a loci.formats.ReaderWrapper object r = javaObject('loci.formats.ChannelSeparator', ... @@ -64,7 +52,6 @@ r = javaObject('loci.formats.ChannelSeparator', ... OMEXMLService = javaObject('loci.formats.services.OMEXMLServiceImpl'); r.setMetadataStore(OMEXMLService.createOMEXMLMetadata()); r.setId(par.fname); -% if par.verbose; t1 = output('mybfopen: file opened', whos, toc(par.timestamp), t1); end % extract metadata table for this series metadataOME = r.getMetadataStore(); @@ -75,147 +62,89 @@ iDZ = metadataOME.getPixelsSizeZ(0).getValue(); iDT = metadataOME.getPixelsSizeT(0).getValue(); imageDims = [iDY iDX iDZ iDC iDT]; numImages = r.getImageCount(); -% if par.verbose; t1 = output('mybfopen: main parameter read, start data reading', whos, toc(par.timestamp), t1); end -% Get pixel information (type, etc.) -pixelType = r.getPixelType(); -bpp = javaMethod('getBytesPerPixel', 'loci.formats.FormatTools', pixelType); -fp = javaMethod('isFloatingPoint', 'loci.formats.FormatTools', pixelType); -sgn = javaMethod('isSigned', 'loci.formats.FormatTools', pixelType); -if sgn - stopHere -end -little = r.isLittleEndian(); -% set data format according to bit depth -switch bpp - case 1; classstr = 'uint8'; - case 2; classstr = 'uint16'; - case 4; classstr = 'uint32'; - case 8; classstr = 'uint64'; -end -% allocating memory for data -% data = zeros(imageDims, classstr); -% calc bytes per image plane -% imb = bpp*iDX*iDY/1024/1024; -% generate progress bar -% if par.gui, -% h = waitbar(0,'Please wait...','Name','mybfopen: Wait for data reading!'); -% iiw = 0; iio = 0; tw = toc(par.timestamp); tr1 = tw; -% end; -% data import loop -% for ii = 1:numImages -% % update waitbar (in steps of 1%) -% if par.gui && 100*ii/numImages>iiw, -% tr = toc(par.timestamp) - tw; -% tre = tr/ii*numImages; -% waitbar(ii/numImages,h,... -% {sprintf('Import frame: %d / %d (%0.0f%%)',ii,numImages,100*ii/numImages);... -% sprintf('data read: % 8.2f MB/s, Time: %02d:%02d / %02d:%02d min',imb*(ii-iio)/(tr-tr1),floor(tr/60),floor(60*(tr/60 - floor(tr/60))),floor(tre/60),floor(60*(tre/60 - floor(tre/60))))}); -% iiw = iiw + 1; iio = ii; tr1 = tr; -% end; - % get image -% plane = r.openBytes(ii - 1, 0, 0, iDX, iDY); -% arr = javaMethod('makeDataArray', 'loci.common.DataTools', plane, bpp, fp, little); -% zct = r.getZCTCoords(ii - 1) + 1; -% % store image in matrix -% data(:,:,zct(1),zct(2),zct(3)) = reshape(typecast(arr, classstr),[iDX iDY])'; -% end -% if par.gui, delete(h); drawnow; end; -% if par.verbose; t1 = output('mybfopen: data reading finished', whos, toc(par.timestamp), t1); end -%data = reshape(data, imageDims); %% transfer output -nout = max(nargout,1)-1; -if 1>0, - tt = par.fname; - tte=regexpi(tt,'/|\'); - ttp=regexpi(tt,'\.'); - if ~isempty(tte) - if any(ttp>tte(end)) - tt = tt(tte(end)+1:ttp(end)-1); - else - tt = tt(tte(end)+1:end); - end - end -% if par.verbose; t1 = output('mybfopen: start list metadata reading', whos, toc(par.timestamp), t1); end - %% metadataList - metadataList = r.getGlobalMetadata(); - metadataKeys = metadataList.keySet().iterator(); - if metadataList.size()>0 - % LA files contain no metadatalist - % but Andor iQ and Zeiss ZEN do - iic = 0; - for ii=1:metadataList.size() - iic = iic + 1; - try - key = metadataKeys.nextElement(); - info.list{iic,1} = strrep(key,[tt ' '],''); - info.list{iic,2} = metadataList.get(key); - catch - info.list(iic,:)=[]; - iic = iic - 1; - end - end - [~,ind] = sort(info.list(:,1)); - info.list = info.list(ind,:); -% if par.verbose; t1 = output('mybfopen: metadata list sorted, generate structure', whos, toc(par.timestamp), t1); end - % generate structure out of list info - str = []; - for ii =1:size(info.list,1) - str = getStruckt(str, regexprep(regexprep(regexprep(info.list{ii,1},'\|',' '),'((?!\s)\W)',''),'\s*',' '), info.list{ii,2}); - % (?!test)expr => Match expr and do not match test. - % \s: any whitespace character - % \W: Any character that is not alphabetic, numeric, or underscore. (equivalent to [^a-zA-Z_0-9]) - end - info.liststr = str; -% if par.verbose; t1 = output('mybfopen: metadata list structure generate, read OME timestamp', whos, toc(par.timestamp), t1); end +tt = par.fname; +tte=regexpi(tt,'/|\'); +ttp=regexpi(tt,'\.'); +if ~isempty(tte) + if any(ttp>tte(end)) + tt = tt(tte(end)+1:ttp(end)-1); else - info.list{1,1} = 'no key'; - info.list{1,2} = 'no value'; - info.liststr = 'Empty'; + tt = tt(tte(end)+1:end); end - %% metadataOME - % read timestamp from OME data - Ts = zeros(numImages,1); - try - for nn=1:numImages; - Ts(nn) = metadataOME.getPlaneDeltaT(0,nn-1).value(); %remove .value() when using older versions of bioformats - end - info.Ts = reshape(Ts,[imageDims(3:end)]); - info.TimeStamp = squeeze(info.Ts(1,1,:));%-info.Ts(1,1,1)); % time in seconds - info.TStxt = 'TimeStamp for each frame'; - catch - if nn>1 - switch nn-1 - case iDT - info.Ts = Ts(1:nn-1); - info.TimeStamp = squeeze(info.Ts); - info.TStxt = 'TimeStamp for each timepoint'; - case iDT*iDZ - info.Ts = reshape(Ts(1:nn-1),[iDZ iDT]); - info.TimeStamp = squeeze(info.Ts(1,:));%-info.Ts(1,1,1)); % time in seconds - info.TStxt = 'TimeStamp for each z-section and timepoint'; - case iDT*iDZ*iDC - info.Ts = reshape(Ts(1:nn-1),[iDC iDZ iDT]); - info.TimeStamp = squeeze(info.Ts(1,1,:));%-info.Ts(1,1,1)); % time in seconds - info.TStxt = 'TimeStamp for each channel, z-section and timepoint'; - end - else - info.Ts = 0; - info.TimeStamp = 0; - info.TStxt = 'No TimeStamp found.'; - warning('File contains no time information') +end + +%% metadataList +metadataList = r.getGlobalMetadata(); +metadataKeys = metadataList.keySet().iterator(); +if metadataList.size()>0 + % LA files contain no metadatalist + % but Andor iQ and Zeiss ZEN do + iic = 0; + for ii=1:metadataList.size() + iic = iic + 1; + try + key = metadataKeys.nextElement(); + info.list{iic,1} = strrep(key,[tt ' '],''); + info.list{iic,2} = metadataList.get(key); + catch + info.list(iic,:)=[]; + iic = iic - 1; end end - info.OME = metadataOME; - varargout(1) = {info}; - metadatastruct=info -% if par.verbose; t1 = output('mybfopen: 2nd output transfered', whos, toc(par.timestamp), t1); end + [~,ind] = sort(info.list(:,1)); + info.list = info.list(ind,:); + % generate structure out of list info + str = []; + for ii =1:size(info.list,1) + str = getStruckt(str, regexprep(regexprep(regexprep(info.list{ii,1},'\|',' '),'((?!\s)\W)',''),'\s*',' '), info.list{ii,2}); + % (?!test)expr => Match expr and do not match test. + % \s: any whitespace character + % \W: Any character that is not alphabetic, numeric, or underscore. (equivalent to [^a-zA-Z_0-9]) + end + info.liststr = str; +else + info.list{1,1} = 'no key'; + info.list{1,2} = 'no value'; + info.liststr = 'Empty'; end -if nout>1, - % parameter list output - varargout(2) = {par}; -% if par.verbose; t1 = output('mybfopen: 3rd output transfered', whos, toc(par.timestamp), t1); end +%% metadataOME +% read timestamp from OME data +Ts = zeros(numImages,1); +try + for nn=1:numImages + Ts(nn) = metadataOME.getPlaneDeltaT(0,nn-1).value(); %remove .value() when using older versions of bioformats + end + info.Ts = reshape(Ts,[imageDims(3:end)]); + info.TimeStamp = squeeze(info.Ts(1,1,:));%-info.Ts(1,1,1)); % time in seconds + info.TStxt = 'TimeStamp for each frame'; +catch + if nn>1 + switch nn-1 + case iDT + info.Ts = Ts(1:nn-1); + info.TimeStamp = squeeze(info.Ts); + info.TStxt = 'TimeStamp for each timepoint'; + case iDT*iDZ + info.Ts = reshape(Ts(1:nn-1),[iDZ iDT]); + info.TimeStamp = squeeze(info.Ts(1,:));%-info.Ts(1,1,1)); % time in seconds + info.TStxt = 'TimeStamp for each z-section and timepoint'; + case iDT*iDZ*iDC + info.Ts = reshape(Ts(1:nn-1),[iDC iDZ iDT]); + info.TimeStamp = squeeze(info.Ts(1,1,:));%-info.Ts(1,1,1)); % time in seconds + info.TStxt = 'TimeStamp for each channel, z-section and timepoint'; + end + else + info.Ts = 0; + info.TimeStamp = 0; + info.TStxt = 'No TimeStamp found.'; + warning('File contains no time information') + end end + +info.OME = metadataOME; +metadatastruct=info; % close file r.close(); % inline function for structure generation from metadatalist @@ -236,7 +165,6 @@ r.close(); end else if regexp(tt(1:tt_pos(1)-1),'^\d*$') % checks if tt is numerical - %str.(['no' tt(1:tt_pos(1)-1)]) = getStruckt(str, tt(tt_pos(1)+1:end), content); ttn = ['no' tt(1:tt_pos(1)-1)]; else ttn = tt(1:tt_pos(1)-1); -- GitLab