Changeset 197


Ignore:
Timestamp:
Feb 27, 2012, 3:39:09 PM (7 years ago)
Author:
tjniskan
Message:
  • The 2DSEQ file support in aedes_readbruker.m now uses the visu_pars header file to read the data instead of the depricated D3PROC file.
  • Added Bruker data support to aedes_headerbrowser.m

M aedes_readbruker.m
M aedes_headerbrowser.m
M aedes_revision.m

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • aedes_headerbrowser.m

    r173 r197  
    5454  Dat.FavList.vnmr = {};
    5555  Dat.FavList.dcm = {};
     56        Dat.FavList.bruker_reco = {};
     57        Dat.FavList.bruker_raw = {};
    5658  Dat.FavList.genheader = {};
    5759  Dat.FavList.generic = {};
     
    6870        Dat.FavouriteList = Dat.FavList.nifti;
    6971      catch
    70         Dat.FavList.nifti = {}
     72        Dat.FavList.nifti = {};
    7173        Dat.FavouriteList = Dat.FavList.nifti;
    7274      end
     
    8082        Dat.FavouriteList = Dat.FavList.vnmr;
    8183      catch
    82         Dat.FavList.vnmr = {}
     84        Dat.FavList.vnmr = {};
    8385        Dat.FavouriteList = Dat.FavList.vnmr;
    8486      end
     
    9294        Dat.FavouriteList = Dat.FavList.dcm;
    9395      catch
    94         Dat.FavList.dcm = {}
     96        Dat.FavList.dcm = {};
    9597        Dat.FavouriteList = Dat.FavList.dcm;
    9698      end
    9799      inStruct=inStruct.HDR.FileHeader;
    98100     
     101                elseif strcmpi(inStruct.DataFormat,'bruker_reco')
     102                        % Bruker 2DSEQ files
     103                        Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
     104                        Dat.FileFormatName = 'Bruker 2DSEQ';
     105                        try
     106                                Dat.FavouriteList = Dat.FavList.bruker_reco;
     107                        catch
     108                                Dat.FavList.bruker_reco = {};
     109                                Dat.FavouriteList = Dat.FavList.bruker_reco;
     110                        end
     111                        inStruct=inStruct.HDR.FileHeader;
     112                       
     113                elseif strcmpi(inStruct.DataFormat,'bruker_raw')
     114                        % Bruker Raw FID files
     115                        Dat.HeaderFileName = [inStruct.HDR.fpath,inStruct.HDR.fname];
     116                        Dat.FileFormatName = 'Bruker FID';
     117                        try
     118                                Dat.FavouriteList = Dat.FavList.bruker_raw;
     119                        catch
     120                                Dat.FavList.bruker_raw = {};
     121                                Dat.FavouriteList = Dat.FavList.bruker_raw;
     122                        end
     123                        inStruct=inStruct.HDR.FileHeader;
     124                       
    99125    else
    100126      % Generic header
     
    104130        Dat.FavouriteList = Dat.FavList.genheader;
    105131      catch
    106         Dat.FavList.genheader = {}
     132        Dat.FavList.genheader = {};
    107133        Dat.FavouriteList = Dat.FavList.genheader;
    108134      end
     
    117143      Dat.FavouriteList = Dat.FavList.genheader;
    118144    catch
    119       Dat.FavList.genheader = {}
     145      Dat.FavList.genheader = {};
    120146      Dat.FavouriteList = Dat.FavList.genheader;
    121147    end
     
    129155    Dat.FavouriteList = Dat.FavList.generic;
    130156  catch
    131     Dat.FavList.generic = {}
     157    Dat.FavList.generic = {};
    132158    Dat.FavouriteList = Dat.FavList.generic;
    133159  end
     
    506532              str = [str,sep,'''',cVal{kk},''''];
    507533            elseif isnumeric(cVal{kk}) || islogical(cVal{kk})
    508               if ndims(cVal{kk})>1
     534              if ~all(size(cVal{kk})==1)
    509535                tmp_str = regexprep(regexprep(mat2str(size(cVal{kk})),'\s','x'),'\]$',' matrix]');
    510536                str = [str,sep,tmp_str];
  • aedes_readbruker.m

    r196 r197  
    277277% Read Header files -------------------------
    278278
    279 % Read d3proc file
     279% Read visu_pars file
     280visu_pars_file = [fp,filesep,'visu_pars'];
     281if exist(visu_pars_file,'file')==2
     282        try
     283                hdr.visu_pars = aedes_readjcamp(visu_pars_file);
     284        catch
     285                hdr = [];
     286                msg = sprintf('Error while reading "%s". The error was "%s".',...
     287                        visu_pars_file,lasterr);
     288                return
     289        end
     290else
     291        % Warn if visu_pars file was not found
     292        warning('AEDES_READBRUKER:VisuParsNotFound',...
     293                'VISU_PARS file was not not found in "%s". The 2dseq file might not be read correctly.',fp);
     294end
     295
     296% Read d3proc file. This is however deprecated and the Visu parameters
     297% should be used instead...
    280298d3proc_file = [fp,filesep,'d3proc'];
    281 if exist(d3proc_file,'file')~=2
    282         hdr = [];
    283         msg = sprintf('Cannot find D3PROC file in "%s".',fp);
    284         return
    285 end
    286 try
    287         hdr.d3proc = aedes_readjcamp(d3proc_file);
    288 catch
    289         hdr = [];
    290         msg = sprintf('Error while reading "%s". The error was "%s".',...
    291                 d3proc_file,lasterr);
    292         return
    293 end
    294 
    295 % Read procs file
    296 procs_file = [fp,filesep,'procs'];
    297 if exist(procs_file,'file')~=2
    298         hdr = [];
    299         msg = sprintf('Cannot find PROCS file in "%s".',fp);
    300         return
    301 end
    302 try
    303         hdr.procs = aedes_readjcamp(procs_file);
    304 catch
    305         hdr = [];
    306         msg = sprintf('Error while reading "%s". The error was "%s".',...
    307                 procs_file,lasterr);
    308         return
     299if exist(d3proc_file,'file')==2
     300        try
     301                hdr.d3proc = aedes_readjcamp(d3proc_file);
     302        catch
     303                warning('Could not read D3PROC file "%s".',d3proc_file);
     304        end
    309305end
    310306
     
    322318end
    323319
    324 % Read visu_pars file
    325 visu_pars_file = [fp,filesep,'visu_pars'];
    326 if exist(visu_pars_file,'file')==2
     320% Read procs file
     321procs_file = [fp,filesep,'procs'];
     322if exist(procs_file,'file')==2
    327323        try
    328                 hdr.visu_pars = aedes_readjcamp(visu_pars_file);
     324                hdr.procs = aedes_readjcamp(procs_file);
    329325        catch
    330                 hdr = [];
    331                 msg = sprintf('Error while reading "%s". The error was "%s".',...
    332                         reco_file,lasterr);
    333                 return
     326                warning('Could not read PROCS file "%s".',procs_file);
    334327        end
    335328end
     
    353346end
    354347
    355 % Check that either RECO or VISU_PARS file is found
    356 if exist(reco_file,'file')~=2 && exist(visu_pars_file,'file')~=2
    357         warning('AEDES_READBRUKER:RecoVisuParsNotFound','Cannot find RECO and VISU_PARS files in "%s".',fp);
     348% Check that either VISU_PARS, RECO or D3PROC file is found
     349if ~isfield(hdr,'visu_pars') && ~isfield(hdr,'reco') && ...
     350                ~isfield(hdr,'d3proc')
     351        hdr = [];
     352        msg = 'Could not read VISU_PARS, RECO or D3PROC files.';
     353        return
    358354end
    359355
     
    431427        % Issue a warning that reconstruction of raw data is experimental
    432428        warning('AEDES_READBRUKER:RawDataReconstructionExperimental',...
    433                 'The reconstruction of raw bruker data is EXPERIMENTAL and may work correctly.');
     429                'The reconstruction of raw bruker data is EXPERIMENTAL and may not work correctly.');
    434430       
    435         [kspace,pe1_table,msg] = l_ReconstructKspace(kspace,hdr,Dat);
    436 else
    437         pe1_table = l_GetPeTable(hdr);
     431        [kspace,pe1_table,pe2_table,msg] = l_ReconstructKspace(kspace,hdr,Dat);
     432else
     433        [pe1_table,pe2_table] = l_GetPeTable(hdr);
    438434end
    439435if isempty(kspace)
     
    464460msg = '';
    465461
     462% Check which files to use
     463isVisuPars = false;
     464isReco = false;
     465isD3proc = false;
     466if isfield(hdr,'visu_pars')
     467        isVisuPars = true;
     468end
     469if isfield(hdr,'reco')
     470        isReco = true;
     471end
     472if isfield(hdr,'d3proc')
     473        isD3proc = true;
     474end
     475
    466476% Get word type
    467 if isfield(hdr,'reco')
     477if isVisuPars
     478        % Use visu_pars information first
     479        if strcmpi(hdr.visu_pars.VisuCoreWordType,'_8BIT_UNSGN_INT')
     480                precision = ['uint8=>',Dat.precision];
     481        elseif strcmpi(hdr.visu_pars.VisuCoreWordType,'_16BIT_SGN_INT')
     482                precision = ['int16=>',Dat.precision];
     483        elseif strcmpi(hdr.visu_pars.VisuCoreWordType,'_32BIT_SGN_INT')
     484                precision = ['int32=>',Dat.precision];
     485        elseif strcmpi(hdr.visu_pars.VisuCoreWordType,'_32BIT_FLOAT')
     486                precision = ['single=>',Dat.precision];
     487        else
     488                msg = sprintf('Unknown word type "%s".',hdr.visu_pars.VisuCoreWordType);
     489                return
     490        end
     491elseif isReco
     492        % If visu_pars was not found, use reco information
    468493        if strcmpi(hdr.reco.RECO_wordtype,'_8BIT_UNSGN_INT')
    469494                precision = ['uint8=>',Dat.precision];
     
    478503                return
    479504        end
    480 elseif isfield(hdr,'visu_pars')
    481         if strcmpi(hdr.visu_pars.VisuCoreWordType,'_8BIT_UNSGN_INT')
    482                 precision = ['uint8=>',Dat.precision];
    483         elseif strcmpi(hdr.visu_pars.VisuCoreWordType,'_16BIT_SGN_INT')
    484                 precision = ['int16=>',Dat.precision];
    485         elseif strcmpi(hdr.visu_pars.VisuCoreWordType,'_32BIT_SGN_INT')
    486                 precision = ['int32=>',Dat.precision];
    487         elseif strcmpi(hdr.visu_pars.VisuCoreWordType,'_32BIT_FLOAT')
    488                 precision = ['single=>',Dat.precision];
    489         else
    490                 msg = sprintf('Unknown word type "%s".',hdr.visu_pars.VisuCoreWordType);
    491                 return
    492         end
    493 else
    494         % Try to guess the word type from file size if reco file was not found...
     505else
     506        % No VISU_PARS or RECO information available. Fall back to the depricated
     507        % D3PROC information and try to guess the word type from file size...
    495508        sz = [hdr.d3proc.IM_SIX,...
    496509                hdr.d3proc.IM_SIY,...
     
    510523
    511524% Get byteorder
    512 if isfield(hdr,'reco')
     525if isVisuPars
     526        if strcmpi(hdr.visu_pars.VisuCoreByteOrder,'littleEndian')
     527                byteorder = 'ieee-le';
     528        else
     529                byteorder = 'ieee-be';
     530        end
     531elseif isReco
    513532        if strcmpi(hdr.reco.RECO_byte_order,'littleEndian')
    514533                byteorder = 'ieee-le';
     
    516535                byteorder = 'ieee-be';
    517536        end
    518 elseif isfield(hdr,'visu_pars')
    519         if strcmpi(hdr.visu_pars.VisuCoreByteOrder,'littleEndian')
    520                 byteorder = 'ieee-le';
    521         else
    522                 byteorder = 'ieee-be';
    523         end
    524537else
    525538        % Use little endian if no information is available
     
    528541
    529542% Get image type
    530 if isfield(hdr,'reco')
     543if isVisuPars
     544        if isfield(hdr.visu_pars,'VisuCoreFrameType')
     545                if strcmpi(hdr.visu_pars.VisuCoreFrameType,'COMPLEX_IMAGE')
     546                        isDataComplex = true;
     547                elseif strcmpi(hdr.visu_pars.VisuCoreFrameType,'MAGNITUDE_IMAGE')
     548                        isDataComplex = false;
     549                else
     550                        msg = sprintf('Unknown image type "%s".',hdr.visu_pars.VisuCoreFrameType);
     551                        return
     552                end
     553        else
     554                % If VisuCoreFrameType parameter was not found in visu_pars, assume
     555                % MAGNITUDE...
     556                isDataComplex = false;
     557        end
     558elseif isReco
    531559        if strcmpi(hdr.reco.RECO_image_type,'COMPLEX_IMAGE')
    532560                isDataComplex = true;
     
    556584% Check if word type is float
    557585isWordFloat = false;
    558 if isfield(hdr,'reco') && strcmpi(hdr.reco.RECO_wordtype,'_32BIT_FLOAT')
     586if isVisuPars && strcmpi(hdr.visu_pars.VisuCoreWordType,'_32BIT_FLOAT')
    559587        isWordFloat = true;
    560 elseif isfield(hdr,'visu_pars') && strcmpi(hdr.visu_pars.VisuCoreWordType,'_32BIT_FLOAT')
     588elseif isReco && strcmpi(hdr.reco.RECO_wordtype,'_32BIT_FLOAT')
    561589        isWordFloat = true;
    562590end
    563591
    564 % Read data
    565 
    566 % - Read magnitude data ---------------------------------
     592% - Read data ---------------------------------
    567593[data,count] = fread(fid,inf,precision);
    568594fclose(fid);
    569595
    570 % Reshape and permute to correct size and orientation
    571 data = reshape(data,[hdr.d3proc.IM_SIX,...
    572         hdr.d3proc.IM_SIY,...
    573         hdr.d3proc.IM_SIZ,...
    574         hdr.d3proc.IM_SIT]);
    575 data = permute(data,[2 1 3 4]);
     596% Try to get image dimensions
     597im_size = ones(1,4);
     598if isVisuPars
     599        for ii=1:length(hdr.visu_pars.VisuCoreSize)
     600                im_size(ii) = hdr.visu_pars.VisuCoreSize(ii);
     601        end
     602        im_size(length(hdr.visu_pars.VisuCoreSize)+1) = hdr.visu_pars.VisuCoreFrameCount;
     603else
     604        % Fall back to the depricated d3proc information, if visu_pars
     605        % information is not available...
     606        im_size = [hdr.d3proc.IM_SIX,...
     607                hdr.d3proc.IM_SIY,...
     608                hdr.d3proc.IM_SIZ,...
     609                hdr.d3proc.IM_SIT];
     610end
     611
     612% Reshape to correct size
     613data = reshape(data,im_size);
    576614
    577615% Map integer data to single or double values
    578616slope = [];
    579617offset = [];
    580 if isfield(hdr,'reco') && ~isWordFloat
    581         slope = hdr.reco.RECO_map_slope;
     618if isfield(hdr,'visu_pars') && ~isWordFloat
     619        % The slope values in visu_pars are multiplicative inverses of the slope
     620        % values in RECO file...
     621        slope = hdr.visu_pars.VisuCoreDataSlope;
     622        offset = hdr.visu_pars.VisuCoreDataOffs;
     623        nDim = hdr.visu_pars.VisuCoreDim;
     624elseif isfield(hdr,'reco') && ~isWordFloat
     625        % Use RECO information if VISU_PARS is not available
     626        slope = 1/hdr.reco.RECO_map_slope;
    582627        offset = hdr.reco.RECO_map_offset;
    583628        nDim = length(hdr.reco.RECO_size);
    584 elseif isfield(hdr,'visu_pars') && ~isWordFloat
    585         % Try to get the scaling information from visu_pars if reco file could
    586         % not be found...
    587         slope = hdr.visu_pars.VisuCoreDataSlope;
    588         offset = hdr.visu_pars.VisuCoreDataOffs;
    589         nDim = length(hdr.visu_pars.VisuCoreSize);
    590629elseif ~isWordFloat
    591630        warning('AEDES_READBRUKER:ScalingInformationNotFound',...
     
    593632end
    594633
     634% Calibrate data
    595635if ~isempty(slope) && ~isempty(offset)
    596636        for ii=1:length(slope)
    597637                if any(nDim == [1 2])
    598                         data(:,:,ii) = data(:,:,ii)/slope(ii)+offset(ii);
     638                        data(:,:,ii) = data(:,:,ii)*slope(ii)+offset(ii);
    599639                else
    600                         data(:,:,:,ii) = data(:,:,:,ii)/slope(ii)+offset(ii);
     640                        data(:,:,:,ii) = data(:,:,:,ii)*slope(ii)+offset(ii);
    601641                end
    602642        end
    603643end
    604644
    605 if ~isDataComplex
    606        
    607         % The length of RECO_transposition should be same as NI.
    608         if isfield(hdr,'reco')
    609                 NI = length(hdr.reco.RECO_transposition);
    610                 if NI~=hdr.d3proc.IM_SIZ
    611                         data = reshape(data,hdr.d3proc.IM_SIY,...
    612                                 hdr.d3proc.IM_SIX,NI,[]);
    613                 end
    614         end
    615        
    616 else
    617         data = reshape(data,hdr.reco.RECO_size(1),...
    618                 hdr.reco.RECO_size(2),...
    619                 hdr.reco.RECO_size(3),[]);
    620        
     645% Reshape frames using VisuFGOrderDesc information
     646if isVisuPars && isfield(hdr.visu_pars,'VisuFGOrderDesc')
     647        if hdr.visu_pars.VisuCoreFrameCount > 1 && ...
     648                        size(hdr.visu_pars.VisuFGOrderDesc,1)>1
     649                nTotalDims = hdr.visu_pars.VisuCoreDim+hdr.visu_pars.VisuFGOrderDescDim;
     650                frame_size = [hdr.visu_pars.VisuCoreSize,...
     651                        hdr.visu_pars.VisuFGOrderDesc{1,1},hdr.visu_pars.VisuFGOrderDesc{2,1}];
     652                data = reshape(data,frame_size);
     653        end
     654end
     655
     656% Permute to correct orientation
     657data = permute(data,[2 1 3 4]);
     658
     659if isDataComplex       
    621660        kspace = complex(data(:,:,:,1),data(:,:,:,2));
    622661        data = [];
     
    631670% Reconstruct k-space
    632671%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    633 function [kspace,pe1_table,msg] = l_ReconstructKspace(kspace,hdr,Dat)
     672function [kspace,pe1_table,pe2_table,msg] = l_ReconstructKspace(kspace,hdr,Dat)
    634673%
    635674% NOTE: The reconstruction of raw bruker data is EXPERIMENTAL and may work
  • aedes_revision.m

    r196 r197  
    9393% bash-script every time it is called so that this file "aedes_revision.m" is
    9494% always in the list of committed files. DO NOT EDIT THE NEXT LINE!!!
    95 % - Svn Hook -
     95% - SVN Hook -
Note: See TracChangeset for help on using the changeset viewer.

Powered by Trac 1.0.9.Copyright © Juha-Pekka Niskanen 2008