0001 function pln = matRad_importDicomRTPlan(ct, rtPlanFiles, dicomMetaBool)
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
0033
0034 if size(rtPlanFiles,1) ~= 1
0035 errordlg('Too few or to many RTPlan files')
0036 end
0037
0038
0039 if verLessThan('matlab','9')
0040 planInfo = dicominfo(rtPlanFiles{1});
0041 else
0042 planInfo = dicominfo(rtPlanFiles{1},'UseDictionaryVR',true);
0043 end
0044
0045
0046 if isfield(planInfo, 'BeamSequence')
0047 BeamParam = 'BeamSequence';
0048 ControlParam = 'ControlPointSequence';
0049 elseif isfield(planInfo, 'IonBeamSequence')
0050 BeamParam = 'IonBeamSequence';
0051 ControlParam = 'IonControlPointSequence';
0052 else
0053 errordlg('Not supported kind of DICOM RT plan file.');
0054 end
0055
0056
0057 BeamSequence = planInfo.(BeamParam);
0058 BeamSeqNames = fieldnames(BeamSequence);
0059
0060
0061 if isfield(BeamSequence.(BeamSeqNames{1}),'TreatmentDeliveryType')
0062 for i = 1:length(BeamSeqNames)
0063 currBeamSeq = BeamSequence.(BeamSeqNames{i});
0064 try
0065 treatDelType = currBeamSeq.TreatmentDeliveryType;
0066 if ~strcmpi(treatDelType,'TREATMENT')
0067 BeamSequence = rmfield(BeamSequence,BeamSeqNames{i});
0068 end
0069 catch
0070 warning('Something went wrong while determining the type of the beam.');
0071 end
0072 end
0073 BeamSeqNames = fieldnames(BeamSequence);
0074 end
0075
0076
0077
0078
0079 gantryAngles{length(BeamSeqNames)} = [];
0080 PatientSupportAngle{length(BeamSeqNames)} = [];
0081 isoCenter = NaN*ones(length(BeamSeqNames),3);
0082 for i = 1:length(BeamSeqNames)
0083 currBeamSeq = BeamSequence.(BeamSeqNames{i});
0084
0085 gantryAngles{i} = currBeamSeq.(ControlParam).Item_1.GantryAngle;
0086 PatientSupportAngle{i} = currBeamSeq.(ControlParam).Item_1.PatientSupportAngle;
0087 isoCenter(i,:) = currBeamSeq.(ControlParam).Item_1.IsocenterPosition';
0088 end
0089
0090
0091 if ct.dicomInfo.ImageOrientationPatient == [1;0;0;0;1;0]
0092 isoCenter = isoCenter - ones(length(BeamSeqNames),1) * ...
0093 ([ct.x(1) ct.y(1) ct.z(1)] - [ct.resolution.x ct.resolution.y ct.resolution.z]);
0094 else
0095 error('This Orientation is not yet supported.');
0096 end
0097
0098
0099
0100 radiationMode = planInfo.(BeamParam).Item_1.RadiationType;
0101 if ~strncmpi(radiationMode,'photons',6)
0102 try
0103 radiationMass = planInfo.(BeamParam).Item_1.RadiationMassNumber;
0104 radiationAtomicNumber = planInfo.(BeamParam).Item_1.RadiationAtomicNumber;
0105 catch
0106 warning('Could not determine mass and atomic number of the particle');
0107 end
0108 end
0109
0110 if strncmpi(radiationMode,'photons',6)
0111 radiationMode = 'photons';
0112 elseif strncmpi(radiationMode,'proton',6)
0113 radiationMode = 'protons';
0114 elseif (strncmpi(radiationMode,'ion',3) && radiationMass == 12 && radiationAtomicNumber == 6)
0115 radiationMode = 'carbon';
0116 else
0117 warning('The given type of radiation is not yet supported');
0118 end
0119
0120
0121 if strcmp(radiationMode, 'photons')
0122
0123 fractionSequence = planInfo.FractionGroupSequence.Item_1;
0124 pln.propStf.collimation = matRad_importFieldShapes(BeamSequence,fractionSequence);
0125
0126 end
0127
0128
0129 pln.radiationMode = radiationMode;
0130 pln.numOfFractions = planInfo.FractionGroupSequence.Item_1.NumberOfFractionsPlanned;
0131 pln.machine = planInfo.(BeamParam).Item_1.TreatmentMachineName;
0132
0133 pln.propStf.isoCenter = isoCenter;
0134 pln.propStf.bixelWidth = NaN;
0135 pln.propStf.gantryAngles = [gantryAngles{1:length(BeamSeqNames)}];
0136 pln.propStf.couchAngles = [PatientSupportAngle{1:length(BeamSeqNames)}];
0137 pln.propStf.numOfBeams = length(BeamSeqNames);
0138
0139
0140 pln.propOpt.bioOptimization = 'none';
0141
0142 pln.propOpt.runSequencing = false;
0143 pln.propOpt.runDAO = false;
0144
0145
0146
0147 if isfield(pln.propStf,'collimation')
0148 pln.propStf.bixelWidth = 'field';
0149 end
0150
0151
0152 pln.DicomInfo.timeStamp = datestr(clock);
0153
0154 try
0155 pln.DicomInfo.SOPClassUID = planInfo.SOPClassUID;
0156 pln.DicomInfo.SOPInstanceUID = planInfo.SOPInstanceUID;
0157 pln.DicomInfo.ReferencedDoseSequence = planInfo.ReferencedDoseSequence;
0158 catch
0159 end
0160
0161
0162 if dicomMetaBool == true
0163 pln.DicomInfo.Meta = planInfo;
0164 end
0165 end