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
#include "gdcmSerieHeader.h"
#include "gdcmDirList.h"
-#include "gdcmHeader.h"
+#include "gdcmFile.h"
+#include "gdcmDebug.h"
#include <math.h>
#include <algorithm>
namespace gdcm
{
-typedef std::vector<Header* > GdcmHeaderVector;
+typedef std::vector<File* > 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;
*/
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;
+ }
}
/**
*/
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 );
}
}
//-----------------------------------------------------------------------------
// Private
/**
- * \ingroup Header
* \brief sorts the images, according to their Patient Position
* We may order, considering :
* -# Image Number
//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;
std::vector<float> distlist;
//!\todo rewrite this for loop.
- for ( GdcmHeaderList::const_iterator
+ for ( GdcmFileList::const_iterator
it = CoherentGdcmFileList.begin();
it != CoherentGdcmFileList.end(); ++it )
{
if( dist == 0 )
{
- delete[] cosines;
return false;
}
if( dist == 0 )
{
- delete[] cosines;
return false;
}
// 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 );
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 !
*/
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)
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();
//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 );
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 !
*/