/ concept-collection / seqlab
Sign in
concept-collection / seqlab
seqlab / src / engine / pulseq / +mr / convert.m
84 lines · 2.7 KBCodeBlameHistory
78d04f1seqlab: write and view pulseq MRI sequences in the browserJeremy Magland 1function out=convert(in,varargin)
2%OPTS Set gradient limits of the MR system.
3% out=convert(in,from,to) Convert the numerical data in, given in
4% specificed units 'from' to units specified in 'to'.
5%
6% Valid unit strings are:
7% 'Hz/m' 'mT/m' 'rad/ms/mm' 'Hz/m/s' 'mT/m/ms' 'T/m/s' 'rad/ms/mm/ms'
9persistent parser
10validB1Units={'Hz','T','mT','uT'}; % todo: gauss?
11validGradUnits={'Hz/m','mT/m','rad/ms/mm'};
12validSlewUnits={'Hz/m/s','mT/m/ms','T/m/s','rad/ms/mm/ms'};
13validUnits=cat(2,validB1Units,validGradUnits,validSlewUnits);
14if isempty(parser)
15 parser = mr.aux.InputParserCompat;
16 parser.FunctionName = 'convert';
17 parser.addRequired('in',@isnumeric);
18 parser.addRequired('fromUnit',...
19 @(x) any(validatestring(x,validUnits)));
20 parser.addOptional('toUnit',[],...
21 @(x) any(validatestring(x,validUnits)));
22 parser.addParamValue('gamma',42.576e6,@isnumeric); % Hz/T
23end
24parse(parser,in,varargin{:});
25opt = parser.Results;
27% Set default output unit if not given
28if isempty(opt.toUnit)
29 if ismember(opt.fromUnit,validGradUnits)
30 opt.toUnit = validGradUnits{1};
31 elseif ismember(opt.fromUnit,validSlewUnits)
32 opt.toUnit = validSlewUnits{1};
33 elseif ismember(opt.fromUnit,validB1Units)
34 opt.toUnit = validB1Units{1};
35 end
36end
38% Verify fromUnit and toUnit are in the same category.
39if ismember(opt.fromUnit,validB1Units), fromCat = 'B1';
40elseif ismember(opt.fromUnit,validGradUnits), fromCat = 'gradient';
41elseif ismember(opt.fromUnit,validSlewUnits), fromCat = 'slew rate';
42end
44if ismember(opt.toUnit,validB1Units), toCat = 'B1';
45elseif ismember(opt.toUnit,validGradUnits), toCat = 'gradient';
46elseif ismember(opt.toUnit,validSlewUnits), toCat = 'slew rate';
47end
49if ~strcmp(fromCat,toCat)
50 error('mr.convert: fromUnit ''%s'' (%s) and toUnit ''%s'' (%s) are in different unit categories.', ...
51 opt.fromUnit, fromCat, opt.toUnit, toCat);
52end
54% Convert to standard units
55switch opt.fromUnit
56 case {'Hz','Hz/m','Hz/m/s'}
57 standard = in;
58 case {'mT','mT/m'};
59 standard = in*1e-3*opt.gamma;
60 case {'uT'};
61 standard = in*1e-6*opt.gamma;
62 case 'rad/ms/mm'
63 standard = in*1e6/(2*pi);
64 case {'T','mT/m/ms','T/m/s'}
65 standard = in*opt.gamma;
66 case 'rad/ms/mm/ms'
67 standard = in*1e9/(2*pi);
68end
70% Convert from standard units
71switch opt.toUnit
72 case {'Hz','Hz/m','Hz/m/s'}
73 out = standard;
74 case {'mT','mT/m'}
75 out = 1e3*standard/opt.gamma;
76 case 'uT'
77 out = 1e6*standard/opt.gamma;
78 case 'rad/ms/mm'
79 out = standard*2*pi*1e-6;
80 case {'T','mT/m/ms','T/m/s'}
81 out = standard/opt.gamma;
82 case 'rad/ms/mm/ms'
83 out = standard*2*pi*1e-9;
84end
moveopenescclose