throw ( BrukerHopelessException ("Output directory creation failure "));
}
- std::string strDirNamein(InputDirName);
- GDCM_NAME_SPACE::DirList dirList(strDirNamein, false, true); // DON'T get recursively the list of files
- std::string strDirNameout(OutputDirName);
-
-/*
- if (listonly)
- {
- std::cout << "------------List of found files ------------" << std::endl;
- dirList.Print();
- std::cout << std::endl;
- return 1;
- }
-*/
-
//
// e.g : at level 0, in : B67d1.Bp1
//
// 1 2 3 4 5 6 AdjStatePerStudy subject
//
+ std::string strDirNamein(InputDirName);
+
+/* */
+ GDCM_NAME_SPACE::DirList dirList(strDirNamein, false, true); // DON'T get recursively the list of files
+
GDCM_NAME_SPACE::DirListType fileNames;
fileNames = dirList.GetFilenames();
- bool canOpen;
- std::string outputFileName;
- // BrukerDataSet br_subject;
- std::string subject;
- subject = GDCM_NAME_SPACE::Util::GetPath(*(fileNames.begin()))+
- GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
- "subject";
- if (verbose)
- std::cout << " Subject : [" << subject << "]" << std::endl;
-
- bool subjectFound;
- canOpen =br_subject.LoadFile(subject);
- if (!canOpen)
+ std::string path = GDCM_NAME_SPACE::Util::GetPath(*(fileNames.begin()));
+
+ std::string subject = path +
+ GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
+ "subject";
+
+ std::string acqp = path +
+ GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
+ "acqp";
+
+ if ( boost::filesystem::is_regular(subject) )
+ subjectFound = true;
+ else
+ subjectFound = false; // user passed only a 'serie', not a 'study
+
+ if ( boost::filesystem::is_regular(acqp) )
+ acqpFound= true;
+ else
+ acqpFound = false; // user passed a 'non study' directory; Hope it's a 'set of studies' directory!
+
+ int type;
+ if (subjectFound ) type = 1; // user passed a 'study
+ else if (acqpFound) type = 2; // user passed a 'serie'
+ else type = 3; // user passed a 'non study' directory; Hope it's a 'set of studies' directory!
+ /* */
+
+
+ // 1 : if subjectFound : user passed a Single Study Directory
+ // 2 : if NOT subjectFound and acqpFound : user passed a Serie Directory
+ // 3 : if NOT subjectFound and NOT acqpFound : user passed a 'non Study Directory' (Hope it's a set of Single Study Directories)
+
+ //int type = CheckUserDirectory(InputDirName);
+
+ switch (type)
{
- //std::cout << "Hopeless! no 'subject' found" << std::endl;
- //throw ( BrukerHopelessException ("Hopeless! no 'subject' found in root input directory "));
-
- std::cout << "Not too much hope! no 'subject' found (Desperate try will be performed -default values- )" << std::endl;
- subjectFound = false;
- }
- else
- {
- br_subject.FillMap();
- subjectFound = true;
- }
+ case 1: {
+ bool canOpen = br_subject.LoadFile(subject);
+ if (!canOpen)
+ {
+ std::cout << "Hopeless! 'subject' found / cannot be open" << std::endl;
+ throw ( BrukerHopelessException ("Hopeless! 'subject' found in root input directory / cannot be open"));
+ }
+ else
+ {
+ br_subject.FillMap();
+ }
//br_subject.PrintSelf();
// get info for 'Study Description'
- if (subjectFound)
- {
- BrukerFieldData b_name=br_subject.GetFieldData("SUBJECT_name_string");
- subject_name = b_name.GetStringValue()[0];
- strPatientName = subject_name;
- cleanString(subject_name);
- }
- else
- subject_name ="defaultPatName";
+ BrukerFieldData b_name=br_subject.GetFieldData("SUBJECT_name_string");
+ subject_name = b_name.GetStringValue()[0];
+ strPatientName = subject_name;
+ cleanString(subject_name);
+ DealWithSingleStudyDirectory (fileNames);
+ break;
+ }
+
+ case 2: {
+ subject_name = "defaultPatName";
+ strPatientName = subject_name;
+ DealWithSingleStudyDirectory (fileNames);
+ break;
+ }
+
+ case 3: {
+ std::cout << " user passed a 'non study' directory; Hope it's a *non recursive* 'set of studies' directory! (recursive not yet dealt with)" << std::endl;
+ DealWithMultiStudyDirectory (fileNames);
+ break;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------------------------------------
+
+void Bruker2Dicom::DealWithMultiStudyDirectory (GDCM_NAME_SPACE::DirListType &dirNames)
+{
+ GDCM_NAME_SPACE::DirListType::iterator it;
+
+ for (it = dirNames.begin();
+ it != dirNames.end();
+ ++it)
+ {
+ if ( boost::filesystem::is_directory(*it) )
+ {
+ if (verbose)
+ std::cout << "[" << *it << "] is a directory" << std::endl;
+
+ GDCM_NAME_SPACE::DirList dirList(*it, false, true); // DON'T get recursively the list of files
+ GDCM_NAME_SPACE::DirListType fileNames;
+ fileNames = dirList.GetFilenames();
+ std::string path = GDCM_NAME_SPACE::Util::GetPath(*(fileNames.begin()));
+ std::string subject = path +
+ GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
+ "subject";
+ if (! boost::filesystem::is_regular(subject) )
+ {
+ std::cout << "no [" << subject << "] file found" << std::endl;
+ continue;
+ }
+
+ bool canOpen = br_subject.LoadFile(subject);
+ if (!canOpen)
+ {
+ std::cout << "Hopeless! 'subject' found / cannot be open" << std::endl;
+ throw ( BrukerHopelessException ("Hopeless! 'subject' found in root input directory / cannot be open"));
+ }
+ else
+ {
+ br_subject.FillMap();
+ }
+
+ BrukerFieldData b_name=br_subject.GetFieldData("SUBJECT_name_string");
+ subject_name = b_name.GetStringValue()[0];
+ strPatientName = subject_name;
+ cleanString(subject_name);
+
+ DealWithSingleStudyDirectory(fileNames);
+ }
+ else
+ {
+ if (verbose)
+ std::cout << "[" << *it << "] is NOT a directory; skipped!" << std::endl;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------------------------------------
+
+void Bruker2Dicom::DealWithSingleStudyDirectory (GDCM_NAME_SPACE::DirListType &fileNames)
+{
+ bool res;
// creation directory : 'nom du patient'
std::string tempStringPatDir(OutputDirName);
tempStringPatDir = tempStringPatDir + GDCM_NAME_SPACE::GDCM_FILESEPARATOR + subject_name;
if (!res) {
std::cout << "[" << tempStringPatDir << "] Directory creation failure " << std::endl;
throw ( BrukerHopelessException ("Patient directory creation failure "));
- }
+ }
- std::string subject_entry;
- std::string subject_position;
- std::string subject_date;
- std::string subject_study_name;
-
if (subjectFound)
{
+
+ std::cout << "===================================--===========nom dir [" << tempStringPatDir << "] subjectFound, studyName : " << subject_study_name<< std::endl;
BrukerFieldData b_entry=br_subject.GetFieldData("SUBJECT_entry");
subject_entry = b_entry.GetStringValue()[0];
//cleanString(subject_entry);
}
else // Desperate trick when file 'subject' is missing
{
+
+ std::cout << "==============================================nom dir [" << tempStringPatDir << "] subjectFound" << std::endl;
subject_entry = "HeadFirst"; // Why not?
subject_position = "Supine"; // Why not?
strStudyTimeDate = "06_06_06_6_June_1666"; // Why not?
// each Directory (name : 1, 2, 3, ...) will be a Dicom Serie
// -----------------------------------------------------
+ /// \TODO better use directory iterator, from boost! // JPR
GDCM_NAME_SPACE::DirListType::iterator it;
for (it = fileNames.begin();
if (verbose)
std::cout << "[" << *it << "] is a directory" << std::endl;
+ //if((*it) == "AdjResult") // avoid trouble with new version 'AdjResult' directory
+ if(GDCM_NAME_SPACE::Util::GetName(*it) == "AdjResult")
+ continue;
+
//BrukerDataSet br_acqp;
std::string strAcqp;
strAcqp = (*it) +
+ "." + acqp_scan_name
+ "." + acqp_method.c_str();
- sprintf(outputDirName, "%s%c%s", tempStringStudyDir.c_str(), //OutputDirName.c_str(),
+ sprintf(outputDirName, "%s%c%s", tempStringStudyDir.c_str(), //OutputDirName.c_str(),
GDCM_NAME_SPACE::GDCM_FILESEPARATOR,
strSerieDescr.c_str() );
<< " === [" << GDCM_NAME_SPACE::Util::GetName(*it) << "] -> [" << strSerieDescr << "]\n"
<< " ================================================================================"
<< std::endl;
-
+ std::string strOutputDirName(outputDirName);
if (verbose)
- printf ("outputDirName [%s]\n", outputDirName);
+ printf ("outputDirName [%s]\n", outputDirName);
try {
- DealWithNiveau1(*it, outputDirName);
+ DealWithNiveau1(*it, strOutputDirName);
}
catch (BrukerHopelessException &e)
{
// =====================================================================
-void Bruker2Dicom::DealWithNiveau1(std::string level1Directory, std::string currentOutputDirName) {
+void Bruker2Dicom::DealWithNiveau1(std::string &level1Directory, std::string ¤tOutputDirName) {
//
// e.g. : at level 1, in B67d1.Bp1/6
//
sprintf(outputDirName, "%s%c%s", currentOutputDirName.c_str(),
GDCM_NAME_SPACE::GDCM_FILESEPARATOR,
GDCM_NAME_SPACE::Util::GetName(*it).c_str());
+ std::string strOutputDirName(outputDirName);
//br1.PrintSelf();
std::string strMethod;
7 1
*/
try {
- DealWithNiveau2(*it, outputDirName);
+ DealWithNiveau2(*it, strOutputDirName);
}
catch (BrukerHopelessException &e)
{
// =====================================================================
-void Bruker2Dicom::DealWithNiveau2(std::string level2Directory, std::string currentOutputDirName) {
+void Bruker2Dicom::DealWithNiveau2(std::string &level2Directory, std::string ¤tOutputDirName) {
// e.g. : at level 2 in B67d1.Bp1/6/pdata
//
GDCM_NAME_SPACE::Util::GetName(*it).c_str(),
str_isa_func_name.c_str());
}
+ std::string strOutputDirName(outputDirName);
try {
- DealWithNiveau3(*it, outputDirName);
+ DealWithNiveau3(*it, strOutputDirName);
}
catch (BrukerHopelessException &e)
{
// =====================================================================
//
-void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string currentOutputDirName){
+void Bruker2Dicom::DealWithNiveau3(std::string &level3Directory, std::string ¤tOutputDirName){
//
// e.g. at level 3, in
{
sprintf(currentOutputMhdDirName, "%s%c%s", currentOutputDirName.c_str(),
GDCM_NAME_SPACE::GDCM_FILESEPARATOR, "MhdFiles");
- res = CreateDirectory( currentOutputMhdDirName );
+
+ std::string strCurrentOutputMhdDirName(currentOutputMhdDirName);
+ res = CreateDirectory( strCurrentOutputMhdDirName );
if (!res) {
std::cout << "[" << currentOutputDirName << "] Directory creation failure " << std::endl;
throw ( BrukerHopelessException ("Hopeless!FillMap failed on 'reco'"));
fprintf(fp, "DimSize = %d %d %d\n", NX, NY, nbSlices );
fprintf(fp, "HeaderSize = %d\n", 0);
//fprintf(fp, "ElementSpacing = %lf %lf %lf\n",fovX/NY, fovY/NY, sliceDistance );
- fprintf(fp, "ElementSpacing = %lf %lf %lf\n", spatResolX, spatResolY, sliceDistance );
+ fprintf(fp, "ElementSpacing = %lf %lf %lf\n", spatResolX, spatResolY, sliceDistance );
fprintf(fp, "Position = 0 0 %d\n", 0 );
fprintf(fp, "Offset = 0 0 0\n" );
fprintf(fp, "CenterOfRotation = 0 0 0\n" );
1, fp);
}
fclose(fp);
+
// std::cout << "end writting[" << output2dseqSliceFileName << "]" << std::endl;
} // end if mhd
} // end method
+// ==========================================================================================================
+
+int Bruker2Dicom::CheckUserDirectory(std::string &userDirName)
+{
+ GDCM_NAME_SPACE::DirList dirList(userDirName, false, true); // DON'T get recursively the list of files
+
+ GDCM_NAME_SPACE::DirListType fileNames;
+ fileNames = dirList.GetFilenames();
+
+ std::string path = GDCM_NAME_SPACE::Util::GetPath(*(fileNames.begin()));
+
+ std::string subject = path +
+ GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
+ "subject";
+
+ std::string acqp = path +
+ GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
+ "acqp";
+
+ if ( boost::filesystem::is_regular(subject) )
+ subjectFound = true; // user passed a 'study
+ else
+ subjectFound = false; // user didnt' pass a 'study
+
+ if ( boost::filesystem::is_regular(acqp) )
+ acqpFound= true; // user passes a 'serie', not a 'study'
+ else
+ acqpFound = false; // user passed a 'non study' directory; Hope it's a 'set of studies' directory!
+
+ int type;
+ if (subjectFound ) type = 1; // user passed a 'study
+ else if (acqpFound) type = 2; // user passed a 'serie'
+ else type = 3; // user passed a 'non study' directory; Hope it's a 'set of studies' directory!
+
+ return type;
+}
+
+
// ==========================================================================================================
-bool Bruker2Dicom::CreateDirectory(std::string OutputDirName)
+bool Bruker2Dicom::CreateDirectory(std::string &OutputDirName)
{
std::string systemCommand;
<<std::endl;
if ( ! boost::filesystem::is_directory(OutputDirName) ) // dirout not found
{
- std::string strDirNameout(OutputDirName); // to please gcc 4
- systemCommand = "mkdir " + strDirNameout; // create it!
+ systemCommand = "mkdir " + OutputDirName; // create it!
if (verbose)
std::cout << systemCommand << std::endl;
system (systemCommand.c_str());
if (verbose)
std::cout << "Output Directory [" << OutputDirName << "] already exists; Used as is." << std::endl;
}
-
return 1;
-
}
GDCM_NAME_SPACE::Util::ReplaceSpecChar(s, repChar);
}
-
-
// ===========================================================================================
-
void Bruker2Dicom::getImhDataType(BrukerFieldData &bDPT, std::string &mhdDataPixelType, int &pixelSize)
{
if(bDPT.GetDataType() == "string")
str.str("");
str << instanceNumber;
file->InsertEntryString(str.str(),0x0020,0x0013, "IS");
-
-
+
// 1.2.840.10008.5.1.4.1.1.4.1 : Enhanced MR Image Storage
// file->InsertEntryString("1.2.840.10008.5.1.4.1.1.4.1" , 0x0002, 0x0002, "UI"); // [Media Storage SOP Class UID]
// file->InsertEntryString("1.2.840.10008.5.1.4.1.1.4.1" , 0x0008, 0x0016, "UI"); // [SOP Class UID]
-
// OK : MR is NOT multiframe, but I want just a quick an dirty solution
// 1.2.840.10008.5.1.4.1.1.4 MR Image Storage
file->InsertEntryString(charImageOrientation,0x0020,0x0037, "DS");
-
// 0020 0032 DS 3 Image Position (Patient)
char charImagePosition[256];
imageSet[imgNum].getTranslationVectorRPS2XYZ()[2]);
file->InsertEntryString(charImagePosition,0x0020,0x0032, "DS"); //0020 0032 DS 3 Image Position (Patient)
-
-
// 0020 0x1041 DS 1 Slice Location
// sprintf(charImagePosition,"%f",float(imgNum));
file->Delete();
fileH->Delete();
}
-
-