#include "bruker2dicom.h"
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#ifndef PATH_MAX // If not defined yet : do it
+ #define PATH_MAX 2048
+#endif
bool Bruker2Dicom::Execute()
{
- // ----- Begin Processing -----
+ // ----- Check input values -----
bool bigEndian = GDCM_NAME_SPACE::Util::IsCurrentProcessorBigEndian();
- if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(InputDirName) )
+ //if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(InputDirName) )
+ if ( ! boost::filesystem::is_directory(InputDirName) )
{
std::cout << "KO : [" << InputDirName << "] is not a Directory." << std::endl;
return 0;
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;
bool canOpen;
std::string outputFileName;
+
// BrukerDataSet br_subject;
std::string subject;
subject = GDCM_NAME_SPACE::Util::GetPath(*(fileNames.begin()))+
// get info for 'Study Description'
- /*
- BrukerFieldData b_protocol_location=br_acqp.GetFieldData("ACQ_protocol_location");
- acqp_protocol_location = b_protocol_location.GetStringValue()[0];
- cleanString(acqp_protocol_location);
-*/
+
BrukerFieldData b_name=br_subject.GetFieldData("SUBJECT_name_string");
std::string subject_name = b_name.GetStringValue()[0];
- strPatientName = subject_name;
+ strPatientName = subject_name;
cleanString(subject_name);
-
+
BrukerFieldData b_entry=br_subject.GetFieldData("SUBJECT_entry");
std::string subject_entry = b_entry.GetStringValue()[0];
//cleanString(subject_entry);
- subject_entry = subject_entry.substr(11, subject_entry.size()-11);
-
+ subject_entry = subject_entry.substr(11, subject_entry.size()-11);
+
BrukerFieldData b_position=br_subject.GetFieldData("SUBJECT_position");
std::string subject_position = b_position.GetStringValue()[0];
//cleanString(subject_position);
- subject_position = subject_position.substr(9, subject_position.size()-9);
-
+ subject_position = subject_position.substr(9, subject_position.size()-9);
+
BrukerFieldData b_date=br_subject.GetFieldData("SUBJECT_date");
std::string subject_date = b_date.GetStringValue()[0];
- strStudyTimeDate = subject_date;
+ strStudyTimeDate = subject_date;
cleanString(subject_date);
-
+
BrukerFieldData b_study_name=br_subject.GetFieldData("SUBJECT_study_name");
std::string subject_study_name = b_study_name.GetStringValue()[0];
- subject_study_name = subject_study_name.substr(1, subject_study_name.size()-2);
+ subject_study_name = subject_study_name.substr(1, subject_study_name.size()-2);
cleanString(subject_date);
-
- strStudyDescr = subject_name + "-" + subject_study_name + "-" + subject_entry + "-" + subject_position + "-" + subject_date;
-
+
+ // subject_name is already in 'Patient Name'
+ strStudyDescr = /*subject_name + "." + */ subject_study_name + "." + subject_entry + "." + subject_position + "." + subject_date;
+
char outputDirName[(unsigned int) PATH_MAX+2];
strStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
-
+ serieNumber = 0;
// -----------------------------------------------------
// Iterate to ALL the objets(files/directories) found in the input directory
// (this is level ZERO)
+ // each Directory (name : 1, 2, 3, ...) will be a Dicom Serie
// -----------------------------------------------------
GDCM_NAME_SPACE::DirListType::iterator it;
it != fileNames.end();
++it)
{
- if ( GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+ if ( boost::filesystem::is_directory(*it) )
{
if (verbose)
std::cout << "[" << *it << "] is a directory" << std::endl;
nbSlices = b_list_size.GetIntValue()[0];
strSerieDescr = GDCM_NAME_SPACE::Util::GetName(*it)
- + "-" + acqp_protocol_location
- + "-" + acqp_scan_name
- + "-" + acqp_method.c_str();
+ /* + "." + acqp_protocol_location */ // always the same (in each acquisition)
+ + "." + acqp_scan_name
+ + "." + acqp_method.c_str();
sprintf(outputDirName, "%s%c%s", OutputDirName.c_str(),
GDCM_NAME_SPACE::GDCM_FILESEPARATOR,
strSerieDescr.c_str() );
-
+
std::cout << " ================================================================================\n"
- << " ========================= [" << GDCM_NAME_SPACE::Util::GetName(*it).c_str()
- << acqp_protocol_location.c_str()
- << acqp_scan_name.c_str()
- << acqp_method.c_str()
- << "]\n"
+ << " === [" << GDCM_NAME_SPACE::Util::GetName(*it) << "] -> [" << strSerieDescr << "]\n"
<< " ================================================================================"
<< std::endl;
+
if (verbose)
printf ("outputDirName [%s]\n", outputDirName);
it != fileNames.end();
++it)
{
- if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+ if ( boost::filesystem::is_regular(*it) )
+ //if ( ! boost::filesystem::is_directory(*it) )
{
if (verbose)
- std::cout << "--- [" << *it << "] is a file" << std::endl;
+ std::cout << "--- [" << *it << "] is a file." << std::endl;
}
}
it != fileNames.end();
++it)
{
- if ( GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+ if ( boost::filesystem::is_directory(*it) )
{
// will be always "pdata" ...
if (verbose)
it != fileNames.end();
++it)
{
- if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+ if ( ! boost::filesystem::is_directory(*it) )
{
- std::cout << "--- --- [" << *it << "] is a file" << std::endl;
+ std::cout << "--- --- [" << *it << "] is a file.." << std::endl;
}
}
it != fileNames.end();
++it)
{
- if ( GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+ if ( boost::filesystem::is_directory(*it) )
{
if (verbose)
str_isa_func_name = b_isa_func_name.GetStringValue()[0];
cleanString(str_isa_func_name);
- sprintf(outputDirName, "%s%c%s-%s", currentOutputDirName.c_str(),
+ sprintf(outputDirName, "%s%c%s.%s", currentOutputDirName.c_str(),
GDCM_NAME_SPACE::GDCM_FILESEPARATOR,
GDCM_NAME_SPACE::Util::GetName(*it).c_str(),
str_isa_func_name.c_str());
sprintf(char_d3proc,"%s%c%s", level3Directory.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR,"d3proc" );
if (verbose)
- std::cout << "--- => [" << char_d3proc << "]" << std::endl;
+ std::cout << "try d3proc: --- => [" << char_d3proc << "]" << std::endl;
std::string str_d3proc(char_d3proc);
canOpen = br_d3proc.LoadFile(str_d3proc);
// GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
// "d3proc";
if (verbose)
- std::cout << "--- => [" << char_reco << "]" << std::endl;
+ std::cout << "try reco --- => [" << char_reco << "]" << std::endl;
std::string str_reco(char_reco);
canOpen = br_reco.LoadFile(str_reco);
std::cout << "FOV (ds method) " << fovX << " " << fovY << std::endl;
/// \TODO probabely a more sophisticated accessor will be necessary :
- /// (cf : non contiguous slices, overlapping, slice thickness, space between clices, etc)
+ /// (cf : non contiguous slices, overlapping, slice thickness, space between slices, etc)
BrukerFieldData bsliceDistance = br_method.GetFieldData("PVM_SPackArrSliceDistance");
double sliceDistance = bsliceDistance.GetDoubleValue()[0];
exit (0);
}
- unsigned char * buffer_2dseq = new unsigned char[NX*NY*pixelSize*nbSlices*nbInstants];
+ unsigned char *buffer_2dseq = new unsigned char[NX*NY*pixelSize*nbSlices*nbInstants];
///\ TODO : find a safer way to be sure to read everything!
size_t lgr = fread(buffer_2dseq, 1, NX*NY*pixelSize*nbSlices*nbInstants, fp);
// ---------------------------
imageSet = CreateImageSet ( );
+ serieNumber++;
strSerieUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
if (nbInstants==1) // creer un seul fichier .mhd pour toutes les Slices! (images natives)
{
std::cout << "Single instant : do not split" << std::endl;
if (mhd)
{
- sprintf(outputMhdFileName, "%s%cMhdData_Toutes_les_Slices.mhd", currentOutputMhdDirName,
+ sprintf(outputMhdFileName, "%s%cMhdData_All_the_Slices.mhd", currentOutputMhdDirName,
GDCM_NAME_SPACE::GDCM_FILESEPARATOR);
fp=fopen(outputMhdFileName, "w");
if (!fp)
fprintf(fp, "CenterOfRotation = 0 0 0\n" );
fprintf(fp, "ElementNumberOfChannels = 1\n" );
fprintf(fp, "ElementType = %s\n", mhdDataPixelType.c_str() );
- fprintf(fp, "ElementDataFile = %s\n", "../2dseq_toutes_les_Slices" );
+ fprintf(fp, "ElementDataFile = %s\n", "../2dseq_All_the_Slices" );
fclose(fp);
}
- sprintf(output2dseqSliceFileName, "%s%c2dseq_toutes_les_Slices",
+ sprintf(output2dseqSliceFileName, "%s%c2dseq_All_the_Slices",
currentOutputDirName.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR);
fp=fopen(output2dseqSliceFileName, "wb");
if (!fp)
fwrite( buffer_2dseq, NX*NY*pixelSize, nbSlices, fp);
}
fclose(fp);
+ serieNumber ++;
strSerieUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
} // end if mhd
if (dicom)
{
- sprintf(output2dseqSliceFileName, "%s%c2dseq_toutes_les_Slices.dcm",
+ sprintf(output2dseqSliceFileName, "%s%c2dseq_All_the_Slices.dcm",
currentOutputDirName.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR);
/* ----------- Write Dicom Image ---------------*/
day,
strStudyUID,
strSerieUID,
- strStudyDescr,
+ strStudyDescr,
strSerieDescr,
- strStudyTimeDate,
+ strStudyTimeDate,
0,// index frame number
GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE
);
// Interleaved !
// it's (slice1,slide2, ...)t1 ; (slice1,slide2, ...)t2 ; ...
- unsigned char * pixelsForCurrentSlice = new unsigned char[NX*NY*pixelSize*nbInstants];
+ unsigned char *pixelsForCurrentSlice = new unsigned char[NX*NY*pixelSize*nbInstants];
k = 0;
for (sliceNb=0; sliceNb<nbSlices; sliceNb++)
{
- if (mhd)
- {
+ if (mhd)
+ {
sprintf(outputMhdFileName, "%s%cMhdData_%03d.mhd", currentOutputMhdDirName,
GDCM_NAME_SPACE::GDCM_FILESEPARATOR, k );
if (verbose)
fclose(fp);
// std::cout << "end writting[" << output2dseqSliceFileName << "]" << std::endl;
} // end if mhd
-
- if (dicom)
- {
+
+ if (dicom)
+ {
// desperate try !
- /*
+ /*
sprintf(output2dseqSliceFileName, "%sdummy_buffer",
currentOutputDirName.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR);
fp=fopen(output2dseqSliceFileName, "wb");
1, fp);
}
fclose(fp);
-
+
fp=fopen(output2dseqSliceFileName, "rb");
if (!fp)
{
std::cout << "Cannot open [" << output2dseqSliceFileName << "] for reading" << std::endl;
exit (0);
- }
+ }
fread( pixelsForCurrentSlice,
frameSize*nbInstants,
1, fp);
fclose(fp);
// end of desperate try !
- */
+ */
/* ----------- Write Dicom Image ---------------*/
-
- int frameSize = NX*NY*pixelSize;
+
+ int frameSize = NX*NY*pixelSize;
for (instantNb=0; instantNb<nbInstants; instantNb++)
{
memcpy(pixelsForCurrentSlice + frameSize*instantNb, buffer_2dseq +(nbSlices*instantNb + sliceNb)*frameSize, frameSize);
day,
strStudyUID,
strSerieUID,
- strStudyDescr,
+ strStudyDescr,
strSerieDescr,
- strStudyTimeDate,
+ strStudyTimeDate,
sliceNb*nbInstants,
GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE
);
if (verbose)
std::cout << "--- Output DCM file [" << output2dseqSliceFileName << "]" << std::endl;
- } // en if dicom
+ } // en if dicom
k++;
}
void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX, int NY, int nbSlices,
double fovX, double fovY, double sliceDistance,
char *copyFile, std::string ¤tOutputDirName,
- char *outputMhdFileName, char *output2dseqCartoName)
+ char *outputMhdFileName, char *output2dseqCartoName)
{
// -----------------------------------------------------
// deal with MatLab-generated Carto file.
it != fileNames.end();
++it)
{
- if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(*it) )
+ if ( boost::filesystem::is_regular(*it) )
+ //if ( ! boost::filesystem::is_directory(*it) )
{
if (verbose)
- std::cout << "--- [" << *it << "] is a file" << std::endl;
+ std::cout << "--- [" << *it << "] is a file..." << std::endl;
icode = 0;
<< NX*NY*sizeof(double)*nbSlices << std::endl;
std::string lastFileName = GDCM_NAME_SPACE::Util::GetName((*it).c_str());
if (mhd)
- {
+ {
// Copy the data file in the new directory
sprintf(copyFile, "cp %s %s%c%s", (*it).c_str() ,
currentOutputDirName.c_str(),GDCM_NAME_SPACE::GDCM_FILESEPARATOR, lastFileName.c_str());
fclose(fp);
}
if (verbose)
- std::cout << "--- end write Carto MHD file [" << outputMhdFileName << "]" << std::endl;
+ std::cout << "--- end write Carto MHD file [" << outputMhdFileName << "]" << std::endl;
} // end if mhd
// ----------- Write Dicom Image ---------------
if (dicom)
- {
+ {
sprintf(output2dseqCartoName, "%s%c%s%s",
currentOutputDirName.c_str(),GDCM_NAME_SPACE::GDCM_FILESEPARATOR, lastFileName.c_str(), ".dcm" );
if (verbose)
- std::cout << "--- end create name output2dseqCartoName file [" << output2dseqCartoName << "]" << std::endl;
+ std::cout << "--- end create name output2dseqCartoName file [" << output2dseqCartoName << "]" << std::endl;
strSerieUID = GDCM_NAME_SPACE::Util::CreateUniqueUID(); //New SerieUID for each carto.
std::string strNewSerieDescr(strSerieDescr+ "_" +GDCM_NAME_SPACE::Util::GetName((*it).c_str()));
day,
strStudyUID,
strSerieUID,
- strStudyDescr,
+ strStudyDescr,
strNewSerieDescr,
- strStudyTimeDate,
+ strStudyTimeDate,
0,
GDCM_NAME_SPACE::CREATED_IMAGE
);
delete [] buffer_carto;
if (verbose)
- std::cout << "--- End writing Carto DICOM file [" << output2dseqCartoName << "]" << std::endl;
+ std::cout << "--- End writing Carto DICOM file [" << output2dseqCartoName << "]" << std::endl;
break; // don't check for more ident on same file name!
- }
+ }
icode++;
}
}
if (verbose)
std::cout << "Check for output directory :[" << OutputDirName << "]."
<<std::endl;
- if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(OutputDirName) ) // dirout not found
+ if ( ! boost::filesystem::is_directory(OutputDirName) ) // dirout not found
{
- std::string strDirNameout(OutputDirName); // to please gcc 4
+ std::string strDirNameout(OutputDirName); // to please gcc 4
systemCommand = "mkdir " + strDirNameout; // create it!
if (verbose)
std::cout << systemCommand << std::endl;
system (systemCommand.c_str());
- if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(OutputDirName) ) // be sure it worked
+ if ( ! boost::filesystem::is_directory(OutputDirName) ) // be sure it worked
{
if (verbose)
std::cout << "KO : not a dir : [" << OutputDirName << "] (creation failure ?)" << std::endl;
return imageSet;
}
-
// ===========================================================================================
void Bruker2Dicom::MakeDicomImage(unsigned char *tabPixels,
std::string &serieUID,
std::string &studyDescr,
std::string &serieDescr,
- std::string &strStudyTimeDate,
+ std::string &strStudyTimeDate,
int imgNum,
GDCM_NAME_SPACE::ImageContentType contentType
)