]> Creatis software - bbtk.git/blob - packages/gdcmvtk/src/bbgdcmvtkGetXCoherentInfoGdcmReader.cxx
GDCM vs GDCM2
[bbtk.git] / packages / gdcmvtk / src / bbgdcmvtkGetXCoherentInfoGdcmReader.cxx
1 #include "bbgdcmvtkGetXCoherentInfoGdcmReader.h"
2 #include "bbgdcmvtkPackage.h"
3
4 #include "gdcmFile.h"
5 #include "vtkImageData.h"
6 #include <vtkIndent.h>
7
8 #if defined USE_GDCM
9         #include "gdcmFileHelper.h"
10 #endif
11
12 #if defined USE_GDCM2
13         #include <gdcmReader.h>
14         #include <gdcmImageHelper.h>
15         #include <gdcmIPPSorter.h>
16         #include <vtkGDCMImageReader.h>
17         #include "vtkStringArray.h"
18 #endif
19
20 namespace bbgdcmvtk
21 {
22
23 BBTK_ADD_BLACK_BOX_TO_PACKAGE(gdcmvtk,GetXCoherentInfoGdcmReader)
24 BBTK_BLACK_BOX_IMPLEMENTATION(GetXCoherentInfoGdcmReader,bbtk::AtomicBlackBox);
25 #if defined USE_GDCM
26 void GetXCoherentInfoGdcmReader::Process()
27 {
28  // Read the *first* image file (a SET of file names is given as input) 
29    f = GDCM_NAME_SPACE::File::New();
30    f->SetFileName( bbGetInputIn()[0] );
31    bool res = f->Load();  
32    if ( !res )
33    {
34       f->Delete();
35       bbSetOutputOut(0);
36       return;
37    }
38  // Get info from the first image file
39    int i;
40    std::vector<double> v_iop;
41    float iop[6];
42    f->GetImageOrientationPatient(iop);
43    
44    for(i=0; i< 6; i++)
45       v_iop.push_back(iop[i]);
46    bbSetOutputIOP(v_iop );
47  
48    std::vector<double> v_ipp;
49    float ipp[3];
50    f->GetImagePositionPatient(ipp);
51    
52    for(i=0; i< 3; i++)
53       v_ipp.push_back(ipp[i]);
54    bbSetOutputIPP(v_ipp );
55
56 // Add *all the files* to the SerieHelper
57    sh = GDCM_NAME_SPACE::SerieHelper::New();
58    std::vector<std::string> gii = bbGetInputIn();
59    
60    for(std::vector<std::string>::iterator it = gii.begin();
61                                           it != gii.end();
62                                         ++it)
63    {
64       sh->AddFileName(*it);
65    }
66
67    GDCM_NAME_SPACE::FileList::const_iterator it;
68    GDCM_NAME_SPACE::FileList *l;
69
70    // Should only contain one!
71    l = sh->GetFirstSingleSerieUIDFileSet();
72
73    int nbFiles;
74    double zspacing = 0.;
75    nbFiles = l->size() ;
76    sh->OrderFileList(l); // this one should compute the *actual* Z Spacing!
77    zspacing = sh->GetZSpacing();
78    std::vector<double> v_pixelspacing;
79    v_pixelspacing.push_back( f->GetXSpacing() );
80    v_pixelspacing.push_back( f->GetYSpacing() );
81    v_pixelspacing.push_back( zspacing );
82 //   if (f->GetZSize() != 1) {
83 //      v_pixelspacing.push_back(f->GetZSpacing());
84 //   }
85    bbSetOutputPixelSpacing(v_pixelspacing);
86
87    if (reader!=NULL)
88    { 
89       reader->Delete();
90       reader=NULL;
91    }
92    reader = vtkGdcmReader::New();
93    //reader->SetFileName( bbGetInputIn().c_str() );
94    reader->SetCoherentFileList(l);
95    reader->Update();
96    reader->GetOutput();
97
98    bbSetOutputOut( reader->GetOutput() );
99 }
100 #endif
101 // endif USE_GDCM
102
103 #if defined USE_GDCM2
104 void GetXCoherentInfoGdcmReader::Process()
105 {
106  // Read the *first* image file (a SET of file names is given as input) 
107         gdcm::Reader *read = new gdcm::Reader();
108         reader->SetFileName( bbGetInputIn()[0].c_str());
109   
110         bool res = read->Read();  
111    if ( !res )
112    {
113       delete read;
114       bbSetOutputOut(0);
115       return;
116    }
117     
118  // Get info from the first image file
119    const gdcm::File &f = read->GetFile();
120    int i;
121    std::vector<double> v_iop;
122    const gdcm::DataElement &deIop = f.GetDataSet().GetDataElement(gdcm::Tag(0x0020, 0x0037));
123    std::stringstream ss;
124    deIop.GetValue().Print(ss);
125    gdcm::Element<gdcm::VR::DS,gdcm::VM::VM6> iop;
126    iop.Read( ss );
127    for(i=0; i< 6; i++)
128       v_iop.push_back((float)(iop[i]));
129    bbSetOutputIOP(v_iop );
130  
131   std::vector<double> v_ipp;
132    const gdcm::DataElement &deIpp = f.GetDataSet().GetDataElement(gdcm::Tag((0x0020,0x0032)));
133    deIpp.GetValue().Print(ss);
134    gdcm::Element<gdcm::VR::DS,gdcm::VM::VM3> ipp;
135    ipp.Read( ss );
136           for(i=0; i< 3; i++)
137                 v_ipp.push_back((float)(ipp[i]));
138    bbSetOutputIPP(v_ipp );
139
140 // Add *all the files* to the IPPsorter
141      gdcm::IPPSorter s;
142          s.SetComputeZSpacing( true );
143      s.SetZSpacingTolerance( 1e-3 );
144      std::vector<std::string> gii = bbGetInputIn();
145      s.Sort(gii);
146
147          //l = sh->GetFirstSingleSerieUIDFileSet();
148          // no Test if we have multiple series
149          //s.GetFilenames();
150          //int nbFiles;
151
152         double zspacing = 0.;
153         zspacing = s.GetZSpacing();
154         std::vector<double> v_pixelspacing = gdcm::ImageHelper::GetSpacingValue(f);
155         v_pixelspacing.push_back( v_pixelspacing[0] );
156         v_pixelspacing.push_back( v_pixelspacing[1] );
157         v_pixelspacing.push_back( zspacing );
158         bbSetOutputPixelSpacing(v_pixelspacing);
159
160    if (reader!=NULL)
161    { 
162       reader->Delete();
163       reader=NULL;
164    }
165    reader = vtkGDCMImageReader::New();
166    vtkStringArray *files = vtkStringArray::New();
167    std::vector< std::string >::const_iterator it = s.GetFilenames().begin();
168    for( ; it != s.GetFilenames().end(); ++it)
169    {
170           const std::string &f = *it;
171       files->InsertNextValue( f.c_str() );
172    }
173    reader->SetFileNames(files);
174    reader->Update();
175    reader->GetOutput();
176    bbSetOutputOut( reader->GetOutput() );
177 }
178 #endif
179 // endif USE_GDCM2
180
181 void GetXCoherentInfoGdcmReader::bbUserSetDefaultValues()
182 {
183    std::vector<std::string> init;
184    init.push_back("");
185    bbSetInputIn(init);  
186    //reader=NULL;   /// \TODO fixme JPR
187 }
188
189 void GetXCoherentInfoGdcmReader::bbUserInitializeProcessing()
190 {
191         
192 }
193
194 #if defined USE_GDCM
195 void GetXCoherentInfoGdcmReader::bbUserFinalizeProcessing()
196 {
197    if(reader)
198       reader->Delete();
199    if(f)
200       f->Delete();
201    if(sh)
202       sh->Delete();      
203 }
204 #endif
205
206 #if defined USE_GDCM2
207 void GetXCoherentInfoGdcmReader::bbUserFinalizeProcessing()
208 {
209    if(reader)
210       reader->Delete();
211 }
212 #endif
213
214 }
215 // EO namespace bbgdcmvtk