X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmSerieHeader.cxx;h=2bee2ffae739369ed6c40e325887fe01fd377410;hb=0591e5cbe0d6136167a7ff5f2086d893f2111d58;hp=51198d24f87c790392252994c6263d456dd2e859;hpb=327dfe7647e3720b0f3125f9b19397cb9afc0ed3;p=gdcm.git diff --git a/src/gdcmSerieHeader.cxx b/src/gdcmSerieHeader.cxx index 51198d24..2bee2ffa 100644 --- a/src/gdcmSerieHeader.cxx +++ b/src/gdcmSerieHeader.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmSerieHeader.cxx,v $ Language: C++ - Date: $Date: 2005/01/06 20:03:28 $ - Version: $Revision: 1.3 $ + Date: $Date: 2005/01/21 11:40:55 $ + Version: $Revision: 1.12 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -18,7 +18,8 @@ #include "gdcmSerieHeader.h" #include "gdcmDirList.h" -#include "gdcmHeader.h" +#include "gdcmFile.h" +#include "gdcmDebug.h" #include #include @@ -27,18 +28,20 @@ namespace gdcm { -typedef std::vector GdcmHeaderVector; +typedef std::vector GdcmFileVector; //----------------------------------------------------------------------------- // Constructor / Destructor SerieHeader::SerieHeader() { CoherentGdcmFileList.clear(); + // Later will contain: 0020 000e UI REL Series Instance UID + CurrentSerieUID = ""; } SerieHeader::~SerieHeader() { /// \todo - for ( GdcmHeaderList::const_iterator it = CoherentGdcmFileList.begin(); + for ( GdcmFileList::const_iterator it = CoherentGdcmFileList.begin(); it != CoherentGdcmFileList.end(); ++it) { delete *it; @@ -57,17 +60,34 @@ SerieHeader::~SerieHeader() */ void SerieHeader::AddFileName(std::string const &filename) { - Header *header = new Header( filename ); - CoherentGdcmFileList.push_back( header ); -} - -/** - * \brief add a File to the list - * @param file Header to add - */ -void SerieHeader::AddGdcmFile(Header *file) -{ - CoherentGdcmFileList.push_back( file ); + //directly use string and not const char*: + File *header = new File( filename ); + if( header->IsReadable() ) + { + // 0020 000e UI REL Series Instance UID + std::string uid = header->GetEntry (0x0020, 0x000e); + // if uid == GDCM_UNFOUND then consistenly we should find GDCM_UNFOUND + // no need here to do anything special + if( CurrentSerieUID == "" ) + { + // Set the current one + CurrentSerieUID = uid; + } + if( CurrentSerieUID == uid ) + { + // Current Serie UID and DICOM header seems to match add the file: + CoherentGdcmFileList.push_back( header ); + } + else + { + gdcmVerboseMacro("Wrong Serie Instance UID should be:" << CurrentSerieUID ); + } + } + else + { + gdcmVerboseMacro("Could not read file: " << filename ); + delete header; + } } /** @@ -76,21 +96,14 @@ void SerieHeader::AddGdcmFile(Header *file) */ void SerieHeader::SetDirectory(std::string const &dir) { - DirList filenames_list(dir); //OS specific + CurrentSerieUID = ""; //Reset previous Serie Instance UID + DirList dirList(dir); //OS specific - for( DirList::const_iterator it = filenames_list.begin(); + DirListType filenames_list = dirList.GetFilenames(); + for( DirListType::const_iterator it = filenames_list.begin(); it != filenames_list.end(); ++it) { - //directly use string and not const char*: - Header *header = new Header( *it ); - if( header->IsReadable() ) - { - CoherentGdcmFileList.push_back( header ); - } - else - { - delete header; - } + AddFileName( *it ); } } @@ -122,7 +135,6 @@ void SerieHeader::OrderGdcmFileList() //----------------------------------------------------------------------------- // Private /** - * \ingroup Header * \brief sorts the images, according to their Patient Position * We may order, considering : * -# Image Number @@ -134,7 +146,7 @@ bool SerieHeader::ImagePositionPatientOrdering() //based on Jolinda's algorithm { //iop is calculated based on the file file - float *cosines = new float[6]; + float cosines[6]; float normal[3]; float ipp[3]; float dist; @@ -144,7 +156,7 @@ bool SerieHeader::ImagePositionPatientOrdering() std::vector distlist; //!\todo rewrite this for loop. - for ( GdcmHeaderList::const_iterator + for ( GdcmFileList::const_iterator it = CoherentGdcmFileList.begin(); it != CoherentGdcmFileList.end(); ++it ) { @@ -172,7 +184,6 @@ bool SerieHeader::ImagePositionPatientOrdering() if( dist == 0 ) { - delete[] cosines; return false; } @@ -195,7 +206,6 @@ bool SerieHeader::ImagePositionPatientOrdering() if( dist == 0 ) { - delete[] cosines; return false; } @@ -210,30 +220,37 @@ bool SerieHeader::ImagePositionPatientOrdering() // Then I order the slices according to the value "dist". Finally, once // I've read in all the slices, I calculate the z-spacing as the difference // between the "dist" values for the first two slices. - GdcmHeaderVector CoherentGdcmFileVector(n); + GdcmFileVector CoherentGdcmFileVector(n); // CoherentGdcmFileVector.reserve( n ); CoherentGdcmFileVector.resize( n ); - // assert( CoherentGdcmFileVector.capacity() >= n ); + // gdcmAssertMacro( CoherentGdcmFileVector.capacity() >= n ); float step = (max - min)/(n - 1); int pos; n = 0; //VC++ don't understand what scope is !! it -> it2 - for (GdcmHeaderList::const_iterator it2 = CoherentGdcmFileList.begin(); + for (GdcmFileList::const_iterator it2 = CoherentGdcmFileList.begin(); it2 != CoherentGdcmFileList.end(); ++it2, ++n) { //2*n sort algo !! //Assumption: all files are present (no one missing) pos = (int)( fabs( (distlist[n]-min)/step) + .5 ); - - CoherentGdcmFileVector[pos] = *it2; + + // a Dicom 'Serie' may contain scout views + // and images may have differents directions + // -> More than one may have the same 'pos' + // Sorting has then NO meaning ! + if (CoherentGdcmFileVector[pos]==NULL) + CoherentGdcmFileVector[pos] = *it2; + else + return false; } CoherentGdcmFileList.clear(); //this doesn't delete list's element, node only //VC++ don't understand what scope is !! it -> it3 - for (GdcmHeaderVector::const_iterator it3 = CoherentGdcmFileVector.begin(); + for (GdcmFileVector::const_iterator it3 = CoherentGdcmFileVector.begin(); it3 != CoherentGdcmFileVector.end(); ++it3) { CoherentGdcmFileList.push_back( *it3 ); @@ -241,13 +258,11 @@ bool SerieHeader::ImagePositionPatientOrdering() distlist.clear(); CoherentGdcmFileVector.clear(); - delete[] cosines; return true; } /** - * \ingroup Header * \brief sorts the images, according to their Image Number * @return false only if the header is bugged ! */ @@ -258,7 +273,7 @@ bool SerieHeader::ImageNumberOrdering() int n = 0;//CoherentGdcmFileList.size() is a O(N) operation unsigned char *partition; - GdcmHeaderList::const_iterator it = CoherentGdcmFileList.begin(); + GdcmFileList::const_iterator it = CoherentGdcmFileList.begin(); min = max = (*it)->GetImageNumber(); for (; it != CoherentGdcmFileList.end(); ++it, ++n) @@ -277,10 +292,10 @@ bool SerieHeader::ImageNumberOrdering() partition = new unsigned char[n]; memset(partition, 0, n); - GdcmHeaderVector CoherentGdcmFileVector(n); + GdcmFileVector CoherentGdcmFileVector(n); //VC++ don't understand what scope is !! it -> it2 - for (GdcmHeaderList::const_iterator it2 = CoherentGdcmFileList.begin(); + for (GdcmFileList::const_iterator it2 = CoherentGdcmFileList.begin(); it2 != CoherentGdcmFileList.end(); ++it2) { pos = (*it2)->GetImageNumber(); @@ -296,7 +311,7 @@ bool SerieHeader::ImageNumberOrdering() //VC++ don't understand what scope is !! it -> it3 CoherentGdcmFileList.clear(); //this doesn't delete list's element, node only - for ( GdcmHeaderVector::const_iterator it3 = CoherentGdcmFileVector.begin(); + for ( GdcmFileVector::const_iterator it3 = CoherentGdcmFileVector.begin(); it3 != CoherentGdcmFileVector.end(); ++it3 ) { CoherentGdcmFileList.push_back( *it3 ); @@ -305,12 +320,11 @@ bool SerieHeader::ImageNumberOrdering() delete[] partition; - return (mult != 0); + return mult != 0; } /** - * \ingroup Header * \brief sorts the images, according to their File Name * @return false only if the header is bugged ! */