-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprocfsems.m
77 lines (58 loc) · 2.47 KB
/
procfsems.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
% [ image, nii ] = procfsems( filename, outputPath, factorRO, factorPE )
%
function [ image, nii ] = procfsems( filename, outputPath, factorRO, factorPE ),
% read FID
fid = readfid( filename );
% get header
header = fid.header;
fid = fid.fid;
numberOfBlocks = header.nblocks; % number of blocks
numberOfTraces = header.ntraces; % number of traces
numberOfRO = header.np / 2; % number of points per trace
numberOfSlices = procpar( filename, 'ns' ); % number of slices
numberOfEchos = procpar( filename, 'etl' ); % echo train length
numberOfPE = numberOfTraces / numberOfSlices; % number of phase encoding steps
numberOfEchoTraces = numberOfPE / numberOfEchos; % number of phase encoding steps per echo
slicePositions = procpar( filename, 'pss' ); % slice positions
% phase-encoding table
phaseTable = procpar( filename, 'pelist' );
phaseTable = reshape( phaseTable, numberOfEchos, numberOfEchoTraces );
minimumPhaseTableIndex = min( min( phaseTable ) ) - 1;
% zero-filling
zeroFillRO = pow2( ceil( log2( numberOfRO * factorRO ) ) );
zeroFillPE = pow2( ceil( log2( numberOfPE * factorPE ) ) );
% order of slices
[ sortedSlicePositions, sliceIndex ] = sort( slicePositions );
% order FID: RO x ( echo x slices x phase ) x blocks
fid = reshape( fid, numberOfRO, numberOfEchos, numberOfSlices, numberOfEchoTraces, numberOfBlocks );
% prepare output
image = zeros( zeroFillRO, zeroFillPE, numberOfSlices, numberOfBlocks );
% transform
for block = 1 : numberOfBlocks,
% re-order phase lines
fidBlock = zeros( numberOfRO, numberOfSlices, numberOfPE );
for echo = 1 : numberOfEchos,
for phase = 1 : numberOfEchoTraces,
% look-up
row = phaseTable( echo, phase ) - minimumPhaseTableIndex;
% fill block FID
fidBlock( :, :, row ) = squeeze( fid( :, echo, :, phase, : ) );
end
end
% re-order: RO x PE x slice
fidBlock = permute( fidBlock, [ 1 3 2 ] );
% transform
for slice = 1 : numberOfSlices,
image( :, :, slice, block ) = fft2d( fidBlock( :, :, sliceIndex( slice ) ), zeroFillRO, zeroFillPE );
end
end
% determine output dimensions
voxelSize = [ 1 1 1 ];
voxelSize( 1 ) = procpar( inputPath, 'lpe' ) / size( image, 1 ) * 10;
voxelSize( 2 ) = procpar( inputPath, 'lro' ) / size( image, 2 ) * 10;
sliceThickness = circshift( sortedSlicePositions, [ 0 -1 ] ) - sortedSlicePositions;
voxelSize( 3 ) = sliceThickness( 1 ) * 10;
% save to nifti
nii = make_nii( abs( image ), voxelSize, zeros( size( voxelSize ) ) );
save_nii( nii, [ outputPath '.nii' ] );
return