forked from BRAINSia/BRAINSTools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDWIConverterFactory.cxx
199 lines (186 loc) · 5.65 KB
/
DWIConverterFactory.cxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
//
// Created by Hui Xie on 12/19/16.
//
#include "DWIConverterFactory.h"
DWIConverterFactory::DWIConverterFactory( const std::string DicomDirectory, const bool UseBMatrixGradientDirections,
const double smallGradientThreshold )
: m_DicomDirectory( DicomDirectory )
, m_UseBMatrixGradientDirections( UseBMatrixGradientDirections )
, m_SmallGradientThreshold( smallGradientThreshold )
{}
DWIConverterFactory::~DWIConverterFactory()
{
for ( std::vector< itk::DCMTKFileReader * >::iterator it = this->m_Headers.begin(); it != this->m_Headers.end();
++it )
{
delete ( *it );
}
}
bool
DWIConverterFactory::isNIIorNrrd( const std::string & filename )
{
constexpr size_t NUMEXT = 4;
const char * extensions[NUMEXT] = { ".nii", ".nii.gz", ".nhdr", ".nrrd" };
for ( size_t i = 0; i < NUMEXT; ++i )
{
if ( filename.find( extensions[i] ) != std::string::npos )
{
return true; // Return true if one of the valid extensions found
}
}
return false;
}
DWIConverter *
DWIConverterFactory::New()
{
// Directory of DICOM slices?
if ( itksys::SystemTools::FileIsDirectory( m_DicomDirectory.c_str() ) )
{
DWIDICOMConverterBase::InputNamesGeneratorType::Pointer inputNames =
DWIDICOMConverterBase::InputNamesGeneratorType::New();
inputNames->SetUseSeriesDetails( true );
inputNames->SetLoadSequences( true );
inputNames->SetLoadPrivateTags( true );
inputNames->SetInputDirectory( m_DicomDirectory );
m_InputFileNames = inputNames->GetInputFileNames();
}
// single file multiSlice Volume?
else if ( itksys::SystemTools::FileExists( m_DicomDirectory.c_str() ) )
{
m_InputFileNames.push_back( m_DicomDirectory );
}
DWIConverter * converter( nullptr );
// nothing at all found?
if ( m_InputFileNames.size() < 1 )
{
std::cerr << "Error: no DICOMfiles found in inputDirectory: " << m_DicomDirectory << std::endl;
return nullptr;
}
// there is a logic error below --huixie
else if ( m_InputFileNames.size() == 1 && isNIIorNrrd( m_InputFileNames[0] ) ) // FSL Reader or NRRD Reader
{
itkGenericExceptionMacro( << "INVALID PATH, create FSLDWIConverter in main program" << std::endl );
converter = new FSLDWIConverter( m_InputFileNames, "", "" );
}
else // Assume multi file dicom file reading
{
// below code has logic error, it has empty hole in the tail of m_Headers when HasPixelData == false;
/*
*
* m_Headers.resize(m_InputFileNames.size());
int headerCount = 0;
for( unsigned i = 0; i < m_Headers.size(); ++i )
{
itk::DCMTKFileReader *curReader = new itk::DCMTKFileReader;
curReader->SetFileName(m_InputFileNames[i]);
try
{
curReader->LoadFile();
}
catch( ... )
{
std::cerr << "Error reading slice" << m_InputFileNames[i] << std::endl;
delete curReader;
curReader = nullptr;
}
// check for pixel data.
if(curReader)
{
if(!curReader->HasPixelData() )
{
delete curReader;
}
else
{
this->m_Headers[headerCount] = curReader;
headerCount++;
}
}
}*/
// modified by HuiXie
m_Headers.clear();
int headerCount = 0;
for ( unsigned i = 0; i < m_InputFileNames.size(); ++i )
{
itk::DCMTKFileReader * curReader = new itk::DCMTKFileReader;
curReader->SetFileName( m_InputFileNames[i] );
try
{
curReader->LoadFile();
}
catch ( ... )
{
std::cerr << "Error reading slice" << m_InputFileNames[i] << std::endl;
delete curReader;
curReader = nullptr;
}
// check for pixel data.
if ( curReader )
{
if ( !curReader->HasPixelData() )
{
delete curReader;
}
else
{
m_Headers.push_back( curReader );
headerCount++;
}
}
}
// end of modified by HuiXie
// no headers found, nothing to do.
if ( headerCount == 0 )
{
std::cerr << "No pixel data in series " << m_DicomDirectory << std::endl;
return nullptr;
}
m_InputFileNames.resize( 0 );
//
// clean the filename by traversing the header vector
for ( unsigned int i = 0; i < this->m_Headers.size(); ++i )
{
m_InputFileNames.push_back( m_Headers[i]->GetFileName() );
}
try
{
m_Headers[0]->GetElementLO( 0x0008, 0x0070, this->m_Vendor );
strupper( this->m_Vendor );
}
catch ( itk::ExceptionObject & excp )
{
std::cerr << "Can't get vendor name from DICOM file" << excp << std::endl;
return nullptr;
}
if ( StringContains( this->m_Vendor, "PHILIPS" ) )
{
converter = new PhilipsDWIConverter( m_Headers, m_InputFileNames, m_UseBMatrixGradientDirections );
}
else if ( StringContains( this->m_Vendor, "SIEMENS" ) )
{
converter = new SiemensDWIConverter(
m_Headers, m_InputFileNames, m_UseBMatrixGradientDirections, m_SmallGradientThreshold );
}
else if ( StringContains( this->m_Vendor, "GE" ) )
{
converter = new GEDWIConverter( m_Headers, m_InputFileNames, m_UseBMatrixGradientDirections );
}
else if ( StringContains( this->m_Vendor, "HITACHI" ) )
{
converter = new HitachiDWIConverter( m_Headers, m_InputFileNames, m_UseBMatrixGradientDirections );
}
else
{
// generic converter can't do anything except load a DICOM
// directory
converter = new GenericDWIConverter( m_InputFileNames );
this->m_Vendor = "GENERIC";
}
}
return converter;
}
std::string
DWIConverterFactory::GetVendor()
{
return m_Vendor;
}