X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2Fsrc1%2Fbruker2dicom.cxx;h=a381993f822a9f4da8199105c03a77c690edcce6;hb=8793028706f4b66bc966466c5d0009038109a4d3;hp=3dc9cbefc91a74057c9a43ab26cbfcc460749ecc;hpb=e290be9f28dc24bfb58f239c098b67c2a76cfbd9;p=creaBruker.git diff --git a/lib/src1/bruker2dicom.cxx b/lib/src1/bruker2dicom.cxx index 3dc9cbe..a381993 100644 --- a/lib/src1/bruker2dicom.cxx +++ b/lib/src1/bruker2dicom.cxx @@ -116,6 +116,7 @@ bool Bruker2Dicom::Execute() strStudyUID = GDCM_NAME_SPACE::Util::CreateUniqueUID(); serieNumber = 0; + instanceNumber = 0; // ----------------------------------------------------- // Iterate to ALL the objets(files/directories) found in the input directory // (this is level ZERO) @@ -159,7 +160,7 @@ bool Bruker2Dicom::Execute() cleanString(acqp_method); BrukerFieldData b_list_size = br_acqp.GetFieldData("ACQ_O1_list_size"); - b_list_size.PrintSelf(); //JP + //b_list_size.PrintSelf(); //JP nbSlices = b_list_size.GetIntValue()[0]; @@ -180,8 +181,14 @@ bool Bruker2Dicom::Execute() if (verbose) printf ("outputDirName [%s]\n", outputDirName); - - DealWithNiveau1(*it, outputDirName); + try { + DealWithNiveau1(*it, outputDirName); + } + catch (BrukerHopelessException &e) + { + std::cout << "And Exception was thrown in DealWithNiveau1 (" << e.what() << ") " << std::endl; + continue; + } } } // end of : for (GDCM_NAME_SPACE::DirListType::iterator it } @@ -267,8 +274,10 @@ void Bruker2Dicom::DealWithNiveau1(std::string level1Directory, std::string curr canOpen = br_method.LoadFile(strMethod); if (!canOpen) { - std::cout << "Hopeless! neither 'method' nor 'imnd' found" << std::endl; - throw ( BrukerHopelessException ("Hopeless! neither 'method' nor 'imnd' found ")); + std::cout << "Hopeless! neither 'method' nor 'imnd' found in [" + << level1Directory << "]; we skip it!" << std::endl; + continue; + //throw ( BrukerHopelessException ("Hopeless! neither 'method' nor 'imnd' found ")); //exit(0); /// \TODO throw an exception ! } } @@ -287,7 +296,14 @@ void Bruker2Dicom::DealWithNiveau1(std::string level1Directory, std::string curr ##$PVM_SPackArrNSlices=( 2 ) 7 1 */ - DealWithNiveau2(*it,outputDirName ); + try { + DealWithNiveau2(*it,outputDirName ); + } + catch (BrukerHopelessException &e) + { + std::cout << "And Exception was thrown in DealWithNiveau2 (" << e.what() << ") " << std::endl; + continue; + } } } } @@ -378,8 +394,22 @@ void Bruker2Dicom::DealWithNiveau2(std::string level2Directory, std::string curr GDCM_NAME_SPACE::GDCM_FILESEPARATOR, GDCM_NAME_SPACE::Util::GetName(*it).c_str(), str_isa_func_name.c_str()); - } - DealWithNiveau3(*it, outputDirName); + } + try { + DealWithNiveau3(*it, outputDirName); + } + catch (BrukerHopelessException &e) + { + std::cout << "And Exception was thrown in DealWithNiveau3 (" << e.what() << "); " + << " We skip [" << level2Directory << "]" << std::endl; + continue; + } + catch (BrukerInitException &e) + { + std::cout << "And Init Exception was thrown in DealWithNiveau3 (" << e.what() << "); " + << " We skip [" << level2Directory << "]" << std::endl; + continue; + } } } } @@ -485,7 +515,7 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr if (!canOpen) { std::cout << "Hopeless! FillMap failed on [" << str_reco << "]" << std::endl; - throw ( BrukerHopelessException ("Hopeless!FillMap failed on 'reco'")); + throw ( BrukerHopelessException ("Hopeless! FillMap failed on 'reco'")); //exit(0); /// \TODO throw an exception ! } //std::cout << "------------------------------------------------------------------------------------------------" << std::cout; @@ -584,8 +614,11 @@ void Bruker2Dicom::DealWithNiveau3(std::string level3Directory, std::string curr } catch (BrukerInitException& e) { - std::cout << "Exception " << e.what() << std::endl; - return; + if (verbose) + std::cout << "an Init Exception was thrown in CreateImageSet ( ); " << e.what() + << "catched in DealWithNiveau3" << std::endl; + //return; + throw (e); } serieNumber++; @@ -827,7 +860,7 @@ void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX // 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 *code[] ={ "ADC", "adc", "TTP", "ttp", "PEAK", "peak", "" }; // add more carto file name identifiers if necessary; end with "" int icode; GDCM_NAME_SPACE::DirListType::iterator it; char file_name_ident[500]; @@ -848,7 +881,7 @@ void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX while (code[icode][0] != 0) { - sprintf(file_name_ident, "2dseq_%s",code[icode]); // e.g "2dseq_ADC" + sprintf(file_name_ident, "2dseq.%s",code[icode]); // e.g "2dseq_ADC" std::string::size_type loc = (*it).rfind(file_name_ident); if ( loc != std::string::npos ) @@ -859,7 +892,7 @@ void Bruker2Dicom::dealWithCarto(GDCM_NAME_SPACE::DirListType &fileNames, int NX fp = fopen ( (*it).c_str(), "rb"); if (!fp){ std::cout << "Cannot open [" << *it << "] for reading" << std::endl; - + throw ( BrukerHopelessException ("Level 1 Unable to open 'carto' file ")); } fread(buffer_carto, NX*NY*sizeof(double), nbSlices, fp); @@ -969,8 +1002,8 @@ bool Bruker2Dicom::CreateDirectory(std::string OutputDirName) { if (verbose) std::cout << "KO : not a dir : [" << OutputDirName << "] (creation failure ?)" << std::endl; - return 0; - /// \todo : THROW AN EXCEPTION + //return 0; + throw ( BrukerHopelessException ("Level 1 output directory creation failure ")); } else { @@ -1061,7 +1094,8 @@ void Bruker2Dicom::getImhDataType(BrukerFieldData &bDPT, std::string &mhdDataPix else { int brukerDataPixelType = bDPT.GetIntValue()[0]; - std::cout << "DATTYPE " << brukerDataPixelType << std::endl; + if (verbose) + std::cout << "DATTYPE " << brukerDataPixelType << std::endl; //std::string brukerDataPixelType = br_d3proc.GetFieldData("DATTYPE").GetStringValue()[0]; // Cross your fingers !!! @@ -1091,11 +1125,12 @@ std::vector Bruker2Dicom::CreateImageSet ( ) br_acqp.SetLoopStructure(); std::vector tempVect = br_acqp.GetLoopStructure() ; std::map map = br_acqp.GetBrukerHeaderMap(); + bool result = br_acqp.ObjectVaryingProperties.init(map,tempVect); if (result == false) { - throw ( BrukerInitException ("Bruker2Dicom::CreateImageSet failure ") ); + throw ( BrukerInitException ("ObjectVaryingProperties.init() failure in Bruker2Dicom::CreateImageSet()") ); } br_acqp.SetImageLoopStructure(); @@ -1126,7 +1161,7 @@ std::vector Bruker2Dicom::CreateImageSet ( ) imageOrientation = imageSet[i].getRotationMatrixRPS2XYZ(); std::cout << "\t Orientation " ; for(int i1=0; i1<3;i1++)for(int i2=0; i2<3;i2++) - std::cout << imageOrientation[i1][i2] << " "; + std::cout << imageOrientation[i1][i2] << " ";CreateImageSet //std::cout << "\t Abs Time " << imageSet[i].getAbsoluteTimePosition(); std::cout << "\t Relat Time " << imageSet[i].getRelativeTimePosition(); @@ -1206,14 +1241,27 @@ void Bruker2Dicom::MakeDicomImage(unsigned char *tabPixels, // 0018 0050 DS 1 Slice Thickness str.str(""); str << sliceDistance; - file->InsertEntryString(str.str(),0x0018,0x0050, "DS"); - + file->InsertEntryString(str.str(),0x0018,0x0050, "DS"); + +// 0020 0011 IS 1 Series Number + str.str(""); + str << serieNumber; + file->InsertEntryString(str.str(),0x0020,0x0011, "IS"); + +// 0020|0013 [IS] [Instance Number] + instanceNumber++; + 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("1.2.840.10008.5.1.4.1.1.4" , 0x0002, 0x0002, "UI"); // [Media Storage SOP Class UID] file->InsertEntryString("1.2.840.10008.5.1.4.1.1.4" , 0x0008, 0x0016, "UI"); // [SOP Class UID] @@ -1229,10 +1277,10 @@ void Bruker2Dicom::MakeDicomImage(unsigned char *tabPixels, /// \TODO split into 2 strings! file->InsertEntryString(strStudyTimeDate.substr(10,11).c_str(),0x0008,0x0020, "DA"); - file->InsertEntryString(strStudyTimeDate.substr(1,8).c_str(),0x0008,0x0030, "TM"); + file->InsertEntryString(strStudyTimeDate.substr(1,8).c_str(), 0x0008,0x0030, "TM"); - file->InsertEntryString(studyDescr,0x0008,0x1030, "LO"); // Study Description - file->InsertEntryString(serieDescr,0x0008,0x103e, "LO"); // Series Description + file->InsertEntryString(studyDescr, 0x0008,0x1030, "LO"); // Study Description + file->InsertEntryString(serieDescr, 0x0008,0x103e, "LO"); // Series Description //0008|0060 [CS] [Modality] file->InsertEntryString("MR",0x0008,0x0060, "CS"); @@ -1299,10 +1347,13 @@ std::cout << "charImageOrientation " << fileH->SetImageData((uint8_t *)tabPixels, X*Y*nbFrames*pixelSize); fileH->SetWriteModeToRaw(); fileH->SetWriteTypeToDcmExplVR(); - if( !fileH->Write(dcmImageName)) + if( !fileH->Write(dcmImageName)) { std::cout << "Failed for [" << dcmImageName << "]\n" - << " File is unwrittable" << std::endl; - + << " File is unwrittable" << std::endl; + file->Delete(); + fileH->Delete(); + throw ( BrukerHopelessException ("Level 1 Unable to write Dicom file ")); + } if (verbose) file->Print();