0001 function matRad_writeNRRD(filename,cube,metadata)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 version = 5;
0033 nrrdVersionStringPrefix = 'NRRD000';
0034 nrrdVersionString = [nrrdVersionStringPrefix num2str(version)];
0035
0036 header = sprintf('%s\n',nrrdVersionString);
0037
0038
0039 header = header_addComment(header,'Created With matRad - An open source multi-modality radiation treatment planning sytem');
0040
0041
0042 header = header_addField(header,'type',matlabTypeToNRRD(metadata.datatype));
0043
0044
0045 try
0046 z = zeros(1,metadata.datatype);
0047 varInfo = whos('z');
0048 if varInfo.bytes > 1
0049 [~,~,endian] = computer;
0050 switch endian
0051 case 'L'
0052 header = header_addField(header,'endian','little');
0053 case 'B'
0054 header = header_addField(header,'endian','big');
0055 otherwise
0056 error('Unknown endian!');
0057 end
0058 end
0059 catch
0060 error(['Unknown datatype: ' metadata.datatype']);
0061 end
0062
0063
0064
0065 if ~isfield(metadata,'compress')
0066 metadata.compress = false;
0067 end
0068
0069 if metadata.compress
0070 try
0071
0072
0073 tmpRawFile = [tempname() '.bin'];
0074 fTmp = fopen(tmpRawFile, 'wb');
0075
0076 fwrite(fTmp,cube,metadata.datatype);
0077 fclose(fTmp);
0078
0079
0080 fNameZip = gzip(tmpRawFile);
0081 fNameZip = fNameZip{1};
0082
0083
0084 fDir = dir(fNameZip);
0085
0086
0087 fTmp = fopen(fNameZip, 'rb');
0088 fileData = fread(fTmp,fDir.bytes,'uint8');
0089 fclose(fTmp);
0090
0091 delete(tmpRawFile,fNameZip);
0092
0093
0094 metadata.datatype = 'uint8';
0095 header = header_addField(header,'encoding','gzip');
0096 catch
0097 warn('Could not open temporary file, writing without compression!');
0098 header = header_addField(header,'encoding','raw');
0099 fileData = cube;
0100 end
0101 else
0102 header = header_addField(header,'encoding','raw');
0103 fileData = cube;
0104 end
0105
0106
0107
0108 cubeDim = size(cube);
0109 header = header_addField(header,'dimension',num2str(numel(cubeDim)));
0110 strCubeDim = vec2str(cubeDim);
0111 header = header_addField(header,'sizes',strCubeDim);
0112
0113
0114 if isfield(metadata,'coordinateSystem')
0115 header = header_addField(header,'space',metadata.coordinateSystem);
0116 end
0117
0118
0119 if isfield(metadata,'imageOrigin')
0120 vecOrigin = matVec2nrrdVec(metadata.imageOrigin);
0121 header = header_addField(header,'space origin',vecOrigin);
0122 end
0123
0124
0125 if isfield(metadata,'resolution')
0126
0127 if isfield(metadata,'axisPermutation')
0128 strDirection = '';
0129 for dim = 1:numel(cubeDim)
0130 dimVec = zeros(1,numel(cubeDim));
0131 dimVec(dim) = 1;
0132 dimVec = dimVec(metadata.axisPermutation);
0133 dimVec = dimVec .* metadata.resolution;
0134 strDirection = [strDirection matVec2nrrdVec(dimVec) ' '];
0135 end
0136 header = header_addField(header,'space directions',strDirection);
0137
0138 else
0139 strSpacings = vec2str(metadata.resolution);
0140 header = header_addField(header,'spacings',strSpacings);
0141 end
0142 end
0143
0144
0145
0146
0147 if nargin > 3
0148 keys = fieldnames(additionalKeyValuePairs);
0149 for f = 1:numel(fields)
0150 key = keys{f};
0151 value = additionalKeyValuePairs.(keys{f});
0152
0153
0154 if isvector(description)
0155 value = mat2str(description);
0156 value = description(2:end-1);
0157 elseif isnumeric(description)
0158 value = num2str(description);
0159 else
0160
0161 end
0162
0163 if and(~ischar(value),~iscellstr(value))
0164 warning(['Cannot convert value for key ' key ' to string, key-value-pair will be ignored!']);
0165 continue;
0166 end
0167
0168 header = header_addKeyValuePair(header,key,value);
0169 end;
0170 end
0171
0172
0173
0174 try
0175
0176 fileHandle = fopen(filename,'w');
0177 fprintf(fileHandle,'%s\n',header);
0178
0179
0180 fwrite(fileHandle,fileData,metadata.datatype);
0181 fclose(fileHandle);
0182
0183 catch MExc
0184 fclose('all');
0185 error(sprintf('File %s could not be written!\n%s',filename,getReport(MExc)));
0186 end
0187
0188 end
0189
0190
0191 function newHeader = header_addComment(header,comment)
0192 newHeader = sprintf('%s# %s\n',header,comment);
0193 end
0194
0195
0196 function newHeader = header_addField(header,fieldName,fieldDescription)
0197 newHeader = sprintf('%s%s: %s\n',header,fieldName,fieldDescription);
0198 end
0199
0200
0201 function newHeader = header_addKeyValuePair(header,key,value)
0202 value = strrep(value,':=','');
0203 newHeader = sprintf('%s%s:=%s\n',header,key,value);
0204 end
0205
0206
0207 function strOutput = vec2str(V)
0208 strOutput = mat2str(V);
0209 strOutput = strOutput(2:end-1);
0210 end
0211
0212
0213 function strOutput = matVec2nrrdVec(V)
0214 strOutput = '(';
0215 for v = 1:numel(V)
0216 strOutput = [strOutput num2str(V(v)) ','];
0217 end
0218 strOutput = [strOutput(1:end-1) ')'];
0219 end
0220
0221
0222
0223 function newType = matlabTypeToNRRD(datatype)
0224 switch datatype
0225 case 'single'
0226 newType = 'float';
0227 otherwise
0228 newType = datatype;
0229 end
0230 end
0231