Program: gdcm
Module: $RCSfile: PhilipsToBrucker2.cxx,v $
Language: C++
- Date: $Date: 2006/01/31 11:45:43 $
- Version: $Revision: 1.11 $
+ Date: $Date: 2006/03/17 14:36:37 $
+ 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
" - orders the gdcm-readable found Files according to their ",
" (0x0010, 0x0010) Patient's Name ",
" (0x0020, 0x000e) Series Instance UID ",
- " (0x0020, 0x0032) Image Position (Patient) ",
+ " (0x0020, 0x0032)PhilipsToBrucker2. Image Position (Patient) ",
" (0x0018, 0x1060) Trigger Time ",
- " (0x0018, 0x1312) In-plane Phase Encoding Direction ",
+ " (0x0018, 0x1312) In-pl)ane Phase Encoding Direction ",
" - fills a single level (*) Directory with *all* the files, ",
" converted into a Brucker-like Dicom, InTags compliant ",
" (*) actually : creates as many directories as Patients ",
" dirout=outputDirectoryName ",
" { [keep= list of seriesNumber to process] ",
" | [drop= list of seriesNumber to ignore] } ",
+ " [taggrid] [skel] ",
" [input = {ACR|DCM}] ",
" [extent=image suffix (.IMA, .NEMA, .DCM, ...)] ",
" [listonly] [split] ",
" drop : if user wants to ignore a limited number of series ",
" he gives the list of 'SeriesNumber' (tag 0020|0011) ",
" SeriesNumber are short enough to be human readable ",
- " e.g : 1030,1035,1043 ",
+ " e.g : 1030,1035,1043 ",
+ " taggrid : user knows all the images are 'grid' -ie : not 'col', not 'raw'",
" extent : DO NOT forget the leading '.' ! ",
+ " skel: name skeleton eg : patName_1.nema -> skel=patName_ ",
" split: creates a tree-like structure of directories as : ",
" - Patient ",
" -- Serie ",
return 0;
}
+ int taggrid = am->ArgMgrDefined("taggrid");
+
+ int hasSkel = am->ArgMgrDefined("skel");
+ const char *skel;
+ if (hasSkel)
+ skel = am->ArgMgrGetString("skel");
+
const char *extent = am->ArgMgrGetString("extent",".DCM");
// if unused Param we give up
std::cout << "------------List of found files ------------" << std::endl;
dirList.Print();
}
-
+
gdcm::DirListType fileNames;
fileNames = dirList.GetFilenames();
gdcm::SerieHelper *s; // Needed only to may use SerieHelper::AddSeriesDetail()
gdcm::File *f;
gdcm::FileHelper *fh;
std::vector<std::string> tokens;
+ std::vector<std::string> tokensForFileName;
/*
std::cout << "---------------Print Unique Series identifiers---------"
<< std::endl;
std::string uniqueSeriesIdentifier;
- for (gdcm::DirListType::iterator it = fileNames.begin();
+ for (gdcm::DirListType::iterator it) = fileNames.begin();
it != fileNames.end();
++it)
{
}
userFileIdentifier=s->CreateUserDefinedFileIdentifier(f);
- // userFileIdentifier += token;
- //userFileIdentifier += *it;
- std::cout << "userFileIdentifier1: "<< userFileIdentifier << std::endl;
tokens.clear();
gdcm::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.
{
- tokens[3] = gdcm::Util::GetName( *it );
+ ///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
+ std::string name = gdcm::Util::GetName( *it );
+ if (hasSkel)
+ {
+ gdcm::Util::Tokenize (name, tokensForFileName, skel);
+ 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;
+ tokensForFileName.clear();
+ }
+ else
+ tokens[3] = name;
+
+
userFileIdentifier = tokens[0] + token + tokens[1] + token + tokens[2] + token
+ tokens[3] + token + tokens[4] + token;
- std::cout << "userFileIdentifier2: "<< userFileIdentifier << std::endl;
}
-
- std::cout << " [" <<
- userFileIdentifier << "]" << std::endl;
+ if (verbose)
+ std::cout << "[" << userFileIdentifier << "]" << std::endl;
// storing in a map ensures automatic sorting !
sf[userFileIdentifier] = f;
fullFilename = currentFile->GetFileName();
lastFilename = gdcm::Util::GetName( fullFilename );
- std::cout << "Try to write [" <<lastFilename << "]" << std::endl;
+ std::cout << "Rewrite [" <<lastFilename << "]" << std::endl;
tokens.clear();
gdcm::Util::Tokenize (it2->first, tokens, token);
// Deal with 0x0020, 0x0012 : 'SESSION INDEX' (Acquisition Number)
std::string chSessionIndex;
// CLEANME
- if (currentPhaseEncodingDirection == "COL" || currentPhaseEncodingDirection == "COL " || currentPhaseEncodingDirection == " COL")
+ if (taggrid)
chSessionIndex = "1";
- else if (currentPhaseEncodingDirection == "ROW" ||
- currentPhaseEncodingDirection == "ROW "|| currentPhaseEncodingDirection == " ROW")
- chSessionIndex = "2";
else
{
- std::cout << "====================== PhaseEncodingDirection "
- << " neither COL nor ROW (?!?) : [ "
- << currentPhaseEncodingDirection << "]" << std::endl;
- chSessionIndex = "1";
+ if (currentPhaseEncodingDirection == "COL" || currentPhaseEncodingDirection == "COL " || currentPhaseEncodingDirection == " COL")
+ chSessionIndex = "1";
+ else if (currentPhaseEncodingDirection == "ROW" || currentPhaseEncodingDirection == "ROW "|| currentPhaseEncodingDirection == " ROW")
+ chSessionIndex = "2";
+ else
+ {
+ std::cout << "====================== PhaseEncodingDirection "
+ << " neither COL nor ROW (?!?) : [ "
+ << currentPhaseEncodingDirection << "]" << std::endl;
+ chSessionIndex = "1";
+ }
}
if (currentFile->IsVRCoherent(0x0020) == 1 )
currentFile->InsertEntryString(chSessionIndex, 0x0020, 0x0012, " ");
char chFrameIndex[5];
sprintf(chFrameIndex, "%04d", frameIndex);
-
+ std::string stringVR;
if (currentFile->IsVRCoherent(0x0021) == 1 )
- {
- currentFile->InsertEntryString(strChSliceIndex, 0x0021, 0x1020, " ");
- currentFile->InsertEntryString(chFrameIndex, 0x0021, 0x1040, " ");
- }
+ stringVR = " ";
else
- {
- currentFile->InsertEntryString(strChSliceIndex, 0x0021, 0x1020, "IS");
- currentFile->InsertEntryString(chFrameIndex, 0x0021, 0x1040, "IS");
- }
+ stringVR = "IS";
+
+ currentFile->InsertEntryString(strChSliceIndex, 0x0021, 0x1020, stringVR);
+ currentFile->InsertEntryString(chFrameIndex, 0x0021, 0x1040, stringVR);
- if (flag == 0)
- {
- flag = 1;
- }
- else
- {
+ if (taggrid)
frameIndex++;
- flag = 0;
- }
-
+ else
+ {
+ if (flag == 0)
+ {
+ flag = 1;
+ }
+ else
+ {
+ frameIndex++;
+ flag = 0;
+ }
+ }
+
if (split)
//fullWriteFilename = currentPhaseEncodingDirectionWriteDir + gdcm::GDCM_FILESEPARATOR
fh = gdcm::FileHelper::New(currentFile);
fh->GetImageDataRaw(); // Don't convert (Gray Pixels + LUT) into (RGB pixels) ?!?
fh->SetWriteTypeToDcmExplVR();
+ // We didn't modify pixels -> keep unchanged the following :
+ // 'Media Storage SOP Class UID' (0x0002,0x0002)
+ // 'SOP Class UID' (0x0008,0x0016)
+ // 'Image Type' (0x0008,0x0008)
+ // 'Conversion Type' (0x0008,0x0064)
+ fh->SetContentType(gdcm::UNMODIFIED_PIXELS_IMAGE);
if (!fh->Write(fullWriteFilename))
{
std::cout << "Fail to write :[" << fullWriteFilename << "]"