1 /*=========================================================================
4 Module: $RCSfile: TestBuildUpDicomDir.cxx,v $
6 Date: $Date: 2007/04/12 13:06:02 $
7 Version: $Revision: 1.10 $
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::DicomDir *dcmdir;
49 dcmdir = gdcm::DicomDir::New();
51 gdcm::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::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::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::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::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::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::DicomDirImage *s1112 = s111->NewImage();
121 s1112->SetEntryString("imageFileName1112",0x0004,0x1500);
123 // Create patient TWO
124 // ------------------
125 gdcm::DicomDirPatient *p2 = dcmdir->NewPatient();
126 p2->SetEntryString("patientTWO",0x0010, 0x0010);
127 // fill here other patient characteristics
129 gdcm::DicomDirStudy *s21 = p2->NewStudy();
130 s21->SetEntryString("StudyDescrTwo.One",0x0008, 0x1030);
131 // fill here other Study characteristics
133 gdcm::DicomDirSerie *s211 = s21->NewSerie();
134 s111->SetEntryString("01-01-211", 0x0008, 0x0021);
135 // fill here other Serie characteristics
137 gdcm::DicomDirImage *s2111 = s211->NewImage();
138 s2111->SetEntryString("imageFileName2111",0x0004,0x1500);
139 // fill here other Image characteristics
141 gdcm::DicomDirImage *s2112 = s211->NewImage();
142 s2112->SetEntryString("imageFileName1122",0x0004,0x1500);
143 // fill here other Image characteristics
145 // Create patient TREE
146 // -------------------
147 gdcm::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::DicomDirSerie *s131 = s13->NewSerie();
154 s111->SetEntryString("01-01-131", 0x0008, 0x0021);
155 // fill here other Serie characteristics
157 gdcm::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::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::DicomDir *newDicomDir = gdcm::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
217 p1 = newDicomDir->GetFirstPatient();
218 p2 = newDicomDir->GetNextPatient();
219 p3 = newDicomDir->GetNextPatient();
221 if (!p1 || !p2 || !p3)
223 std::cout << "A patient is missing in written DicomDir"
225 newDicomDir->Delete();
229 std::cout <<std::endl
230 << "----------Final Check ---------------------"
233 std::string valueStuff;
234 for (;;) // exit on 'break'
236 if ( p1->GetEntryString(0x0010, 0x0010) != "patientONE" )
238 std::cout << "0x0010,0x0010 ["
239 << p1->GetEntryString(0x0010, 0x0010)
244 std::cout << "Patient : ["
245 << p1->GetEntryString(0x0010, 0x0010)
248 if ( !(s11 = p1->GetFirstStudy()) )
250 std::cout << "missing first Study Patient One" << std::endl;
254 valueStuff = s11->GetEntryString(0x0008, 0x1030);
255 if ( valueStuff.find("StudyDescrOne.One_") >= valueStuff.length() )
257 std::cout << "1 : 0x0008,0x1030 ["
263 std::cout << "Study : ["
267 valueStuff = s11->GetEntryString(0x0008, 0x1060);
268 std::cout << "----------------length-----------------" << valueStuff.length() <<
270 if (!gdcm::Util::DicomStringEqual(valueStuff, "Dr^Mabuse") )
272 std::cout << "2 : 0x0008,0x1060 ["
273 << s11->GetEntryString(0x0008,0x1060)
278 std::cout << "Physician : ["
281 if ( (s12 = p1->GetNextStudy()) == 0 )
286 if ( gdcm::Util::DicomStringEqual(s12->GetEntryString(0x0008,
287 0x1030),"StudyDescrOne.Two " ))
289 std::cout << "3 0x0008,0x1030 ["
290 << s12->GetEntryString(0x0008,0x1030)
295 std::cout << "Study Descr : ["
296 << s12->GetEntryString(0x0008,0x1030)
299 if ( gdcm::Util::DicomStringEqual(s12->GetEntryString(0x0008,
300 0x1060),"Dr^Zorglub " ))
302 std::cout << "4 0x0008,0x1060 ["
303 << s12->GetEntryString(0x0008,0x1060)
308 std::cout << "___________________________________" << std::endl;
309 std::cout << "Pysician Reading Study: ["
310 << s12->GetEntryString(0x0008,0x1060)
313 if ( (s13 = p1->GetNextStudy()) == 0 )
315 std::cout << "Study StudyDescrOne.Tree missing" << std::endl;
318 if ( s13->GetEntryString(0x0008, 0x1030) != "StudyDescrOne.Tree" )
323 std::cout << "Study : ["
327 valueStuff = s13->GetEntryString(0x0008, 0x1060);
328 if (!gdcm::Util::DicomStringEqual(valueStuff, "Dr^Follamour") )
330 std::cout << "5 0x0008,0x1060 ["
336 std::cout << "Pysician : ["
340 if ((s111 = s11->GetFirstSerie()) == 0 )
342 std::cout << "Serie 01-01-111 missing" << std::endl;
347 valueStuff = s111->GetEntryString(0x0008, 0x0021);
348 if (!gdcm::Util::DicomStringEqual(valueStuff, "01-01-131") )
350 std::cout << "6 0x0008,0x0021 ["
356 std::cout << "Serie : ["
360 if ( (s1111 = s111->GetFirstImage()) == 0 )
362 std::cout << "missing image S1111" << std::endl;
367 if ( (s1112 = s111->GetNextImage()) == 0 )
369 std::cout << "missing image S1112" << std::endl;
374 break; // No error found. Stop looping
379 std::cout << "MissWritting / MissReading " << std::endl;
382 std::cout<<std::flush;
383 newDicomDir->Delete();