Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef MITKDICOMSERIESREADER_TXX_
00019 #define MITKDICOMSERIESREADER_TXX_
00020
00021 #include <mitkDicomSeriesReader.h>
00022
00023 #include <itkImageSeriesReader.h>
00024
00025 #if GDCM_MAJOR_VERSION >= 2
00026 #include <gdcmSorter.h>
00027 #include <gdcmScanner.h>
00028 #endif
00029
00030 namespace mitk
00031 {
00032
00033 template <typename PixelType>
00034 void DicomSeriesReader::LoadDicom(const StringContainer &filenames, DataNode &node, UpdateCallBackMethod callback)
00035 {
00036 const char* previousCLocale = setlocale(LC_NUMERIC, NULL);
00037 setlocale(LC_NUMERIC, "C");
00038 std::locale previousCppLocale( std::cin.getloc() );
00039 std::locale l( "C" );
00040 std::cin.imbue(l);
00041
00042 try
00043 {
00044 mitk::Image::Pointer image = mitk::Image::New();
00045 CallbackCommand *command = callback ? new CallbackCommand(callback) : 0;
00046
00047 #if GDCM_MAJOR_VERSION >= 2
00048
00049
00050 gdcm::Sorter sorter;
00051
00052 sorter.SetSortFunction(DicomSeriesReader::GdcmSortFunction);
00053 sorter.Sort(filenames);
00054
00055 gdcm::Tag acq_time(0x0008,0x0032);
00056 gdcm::Scanner scanner;
00057
00058 scanner.AddTag(acq_time);
00059 scanner.Scan(sorter.GetFilenames());
00060
00061 std::list<StringContainer> decomposed_filenames;
00062 const StringContainer::const_iterator f_end = sorter.GetFilenames().end();
00063 const char *act_value = scanner.GetValue(sorter.GetFilenames().front().c_str(), acq_time);
00064 unsigned int volume_count = 1u;
00065
00066 decomposed_filenames.push_back(StringContainer());
00067 decomposed_filenames.back().push_back(sorter.GetFilenames().front());
00068
00069 for (StringContainer::const_iterator f_it = ++sorter.GetFilenames().begin(); f_it != f_end; ++f_it)
00070 {
00071 const char *value = scanner.GetValue(f_it->c_str(), acq_time);
00072
00073 if (strcmp(act_value, value))
00074 {
00075 act_value = value;
00076 decomposed_filenames.push_back(StringContainer());
00077 ++volume_count;
00078 }
00079
00080 decomposed_filenames.back().push_back(*f_it);
00081 }
00082
00083
00084 if (volume_count > 1)
00085 {
00086 typedef itk::Image<PixelType, 4> ImageType;
00087 typedef itk::ImageSeriesReader<ImageType> ReaderType;
00088
00089 DcmIoType::Pointer io = DcmIoType::New();
00090 typename ReaderType::Pointer reader = ReaderType::New();
00091
00092 reader->SetImageIO(io);
00093 reader->ReverseOrderOff();
00094
00095 if (command)
00096 {
00097 reader->AddObserver(itk::ProgressEvent(), command);
00098 }
00099
00100 const std::list<StringContainer>::const_iterator df_end = decomposed_filenames.end();
00101 unsigned int act_volume = 1u;
00102
00103 reader->SetFileNames(decomposed_filenames.front());
00104 reader->Update();
00105 image->InitializeByItk(reader->GetOutput(), 1, volume_count);
00106 image->SetImportVolume(reader->GetOutput()->GetBufferPointer(), 0u);
00107
00108 MITK_DEBUG << "Volume dimension: [" << image->GetDimension(0) << ", " << image->GetDimension(1) << ", " << image->GetDimension(2) << ", " << image->GetDimension(3) << "]";
00109 MITK_DEBUG << "Volume spacing: [" << image->GetGeometry()->GetSpacing()[0] << ", " << image->GetGeometry()->GetSpacing()[1] << ", " << image->GetGeometry()->GetSpacing()[2] << "]";
00110
00111 for (std::list<StringContainer>::iterator df_it = ++decomposed_filenames.begin(); df_it != df_end; ++df_it)
00112 {
00113 reader->SetFileNames(*df_it);
00114 reader->Update();
00115 image->SetImportVolume(reader->GetOutput()->GetBufferPointer(), act_volume++);
00116 }
00117 }
00118 else
00119 {
00120 typedef itk::Image<PixelType, 3> ImageType;
00121 typedef itk::ImageSeriesReader<ImageType> ReaderType;
00122
00123 DcmIoType::Pointer io = DcmIoType::New();
00124 typename ReaderType::Pointer reader = ReaderType::New();
00125
00126 reader->SetImageIO(io);
00127 reader->ReverseOrderOff();
00128
00129 if (command)
00130 {
00131 reader->AddObserver(itk::ProgressEvent(), command);
00132 }
00133
00134 reader->SetFileNames(filenames);
00135 reader->Update();
00136 image->InitializeByItk(reader->GetOutput());
00137 image->SetImportVolume(reader->GetOutput()->GetBufferPointer());
00138
00139 MITK_DEBUG << "Volume dimension: [" << image->GetDimension(0) << ", " << image->GetDimension(1) << ", " << image->GetDimension(2) << "]";
00140 MITK_DEBUG << "Volume spacing: [" << image->GetGeometry()->GetSpacing()[0] << ", " << image->GetGeometry()->GetSpacing()[1] << ", " << image->GetGeometry()->GetSpacing()[2] << "]";
00141 }
00142
00143 #else
00144 typedef itk::Image<PixelType, 3> ImageType;
00145 typedef itk::ImageSeriesReader<ImageType> ReaderType;
00146
00147 DcmIoType::Pointer io = DcmIoType::New();
00148 typename ReaderType::Pointer reader = ReaderType::New();
00149
00150 reader->SetImageIO(io);
00151 reader->ReverseOrderOff();
00152
00153 if (command)
00154 {
00155 reader->AddObserver(itk::ProgressEvent(), command);
00156 }
00157
00158 reader->SetFileNames(filenames);
00159 reader->Update();
00160 image->InitializeByItk(reader->GetOutput());
00161 image->SetImportVolume(reader->GetOutput()->GetBufferPointer());
00162
00163 MITK_DEBUG << "Volume dimension: [" << image->GetDimension(0) << ", " << image->GetDimension(1) << ", " << image->GetDimension(2) << "]";
00164 MITK_DEBUG << "Volume spacing: [" << image->GetGeometry()->GetSpacing()[0] << ", " << image->GetGeometry()->GetSpacing()[1] << ", " << image->GetGeometry()->GetSpacing()[2] << "]";
00165
00166 #endif
00167
00168 node.SetData(image);
00169
00170 setlocale(LC_NUMERIC, previousCLocale);
00171 std::cin.imbue(previousCppLocale);
00172
00173 }
00174 catch (std::exception& e)
00175 {
00176 setlocale(LC_NUMERIC, previousCLocale);
00177 std::cin.imbue(previousCppLocale);
00178
00179 throw e;
00180 }
00181 }
00182
00183 }
00184
00185 #endif