diff --git a/libsrc/Helper.cpp b/libsrc/Helper.cpp index f2ee32f2..3f8ff136 100644 --- a/libsrc/Helper.cpp +++ b/libsrc/Helper.cpp @@ -103,9 +103,32 @@ namespace dcmqi { string Helper::floatToStrScientific(float f) { + string formatted_f; + /* + - mantissa sign (1) + - mantissa leading number (1) + - dot (1) + - mantissa after the dot (8) + - E (1) + - exponent sign (1) + - exponent (2 OR 3 (Win)) + */ + + ostringstream sstream; + sstream << setprecision(8) << scientific << f; + formatted_f = sstream.str(); + + // somehow this was resulting in more than 16 characters in local tests and on CI + /* ostringstream sstream; - sstream << scientific << f; - return sstream.str(); + sstream.imbue(std::locale::classic()); + sstream << setprecision(14) << f; + formatted_f = sstream.str(); + cout << "Formatted float: " << formatted_f << endl; + cout << "Size: " << formatted_f.size() << endl; + */ + + return formatted_f; } void Helper::checkValidityOfFirstSrcImage(DcmSegmentation *segdoc) { diff --git a/libsrc/ImageSEGConverter.cpp b/libsrc/ImageSEGConverter.cpp index 1371d708..237ed2e3 100644 --- a/libsrc/ImageSEGConverter.cpp +++ b/libsrc/ImageSEGConverter.cpp @@ -80,15 +80,14 @@ namespace dcmqi { { FGPixelMeasures *pixmsr = new FGPixelMeasures(); - ShortImageType::SpacingType labelSpacing = segmentations[0]->GetSpacing(); + ShortImageType::SpacingType labelSpacing = segmentations[0]->GetSpacing(); ostringstream spacingSStream; - spacingSStream << scientific << labelSpacing[0] << "\\" << labelSpacing[1]; + spacingSStream << Helper::floatToStrScientific(labelSpacing[0]) << "\\" << Helper::floatToStrScientific(labelSpacing[1]); CHECK_COND(pixmsr->setPixelSpacing(spacingSStream.str().c_str())); - spacingSStream.clear(); spacingSStream.str(""); - spacingSStream << scientific << labelSpacing[2]; - CHECK_COND(pixmsr->setSpacingBetweenSlices(spacingSStream.str().c_str())); - CHECK_COND(pixmsr->setSliceThickness(spacingSStream.str().c_str())); + string sliceThicknessStr = Helper::floatToStrScientific(labelSpacing[2]); + CHECK_COND(pixmsr->setSpacingBetweenSlices(sliceThicknessStr.c_str())); + CHECK_COND(pixmsr->setSliceThickness(sliceThicknessStr.c_str())); CHECK_COND(segdoc->addForAllFrames(*pixmsr)); delete pixmsr; } diff --git a/libsrc/ParaMapConverter.cpp b/libsrc/ParaMapConverter.cpp index f1acd235..32b06809 100644 --- a/libsrc/ParaMapConverter.cpp +++ b/libsrc/ParaMapConverter.cpp @@ -4,6 +4,7 @@ #include // DCMQI includes +#include "dcmqi/Helper.h" #include "dcmqi/ParaMapConverter.h" #include "dcmqi/ImageSEGConverter.h" @@ -77,15 +78,14 @@ namespace dcmqi { { FGPixelMeasures *pixmsr = new FGPixelMeasures(); - FloatImageType::SpacingType labelSpacing = parametricMapImage->GetSpacing(); + FloatImageType::SpacingType pmSpacing = parametricMapImage->GetSpacing(); ostringstream spacingSStream; - spacingSStream << scientific << labelSpacing[0] << "\\" << labelSpacing[1]; + spacingSStream << Helper::floatToStrScientific(pmSpacing[0]) << "\\" << Helper::floatToStrScientific(pmSpacing[1]); CHECK_COND(pixmsr->setPixelSpacing(spacingSStream.str().c_str())); - spacingSStream.clear(); spacingSStream.str(""); - spacingSStream << scientific << labelSpacing[2]; - CHECK_COND(pixmsr->setSpacingBetweenSlices(spacingSStream.str().c_str())); - CHECK_COND(pixmsr->setSliceThickness(spacingSStream.str().c_str())); + string sliceThicknessStr = Helper::floatToStrScientific(pmSpacing[2]); + CHECK_COND(pixmsr->setSpacingBetweenSlices(sliceThicknessStr.c_str())); + CHECK_COND(pixmsr->setSliceThickness(sliceThicknessStr.c_str())); CHECK_COND(pMapDoc->addForAllFrames(*pixmsr)); } @@ -252,7 +252,7 @@ namespace dcmqi { slice2derimg = getSliceMapForSegmentation2DerivationImage(dcmDatasets, cast->GetOutput()); cout << "Mapping from the ITK image slices to the DICOM instances in the input list" << endl; for(size_t i=0;igetFrames(); result = OFget >(&frames)->addFrame(&*data.begin(), frameSize, perFrameFGs); - cout << "Frame " << sliceNumber << " added" << endl; + //cout << "Frame " << sliceNumber << " added" << endl; } // remove derivation image FG from the per-frame FGs, only if applicable!