Changeset 103 for aedes_readfid.m


Ignore:
Timestamp:
Mar 10, 2010, 1:31:15 PM (9 years ago)
Author:
tjniskan
Message:
  • Added support for multiple receivers in aedes_readfid.m
  • Aedes can now read data stored in MAT-file from a variable that starts

with "data" (not case sensitive)

M aedes_data_read.m
M aedes_readfid.m
M aedes_revision.m

File:
1 edited

Legend:

Unmodified
Added
Removed
  • aedes_readfid.m

    r99 r103  
    744744
    745745if isfield(procpar,'seqcon')
    746   seqcon=procpar.seqcon{1};
     746  procpar.seqcon=procpar.seqcon{1};
    747747else
    748   seqcon='nnnnn';
     748  procpar.seqcon='nnnnn';
    749749end
    750750
    751751%% Determine acquisition type from seqcon parameter
    752 if all(seqcon=='n')          % 1D spectroscopy
    753   AcqType=1;
    754 elseif all(seqcon(4:5)=='n') % 2D imaging
    755   AcqType=2;
    756 elseif seqcon(5)=='n'        % 3D imaging
    757   AcqType=3;
     752if all(procpar.seqcon=='n')          % 1D spectroscopy
     753  Dat.AcqType=1;
     754elseif all(procpar.seqcon(4:5)=='n') % 2D imaging
     755  Dat.AcqType=2;
     756elseif procpar.seqcon(5)=='n'        % 3D imaging
     757  Dat.AcqType=3;
    758758else                         % 4D imaging
    759   AcqType=4;
     759  Dat.AcqType=4;
    760760end
    761761
    762762%% Double-check that AcqType is not 1D spectral
    763763if isfield(procpar,'nv') && procpar.nv==0
    764   AcqType=1;
     764  Dat.AcqType=1;
    765765end
    766766
     
    777777      ~isempty(strfind(procpar.seqfil{1},'2PULSE')) || ...
    778778      ~isempty(strfind(procpar.seqfil{1},'2pulse'))
    779   AcqType=1;
     779  Dat.AcqType=1;
    780780end
    781781
     
    787787if isfield(procpar,'flash_converted')
    788788  if isfield(procpar,'ni') && procpar.ni>1
    789     seqcon(3)='s';
    790   elseif ((seqcon(2)=='c') && (seqcon(3)=='c'))
    791     seqcon(2)='s';
     789    procpar.seqcon(3)='s';
     790  elseif ((procpar.seqcon(2)=='c') && (procpar.seqcon(3)=='c'))
     791    procpar.seqcon(2)='s';
    792792  end
    793793  UsePhaseTable=false; % Do not try to order data if flashc has been run
     
    807807      strcmp(procpar.array{1},'pad') && all(procpar.pad==0)
    808808    % Skip the array parsing if the array is a dummy "pad"-array...
    809     isAcqArrayed = false;
    810     ArrayLength = 1;
    811   else
    812     isAcqArrayed = true;
    813     ArrayLength = [];
     809    Dat.isAcqArrayed = false;
     810    Dat.ArrayLength = 1;
     811  else
     812    Dat.isAcqArrayed = true;
     813    Dat.ArrayLength = [];
    814814   
    815815    % Determine array length
    816816    for ii=1:length(procpar.array)
    817817      if iscell(procpar.array{ii})
    818         ArrayLength(ii) = length(procpar.(procpar.array{ii}{1}));
     818        Dat.ArrayLength(ii) = length(procpar.(procpar.array{ii}{1}));
    819819      else
    820         ArrayLength(ii) = length(procpar.(procpar.array{ii}));
    821       end
    822     end
    823     ArrayLength = prod(ArrayLength);
     820        Dat.ArrayLength(ii) = length(procpar.(procpar.array{ii}));
     821      end
     822    end
     823    Dat.ArrayLength = prod(Dat.ArrayLength);
    824824  end
    825825else
    826   isAcqArrayed = false;
    827   ArrayLength = 1;
     826  Dat.isAcqArrayed = false;
     827  Dat.ArrayLength = 1;
    828828end
    829829
     
    891891
    892892if ~Dat.FastDataRead
    893   if any(AcqType==[1 2])
    894     switch seqcon(2:3)
     893  if any(Dat.AcqType==[1 2])
     894    switch procpar.seqcon(2:3)
    895895      case {'cc','sc'}
    896896        kspace = zeros(hdr.FileHeader.np/2,...
     
    918918  if Dat.ShowWaitbar
    919919        wb_h = aedes_wbar(0/hdr.FileHeader.nblocks,...
    920           {['Reading ',num2str(AcqType),'D VNMR data (seqcon: "' seqcon '")'],...
     920          {['Reading ',num2str(Dat.AcqType),'D VNMR data (seqcon: "' procpar.seqcon '")'],...
    921921          ['(Processing data block ' ...
    922922          num2str(0) '/' num2str(hdr.FileHeader.nblocks) ')']});
     
    929929          aedes_wbar(ii/hdr.FileHeader.nblocks,...
    930930                wb_h,...
    931                 {['Reading ',num2str(AcqType),'D VNMR data (seqcon: "' seqcon '")'],...
     931                {['Reading ',num2str(Dat.AcqType),'D VNMR data (seqcon: "' procpar.seqcon '")'],...
    932932                ['(Processing data block ' ...
    933933                num2str(ii) '/' num2str(hdr.FileHeader.nblocks) ')']})
     
    10271027
    10281028        %% Store and order k-space values
    1029         if any(AcqType==[1 2])
    1030           switch seqcon(2:3)
     1029        if any(Dat.AcqType==[1 2])
     1030          switch procpar.seqcon(2:3)
    10311031                case {'cc','sc'}
    10321032                  kspace(:,:,ii) = complex_block;
     
    10581058  % Initialize waitbar
    10591059  if Dat.ShowWaitbar
    1060         wb_h = aedes_calc_wait(['Reading ',num2str(AcqType),...
    1061           'D VNMR data (seqcon: "' seqcon '")']);
     1060        wb_h = aedes_calc_wait(['Reading ',num2str(Dat.AcqType),...
     1061          'D VNMR data (seqcon: "' procpar.seqcon '")']);
    10621062  end
    10631063 
     
    11281128 
    11291129  %% Store and order k-space values
    1130   if any(AcqType==[1 2])
    1131     switch seqcon(2:3)
     1130  if any(Dat.AcqType==[1 2])
     1131    switch procpar.seqcon(2:3)
    11321132      case {'cc','sc'}
    11331133        %kspace(:,:,ii) = complex_block;
     
    11461146end
    11471147
    1148 
    11491148% Remove singleton dimensions from kspace
    11501149kspace = squeeze(kspace);
     
    11561155        delete(wb_h)
    11571156  end
    1158   return
    1159 end
    1160 
    1161 %% Support for fat/water measurements ----------------------
    1162 if isfield(procpar,'seqfil') && strcmpi(procpar.seqfil,'ge3d_csi2')
    1163  
    1164   % Split kspace into fat and water (in 4th dimesion)
    1165   kspace=reshape(permute(reshape(kspace,256,2,[]),[1 3 4 2]),256,128,[],2);
    1166  
    1167   % Fourier transform data
    1168   if any(Dat.ZeroPadding==[1 2])
    1169     data_sz = [procpar.np/2,procpar.nf,procpar.nv2,2];
    1170     data = zeros(data_sz,class(kspace));
    1171     data(:,:,:,1) = abs(fftshift(fftn(kspace(:,:,:,1),data_sz(1:3))));
    1172     data(:,:,:,2) = abs(fftshift(fftn(kspace(:,:,:,2),data_sz(1:3))));
    1173   else
    1174     data = zeros(size(kspace),class(kspace));
    1175     data(:,:,:,1) = abs(fftshift(fftn(kspace(:,:,:,1))));
    1176     data(:,:,:,2) = abs(fftshift(fftn(kspace(:,:,:,2))));
    1177   end
    1178  
    1179   % Delete kspace if not returned
    1180   if ~Dat.ReturnKSpace
    1181     kspace=[];
    1182   end
    1183  
    11841157  return
    11851158end
     
    12721245end
    12731246
    1274 %% ------------------------------------------------------
     1247%% Support for fat/water measurements ----------------------
     1248if isfield(procpar,'seqfil') && strcmpi(procpar.seqfil,'ge3d_csi2')
     1249 
     1250  % Split kspace into fat and water (in 4th dimesion)
     1251  kspace=reshape(permute(reshape(kspace,256,2,[]),[1 3 4 2]),256,128,[],2);
     1252 
     1253  % Fourier transform data
     1254  if any(Dat.ZeroPadding==[1 2])
     1255    data_sz = [procpar.np/2,procpar.nf,procpar.nv2,2];
     1256    data = zeros(data_sz,class(kspace));
     1257    data(:,:,:,1) = abs(fftshift(fftn(kspace(:,:,:,1),data_sz(1:3))));
     1258    data(:,:,:,2) = abs(fftshift(fftn(kspace(:,:,:,2),data_sz(1:3))));
     1259  else
     1260    data = zeros(size(kspace),class(kspace));
     1261    data(:,:,:,1) = abs(fftshift(fftn(kspace(:,:,:,1))));
     1262    data(:,:,:,2) = abs(fftshift(fftn(kspace(:,:,:,2))));
     1263  end
     1264 
     1265  % Delete kspace if not returned
     1266  if ~Dat.ReturnKSpace
     1267    kspace=[];
     1268  end
     1269 
     1270  return
     1271end
     1272
     1273% Check the number of receivers (PI stuff)
     1274if isfield(procpar,'rcvrs') && ~isempty(procpar.rcvrs)
     1275  % Multiple receivers used
     1276  nRcv = length(find(procpar.rcvrs{1}=='y'));
     1277  data = [];
     1278  kspace2 = [];
     1279  for ii=1:nRcv
     1280    tmp_kspace = l_ReconstructKspace(kspace(:,:,ii),procpar,Dat);
     1281    kspace2(:,:,:,ii)=tmp_kspace;
     1282    if Dat.ReturnFTData
     1283      tmp_data = l_CalculateFFT(tmp_kspace,procpar,Dat);
     1284      data(:,:,:,ii) = tmp_data;
     1285    end
     1286  end
     1287  kspace = kspace2;
     1288  kspace2=[];
     1289else
     1290  % Only one receiver
     1291  kspace = l_ReconstructKspace(kspace,procpar,Dat);
     1292  data = l_CalculateFFT(kspace,procpar,Dat);
     1293end
     1294
     1295% Delete kspace if not returned
     1296if ~Dat.ReturnKSpace
     1297  kspace=[];
     1298end
     1299
     1300%===============================================
     1301% Reconstruct kspace for different sequences
     1302%===============================================
     1303function kspace=l_ReconstructKspace(kspace,procpar,Dat)
     1304
    12751305
    12761306%% Flip images for certain measurements
     
    12981328
    12991329% Handle arrayed and RARE sequences
    1300 if isAcqArrayed && AcqType~=1 && Dat.Sorting && ~Dat.isEPIdata
    1301   %if ~strcmpi(seqcon(2:3),'cc') && ( isempty(Dat.phasetable) | ...
     1330if Dat.isAcqArrayed && Dat.AcqType~=1 && Dat.Sorting && ~Dat.isEPIdata
     1331  %if ~strcmpi(procpar.seqcon(2:3),'cc') && ( isempty(Dat.phasetable) | ...
    13021332  %        isfield(procpar,'flash_converted') )
    1303   if (( isempty(Dat.phasetable) && ~strcmpi(seqcon(2:3),'sc') ) && ...
    1304       ~(strcmpi(seqcon(2:3),'cc') && ArrayLength==size(kspace,3))) || ...
     1333  if (( isempty(Dat.phasetable) && ~strcmpi(procpar.seqcon(2:3),'sc') ) && ...
     1334      ~(strcmpi(procpar.seqcon(2:3),'cc') && Dat.ArrayLength==size(kspace,3))) || ...
    13051335      isfield(procpar,'flash_converted')
    13061336                                 
    13071337    % Sort uncompressed arrayed data
    1308     ks_order = 1:procpar.nv*ArrayLength;
     1338    ks_order = 1:procpar.nv*Dat.ArrayLength;
    13091339    tmp = 0:procpar.nv:(procpar.ne-1)*procpar.nv;
    1310     tmp=repmat(tmp,procpar.nv*ArrayLength,1);
    1311     ks_order = reshape(ks_order,ArrayLength,procpar.nv).';
     1340    tmp=repmat(tmp,procpar.nv*Dat.ArrayLength,1);
     1341    ks_order = reshape(ks_order,Dat.ArrayLength,procpar.nv).';
    13121342    ks_order = ks_order(:);
    13131343    ks_order = repmat(ks_order,1,procpar.ne);
     
    13221352   
    13231353    % Reshape into 3D matrix
    1324     kspace=reshape(kspace,[size(kspace,1) procpar.nv ArrayLength* ...
     1354    kspace=reshape(kspace,[size(kspace,1) procpar.nv Dat.ArrayLength* ...
    13251355                        procpar.ns]);
    13261356  else
     
    13281358    if UsePhaseTable && ~isempty(Dat.phasetable)
    13291359      %Dat.phasetable = Dat.phasetable';
    1330       if isAcqArrayed && ArrayLength>1 && strcmpi(seqcon(2:3),'cs')
    1331         kspace = permute(reshape(reshape(kspace,size(kspace,1),[]),size(kspace,1),ArrayLength,[]),[1 3 2]);
     1360      if Dat.isAcqArrayed && Dat.ArrayLength>1 && strcmpi(procpar.seqcon(2:3),'cs')
     1361        kspace = permute(reshape(reshape(kspace,size(kspace,1),[]),size(kspace,1),Dat.ArrayLength,[]),[1 3 2]);
    13321362      else
    13331363        Dat.phasetable = Dat.phasetable.';
     
    14061436  % patches that hopefully work...
    14071437 
    1408   if strcmp(seqcon,'nncnn')
     1438  if strcmp(procpar.seqcon,'nncnn')
    14091439    kspace = permute(kspace,[1 3 2]);
    1410   elseif strcmp(seqcon,'nccnn') && length(size(kspace))==2 && ...
    1411       procpar.ns>=1 && AcqType~=1
     1440  elseif strcmp(procpar.seqcon,'nccnn') && length(size(kspace))==2 && ...
     1441      procpar.ns>=1 && Dat.AcqType~=1
    14121442    if ~isempty(Dat.phasetable)
    14131443      kssz = size(kspace);
     
    14281458    end
    14291459   
    1430   elseif strcmp(seqcon,'nscsn') && length(size(kspace))==3 && ...
    1431           AcqType~=1
     1460  elseif strcmp(procpar.seqcon,'nscsn') && length(size(kspace))==3 && ...
     1461          Dat.AcqType~=1
    14321462        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    14331463        % Support for 3D fast spin-echo
     
    14511481       
    14521482       
    1453   elseif AcqType~=1 && isfield(procpar,'nv')
     1483  elseif Dat.AcqType~=1 && isfield(procpar,'nv')
    14541484    if length(size(kspace))==2 && ...
    14551485              ( size(kspace,1)~=(procpar.np/2) || size(kspace,2)~=procpar.nv )
     
    14671497 
    14681498  %%% Support for Teemu's ASE3D-data
    1469   %if strcmpi(seqcon,'ncccn')
     1499  %if strcmpi(procpar.seqcon,'ncccn')
    14701500  %  %% Reshape the kspace to the appropriate size
    14711501  %  kspace=reshape(kspace,[procpar.np/2 procpar.nv size(kspace,2)/procpar.nv]);
     
    14741504
    14751505
     1506
     1507%=========================================
     1508% Fourier Transform Data
     1509%=========================================
     1510function data=l_CalculateFFT(kspace,procpar,Dat)
     1511data=[];
     1512
    14761513% Return image/spectral data --------------------------------
    14771514if Dat.ReturnFTData
    14781515  %% Fourier transform spectral data
    1479   if AcqType==1
     1516  if Dat.AcqType==1
    14801517        wb_h = aedes_wbar(0,'Fourier transforming spectral data');
    14811518    %data=zeros(size(kspace),'single');
     
    15471584   
    15481585    %% Fourier transform 2D and EPI image data
    1549     if AcqType==2 || Dat.isEPIdata
     1586    if Dat.AcqType==2 || Dat.isEPIdata
    15501587      sz=size(kspace,3);
    15511588     
     
    15821619        if Dat.ZeroPadding==2
    15831620          if isfield(procpar,'lpe2') && isfield(procpar,'lpe')
    1584             data_sz(3) = max(1,round((procpar.lpe2/procpar.lpe)*data_sz(2)*ArrayLength));
     1621            data_sz(3) = max(1,round((procpar.lpe2/procpar.lpe)*data_sz(2)*Dat.ArrayLength));
    15851622          end
    15861623        end
     
    16001637    % Reorient images and remove the reference image if requested
    16011638    if Dat.OrientImages && ~isempty(procpar) && ...
    1602         isfield(procpar,'orient') && any(AcqType==[2 3 4])
     1639        isfield(procpar,'orient') && any(Dat.AcqType==[2 3 4])
    16031640      orient = procpar.orient{1};
    16041641      if any(strcmpi(orient,{'xyz','trans90','cor90','sag90'}))
     
    16141651   
    16151652% $$$   %% Fourier transform 4D image data
    1616 % $$$   elseif AcqType==4
     1653% $$$   elseif Dat.AcqType==4
    16171654% $$$     data = abs(fftshift(fftshift(fft2(kspace),2),1));
    16181655  end
    1619 end
    1620 
    1621 %% Delete waitbar
    1622 if Dat.ShowWaitbar && ishandle(wb_h)
    1623   delete(wb_h)
    1624 end
    1625 
    1626 % Delete kspace if not returned
    1627 if ~Dat.ReturnKSpace
    1628   kspace=[];
    1629 end
     1656 
     1657  %% Delete waitbar
     1658  if Dat.ShowWaitbar && ishandle(wb_h)
     1659    delete(wb_h)
     1660  end
     1661end
     1662
     1663
     1664
     1665
    16301666
    16311667%========================================================
Note: See TracChangeset for help on using the changeset viewer.

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