/*========================================================================= Program: gdcm Module: $RCSfile: exCTPET.cxx,v $ Language: C++ Date: $Date: 2006/01/02 21:54:23 $ Version: $Revision: 1.1 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "gdcmFile.h" #include "gdcmSerieHelper.h" #include "gdcmDirList.h" #include "gdcmUtil.h" #include "gdcmDataEntry.h" int main(int argc, char *argv[]) { if(argc < 2 ) { std::cerr << "RTFM" << std::endl; return 1; } // Get the directory name const char *directory = argv[1]; #if 0 gdcm::SerieHelper *s; std::cout << "Dir Name :[" << directory << "]" << std::endl; s = gdcm::SerieHelper::New(); s->SetLoadMode(gdcm::LD_NOSHADOW | gdcm::LD_NOSEQ); // 0008|0060 [CS] [Modality] [CT] gdcm::TagKey modality(0x0008,0x0060); s->AddRestriction(modality, "CT", gdcm::GDCM_EQUAL); // Keep only files where // restriction is true s->SetDirectory(directory, true); // true : recursive exploration // std::cout << " ---------------------------------------- Finish parsing :[" // << directory << "]" << std::endl; // // s->Print(); // std::cout << " ---------------------------------------- Finish printing (1)" // << std::endl; int nbFiles; // For all the Single SerieUID Files Sets of the gdcm::Serie gdcm::FileList *l = s->GetFirstSingleSerieUIDFileSet(); while (l) { nbFiles = l->size() ; //if ( l->size() > 3 ) // Why not ? Just an example, for testing { //std::cout << "Sort list : " << nbFiles << " long" << std::endl; s->OrderFileList(l); // sort the list } l = s->GetNextSingleSerieUIDFileSet(); } s->Delete(); #endif // Open a file A // Open another file B // Same Serie/Study ? // No -> return // Yes -> continue // Same Frame of Reference // No -> Return // Yes -> continue // A is CT and B is PT (PET) // No -> return // Yes -> continue // Same Image Position (no string comparison !!) // Even if floating point comparison are dangerous, string comp will not work in general case // No -> Return // Yes: We found a match const char filename1[] = "/tmp/PETCT/case1/WHOLEB001_CT001.dcm"; const char filename2[] = "/tmp/PETCT/case1/CT_PET001_CT100.dcm"; gdcm::File *fileRef = gdcm::File::New(); fileRef->SetFileName( filename2 ); fileRef->Load(); // 0008 0060 CS 1 Modality std::string modalityRef = fileRef->GetEntryString(0x0008,0x0060); if( modalityRef == gdcm::GDCM_UNFOUND ) return 1; if ( !gdcm::Util::DicomStringEqual(modalityRef, "CT") ) return 1; // 0020 000d UI 1 Study Instance UID // 0020 000e UI REL Series Instance UID std::string series_uid_ref = fileRef->GetEntryString(0x0020, 0x000e); // 0020 0052 UI 1 Frame of Reference UID std::string frame_uid_ref = fileRef->GetEntryString(0x0020, 0x0052); // 0020 0032 DS 3 Image Position (Patient) gdcm::DataEntry *imagePosRef = fileRef->GetDataEntry(0x0020,0x0032); assert( imagePosRef->GetValueCount() == 3 ); gdcm::DirList dirList( directory, true ); const gdcm::DirListType filenames = dirList.GetFilenames(); gdcm::DirListType::const_iterator it = filenames.begin(); gdcm::File *file = gdcm::File::New(); for( ; it != filenames.end(); ++it) { file->SetFileName( *it ); file->Load(); std::string modality = file->GetEntryString(0x0008,0x0060); // This is a dual modality: modality should be *different* if( modality == modalityRef ) continue; if ( !gdcm::Util::DicomStringEqual(modality, "PT") ) continue; std::string series_uid = file->GetEntryString(0x0020, 0x000e); // Not same series ! if( series_uid == series_uid_ref ) continue; std::string frame_uid = file->GetEntryString(0x0020, 0x0052); if( frame_uid_ref != frame_uid ) continue; gdcm::DataEntry *imagePos = file->GetDataEntry(0x0020,0x0032); assert( imagePos->GetValueCount() == 3 ); if( imagePos->GetValue(0) == imagePosRef->GetValue(0) && imagePos->GetValue(1) == imagePosRef->GetValue(1) && imagePos->GetValue(2) == imagePosRef->GetValue(2) ) { std::cerr << "We found a match: " << *it << std::endl; } } return 0; }