1 /*=========================================================================
4 Module: $RCSfile: TestBuildUpDicomDir.cxx,v $
6 Date: $Date: 2007/08/20 13:25:32 $
7 Version: $Revision: 1.12 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See Doc/License.txt or
11 http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
18 #include "gdcmDocEntry.h"
19 #include "gdcmDicomDir.h"
20 #include "gdcmDicomDirPatient.h"
21 #include "gdcmDicomDirStudy.h"
22 #include "gdcmDicomDirSerie.h"
23 #include "gdcmDicomDirImage.h"
24 #include "gdcmDirList.h"
25 #include "gdcmDebug.h"
28 // ===============================================================
31 * \brief Builds up ex-nihilo a DICOMDIR file
32 * adding Patient, Study, Serie, Image descriptions
33 * to an empty gdcmDicomDir occurence
34 * and writes a file named NewDICOMDIR.
36 int TestBuildUpDicomDir(int argc, char *argv[])
40 std::cerr << "Usage: " << argv[0] << " dummy " << std::endl;
43 // gdcm::Debug::DebugOn();
45 bool errorFound = false;
46 GDCM_NAME_SPACE::DicomDir *dcmdir;
49 dcmdir = GDCM_NAME_SPACE::DicomDir::New();
51 GDCM_NAME_SPACE::DicomDirPatient *p1;
53 // --- Forget these 4 lines :
54 // just to improve test coverage.
55 p1=dcmdir->GetFirstPatient();
57 std::cout << "BEFORE any Patient creation, a DicomDir has no Patient. Pffff"
63 p1 = dcmdir->NewPatient();
64 p1->SetEntryString("patientONE",0x0010, 0x0010);
65 // fill here other patient characteristics
67 GDCM_NAME_SPACE::DicomDirStudy *s11;
68 // --- Forget these 4 lines :
69 // just to improve test coverage.
70 s11=p1->GetFirstStudy();
72 std::cout << "BEFORE any Study creation, a Patient has no Study. Pffff"
76 // Let's create and add a Study for this Patient
78 s11->SetEntryString("StudyDescrOne.One_",0x0008, 0x1030);
79 // we know entry (0008,1060) is not yet created
80 s11->InsertEntryString("Dr^Mabuse", 0x0008, 0x1060, "PN");
81 // fill here other Study characteristics
83 GDCM_NAME_SPACE::DicomDirStudy *s12 = p1->NewStudy();
84 s12->SetEntryString("StudyDescrOne.Two",0x0008, 0x1030);
85 s12->InsertEntryString("Dr^Zorglub", 0x0008, 0x1060, "PN");
86 // fill here other Study characteristics
88 GDCM_NAME_SPACE::DicomDirStudy *s13 = p1->NewStudy();
89 s13->SetEntryString("StudyDescrOne.Tree",0x0008, 0x1030);
90 s13->InsertEntryString("Dr^Follamour", 0x0008, 0x1060, "PN");
91 // fill here other Study characteristics
93 GDCM_NAME_SPACE::DicomDirSerie *s111;
94 // --- Forget these 4 lines :
95 // just to improve test coverage.
96 s111=s11->GetFirstSerie();
98 std::cout << "BEFORE any Serie creation, a Study has no Serie. Pffff"
102 // Let's create and add a Serie for this Study
103 s111 = s11->NewSerie();
104 s111->SetEntryString("01-01-111", 0x0008, 0x0021);
105 // fill here other Serie characteristics
107 GDCM_NAME_SPACE::DicomDirImage *s1111;
109 // --- Forget these 4 lines :
110 // just to improve test coverage.
111 s1111=s111->GetFirstImage();
113 std::cout << "BEFORE any Image creation, a Serie has no Image. Pffff"
117 // Let's create and add a Image for this Serie
118 s1111 = s111->NewImage();
119 s1111->SetEntryString("imageFileName1111",0x0004,0x1500);
120 GDCM_NAME_SPACE::DicomDirImage *s1112 = s111->NewImage();
121 s1112->SetEntryString("imageFileName1112",0x0004,0x1500);
123 // Create patient TWO
124 // ------------------
125 GDCM_NAME_SPACE::DicomDirPatient *p2 = dcmdir->NewPatient();
126 p2->SetEntryString("patientTWO",0x0010, 0x0010);
127 // fill here other patient characteristics
129 GDCM_NAME_SPACE::DicomDirStudy *s21 = p2->NewStudy();
130 s21->SetEntryString("StudyDescrTwo.One",0x0008, 0x1030);
131 // fill here other Study characteristics
133 GDCM_NAME_SPACE::DicomDirSerie *s211 = s21->NewSerie();
134 s111->SetEntryString("01-01-211", 0x0008, 0x0021);
135 // fill here other Serie characteristics
137 GDCM_NAME_SPACE::DicomDirImage *s2111 = s211->NewImage();
138 s2111->SetEntryString("imageFileName2111",0x0004,0x1500);
139 // fill here other Image characteristics
141 GDCM_NAME_SPACE::DicomDirImage *s2112 = s211->NewImage();
142 s2112->SetEntryString("imageFileName1122",0x0004,0x1500);
143 // fill here other Image characteristics
145 // Create patient TREE
146 // -------------------
147 GDCM_NAME_SPACE::DicomDirPatient *p3 = dcmdir->NewPatient();
148 p3->SetEntryString("patientTHREE",0x0010, 0x0010);
149 // fill here other Patient characteristics
151 // Add a new Serie/Image for a Patient's Study created a long time ago
152 // -------------------------------------------------------------------
153 GDCM_NAME_SPACE::DicomDirSerie *s131 = s13->NewSerie();
154 s111->SetEntryString("01-01-131", 0x0008, 0x0021);
155 // fill here other Serie characteristics
157 GDCM_NAME_SPACE::DicomDirImage *s1311 = s131->NewImage();
158 s1311->SetEntryString("imageFileName1311",0x0004,0x1500);
159 // fill here other Image characteristics
162 std::cout << "Test/BuildUpDicomDir: Test Print of patients\n";
164 std::cout << "Test/BuildUpDicomDir: end of P1-------------------\n";
166 std::cout << "Test/BuildUpDicomDir: end of P2-------------------\n";
168 std::cout << "Test/BuildUpDicomDir: end of P3-------------------\n";
169 std::cout << "Test/BuildUpDicomDir: Test Print of patients ended\n";
172 // Let's loop on Patients.
173 GDCM_NAME_SPACE::DicomDirPatient *p;
174 p=dcmdir->GetFirstPatient();
176 std::cout << "one more patient\n";
178 p=dcmdir->GetNextPatient();
182 if( !dcmdir->IsReadable() )
184 std::cout<<" Created DicomDir "
185 <<" is not readable"<<std::endl
186 <<" ...Failed"<<std::endl;
193 // Print the 'in memory' built up DicomDir
194 std::cout << "Test/BuildUpDicomDir: Print all of the DicomDir" << std::endl;
195 dcmdir->SetPrintLevel(-1);
199 dcmdir->Write("NewDICOMDIR");
203 // Read the newly written DicomDir
204 GDCM_NAME_SPACE::DicomDir *newDicomDir = GDCM_NAME_SPACE::DicomDir::New();
205 newDicomDir->SetFileName("NewDICOMDIR");
206 newDicomDir->Load( );
207 if( !newDicomDir->IsReadable() )
209 std::cout<<" Written DicomDir 'NewDICOMDIR'"
210 <<" is not readable"<<std::endl
211 <<" ...Failed"<<std::endl;
213 newDicomDir->Delete();
216 // Check some value we are sure
218 int numberOfPatients = newDicomDir->GetNumberOfPatients();
219 if (numberOfPatients != 3)
221 std::cout<<" wrong GetNumberOfPatients() : " << newDicomDir->GetNumberOfPatients()
222 <<" (should be 3)" <<std::endl;
224 newDicomDir->Delete();
228 p1 = newDicomDir->GetFirstPatient();
229 p2 = newDicomDir->GetNextPatient();
230 p3 = newDicomDir->GetNextPatient();
232 if (!p1 || !p2 || !p3)
234 std::cout << "A patient is missing in written DicomDir"
236 newDicomDir->Delete();
240 std::cout <<std::endl
241 << "----------Final Check ---------------------"
244 std::string valueStuff;
245 for (;;) // exit on 'break'
247 if ( p1->GetEntryString(0x0010, 0x0010) != "patientONE" )
249 std::cout << "0x0010,0x0010 ["
250 << p1->GetEntryString(0x0010, 0x0010)
255 std::cout << "Patient : ["
256 << p1->GetEntryString(0x0010, 0x0010)
259 if ( !(s11 = p1->GetFirstStudy()) )
261 std::cout << "missing first Study Patient One" << std::endl;
265 valueStuff = s11->GetEntryString(0x0008, 0x1030);
266 if ( valueStuff.find("StudyDescrOne.One_") >= valueStuff.length() )
268 std::cout << "1 : 0x0008,0x1030 ["
274 std::cout << "Study : ["
278 valueStuff = s11->GetEntryString(0x0008, 0x1060);
279 std::cout << "----------------length-----------------" << valueStuff.length() <<
281 if (!GDCM_NAME_SPACE::Util::DicomStringEqual(valueStuff, "Dr^Mabuse") )
283 std::cout << "2 : 0x0008,0x1060 ["
284 << s11->GetEntryString(0x0008,0x1060)
289 std::cout << "Physician : ["
292 if ( (s12 = p1->GetNextStudy()) == 0 )
297 if ( GDCM_NAME_SPACE::Util::DicomStringEqual(s12->GetEntryString(0x0008,
298 0x1030),"StudyDescrOne.Two " ))
300 std::cout << "3 0x0008,0x1030 ["
301 << s12->GetEntryString(0x0008,0x1030)
306 std::cout << "Study Descr : ["
307 << s12->GetEntryString(0x0008,0x1030)
310 if ( GDCM_NAME_SPACE::Util::DicomStringEqual(s12->GetEntryString(0x0008,
311 0x1060),"Dr^Zorglub " ))
313 std::cout << "4 0x0008,0x1060 ["
314 << s12->GetEntryString(0x0008,0x1060)
319 std::cout << "___________________________________" << std::endl;
320 std::cout << "Pysician Reading Study: ["
321 << s12->GetEntryString(0x0008,0x1060)
324 if ( (s13 = p1->GetNextStudy()) == 0 )
326 std::cout << "Study StudyDescrOne.Tree missing" << std::endl;
329 if ( s13->GetEntryString(0x0008, 0x1030) != "StudyDescrOne.Tree" )
334 std::cout << "Study : ["
338 valueStuff = s13->GetEntryString(0x0008, 0x1060);
339 if (!GDCM_NAME_SPACE::Util::DicomStringEqual(valueStuff, "Dr^Follamour") )
341 std::cout << "5 0x0008,0x1060 ["
347 std::cout << "Pysician : ["
351 if ((s111 = s11->GetFirstSerie()) == 0 )
353 std::cout << "Serie 01-01-111 missing" << std::endl;
358 valueStuff = s111->GetEntryString(0x0008, 0x0021);
359 if (!GDCM_NAME_SPACE::Util::DicomStringEqual(valueStuff, "01-01-131") )
361 std::cout << "6 0x0008,0x0021 ["
367 std::cout << "Serie : ["
371 if ( (s1111 = s111->GetFirstImage()) == 0 )
373 std::cout << "missing image S1111" << std::endl;
378 if ( (s1112 = s111->GetNextImage()) == 0 )
380 std::cout << "missing image S1112" << std::endl;
385 break; // No error found. Stop looping
390 std::cout << "MissWritting / MissReading " << std::endl;
393 std::cout<<std::flush;
394 newDicomDir->Delete();