Program: gdcm
Module: $RCSfile: PhilipsToBrucker2.cxx,v $
Language: C++
- Date: $Date: 2006/01/25 17:02:00 $
- Version: $Revision: 1.9 $
+ 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;
}
- char *dirNamein;
- dirNamein = am->ArgMgrGetString("dirin",(char *)".");
+ const char *dirNamein;
+ dirNamein = am->ArgMgrGetString("dirin",".");
- char *dirNameout;
- dirNameout = am->ArgMgrGetString("dirout",(char *)".");
+ const char *dirNameout;
+ dirNameout = am->ArgMgrGetString("dirout",".");
int loadMode = gdcm::LD_ALL;
if ( am->ArgMgrDefined("noshadowseq") )
return 0;
}
- char *extent = am->ArgMgrGetString("extent",".DCM");
+ 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
if ( am->ArgMgrPrintUnusedLabels() )
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()
s = gdcm::SerieHelper::New();
+ std::string token = "%%%"; // Hope it's enough!
/*
std::cout << "---------------Print Serie--------------" << std::endl;
s->SetDirectory(dirNamein, true); // true : recursive exploration
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 += "_";
- //userFileIdentifier += *it;
-
tokens.clear();
- gdcm::Util::Tokenize (userFileIdentifier, tokens, "_");
+ 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 );
- userFileIdentifier = tokens[0] + "_" + tokens[1] + "_" + tokens[2] + "_" + tokens[3] + "_" + tokens[4];
- }
+ ///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;
- std::cout << " [" <<
- userFileIdentifier << "]" << std::endl;
+
+ userFileIdentifier = tokens[0] + token + tokens[1] + token + tokens[2] + token
+ + tokens[3] + token + tokens[4] + token;
+ }
+ 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, "_");
+ gdcm::Util::Tokenize (it2->first, tokens, token);
currentPatientName = tokens[0];
currentSerieInstanceUID = tokens[1];
currentImagePosition = tokens[2];
currentTriggerTime = tokens[3];
- currentPhaseEncodingDirection = tokens[4];
-
+ currentPhaseEncodingDirection = tokens[4];
+
if ( currentImagePosition[0] == '-')
currentImagePosition[0] = 'M';
if ( currentImagePosition[0] == '+')
float pxSzY = currentFile->GetYSpacing();
char fov[64];
sprintf(fov, "%f\\%f",nX*pxSzX, nY*pxSzY);
- currentFile->InsertEntryString(fov, 0x0019, 0x1000, "DS");
+ if (currentFile->IsVRCoherent(0x0019) == 1 )
+ currentFile->InsertEntryString(fov, 0x0019, 0x1000, " ");
+ else
+ currentFile->InsertEntryString(fov, 0x0019, 0x1000, "DS");
+
// 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 == "RAW" || currentPhaseEncodingDirection == "RAW "|| currentPhaseEncodingDirection == " RAW")
- chSessionIndex = "2";
else
{
- std::cout << "====================== PhaseEncodingDirection "
- << " neither COL nor RAW (?!?) : [ "
- << currentPhaseEncodingDirection << "]" << std::endl;
- chSessionIndex = "2";
+ 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";
+ }
}
- currentFile->InsertEntryString(chSessionIndex, 0x0020, 0x0012, "IS");
-
+ if (currentFile->IsVRCoherent(0x0020) == 1 )
+ currentFile->InsertEntryString(chSessionIndex, 0x0020, 0x0012, " ");
+ else
+ currentFile->InsertEntryString(chSessionIndex, 0x0020, 0x0012, "IS");
+
// Deal with 0x0021, 0x1020 : 'SLICE INDEX'
char chSliceIndex[5];
sprintf(chSliceIndex, "%04d", sliceIndex);
std::string strChSliceIndex(chSliceIndex);
- currentFile->InsertEntryString(strChSliceIndex, 0x0021, 0x1020, "IS");
// Deal with 0x0021, 0x1040 : 'FRAME INDEX'
char chFrameIndex[5];
sprintf(chFrameIndex, "%04d", frameIndex);
- currentFile->InsertEntryString(chFrameIndex, 0x0021, 0x1040, "IS");
-
- if (flag == 0)
- {
- flag = 1;
- }
+
+ std::string stringVR;
+ if (currentFile->IsVRCoherent(0x0021) == 1 )
+ stringVR = " ";
else
- {
+ stringVR = "IS";
+
+ currentFile->InsertEntryString(strChSliceIndex, 0x0021, 0x1020, stringVR);
+ currentFile->InsertEntryString(chFrameIndex, 0x0021, 0x1040, stringVR);
+
+ 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 << "]"