Program: gdcm
Module: $RCSfile: ToInTag.cxx,v $
Language: C++
- Date: $Date: 2007/07/04 15:40:51 $
- Version: $Revision: 1.16 $
+ Date: $Date: 2007/10/24 08:03:10 $
+ Version: $Revision: 1.20 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
" { [keep= list of seriesNumber to process] ",
" | [drop= list of seriesNumber to ignore] } ",
" [taggrid] [skel] ",
- " [input = {ACR|DCM}] ",
+ " [input = {ACR|DCM|IDO}] ",
" [extent=image suffix (.IMA, .NEMA, .DCM, ...)] ",
" [listonly] [split] [rubout] ",
" [noshadowseq][noshadow][noseq] [verbose] [debug] ",
" e.g : 1030,1035,1043 ",
" taggrid : user knows all the images are 'grid' -ie: not 'col', not 'raw'-",
" extent : DO NOT forget the leading '.' ! ",
+ " input : IDO when *realy* old libIDO images ",
" skel: name skeleton eg : patName_1.nema -> skel=patName_ ",
" split: creates a tree-like structure of directories as : ",
" - Patient ",
" debug : *developer* wants to run the program in 'debug mode' ",
FINISH_USAGE
+
+ enum Index
+ {
+ IND_PatientName,
+ IND_SerieInstanceUID,
+ IND_ImagePosition,
+ IND_TriggerTime,
+ IND_PhaseEncodingDirection,
+ IND_seriesDescription,
+ IND_FileName
+ };
+
std::cout << "inside ToInTag" << std::endl;
// ----- Initialize Arguments Manager ------
return 0;
}
- int taggrid = am->ArgMgrDefined("taggrid");
-
- int hasSkel = am->ArgMgrDefined("skel");
+ bool taggrid = ( 0 != am->ArgMgrDefined("taggrid") );
+
+ bool hasSkel = ( 0 != am->ArgMgrDefined("hasSkel") );
const char *skel;
if (hasSkel)
- skel = am->ArgMgrGetString("skel");
+ skel = am->ArgMgrGetString("skel");
const char *extent = am->ArgMgrGetString("extent",".DCM");
+ const char *input = am->ArgMgrGetString("input","DCM");
// if unused Param we give up
if ( am->ArgMgrPrintUnusedLabels() )
std::vector<std::string> tokensForFileName;
// For Siemens pb, we need Manufacturer's Model Name
-
+ // (We read only the first file, to know)
GDCM_NAME_SPACE::DirListType::iterator it1 = fileNames.begin();
f = GDCM_NAME_SPACE::File::New();
f->SetLoadMode(GDCM_NAME_SPACE::LD_ALL);
if (verbose)
std::cout << "------------------Print Break levels-----------------" << std::endl;
- std::string userFileIdentifier;
+ std::string userFileIdentifier;
SortedFiles sf;
s->AddSeriesDetail(0x0010, 0x0010, false); // Patient's Name
// for Siemens TrioTim, don't deal with 'Series Instance UID'
- if ( !GDCM_NAME_SPACE::Util::DicomStringEqual(modelName,"TrioTim") )
+ if ( !GDCM_NAME_SPACE::Util::DicomStringEqual(modelName,"TrioTim") )
s->AddSeriesDetail(0x0020, 0x000e, false); // Series Instance UID
else
s->AddSeriesDetail(0x9999, 0x9999, false); // dirty trick to ignore 'Series Instance UID'
- s->AddSeriesDetail(0x0020, 0x0032, false); // Image Position (Patient)
+ s->AddSeriesDetail(0x0020, 0x0032, false); // Image Position (Patient)
s->AddSeriesDetail(0x0018, 0x1060, true); // Trigger Time (true: convert to keep numerical order)
- s->AddSeriesDetail(0x0018, 0x1312, false); // In-plane Phase Encoding Direction
- s->AddSeriesDetail(0x0008, 0x103e, false); // Series Description (special Siemens ...)
+ s->AddSeriesDetail(0x0018, 0x1312, false); // In-plane Phase Encoding Direction
+ s->AddSeriesDetail(0x0008, 0x103e, false); // Series Description (special Siemens ...)
//uint8_t *imageData; // Useless : pixels will not be loaded
// (images are overwritten)
// keep only requested Series
bool keep = false;
if (nbSeriesToKeep != 0)
- {
+ {
strSeriesNumber = f->GetEntryString(0x0020, 0x0011 );
seriesNumber = atoi( strSeriesNumber.c_str() );
for (j=0;j<nbSeriesToKeep; j++)
f->Delete();
continue;
}
- }
+ }
- userFileIdentifier=s->CreateUserDefinedFileIdentifier(f);
+ userFileIdentifier=s->CreateUserDefinedFileIdentifier(f);
tokens.clear();
- GDCM_NAME_SPACE::Util::Tokenize (userFileIdentifier, tokens, token);
-
+ GDCM_NAME_SPACE::Util::Tokenize (userFileIdentifier, tokens, token);
+
int imageNum; // Within FileName
char newName[1024];
-
- if ( tokens[3] == GDCM_NAME_SPACE::GDCM_UNFOUND) // sometimes Trigger Time is not found. CreateUserDefinedFileIdentifier is not aware of the pb.
+
+ // sometimes Trigger Time is not found.
+ // CreateUserDefinedFileIdentifier is not aware of the pb.
+ // We use File name instead (hope it's significant)
+
+ if ( tokens[IND_TriggerTime] == GDCM_NAME_SPACE::GDCM_UNFOUND)
{
///this is a trick to build up a lexicographical compliant name :
/// eg : fich001.ima vs fich100.ima as opposed to fich1.ima vs fich100.ima
imageNum = atoi ( tokensForFileName[0].c_str() );
// probabely we could write something much more complicated using C++ !
sprintf (newName, "%s%06d%s", skel, imageNum, extent);
- tokens[3] = newName;
+ tokens[IND_TriggerTime] = newName;
tokensForFileName.clear();
}
else
- tokens[3] = name;
-
+ tokens[IND_TriggerTime] = name;
+
+ // Patient's Name
+ // Series Instance UID
+ // Image Position (Patient)
+ // Trigger Time
+ // In-plane Phase Encoding Direction
+ // Series Description
+ // FileName
- userFileIdentifier = tokens[0] + token + tokens[1] + token + tokens[2] + token
- + tokens[3] + token + tokens[4] + token + tokens[5] + token;
- }
+ userFileIdentifier = tokens[IND_PatientName] + token + tokens[IND_SerieInstanceUID] + token + tokens[IND_ImagePosition] + token
+ + tokens[IND_TriggerTime] + token + tokens[IND_PhaseEncodingDirection] + token + tokens[IND_seriesDescription] + token
+ + tokens[IND_FileName] + token;
+ }
+
if (verbose)
std::cout << "[" << userFileIdentifier << "] : " << *it << std::endl;
std::string defaultStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
std::string defaultSerieUID;
-
+
for (it2 = sf.begin() ; it2 != sf.end(); ++it2)
{
currentFile = it2->second;
tokens.clear();
GDCM_NAME_SPACE::Util::Tokenize (it2->first, tokens, token);
-
- currentPatientName = tokens[0];
- currentSerieInstanceUID = tokens[1];
- currentImagePosition = tokens[2];
- currentTriggerTime = tokens[3];
- currentPhaseEncodingDirection = tokens[4];
- seriesDescription = tokens[5]; // For Siemens pb
+
+ currentPatientName = tokens[IND_PatientName];
+ currentSerieInstanceUID = tokens[IND_SerieInstanceUID];
+ currentImagePosition = tokens[IND_ImagePosition];
+ currentTriggerTime = tokens[IND_TriggerTime];
+ currentPhaseEncodingDirection = tokens[IND_PhaseEncodingDirection];
+ seriesDescription = tokens[IND_seriesDescription]; // For Siemens pb
if ( currentImagePosition[0] == '-')
currentImagePosition[0] = 'M';
{
currentFile->InsertEntryString("1.\\0.\\0.\\0.\\1.\\0.",0x0020, 0x0037, "DS" );
}
-
+
if (previousPatientName != currentPatientName)
{
- if ( currentFile->GetEntryString(0x0020,0x000d) == GDCM_NAME_SPACE::GDCM_UNFOUND)
+ if ( currentFile->GetEntryString(0x0020,0x000d) == GDCM_NAME_SPACE::GDCM_UNFOUND) // Study UID
{
if (verbose)
std::cout << "--- new Study UID created" << std::endl;
defaultStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
- currentFile->InsertEntryString(defaultStudyUID, 0x0020, 0x000d, "UI" );
}
previousPatientName = currentPatientName;
system ( systemCommand.c_str() );
}
}
+ currentFile->InsertEntryString(defaultStudyUID, 0x0020, 0x000d, "UI" );
+
if ( GDCM_NAME_SPACE::Util::DicomStringEqual(modelName,"TrioTim") ) // for Siemens TrioTim , don't deal with 'Series Instance UID'
if (previousSerieInstanceUID != currentSerieInstanceUID)
{
- if (verbose)
+ if (verbose)
std::cout << "==== === new Serie [" << currentSerieInstanceUID << "]"
<< std::endl;
if (verbose)
std::cout << "--- --- new Serie UID created" << std::endl;
defaultSerieUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
- currentFile->InsertEntryString(defaultSerieUID, 0x0020, 0x000e, "UI" );
- }
-
+ // currentFile->InsertEntryString(defaultSerieUID, 0x0020, 0x000e, "UI" );
+ }
+
if (split)
{
currentSerieWriteDir = currentPatientWriteDir + GDCM_NAME_SPACE::GDCM_FILESEPARATOR
previousImagePosition = ""; //currentImagePosition;
previousPhaseEncodingDirection = ""; //currentPhaseEncodingDirection;
}
+ currentFile->InsertEntryString(defaultSerieUID, 0x0020, 0x000e, "UI" );
+
// end of modelName != "TrioTim "
if (previousImagePosition != currentImagePosition)
/*
if (previousPhaseEncodingDirection != currentPhaseEncodingDirection)
{
- if (verbose)
+ if (verbose)
std::cout << "==== === === === new PhaseEncodingDirection ["
<< currentPhaseEncodingDirection << "]" << std::endl;
+ GDCM_NAME_SPACE::GDCM_FILESEPARATOR
+ currentPhaseEncodingDirection;
systemCommand = "mkdir " + currentPhaseEncodingDirectionWriteDir;
- system (systemCommand.c_str());
- }
-
+ system (systemCommand.c_str());
+ }
+
previousPhaseEncodingDirection = currentPhaseEncodingDirection;
- }
-*/
+ }
+*/
if ( GDCM_NAME_SPACE::Debug::GetDebugFlag())
std::cout << "--- --- --- --- --- " << it2->first << " "
std::cout << "Duplicate ImageOrientation into ImageOrientationPatient" << std::endl;
currentFile->InsertEntryString(currentFile->GetEntryString(0x0020, 0x0035), 0x0020, 0x0037, "DS" );
}
-
- if (taggrid)
+
+ if (taggrid || strcmp(input, "IDO")==0 || strcmp(input, "ido")==0 )
frameIndex++;
else
{