#define PATH_MAX 2048
#endif
-
-
bool Bruker2Dicom::Execute()
{
// ----- Check input directory name -----
bool canOpen;
std::string outputFileName;
-
// BrukerDataSet br_subject;
std::string subject;
subject = GDCM_NAME_SPACE::Util::GetPath(*(fileNames.begin()))+
cleanString(subject_name);
}
else
- subject_name ="defaultPatName";
+ subject_name ="defaultPatName";
// creation directory : 'nom du patient'
std::string tempStringPatDir(OutputDirName);
if (verbose)
std::cout << "[" << *it << "] is a directory" << std::endl;
+ if((*it) == "AdjStatePerStudy") // avoid trouble with new version 'AdjStatePerStudy' directory
+ continue;
+
//BrukerDataSet br_acqp;
std::string strAcqp;
strAcqp = (*it) +
<< " ================================================================================"
<< std::endl;
-
if (verbose)
printf ("outputDirName [%s]\n", outputDirName);
try {
br_method.FillMap();
/* a recuperer :
- ##$PVM_Fov (dimension)
+ ##$PVM_Fov (dimension) // ou plutot RECO_fov !
*/
/*
dans method (pour perfusion seulement?) :
// =====================================================================
void Bruker2Dicom::DealWithNiveau2(std::string level2Directory, std::string currentOutputDirName) {
-
+
// e.g. : at level 2 in B67d1.Bp1/6/pdata
//
// acqp fid imnd pdata pulseprogram spnam0 spnam1
throw ( BrukerHopelessException ("Hopeless! Level2 output directory creation failure"));
//exit (0);
}
-
+
GDCM_NAME_SPACE::DirList dirList(level2Directory, false, true); // DON'T get recursively the list of files
GDCM_NAME_SPACE::DirListType fileNames;
{
std::cout << "--- --- [" << *it << "] is a file.." << std::endl;
}
-
}
for (it = fileNames.begin();
if (verbose)
std::cout << "--- --- [" << *it << "] is a directory" << std::endl;
-
+
// sprintf(outputDirName, "%s%c%s", currentOutputDirName.c_str(),
// GDCM_NAME_SPACE::GDCM_FILESEPARATOR,
// GDCM_NAME_SPACE::Util::GetName(*it).c_str() );
GDCM_NAME_SPACE::Util::GetName(*it).c_str(),
str_isa_func_name.c_str());
}
- try {
+ try {
DealWithNiveau3(*it, outputDirName);
}
catch (BrukerHopelessException &e)
std::cout << "And Init Exception was thrown in DealWithNiveau3 (" << e.what() << "); "
<< " We skip [" << level2Directory << "]" << std::endl;
continue;
- }
+ }
}
}
}
-
//
// =====================================================================
//
if (!res)
{
std::cout << "[" << currentOutputDirName << "] Directory creation failure " << std::endl;
- throw ( BrukerHopelessException ("Hopeless! Level3 output directory creation failure"));
+ throw ( BrukerHopelessException ("Hopeless! Level3 output directory creation failure"));
//exit (0);
}
char copyFile[PATH_MAX + PATH_MAX + 5]; // Should be enough!
bool canOpen;
-
+
//-------------- try d3proc;
char char_d3proc[(unsigned int) PATH_MAX+2];
sprintf(char_d3proc,"%s%c%s", level3Directory.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR,"d3proc" );
-
+
if (verbose)
std::cout << "d3proc: --- => [" << char_d3proc << "]" << std::endl;
std::string str_d3proc(char_d3proc);
throw ( BrukerHopelessException ("Hopeless! FillMap failed on 'd3proc'"));
//exit(0); /// \TODO throw an exception !
}
-
+
//-------------- end try d3proc;
-
-
+
+
// -------------------try reco
char char_reco[(unsigned int) PATH_MAX+2];
// GDCM_NAME_SPACE::GDCM_FILESEPARATOR +
// "d3proc";
if (verbose)
- std::cout << "reco --- => [" << char_reco << "]" << std::endl;
- std::string str_reco(char_reco);
+ std::cout << "reco: --- => [" << char_reco << "]" << std::endl;
+
+ std::string str_reco(char_reco);
canOpen = br_reco.LoadFile(str_reco);
if (!canOpen) // we try in directory ../1
std::string lastDirName = GDCM_NAME_SPACE::Util::GetPath(level3Directory);
//lastDirName = GDCM_NAME_SPACE::Util::GetPath(lastDirName);
sprintf(char_reco,"%s%c1%c%s", lastDirName.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR,GDCM_NAME_SPACE::GDCM_FILESEPARATOR,"reco" );
- str_reco=char_reco;
+ //str_reco=char_reco;
canOpen = br_reco.LoadFile(str_reco);
if (!canOpen)
{
throw ( BrukerHopelessException ("Hopeless! cannot find 'reco'"));
//exit(0); /// \TODO throw an exception !
}
+ } else {
+ if (verbose)
+ std::cout << "[" << str_reco << "] successfully Loaded " << std::endl;
}
-
+
canOpen = br_reco.FillMap();
if (!canOpen)
{
std::cout << "Hopeless! FillMap failed on [" << str_reco << "]" << std::endl;
throw ( BrukerHopelessException ("Hopeless! FillMap failed on 'reco'"));
- //exit(0); /// \TODO throw an exception !
- }
+ //exit(0); /// \TODO throw an exception !
+ } else {
+ if (verbose)
+ std::cout << "[" << str_reco << "] successfully Mapped" << std::endl;
+ }
+
//std::cout << "------------------------------------------------------------------------------------------------" << std::cout;
// br_reco.PrintSelf();
// std::cout << "------------------------------------------------------------------------------------------------" << std::cout;
if (verbose)
std::cout << "IM_SIY " << NY << std::endl;
/// \todo : check if there are actually 3 dimensions or only 2
-
+
BrukerFieldData bZ= br_d3proc.GetFieldData("IM_SIZ");
int nbFrames = bZ.GetIntValue()[0];
if (verbose)
std::cout << "IM_SIZ " << nbFrames << std::endl;
// WARNING DATTYPE is, either in {ip_short, ip_int, ip_char, ...}, or in {1, 2, 3, ...}
-
+
BrukerFieldData bDPT = br_d3proc.GetFieldData("DATTYPE");
-
+
std::string mhdDataPixelType;
int pixelSize;
getImhDataType(bDPT, mhdDataPixelType, pixelSize);
-
+
+
+ /*
+
+ // See mail Denis :
+ // En regle generale il vaut mieux que l'on passe par RECO_*
+ // pour extraire les parametres de l'image
+ //
+
BrukerFieldData fov = br_method.GetFieldData("PVM_Fov");
double fovX = fov.GetDoubleValue()[0];
double fovY = fov.GetDoubleValue()[1];
if (verbose)
std::cout << "FOV (ds method) " << fovX << " " << fovY << std::endl;
-
+
BrukerFieldData spatResol = br_method.GetFieldData("PVM_SpatResol");
double spatResolX = spatResol.GetDoubleValue()[0];
double spatResolY = spatResol.GetDoubleValue()[1];
if (verbose)
std::cout << "SpatResol (ds method) " << spatResolX << " " << spatResolY << std::endl;
+
+*/
+/* ------ */
+// Better we use 'get' accessors from BrukerImage class, as Denis wrote them
+
+ BrukerFieldData fov = br_reco.GetFieldData("RECO_fov");
+ double fovX = fov.GetDoubleValue()[0];
+ double fovY = fov.GetDoubleValue()[1];
+ if (verbose)
+ std::cout << "FOV (ds reco) " << fovX << " " << fovY << std::endl;
+
+ BrukerFieldData size = br_reco.GetFieldData("RECO_size");
+ double sizeX = size.GetDoubleValue()[0];
+ double sizeY = size.GetDoubleValue()[1];
+
+ if (verbose)
+ std::cout << "SIZE (ds reco) " << sizeX << " " << sizeY << std::endl;
+
+ double spatResolX = fovX / sizeX;
+ double spatResolY = fovY / sizeY;
+
+ if (verbose)
+ std::cout << "spatResol (ds reco : fov/size) " << spatResolX << " " << spatResolY << std::endl;
+
+/* ------ */
/// \TODO probabely a more sophisticated accessor will be necessary :
/// (cf : non contiguous slices, overlapping, slice thickness, space between slices, etc)
+
BrukerFieldData bsliceDistance = br_method.GetFieldData("PVM_SPackArrSliceDistance");
double sliceDistance = bsliceDistance.GetDoubleValue()[0];
+
+ if (verbose)
+ std::cout << "SPackArrSliceDistance (ds method) " << sliceDistance << std::endl;
+
+// ----------------------------------------------------------------------------------------
if (mhd)
{
int k;
int nbInstants = nbFrames/nbSlices;
if (verbose)
- std::cout << "nbInstants (deduced )" << nbInstants << std::endl;
+ std::cout << "nbInstants (deduced)" << nbInstants << std::endl;
int instantNb;
int sliceNb;
FILE *fp; // for MHD files
//exit (0);
}
}
-
+
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);
//return;
throw (e);
}
-
+
serieNumber++;
strSerieUID = GDCM_NAME_SPACE::Util::CreateUniqueUID();
if (nbInstants==1) // creer un seul fichier .mhd pour toutes les Slices! (images natives)
{
sprintf(output2dseqSliceFileName, "%s%c2dseq_All_the_Slices.dcm",
currentOutputDirName.c_str(), GDCM_NAME_SPACE::GDCM_FILESEPARATOR);
-
+
/* ----------- Write Dicom Image ---------------*/
MakeDicomImage(buffer_2dseq,
NX,
);
} // end if dicom
} // end if nbInstants = 1
-
+
else // more than ONE instant
{
// Interleaved !
} // end nbInstants == 1
delete [] buffer_2dseq;
/**/
-
-
+
+
// -----------------------------------------------------
// deal with MatLab-generated Carto file.
// -----------------------------------------------------
-
+
dealWithCarto(fileNames, NX, NY, nbSlices, /*fovX, fovY,*/ spatResolX, spatResolY, sliceDistance,
copyFile, currentOutputDirName, outputMhdFileName, output2dseqCartoName);
}
// deal with MatLab-generated Carto file.
// -----------------------------------------------------
- char *code[] = { "ADC", "adc", "TTP", "ttp", "PEAK", "peak", "" }; // add more carto file name identifiers if necessary; end with ""
- char *separator[] = { "_", ".", "-", "" }; // add more, if necessary, to ckeck for 2dseq.ADC, 2dseq_ADC, 2dseq-ADC, etc; end with ""
+ const char *code[] = { "ADC", "adc", "TTP", "ttp", "PEAK", "peak", "" }; // add more carto file name identifiers if necessary; end with ""
+ const char *separator[] = { "_", ".", "-", "" }; // add more, if necessary, to ckeck for 2dseq.ADC, 2dseq_ADC, 2dseq-ADC, etc; end with ""
int icode;
int iseparator;
GDCM_NAME_SPACE::DirListType::iterator it;
char file_name_ident[500];
FILE *fp;
-
+
// Iterate to ALL the objets(files/directories) found in the input directory
for (it = fileNames.begin();
it != fileNames.end();
if ( loc != std::string::npos )
{
-
+
///\ TODO : find a safer way to be sure to read everything!
unsigned char *buffer_carto = new unsigned char[NX*NY*sizeof(double)*nbSlices];
fp = fopen ( (*it).c_str(), "rb");
currentOutputDirName.c_str(),GDCM_NAME_SPACE::GDCM_FILESEPARATOR, lastFileName.c_str(), ".mhd" );
if (verbose)
std::cout << "--- Output Carto MHD file [" << outputMhdFileName << "]" << std::endl;
-
+
FILE *fp;
fp=fopen(outputMhdFileName, "w");
if (!fp)
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
// if (strlen(patientName) != 0)
file->InsertEntryString(patientName.c_str(),0x0010,0x0010, "PN"); // Patient's Name
+ file->InsertEntryString(patientName.c_str(),0x0010,0x0020, "LO"); // Patient's ID
file->InsertEntryString(studyUID, 0x0020, 0x000d, "UI");
file->InsertEntryString(serieUID, 0x0020, 0x000e, "UI");
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();
}
-
-