//Get GDCMSeriesFileNames order to sort filenames
typedef itk::GDCMSeriesFileNames NamesGeneratorType;
NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
- nameGenerator->SetUseSeriesDetails(true);
+ nameGenerator->SetUseSeriesDetails(false);
std::string folderName=".";
const size_t last_slash_idx = input_files[0].rfind('/');
if (std::string::npos != last_slash_idx)
std::map< std::string, std::vector<double> > theorigin;
std::map< std::string, std::vector<double> > theorientation;
std::map< std::string, std::vector<double> > sliceLocations;
+ std::map< std::string, std::vector<double> > instanceNumber;
std::map< std::string, std::vector<std::string> > seriesFiles;
#if GDCM_MAJOR_VERSION >= 2
if (args_info.verbose_flag)
hreader.Read();
gdcm::DataSet& ds = hreader.GetFile().GetDataSet();
- if (args_info.extract_series_flag) {
- gdcm::Attribute<0x20,0x000e> series_UID_att;
- series_UID_att.SetFromDataSet(ds);
- series_UID = series_UID_att.GetValue();
- }
+ gdcm::Attribute<0x20,0x000e> series_UID_att;
+ series_UID_att.SetFromDataSet(ds);
+ series_UID = series_UID_att.GetValue().c_str();
series_UIDs.insert(series_UID);
theorigin[series_UID] = gdcm::ImageHelper::GetOriginValue(hreader.GetFile());
sliceLocations[series_UID].push_back(theorigin[series_UID][2]);
seriesFiles[series_UID].push_back(input_files[i]);
+ gdcm::Attribute<0x20,0x0013> instanceNumber_att;
+ instanceNumber_att.SetFromDataSet(ds);
+ instanceNumber[series_UID].push_back(instanceNumber_att.GetValue());
+
gdcm::Attribute<0x28, 0x100> pixel_size;
pixel_size.SetFromDataSet(ds);
/* if (pixel_size.GetValue() != 16)
header->SetMaxSizeLoadEntry(16384); // required ?
header->Load();
- if (args_info.extract_series_flag) {
- series_UID = header->GetEntryValue(0x20,0x000e).c_str();
- }
+ series_UID = header->GetEntryValue(0x20,0x000e).c_str();
series_UIDs.insert(series_UID);
theorigin[series_UID].resize(3);
while ( sn != series_UIDs.end() ) {
std::vector<double> locs = sliceLocations[*sn];
std::vector<double> origin = theorigin[*sn];
+ std::vector<double> instanceNumberSerie = instanceNumber[*sn];
std::vector<std::string> files = seriesFiles[*sn];
- std::vector<int> sliceIndex;
+ std::vector<int> sliceIndex(files.size());
//clitk::GetSortedIndex(locs, sliceIndex);
//Look for files into GDCMSeriesFileNames, because it sorts files correctly and take the order
const std::vector<std::string> & temp = nameGenerator->GetFileNames(*sn);
for(unsigned int i=0; i<files.size(); i++) {
int j(0);
- while (sliceIndex.size()==i && j<temp.size()) {
+ bool found(false);
+ while (!found && j<temp.size()) {
const size_t last_slash_idx2 = temp[j].rfind('/');
std::string tempFilename(temp[j]);
- if (temp[j][0] == '.' && std::string::npos != last_slash_idx2)
- tempFilename = temp[j].substr(last_slash_idx2+1, temp[j].size()-1);
- if (tempFilename == files[i])
- sliceIndex.push_back(j);
+ if (temp[j][0] == '.' && temp[j][1] == '/')
+ tempFilename = temp[j].substr(2, temp[j].size()-1);
+ if (tempFilename == files[i]) {
+ sliceIndex[j] = i;
+ found = true;
+ }
++j;
}
}
+ if (sliceIndex.size() == 0) { //ie. sn is not a serie present in files
+ sn++;
+ continue;
+ }
if (args_info.verbose_flag) {
std::cout << locs[sliceIndex[0]] << " -> "
// Create ordered vector of filenames
std::vector<std::string> sorted_files;
sorted_files.resize(sliceIndex.size());
- for(unsigned int i=0; i<sliceIndex.size(); i++)
- sorted_files[i] = files[ sliceIndex[i] ];
+ if (!args_info.instanceNumber_flag) {
+ for(unsigned int i=0; i<sliceIndex.size(); i++)
+ sorted_files[i] = files[ sliceIndex[i] ];
+ } else {
+ std::vector<double>::iterator maxInstanceNumber = std::max_element(instanceNumberSerie.begin(), instanceNumberSerie.end());
+ std::vector<std::string> instanceNumberTemp(*maxInstanceNumber, "");
+ for(unsigned int i=0; i<instanceNumberSerie.size(); i++)
+ instanceNumberTemp[instanceNumberSerie[i]-1] = files[i];
+ unsigned int fillFiles(0);
+ for(unsigned int i=0; i<instanceNumberTemp.size(); i++) {
+ if (instanceNumberTemp[i] != "") {
+ sorted_files[fillFiles] = instanceNumberTemp[i];
+ ++fillFiles;
+ }
+ }
+ }
+
+ //===========================================
+ // Reverse the slice order (for MR from HEH)
+ if (args_info.reverse_flag)
+ std::reverse(sorted_files.begin(), sorted_files.end());
//===========================================
// Read write serie