Warning, file /geant4/examples/extended/medical/DICOM/G4DicomReader/src/DicomFilePlan.cc was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
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 #include "DicomFilePlan.hh"
0027
0028 #include "DicomBeam.hh"
0029 #include "DicomBeamBlock.hh"
0030 #include "DicomBeamCompensator.hh"
0031 #include "DicomBeamControlPoint.hh"
0032 #include "DicomBeamDevicePos.hh"
0033 #include "DicomBeamDeviceRef.hh"
0034 #include "DicomBeamWedge.hh"
0035 #include "dcmtk/dcmdata/dcdeftag.h"
0036 #include "dcmtk/dcmdata/dcfilefo.h"
0037 #include "dcmtk/dcmrt/drtplan.h"
0038 #include "dcmtk/dcmrt/seq/drtbl2.h" // for BlockSequence
0039 #include "dcmtk/dcmrt/seq/drtbldps.h" // for BeamLimitingDevicePositionSequence
0040 #include "dcmtk/dcmrt/seq/drtblds1.h" // for BeamLimitingDeviceSequence
0041 #include "dcmtk/dcmrt/seq/drtbs.h" // for BeamSequence
0042 #include "dcmtk/dcmrt/seq/drtcos.h" // for CompensatorSequence
0043 #include "dcmtk/dcmrt/seq/drtcps.h" // for ControlPointSequence
0044 #include "dcmtk/dcmrt/seq/drtfgs.h" // DRTFractionGroupSequence
0045 #include "dcmtk/dcmrt/seq/drtrbs8.h" // DRTReferencedBeamSequenceInRTFractionSchemeModule
0046 #include "dcmtk/dcmrt/seq/drtws.h" // for WedgeSequence
0047
0048 #include "G4ThreeVector.hh"
0049
0050
0051 DicomFilePlan::DicomFilePlan(DcmDataset* dset) : DicomVFile(dset) {}
0052
0053
0054 void DicomFilePlan::ReadData()
0055 {
0056 DRTPlanIOD rtplan;
0057 OFCondition result = rtplan.read(*theDataset);
0058 if (!result.good()) {
0059 G4Exception("DicomFilePlan::ReadData", "DFS001", FatalException, result.text());
0060 }
0061 OFString fstr;
0062 Sint32 fint;
0063 Float64 ffloat;
0064 OFVector<Float64> fvfloat;
0065
0066 DRTFractionGroupSequence frgSeq = rtplan.getFractionGroupSequence();
0067 if (frgSeq.isEmpty()) {
0068 G4Exception("DicomFilePlan::ReadData", "DFS002", JustWarning,
0069 "DRTFractionGroupSequence is empty");
0070 }
0071 G4cout << "@@@@@ NUMBER OF FractionSequences " << frgSeq.getNumberOfItems() << G4endl;
0072 frgSeq.gotoFirstItem();
0073 for (size_t i1 = 0; i1 < frgSeq.getNumberOfItems(); i1++) {
0074 DRTFractionGroupSequence::Item& rfgItem = frgSeq.getCurrentItem();
0075 rfgItem.getBeamDoseMeaning(fstr);
0076 G4cout << " " << i1 << " BeamDoseMeaning " << fstr << G4endl;
0077 rfgItem.getFractionGroupDescription(fstr);
0078 G4cout << " " << i1 << " FractionGroupDescription " << fstr << G4endl;
0079 rfgItem.getFractionGroupNumber(fint);
0080 G4cout << " " << i1 << " FractionGroupNumber " << fint << G4endl;
0081 rfgItem.getFractionPattern(fstr);
0082 G4cout << " " << i1 << " FractionPattern " << fstr << G4endl;
0083 rfgItem.getNumberOfBeams(fint);
0084 G4cout << " " << i1 << " NumberOfBeams " << fint << G4endl;
0085 theNumberOfBeams = fint;
0086 rfgItem.getNumberOfBrachyApplicationSetups(fint);
0087 G4cout << " " << i1 << " NumberOfBrachyApplicationSetups " << fint << G4endl;
0088 CheckData0(" NumberOfBrachyApplicationSetups ", fint);
0089 rfgItem.getNumberOfFractionPatternDigitsPerDay(fint);
0090 G4cout << " " << i1 << " NumberOfFractionPatternDigitsPerDay " << fint << G4endl;
0091 rfgItem.getNumberOfFractionsPlanned(fint);
0092 G4cout << " " << i1 << " NumberOfFractionsPlanned " << fint << G4endl;
0093 rfgItem.getRepeatFractionCycleLength(fint);
0094 G4cout << " " << i1 << " RepeatFractionCycleLength " << fint << G4endl;
0095 DRTReferencedBeamSequenceInRTFractionSchemeModule refBeamSeq =
0096 rfgItem.getReferencedBeamSequence();
0097 G4cout << " @@@ NUMBER OF ReferencedBeamSequences " << refBeamSeq.getNumberOfItems() << G4endl;
0098
0099 refBeamSeq.gotoFirstItem();
0100 for (size_t i2 = 0; i2 < refBeamSeq.getNumberOfItems(); i2++) {
0101 DicomBeam* db = new DicomBeam();
0102 theBeams.push_back(db);
0103 DRTReferencedBeamSequenceInRTFractionSchemeModule::Item& rbsItem =
0104 refBeamSeq.getCurrentItem();
0105 rbsItem.getBeamDeliveryDurationLimit(ffloat);
0106 G4cout << " " << i2 << " BeamDeliveryDurationLimit " << ffloat << G4endl;
0107 rbsItem.getBeamDose(ffloat);
0108 G4cout << " " << i2 << " BeamDose " << ffloat << G4endl;
0109 rbsItem.getBeamDoseSpecificationPoint(fvfloat);
0110 G4cout << " " << i2 << " BeamDoseSpecificationPoint (" << fvfloat[0] << "," << fvfloat[1]
0111 << "," << fvfloat[2] << ")" << G4endl;
0112 db->SetDoseSpecificationPoint(G4ThreeVector(fvfloat[0], fvfloat[1], fvfloat[2]));
0113 rbsItem.getBeamMeterset(ffloat);
0114 G4cout << " " << i2 << " BeamMeterset " << ffloat << G4endl;
0115 db->SetMeterset(ffloat);
0116 rbsItem.getReferencedBeamNumber(fint);
0117 G4cout << " " << i2 << " ReferencedBeamNumber " << fint << G4endl;
0118
0119 refBeamSeq.gotoNextItem();
0120 }
0121
0122 frgSeq.gotoNextItem();
0123 }
0124
0125 DRTBeamSequence beamSeq = rtplan.getBeamSequence();
0126 if (beamSeq.isEmpty()) {
0127 G4Exception("DicomFilePlan::ReadData", "DFS002", JustWarning, "DRTBeamSequence is empty");
0128 }
0129 G4cout << "@@@@@ NUMBER OF BeamSequences " << beamSeq.getNumberOfItems() << G4endl;
0130 beamSeq.gotoFirstItem();
0131 for (size_t i1 = 0; i1 < beamSeq.getNumberOfItems(); i1++) {
0132 DicomBeam* db = theBeams[i1];
0133 DRTBeamSequence::Item& beamItem = beamSeq.getCurrentItem();
0134
0135 beamItem.getManufacturer(fstr);
0136 G4cout << " " << i1 << " Manufacturer " << fstr << G4endl;
0137 beamItem.getManufacturerModelName(fstr);
0138 G4cout << " " << i1 << " ManufacturerModelName " << fstr << G4endl;
0139 beamItem.getTreatmentMachineName(fstr);
0140 G4cout << " " << i1 << " TreatmentMachineName " << fstr << G4endl;
0141 beamItem.getPrimaryDosimeterUnit(fstr);
0142 G4cout << " " << i1 << " PrimaryDosimeterUnit " << fstr << G4endl;
0143 beamItem.getSourceAxisDistance(ffloat);
0144 G4cout << " " << i1 << " SourceAxisDistance " << ffloat << G4endl;
0145 db->SetSourceAxisDistance(ffloat);
0146
0147 DRTBeamLimitingDeviceSequenceInRTBeamsModule beamLDS = beamItem.getBeamLimitingDeviceSequence();
0148 G4cout << " @@@ NUMBER OF BeamLimitingDeviceSequence " << beamLDS.getNumberOfItems() << G4endl;
0149 beamLDS.gotoFirstItem();
0150 for (size_t i2 = 0; i2 < beamLDS.getNumberOfItems(); i2++) {
0151 DRTBeamLimitingDeviceSequenceInRTBeamsModule::Item bldsItem = beamLDS.getCurrentItem();
0152 DicomBeamDeviceRef* dbd = new DicomBeamDeviceRef(bldsItem);
0153 db->AddDevice(dbd);
0154
0155 beamLDS.gotoNextItem();
0156 }
0157
0158 beamItem.getBeamNumber(fint);
0159 G4cout << " " << i1 << " BeamNumber " << fint << G4endl;
0160 db->SetNumber(fint);
0161 beamItem.getBeamName(fstr);
0162 G4cout << " " << i1 << " BeamName " << fstr << G4endl;
0163 beamItem.getBeamDescription(fstr);
0164 G4cout << " " << i1 << " BeamDescription " << fstr << G4endl;
0165 beamItem.getBeamType(fstr);
0166 G4cout << " " << i1 << " BeamType " << fstr << G4endl;
0167 beamItem.getRadiationType(fstr);
0168 G4cout << " " << i1 << " RadiationType " << fstr << G4endl;
0169 db->SetRadiationType(fstr);
0170 beamItem.getTreatmentDeliveryType(fstr);
0171 G4cout << " " << i1 << " TreatmentDeliveryType " << fstr << G4endl;
0172 beamItem.getNumberOfWedges(fint);
0173 G4cout << " " << i1 << " NumberOfWedges " << fint << G4endl;
0174 DRTWedgeSequence beamWedge = beamItem.getWedgeSequence();
0175 beamWedge.gotoFirstItem();
0176 for (size_t i2 = 0; i2 < beamWedge.getNumberOfItems(); i2++) {
0177 DRTWedgeSequence::Item bwedItem = beamWedge.getCurrentItem();
0178 DicomBeamWedge* dbwed = new DicomBeamWedge(bwedItem);
0179 db->AddWedge(dbwed);
0180 beamWedge.gotoNextItem();
0181 }
0182
0183 beamItem.getNumberOfCompensators(fint);
0184 G4cout << " " << i1 << " NumberOfCompensators " << fint << G4endl;
0185 DRTCompensatorSequence beamCompens = beamItem.getCompensatorSequence();
0186 beamCompens.gotoFirstItem();
0187 for (size_t i2 = 0; i2 < beamCompens.getNumberOfItems(); i2++) {
0188 DRTCompensatorSequence::Item bcompItem = beamCompens.getCurrentItem();
0189 DicomBeamCompensator* dbcomp = new DicomBeamCompensator(bcompItem);
0190 db->AddCompensator(dbcomp);
0191 beamCompens.gotoNextItem();
0192 }
0193
0194 beamItem.getNumberOfBoli(fint);
0195 G4cout << " " << i1 << " NumberOfBoli " << fint << G4endl;
0196
0197
0198 beamItem.getNumberOfBlocks(fint);
0199 G4cout << " " << i1 << " NumberOfBlocks " << fint << G4endl;
0200 DRTBlockSequenceInRTBeamsModule beamBlock = beamItem.getBlockSequence();
0201 beamBlock.gotoFirstItem();
0202 for (size_t i2 = 0; i2 < beamBlock.getNumberOfItems(); i2++) {
0203 DRTBlockSequenceInRTBeamsModule::Item bblItem = beamBlock.getCurrentItem();
0204 DicomBeamBlock* dbbl = new DicomBeamBlock(bblItem);
0205 db->AddBlock(dbbl);
0206 beamBlock.gotoNextItem();
0207 }
0208
0209 beamItem.getFinalCumulativeMetersetWeight(fstr);
0210 G4cout << " " << i1 << " FinalCumulativeMetersetWeight " << fstr << G4endl;
0211 beamItem.getDeviceSerialNumber(fstr);
0212 G4cout << " " << i1 << " DeviceSerialNumber " << fstr << G4endl;
0213 beamItem.getHighDoseTechniqueType(fstr);
0214 G4cout << " " << i1 << " HighDoseTechniqueType " << fstr << G4endl;
0215 beamItem.getInstitutionAddress(fstr);
0216 G4cout << " " << i1 << " InstitutionAddress " << fstr << G4endl;
0217 beamItem.getInstitutionName(fstr);
0218 G4cout << " " << i1 << " InstitutionName " << fstr << G4endl;
0219 beamItem.getInstitutionalDepartmentName(fstr);
0220 G4cout << " " << i1 << " InstitutionalDepartmentName " << fstr << G4endl;
0221 beamItem.getReferencedPatientSetupNumber(fint);
0222 G4cout << " " << i1 << " ReferencedPatientSetupNumber " << fint << G4endl;
0223 beamItem.getReferencedToleranceTableNumber(fint);
0224 G4cout << " " << i1 << " ReferencedToleranceTableNumber " << fint << G4endl;
0225 beamItem.getTotalBlockTrayFactor(ffloat);
0226 G4cout << " " << i1 << " TotalBlockTrayFactor " << ffloat << G4endl;
0227 beamItem.getTotalCompensatorTrayFactor(ffloat);
0228 G4cout << " " << i1 << " TotalCompensatorTrayFactor " << ffloat << G4endl;
0229
0230 beamItem.getNumberOfControlPoints(fint);
0231 DRTControlPointSequence controlPSeq = beamItem.getControlPointSequence();
0232 G4cout << " @@@ NUMBER OF ControlPointSequences " << controlPSeq.getNumberOfItems() << " = "
0233 << fint << G4endl;
0234 controlPSeq.gotoFirstItem();
0235 DicomBeamControlPoint* dbcp0 = 0;
0236
0237 for (size_t i2 = 0; i2 < controlPSeq.getNumberOfItems(); i2++) {
0238 DRTControlPointSequence::Item& cpItem = controlPSeq.getCurrentItem();
0239 if (db->GetNControlPoints() != 0) dbcp0 = db->GetControlPoint(0);
0240 DicomBeamControlPoint* dbcp = new DicomBeamControlPoint(cpItem, dbcp0);
0241 db->AddControlPoint(dbcp);
0242 controlPSeq.gotoNextItem();
0243 }
0244
0245 beamSeq.gotoNextItem();
0246 }
0247
0248
0249
0250
0251
0252 }
0253
0254
0255 void DicomFilePlan::CheckData0(OFString title, Sint32 val)
0256 {
0257 if (val != 0) {
0258 G4Exception("DicomFilePlan::CheckData", "DFP003", FatalException,
0259 (title + " exists, and code is not ready ").c_str());
0260 }
0261 }
0262
0263
0264 void DicomFilePlan::SetControlPointMetersets()
0265 {
0266 for (size_t ii = 0; ii < theBeams.size(); ii++) {
0267 theBeams[ii]->SetControlPointMetersets();
0268 }
0269 }
0270
0271
0272 void DicomFilePlan::DumpToFile()
0273 {
0274 for (size_t ii = 0; ii < theBeams.size(); ii++) {
0275 theBeams[ii]->DumpToFile();
0276 }
0277 }