1 /*=========================================================================
4 Module: $RCSfile: TestBuildUpDicomDir.cxx,v $
6 Date: $Date: 2006/04/11 16:05:03 $
7 Version: $Revision: 1.9 $
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;
52 // --- Forget these 4 lines :
53 // just to improve test coverage.
54 p1=dcmdir->GetFirstPatient();
56 std::cout << "BEFORE any Patient creation, a DicomDir has no Patient. Pffff"
62 p1 = dcmdir->NewPatient();
63 p1->SetEntryString("patientONE",0x0010, 0x0010);
64 // fill here other patient characteristics
66 gdcm::DicomDirStudy *s11;
67 // --- Forget these 4 lines :
68 // just to improve test coverage.
69 s11=p1->GetFirstStudy();
71 std::cout << "BEFORE any Study creation, a Patient has no Study. Pffff"
75 // Let's create and add a Study for this Patient
77 s11->SetEntryString("StudyDescrOne.One_",0x0008, 0x1030);
78 // we know entry (0008,1060) is not yet created
79 s11->InsertEntryString("Dr^Mabuse", 0x0008, 0x1060, "PN");
80 // fill here other Study characteristics
82 gdcm::DicomDirStudy *s12 = p1->NewStudy();
83 s12->SetEntryString("StudyDescrOne.Two",0x0008, 0x1030);
84 s12->InsertEntryString("Dr^Zorglub", 0x0008, 0x1060, "PN");
85 // fill here other Study characteristics
87 gdcm::DicomDirStudy *s13 = p1->NewStudy();
88 s13->SetEntryString("StudyDescrOne.Tree",0x0008, 0x1030);
89 s13->InsertEntryString("Dr^Follamour", 0x0008, 0x1060, "PN");
90 // fill here other Study characteristics
92 gdcm::DicomDirSerie *s111;
93 // --- Forget these 4 lines :
94 // just to improve test coverage.
95 s111=s11->GetFirstSerie();
97 std::cout << "BEFORE any Serie creation, a Study has no Serie. Pffff"
101 // Let's create and add a Serie for this Study
102 s111 = s11->NewSerie();
103 s111->SetEntryString("01-01-111", 0x0008, 0x0021);
104 // fill here other Serie characteristics
106 gdcm::DicomDirImage *s1111;
108 // --- Forget these 4 lines :
109 // just to improve test coverage.
110 s1111=s111->GetFirstImage();
112 std::cout << "BEFORE any Image creation, a Serie has no Image. Pffff"
116 // Let's create and add a Image for this Serie
117 s1111 = s111->NewImage();
118 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: -------------------\n";
166 std::cout << "Test/BuildUpDicomDir: -------------------\n";
168 std::cout << "Test/BuildUpDicomDir: Test Print of patients ended\n";
170 if( !dcmdir->IsReadable() )
172 std::cout<<" Created DicomDir "
173 <<" is not readable"<<std::endl
174 <<" ...Failed"<<std::endl;
181 // Print the 'in memory' built up DicomDir
182 std::cout << "Test/BuildUpDicomDir: Print all of the DicomDir" << std::endl;
183 dcmdir->SetPrintLevel(-1);
187 dcmdir->Write("NewDICOMDIR");
191 // Read the newly written DicomDir
192 gdcm::DicomDir *newDicomDir = gdcm::DicomDir::New();
193 newDicomDir->SetFileName("NewDICOMDIR");
194 newDicomDir->Load( );
195 if( !newDicomDir->IsReadable() )
197 std::cout<<" Written DicomDir 'NewDICOMDIR'"
198 <<" is not readable"<<std::endl
199 <<" ...Failed"<<std::endl;
201 newDicomDir->Delete();
204 // Check some value we are sure
205 p1 = newDicomDir->GetFirstPatient();
206 p2 = newDicomDir->GetNextPatient();
207 p3 = newDicomDir->GetNextPatient();
209 if (!p1 || !p2 || !p3)
211 std::cout << "A patient is missing in written DicomDir"
213 newDicomDir->Delete();
217 std::cout <<std::endl
218 << "----------Final Check ---------------------"
221 std::string valueStuff;
222 for (;;) // exit on 'break'
224 if ( p1->GetEntryString(0x0010, 0x0010) != "patientONE" )
226 std::cout << "0x0010,0x0010 ["
227 << p1->GetEntryString(0x0010, 0x0010)
232 std::cout << "Patient : ["
233 << p1->GetEntryString(0x0010, 0x0010)
236 if ( !(s11 = p1->GetFirstStudy()) )
238 std::cout << "missing first Study Patient One" << std::endl;
242 valueStuff = s11->GetEntryString(0x0008, 0x1030);
243 if ( valueStuff.find("StudyDescrOne.One_") >= valueStuff.length() )
245 std::cout << "1 : 0x0008,0x1030 ["
251 std::cout << "Study : ["
255 valueStuff = s11->GetEntryString(0x0008, 0x1060);
256 std::cout << "----------------length-----------------" << valueStuff.length() <<
258 if (!gdcm::Util::DicomStringEqual(valueStuff, "Dr^Mabuse") )
260 std::cout << "2 : 0x0008,0x1060 ["
261 << s11->GetEntryString(0x0008,0x1060)
266 std::cout << "Physician : ["
269 if ( (s12 = p1->GetNextStudy()) == 0 )
274 if ( gdcm::Util::DicomStringEqual(s12->GetEntryString(0x0008,
275 0x1030),"StudyDescrOne.Two " ))
277 std::cout << "3 0x0008,0x1030 ["
278 << s12->GetEntryString(0x0008,0x1030)
283 std::cout << "Study Descr : ["
284 << s12->GetEntryString(0x0008,0x1030)
287 if ( gdcm::Util::DicomStringEqual(s12->GetEntryString(0x0008,
288 0x1060),"Dr^Zorglub " ))
290 std::cout << "4 0x0008,0x1060 ["
291 << s12->GetEntryString(0x0008,0x1060)
296 std::cout << "___________________________________" << std::endl;
297 std::cout << "Pysician Reading Study: ["
298 << s12->GetEntryString(0x0008,0x1060)
301 if ( (s13 = p1->GetNextStudy()) == 0 )
303 std::cout << "Study StudyDescrOne.Tree missing" << std::endl;
306 if ( s13->GetEntryString(0x0008, 0x1030) != "StudyDescrOne.Tree" )
311 std::cout << "Study : ["
315 valueStuff = s13->GetEntryString(0x0008, 0x1060);
316 if (!gdcm::Util::DicomStringEqual(valueStuff, "Dr^Follamour") )
318 std::cout << "5 0x0008,0x1060 ["
324 std::cout << "Pysician : ["
328 if ((s111 = s11->GetFirstSerie()) == 0 )
330 std::cout << "Serie 01-01-111 missing" << std::endl;
335 valueStuff = s111->GetEntryString(0x0008, 0x0021);
336 if (!gdcm::Util::DicomStringEqual(valueStuff, "01-01-131") )
338 std::cout << "6 0x0008,0x0021 ["
344 std::cout << "Serie : ["
348 if ( (s1111 = s111->GetFirstImage()) == 0 )
350 std::cout << "missing image S1111" << std::endl;
355 if ( (s1112 = s111->GetNextImage()) == 0 )
357 std::cout << "missing image S1112" << std::endl;
362 break; // No error found. Stop looping
367 std::cout << "MissWritting / MissReading " << std::endl;
370 std::cout<<std::flush;
371 newDicomDir->Delete();