X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=Example%2FToInTag.cxx;h=8d2ae3ea8f9015838554d1ea8ec97feb14115832;hb=9fc41d585113e37d4d1d1d511e61d2e638096fb3;hp=68aa3ff889ba0c3bea22cb50cc28bff5ed9ebc03;hpb=0fa63be831b4ad3f2908b1c9c2a1f6e24f991ccb;p=gdcm.git diff --git a/Example/ToInTag.cxx b/Example/ToInTag.cxx index 68aa3ff8..8d2ae3ea 100755 --- a/Example/ToInTag.cxx +++ b/Example/ToInTag.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: ToInTag.cxx,v $ Language: C++ - Date: $Date: 2007/07/04 10:31:55 $ - Version: $Revision: 1.15 $ + Date: $Date: 2007/09/28 14:09:20 $ + Version: $Revision: 1.19 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -83,7 +83,7 @@ int main(int argc, char *argv[]) " { [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] ", @@ -97,6 +97,7 @@ int main(int argc, char *argv[]) " 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 ", @@ -112,6 +113,18 @@ int main(int argc, char *argv[]) " 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 ------ @@ -163,14 +176,15 @@ int main(int argc, char *argv[]) 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() ) @@ -251,7 +265,7 @@ int main(int argc, char *argv[]) std::vector 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); @@ -285,19 +299,19 @@ int main(int argc, char *argv[]) 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) @@ -318,7 +332,7 @@ int main(int argc, char *argv[]) // keep only requested Series bool keep = false; if (nbSeriesToKeep != 0) - { + { strSeriesNumber = f->GetEntryString(0x0020, 0x0011 ); seriesNumber = atoi( strSeriesNumber.c_str() ); for (j=0;jDelete(); 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] == "gdcmUnfound") // 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 @@ -374,16 +392,25 @@ int main(int argc, char *argv[]) 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; @@ -433,7 +460,7 @@ int main(int argc, char *argv[]) std::string defaultStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID(); std::string defaultSerieUID; - + for (it2 = sf.begin() ; it2 != sf.end(); ++it2) { currentFile = it2->second; @@ -447,13 +474,13 @@ int main(int argc, char *argv[]) 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'; @@ -473,15 +500,14 @@ int main(int argc, char *argv[]) { 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; @@ -503,12 +529,14 @@ int main(int argc, char *argv[]) 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; @@ -517,9 +545,9 @@ int main(int argc, char *argv[]) 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 @@ -531,6 +559,8 @@ int main(int argc, char *argv[]) previousImagePosition = ""; //currentImagePosition; previousPhaseEncodingDirection = ""; //currentPhaseEncodingDirection; } + currentFile->InsertEntryString(defaultSerieUID, 0x0020, 0x000e, "UI" ); + // end of modelName != "TrioTim " if (previousImagePosition != currentImagePosition) @@ -559,7 +589,7 @@ int main(int argc, char *argv[]) /* if (previousPhaseEncodingDirection != currentPhaseEncodingDirection) { - if (verbose) + if (verbose) std::cout << "==== === === === new PhaseEncodingDirection [" << currentPhaseEncodingDirection << "]" << std::endl; @@ -569,12 +599,12 @@ int main(int argc, char *argv[]) + 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 << " " @@ -690,8 +720,8 @@ int main(int argc, char *argv[]) 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 {