]> Creatis software - gdcm.git/blob - vtk/test4DSplitter.cxx
4fe3410557cb7baf14e710ba0aa34e3bd4cd3a1b
[gdcm.git] / vtk / test4DSplitter.cxx
1 /*=========================================================================
2
3   Program:   gdcm
4   Module:    $RCSfile: test4DSplitter.cxx,v $
5   Language:  C++
6   Date:      $Date: 2011/03/31 16:12:33 $
7   Version:   $Revision: 1.2 $
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
19 /* Raisons ne pas utiliser itkImageSeriesReader:
20
21 On Wed, Feb 16, 2011 at 11:51 AM, Roger Bramon Feixas <rogerbramon@gmail.com>
22     Hi,
23     I'm developing with ITK 3.20 + GDCM 2.0.17 + VTK 5.6 and I've noticed 
24     itkImageSeriesReader is ~2x slower than vtkGDCMImageReader (from GDCM2). 
25     I compared both codes and I think the difference is the extra copy which 
26     itkImageSeriesReader makes from ImageFileReader's output to its own output 
27     (ImageSeriesReader::GenerateData() line 393). I've commented it just to test 
28     the time needed without making the copy and now both readers take more or less 
29     the same time.
30 */
31
32
33 #include "gdcmFile.h"
34 #include "gdcmSerieHelper.h"
35 #include <vtkImageData.h>
36 #include <iostream>
37 #include "vtkGdcmReader.h"
38
39 #include <algorithm>
40 #include "vtkGdcm4DSplitter.h"
41     
42 /**
43   * \brief
44   */
45
46 typedef std::map<std::string, GDCM_NAME_SPACE::File*> SortedFiles;
47
48 // Due to a deep C++ trouble in 'SortOnTag', we use 'SortOnUserFunction'
49 bool myCompareFunction(GDCM_NAME_SPACE::File *file1, GDCM_NAME_SPACE::File *file2)
50  { 
51    return atof(file1->GetEntryString(0x0018,0x1060).c_str()) < atof(file2->GetEntryString(0x0018,0x1060).c_str()); 
52  } 
53
54 int main(int argc, char *argv[])
55 {
56   
57   
58    std::cout << "... inside " << argv[0] << std::endl;
59
60      
61
62 std::string strDirName("/home/jpr/Desktop/Patients_Emilie/Patient.3T/AUB Jos/AUBERTIN JOSEPH/PROSTATE - 305629373/DYN7INJDYN6_901");
63    
64
65    // ----- Begin Processing -----  
66    
67    unsigned short int grSplit;
68    unsigned short int elSplit;
69
70    unsigned short int grSort;
71    unsigned short int elSort;
72
73 // Pour un directory '4D'
74 // en sortie, chaque vtkImageData contiendra une coupe au cours du temps
75 // n * 2D+T
76
77 std::vector<vtkImageData*> *output;
78
79  if (1) {
80    vtkGdcm4DSplitter *spl = new vtkGdcm4DSplitter();
81    spl->setDirName(strDirName);
82    spl->setRecursive(false);
83    spl->setSplitOnPosition();
84
85    // Time triger : 0018|1060
86    grSort=0x0018;
87    elSort=0x1060;
88    
89    // ==> Big troubles with SortOnTag
90    //spl->setSortOnTag(grSort, elSort);
91    //spl->setSortConvertToFloat(true); 
92       
93    // ==> use SortOnUserFunction !
94    spl->setSortOnUserFunction(myCompareFunction);   
95
96    std::cout << "Everything set" << std::endl;  
97    bool res=spl->Go();
98    
99     std::cout << "GO() done, status " << res << std::endl;
100     if(!res)
101     {
102        std::cout << "plantage!" << std::endl;
103     } 
104
105    output = spl->GetImageDataVector();
106 }
107
108 std::cout << "--------------------------------" << std::endl;
109 std::cout << "Vector size " << output->size()   << std::endl;
110 std::cout << "--------------------------------" << std::endl;
111
112 std::vector<vtkImageData*>::iterator it;
113 // Print the first one (why not?)
114 it=output->begin();
115 (*it)->PrintSelf(std::cout, vtkIndent(2));
116
117
118 // Pour un directory '4D'
119 // en sortie, chaque  vtkImageData contiendra un volume au cours du temps.
120 // 3D + T
121
122 }
123   
124
125