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 #include <mitkDicomSeriesReader.h>
00019
00020 #include <itkGDCMSeriesFileNames.h>
00021
00022 #if GDCM_MAJOR_VERSION >= 2
00023 #include <gdcmAttribute.h>
00024 #endif
00025
00026 namespace mitk
00027 {
00028
00029 typedef itk::GDCMSeriesFileNames DcmFileNamesGeneratorType;
00030
00031 DataNode::Pointer DicomSeriesReader::LoadDicomSeries(const StringContainer &filenames, UpdateCallBackMethod callback)
00032 {
00033 DataNode::Pointer node = DataNode::New();
00034
00035 if (DicomSeriesReader::LoadDicomSeries(filenames, *node, callback))
00036 {
00037 return node;
00038 }
00039 else
00040 {
00041 return 0;
00042 }
00043 }
00044
00045 bool DicomSeriesReader::LoadDicomSeries(const StringContainer &filenames, DataNode &node, UpdateCallBackMethod callback)
00046 {
00047 DcmIoType::Pointer io = DcmIoType::New();
00048
00049 try
00050 {
00051 if (io->CanReadFile(filenames.front().c_str()))
00052 {
00053 io->SetFileName(filenames.front().c_str());
00054 io->ReadImageInformation();
00055
00056 switch (io->GetComponentType())
00057 {
00058 case DcmIoType::UCHAR:
00059 DicomSeriesReader::LoadDicom<unsigned char>(filenames, node, callback);
00060 return true;
00061 case DcmIoType::CHAR:
00062 DicomSeriesReader::LoadDicom<char>(filenames, node, callback);
00063 return true;
00064 case DcmIoType::USHORT:
00065 DicomSeriesReader::LoadDicom<unsigned short>(filenames, node, callback);
00066 return true;
00067 case DcmIoType::SHORT:
00068 DicomSeriesReader::LoadDicom<short>(filenames, node, callback);
00069 return true;
00070 case DcmIoType::UINT:
00071 DicomSeriesReader::LoadDicom<unsigned int>(filenames, node, callback);
00072 return true;
00073 case DcmIoType::INT:
00074 DicomSeriesReader::LoadDicom<int>(filenames, node, callback);
00075 return true;
00076 case DcmIoType::ULONG:
00077 DicomSeriesReader::LoadDicom<long unsigned int>(filenames, node, callback);
00078 return true;
00079 case DcmIoType::LONG:
00080 DicomSeriesReader::LoadDicom<long int>(filenames, node, callback);
00081 return true;
00082 case DcmIoType::FLOAT:
00083 DicomSeriesReader::LoadDicom<float>(filenames, node, callback);
00084 return true;
00085 case DcmIoType::DOUBLE:
00086 DicomSeriesReader::LoadDicom<double>(filenames, node, callback);
00087 return true;
00088 default:
00089 MITK_ERROR << "Unknown pixel type!";
00090 }
00091 }
00092 }
00093 catch(itk::MemoryAllocationError e)
00094 {
00095 MITK_ERROR << "Memory allocation!";
00096 }
00097 catch(...)
00098 {
00099 MITK_ERROR << "Unknown!";
00100 }
00101
00102 return false;
00103 }
00104
00105 bool DicomSeriesReader::IsDicom(const std::string &filename)
00106 {
00107 DcmIoType::Pointer io = DcmIoType::New();
00108
00109 return io->CanReadFile(filename.c_str());
00110 }
00111
00112 DicomSeriesReader::UidFileNamesMap DicomSeriesReader::GetSeries(const std::string &dir, bool additional_criteria, const StringContainer &restrictions)
00113 {
00114 DcmFileNamesGeneratorType::Pointer name_generator = DcmFileNamesGeneratorType::New();
00115
00116 name_generator->SetUseSeriesDetails(additional_criteria);
00117 name_generator->SetDirectory(dir.c_str());
00118
00119 const StringContainer::const_iterator restrictions_end = restrictions.end();
00120
00121 for(StringContainer::const_iterator it = restrictions.begin(); it != restrictions_end; ++it)
00122 {
00123 name_generator->AddSeriesRestriction(*it);
00124 }
00125
00126 UidFileNamesMap map;
00127 const StringContainer &series_uids = name_generator->GetSeriesUIDs();
00128 const StringContainer::const_iterator series_end = series_uids.end();
00129
00130 for(StringContainer::const_iterator it = series_uids.begin(); it != series_end; ++it)
00131 {
00132 const std::string &uid = *it;
00133
00134 map[uid] = name_generator->GetFileNames(uid);
00135 }
00136
00137 return map;
00138 }
00139
00140 DicomSeriesReader::StringContainer DicomSeriesReader::GetSeries(const std::string &dir, const std::string &series_uid, bool additional_criteria,
00141 const StringContainer &restrictions)
00142 {
00143 DcmFileNamesGeneratorType::Pointer name_generator = DcmFileNamesGeneratorType::New();
00144
00145 name_generator->SetUseSeriesDetails(additional_criteria);
00146 name_generator->SetDirectory(dir.c_str());
00147
00148 const StringContainer::const_iterator restrictions_end = restrictions.end();
00149
00150 for(StringContainer::const_iterator it = restrictions.begin(); it != restrictions_end; ++it)
00151 {
00152 name_generator->AddSeriesRestriction(*it);
00153 }
00154
00155 return name_generator->GetFileNames(series_uid);
00156 }
00157
00158 #if GDCM_MAJOR_VERSION >= 2
00159 bool DicomSeriesReader::GdcmSortFunction(const gdcm::DataSet &ds1, const gdcm::DataSet &ds2)
00160 {
00161 gdcm::Attribute<0x0008,0x0032> acq_time1;
00162 gdcm::Attribute<0x0020,0x0032> image_pos1;
00163
00164 acq_time1.Set(ds1);
00165 image_pos1.Set(ds1);
00166
00167 gdcm::Attribute<0x0008,0x0032> acq_time2;
00168 gdcm::Attribute<0x0020,0x0032> image_pos2;
00169
00170 acq_time2.Set(ds2);
00171 image_pos2.Set(ds2);
00172
00173 if (acq_time1 == acq_time2)
00174 {
00175 return image_pos1 < image_pos2;
00176 }
00177
00178 return acq_time1 < acq_time2;
00179 }
00180 #endif
00181
00182 }
00183