]> Creatis software - gdcm.git/blob - Testing/TestBuildUpDicomDir.cxx
GDCM_NAME_SPACE
[gdcm.git] / Testing / TestBuildUpDicomDir.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: TestBuildUpDicomDir.cxx,v $
5   Language:  C++
6   Date:      $Date: 2007/06/21 14:59:06 $
7   Version:   $Revision: 1.11 $
8                                                                                 
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.
12                                                                                 
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.
16                                                                                 
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"
26 #include "gdcmUtil.h"
27
28 // ===============================================================
29
30 /**
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. 
35   */  
36 int TestBuildUpDicomDir(int argc, char *argv[])
37 {
38    if (argc) 
39    {
40       std::cerr << "Usage: " << argv[0] << " dummy " << std::endl;
41    }
42    
43  // gdcm::Debug::DebugOn();
44  
45    bool errorFound = false; 
46    GDCM_NAME_SPACE::DicomDir *dcmdir;
47    std::string dirName;  
48
49    dcmdir = GDCM_NAME_SPACE::DicomDir::New();
50
51    GDCM_NAME_SPACE::DicomDirPatient *p1;
52    
53    // --- Forget these 4 lines :
54    // just to improve test coverage.
55    p1=dcmdir->GetFirstPatient();
56    if (!p1)
57       std::cout << "BEFORE any Patient creation, a DicomDir has no Patient. Pffff"
58                 << std::endl;
59    // --- end forget
60
61    // Create patient ONE
62    // ------------------
63    p1 = dcmdir->NewPatient();
64    p1->SetEntryString("patientONE",0x0010, 0x0010);
65    // fill here other patient characteristics
66
67    GDCM_NAME_SPACE::DicomDirStudy *s11;
68    // --- Forget these 4 lines :
69    // just to improve test coverage.
70    s11=p1->GetFirstStudy();
71    if (!s11)
72       std::cout << "BEFORE any Study creation, a Patient has no Study. Pffff"
73                 << std::endl;
74    // --- end forget
75
76    // Let's create and add a Study for this Patient
77    s11 = p1->NewStudy();  
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
82
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
87
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
92  
93    GDCM_NAME_SPACE::DicomDirSerie *s111;
94    // --- Forget these 4 lines :
95    // just to improve test coverage.
96    s111=s11->GetFirstSerie();
97    if (!s111)
98       std::cout << "BEFORE any Serie creation, a Study has no Serie. Pffff"
99                 << std::endl;
100    // --- end forget
101
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
106
107    GDCM_NAME_SPACE::DicomDirImage *s1111;
108
109    // --- Forget these 4 lines :
110    // just to improve test coverage.
111    s1111=s111->GetFirstImage();
112    if (!s1111)
113       std::cout << "BEFORE any Image creation, a Serie has no Image. Pffff"
114                 << std::endl;
115    // --- end forget
116
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);
122
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
128     
129    GDCM_NAME_SPACE::DicomDirStudy *s21 = p2->NewStudy();  
130    s21->SetEntryString("StudyDescrTwo.One",0x0008, 0x1030);        
131    // fill here other Study characteristics
132
133    GDCM_NAME_SPACE::DicomDirSerie *s211 = s21->NewSerie();
134    s111->SetEntryString("01-01-211", 0x0008, 0x0021);
135    // fill here other Serie characteristics
136
137    GDCM_NAME_SPACE::DicomDirImage *s2111 = s211->NewImage();
138    s2111->SetEntryString("imageFileName2111",0x0004,0x1500);
139    // fill here other Image characteristics
140
141    GDCM_NAME_SPACE::DicomDirImage *s2112 = s211->NewImage();
142    s2112->SetEntryString("imageFileName1122",0x0004,0x1500);
143    // fill here other Image characteristics
144
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
150
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
156
157    GDCM_NAME_SPACE::DicomDirImage *s1311 = s131->NewImage();
158    s1311->SetEntryString("imageFileName1311",0x0004,0x1500);
159    // fill here other Image characteristics
160      
161    // Print
162    std::cout << "Test/BuildUpDicomDir: Test Print of patients\n";
163    p1->Print();
164    std::cout << "Test/BuildUpDicomDir: end of P1-------------------\n";
165    p2->Print();
166    std::cout << "Test/BuildUpDicomDir: end of P2-------------------\n";
167    p3->Print();
168    std::cout << "Test/BuildUpDicomDir: end of P3-------------------\n";   
169    std::cout << "Test/BuildUpDicomDir: Test Print of patients ended\n";
170    
171  
172  // Let's loop on Patients.  
173    GDCM_NAME_SPACE::DicomDirPatient *p;
174    p=dcmdir->GetFirstPatient();
175    while (p) {
176       std::cout << "one more patient\n";
177       p->Print();
178       p=dcmdir->GetNextPatient();
179    }
180
181   
182    if( !dcmdir->IsReadable() )
183    {
184       std::cout<<"          Created DicomDir "
185                <<" is not readable"<<std::endl
186                <<"          ...Failed"<<std::endl;
187
188       dcmdir->Delete();
189       return 1;
190    }
191
192
193    // Print the 'in memory' built up DicomDir
194    std::cout << "Test/BuildUpDicomDir: Print all of the DicomDir" << std::endl;
195    dcmdir->SetPrintLevel(-1);
196    dcmdir->Print();
197
198    // Write it on disc
199    dcmdir->Write("NewDICOMDIR");
200
201    dcmdir->Delete();
202
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() )
208    {
209       std::cout<<"          Written DicomDir 'NewDICOMDIR'"
210                <<" is not readable"<<std::endl
211                <<"          ...Failed"<<std::endl;
212
213       newDicomDir->Delete();
214       return 1;
215    }
216    // Check some value we are sure
217    p1 = newDicomDir->GetFirstPatient();
218    p2 = newDicomDir->GetNextPatient();
219    p3 = newDicomDir->GetNextPatient();
220
221    if (!p1 || !p2 || !p3)
222    {
223       std::cout << "A patient is missing in written DicomDir"
224           << std::endl;
225       newDicomDir->Delete();
226       return 1;
227    }
228
229    std::cout <<std::endl
230              << "----------Final Check ---------------------" 
231              <<std::endl;
232  
233    std::string valueStuff;  
234    for (;;) // exit on 'break'
235    {
236       if ( p1->GetEntryString(0x0010, 0x0010) != "patientONE" )
237       {
238          std::cout << "0x0010,0x0010 [" 
239                    << p1->GetEntryString(0x0010, 0x0010)
240                    << "]" << std::endl;
241          errorFound = true;
242          break;
243       }
244       std::cout << "Patient : [" 
245                 << p1->GetEntryString(0x0010, 0x0010)
246                 << "]" << std::endl;
247
248       if ( !(s11 = p1->GetFirstStudy()) )
249       {
250          std::cout << "missing first Study Patient One" << std::endl;  
251          errorFound = true;
252          break;
253       }
254       valueStuff = s11->GetEntryString(0x0008, 0x1030);
255       if ( valueStuff.find("StudyDescrOne.One_") >= valueStuff.length() )
256       {
257          std::cout << "1 : 0x0008,0x1030 [" 
258                    << valueStuff
259                    << "]" << std::endl;
260          errorFound = true;
261          break;
262       }
263       std::cout << "Study : [" 
264                 << valueStuff
265                 << "]" << std::endl;
266  
267       valueStuff = s11->GetEntryString(0x0008, 0x1060);
268 std::cout << "----------------length-----------------" << valueStuff.length() <<
269 std::endl;     
270       if (!GDCM_NAME_SPACE::Util::DicomStringEqual(valueStuff, "Dr^Mabuse") )
271       {
272          std::cout << "2 : 0x0008,0x1060 [" 
273                    << s11->GetEntryString(0x0008,0x1060)
274                    << "]" << std::endl;
275          errorFound = true;
276          break;
277       }
278       std::cout << "Physician : [" 
279                 << valueStuff
280                 << "]" << std::endl;
281       if ( (s12 = p1->GetNextStudy()) == 0 )
282       {
283          errorFound = true;
284          break;
285       }
286       if ( GDCM_NAME_SPACE::Util::DicomStringEqual(s12->GetEntryString(0x0008,
287                                            0x1030),"StudyDescrOne.Two " ))
288       {
289          std::cout << "3 0x0008,0x1030 [" 
290                    << s12->GetEntryString(0x0008,0x1030)
291                    << "]" << std::endl;
292          errorFound = true;
293          break;
294       }
295       std::cout << "Study Descr : [" 
296                 << s12->GetEntryString(0x0008,0x1030)
297                 << "]" << std::endl;
298
299       if ( GDCM_NAME_SPACE::Util::DicomStringEqual(s12->GetEntryString(0x0008,
300                                            0x1060),"Dr^Zorglub " ))
301       {
302          std::cout << "4 0x0008,0x1060 [" 
303                    << s12->GetEntryString(0x0008,0x1060)
304                    << "]" << std::endl;
305          errorFound = true;
306          break;
307       }
308    std::cout << "___________________________________" << std::endl;
309       std::cout << "Pysician Reading Study: [" 
310                 << s12->GetEntryString(0x0008,0x1060)
311                 << "]" << std::endl;
312
313       if ( (s13 = p1->GetNextStudy()) == 0 )
314       {
315          std::cout << "Study StudyDescrOne.Tree missing" << std::endl;
316          break;
317       }         
318       if ( s13->GetEntryString(0x0008, 0x1030) != "StudyDescrOne.Tree" )
319       {
320          errorFound = true;
321          break;
322       }
323       std::cout << "Study : [" 
324                 << valueStuff
325                 << "]" << std::endl;
326
327       valueStuff = s13->GetEntryString(0x0008, 0x1060);
328       if (!GDCM_NAME_SPACE::Util::DicomStringEqual(valueStuff, "Dr^Follamour") )
329       {
330          std::cout << "5 0x0008,0x1060 [" 
331                    << valueStuff
332                    << "]" << std::endl;
333          errorFound = true;
334          break;
335       }
336       std::cout << "Pysician : [" 
337                 << valueStuff
338                 << "]" << std::endl;
339
340       if ((s111 = s11->GetFirstSerie()) == 0 )
341       {
342          std::cout << "Serie 01-01-111 missing" << std::endl;
343          errorFound = true;
344          break;
345       }
346
347       valueStuff = s111->GetEntryString(0x0008, 0x0021);
348       if (!GDCM_NAME_SPACE::Util::DicomStringEqual(valueStuff, "01-01-131") )
349       {
350          std::cout << "6 0x0008,0x0021 [" 
351                    << valueStuff
352                    << "]" << std::endl;
353          errorFound = true;
354          break;
355       }
356       std::cout << "Serie : [" 
357                 << valueStuff
358                 << "]" << std::endl;
359
360       if ( (s1111 = s111->GetFirstImage()) == 0 )
361       {
362          std::cout << "missing image S1111" << std::endl;
363          errorFound = true;
364          break;
365       } 
366
367       if ( (s1112 = s111->GetNextImage()) == 0 )
368       {
369          std::cout << "missing image S1112" << std::endl;
370          errorFound = true;
371          break;
372       }
373
374       break; // No error found. Stop looping
375    }
376
377    if ( errorFound )
378    {
379       std::cout << "MissWritting / MissReading " << std::endl;
380    }
381
382    std::cout<<std::flush;
383    newDicomDir->Delete();
384
385    return errorFound;
386 }