void VolumeSeriesSource::openSeries() { if(volumeHandle_) delete volumeHandle_; volumeHandle_ = 0; try { TextFileReader reader(filename_.get()); if (!reader) throw tgt::FileNotFoundException("Reading sdat file failed", filename_.get()); std::string type; std::istringstream args; std::string format, model; tgt::ivec3 resolution(0); tgt::vec3 sliceThickness(1.f); spreadMin_ = 0.f; spreadMax_ = 0.f; files_.clear(); std::string blockfile; while (reader.getNextLine(type, args, false)) { if (type == "ObjectFileName:") { std::string s; args >> s; LDEBUG(type << " " << s); files_.push_back(tgt::FileSystem::dirName(filename_.get()) + "/" + s); } else if (type == "Resolution:") { args >> resolution[0]; args >> resolution[1]; args >> resolution[2]; LDEBUG(type << " " << resolution[0] << " x " << resolution[1] << " x " << resolution[2]); } else if (type == "SliceThickness:") {
// ------------------------------------------------------------------------ void groupDicomFiles(const gdcm::Directory::FilenamesType &filenames, SeriesTransform::Map &transforms) { // set up the dicom scanner gdcm::Scanner scanner; gdcm::Tag seriesNumberTag(0x0020,0x0011); gdcm::Tag instanceTag(0x0020,0x0013); gdcm::Tag numberOfImagesTag(0x0018,0x1090); gdcm::Tag seriesDescription(0x0008,0x103e); gdcm::Tag sliceThickness(0x0018,0x0050); scanner.AddTag(seriesNumberTag); scanner.AddTag(sliceThickness); scanner.AddTag(seriesDescription); scanner.AddTag(instanceTag); scanner.AddTag(numberOfImagesTag); scanner.Scan(filenames); gdcm::Scanner::MappingType mapping = scanner.GetMappings(); for(unsigned int i = 0; i < filenames.size(); i++) { const char * fname = filenames[i].c_str(); // is the filename valid if(mapping.count(fname) > 0) { if(mapping[fname].count(seriesNumberTag) > 0 && mapping[fname].count(instanceTag) > 0 && mapping[fname].count(numberOfImagesTag) > 0) { // extract the dicom header information std::string seriesNumberStr, instanceNumberStr, numberOfImagesStr, descriptionStr, thicknessStr; seriesNumberStr = mapping[fname][seriesNumberTag]; instanceNumberStr = mapping[fname][instanceTag]; numberOfImagesStr = mapping[fname][numberOfImagesTag]; descriptionStr = mapping[fname][seriesDescription]; thicknessStr = mapping[fname][sliceThickness]; unsigned int seriesNum = QString::fromStdString(seriesNumberStr).toInt(); unsigned int instanceNum = QString::fromStdString(instanceNumberStr).toInt(); unsigned int numberOfImages = QString::fromStdString(numberOfImagesStr).toInt(); double thickness = QString::fromStdString(thicknessStr).toDouble(); descriptionStr = QString::fromStdString(descriptionStr).replace(" ","").toStdString(); if(transforms.count(seriesNum) == 0) continue; // resize the image list if needed if(transforms[seriesNum].imageFilenames.size() != numberOfImages) { transforms[seriesNum].imageFilenames.resize(numberOfImages); } // put the image file into the image list transforms[seriesNum].description = descriptionStr; transforms[seriesNum].sliceThickness = thickness; transforms[seriesNum].imageFilenames[instanceNum-1] = fname; } } } }