X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmSerieHeader.cxx;h=f5b5af890a73b23e3f2d66cfa14450faabec1443;hb=1fe405b2347a5f78d5ecc67d2d81f53bd9c7541d;hp=37da36b1bf5663664395f7e3d093f17f887494a1;hpb=af698856153f426a4d852b6645e238f669d42276;p=gdcm.git diff --git a/src/gdcmSerieHeader.cxx b/src/gdcmSerieHeader.cxx index 37da36b1..f5b5af89 100644 --- a/src/gdcmSerieHeader.cxx +++ b/src/gdcmSerieHeader.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmSerieHeader.cxx,v $ Language: C++ - Date: $Date: 2004/11/26 10:55:04 $ - Version: $Revision: 1.1 $ + Date: $Date: 2005/01/24 16:10:53 $ + Version: $Revision: 1.13 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -18,6 +18,7 @@ #include "gdcmSerieHeader.h" #include "gdcmDirList.h" +#include "gdcmFile.h" #include "gdcmDebug.h" #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; @@ -55,42 +58,52 @@ SerieHeader::~SerieHeader() * \brief add a File to the list based on file name * @param filename Name of the file to deal with */ -void SerieHeader::AddFileName(std::string const & filename) +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->GetEntryValue (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; + } } /** * \brief Sets the Directory * @param dir Name of the directory to deal with */ -void SerieHeader::SetDirectory(std::string const & dir) +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 ! */