Skip to content

Commit

Permalink
ENH: add an option to pass DICOM directory to the PM converter
Browse files Browse the repository at this point in the history
see QIICR#186

deficiencies described in QIICR#182 apply
  • Loading branch information
fedorov committed Feb 1, 2017
1 parent d02c98f commit 38f83cf
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 17 deletions.
4 changes: 2 additions & 2 deletions apps/paramaps/Testing/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ dcmqi_add_test(
COMMAND $<TARGET_FILE:${MODULE_NAME}>
--inputMetadata ${CMAKE_SOURCE_DIR}/doc/examples/pm-example.json
--inputImage ${BASELINE}/pm-example.nrrd
--inputDICOM ${BASELINE}/pm-example-slice.dcm
--inputDICOMList ${BASELINE}/pm-example-slice.dcm
--outputDICOM ${TEMP_DIR}/paramap.dcm
)

Expand All @@ -36,7 +36,7 @@ dcmqi_add_test(
COMMAND $<TARGET_FILE:${MODULE_NAME}>
--inputMetadata ${CMAKE_SOURCE_DIR}/doc/examples/pm-example-float.json
--inputImage ${BASELINE}/pm-example-float.nrrd
--inputDICOM ${BASELINE}/pm-example-slice.dcm
--inputDICOMList ${BASELINE}/pm-example-slice.dcm
--outputDICOM ${TEMP_DIR}/paramap-float.dcm
)

Expand Down
38 changes: 32 additions & 6 deletions apps/paramaps/itkimage2paramap.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@
#undef HAVE_SSTREAM // Avoid redefinition warning
#include "dcmqi/ParaMapConverter.h"

#ifdef _WIN32
#include "dirent_win.h"
#else
#include <dirent.h>
#endif


int main(int argc, char *argv[])
{
PARSE_ARGS;
Expand All @@ -19,18 +26,37 @@ int main(int argc, char *argv[])
reader->Update();
ImageType::Pointer parametricMapImage = reader->GetOutput();

DcmDataset* dcmDataset = NULL;
if (!dicomImageFileName.empty()) {
DcmFileFormat *sliceFF = new DcmFileFormat();
CHECK_COND(sliceFF->loadFile(dicomImageFileName.c_str()));
dcmDataset = sliceFF->getDataset();
vector<DcmDataset*> dcmDatasets;

DcmFileFormat* sliceFF = new DcmFileFormat();
for(size_t dcmFileNumber=0; dcmFileNumber<dicomImageFileList.size(); dcmFileNumber++){
if(sliceFF->loadFile(dicomImageFileList[dcmFileNumber].c_str()).good()){
dcmDatasets.push_back(sliceFF->getAndRemoveDataset());
}
}

// solution from
// http://stackoverflow.com/questions/612097/how-can-i-get-the-list-of-files-in-a-directory-using-c-or-c
if(dicomDirectory.size()){
DIR *dir;
struct dirent *ent;
if ((dir = opendir (dicomDirectory.c_str())) != NULL) {
while ((ent = readdir (dir)) != NULL) {
if(sliceFF->loadFile((dicomDirectory+"/"+ent->d_name).c_str()).good()){
dcmDatasets.push_back(sliceFF->getAndRemoveDataset());
}
}
closedir (dir);
} else {
cerr << "Cannot open input DICOM directory!" << endl;
}
}

ifstream metainfoStream(metaDataFileName.c_str(), ios_base::binary);
std::string metadata( (std::istreambuf_iterator<char>(metainfoStream) ),
(std::istreambuf_iterator<char>()));

DcmDataset* result = dcmqi::ParaMapConverter::itkimage2paramap(parametricMapImage, dcmDataset, metadata);
DcmDataset* result = dcmqi::ParaMapConverter::itkimage2paramap(parametricMapImage, dcmDatasets, metadata);

if (result == NULL) {
return EXIT_FAILURE;
Expand Down
15 changes: 12 additions & 3 deletions apps/paramaps/itkimage2paramap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,22 @@
<description>File name of the DICOM Parametric map object with the result of the conversion.</description>
</file>

<file>
<name>dicomImageFileName</name>
<string-vector>
<name>dicomImageFileList</name>
<label>DICOM images file name</label>
<channel>input</channel>
<longflag>inputDICOM</longflag>
<longflag>inputDICOMList</longflag>
<default></default>
<description>File name of the DICOM image file that should be used to populate the composite context (attributes related to the patient and imaging study).</description>
</string-vector>

<file>
<name>dicomDirectory</name>
<label>Source DICOM directory</label>
<channel>input</channel>
<longflag>inputDICOMDirectory</longflag>
<default></default>
<description>Directory with the source DICOM images that were used to generate the parametric map.</description>
</file>

</parameters>
Expand Down
2 changes: 1 addition & 1 deletion include/dcmqi/ParaMapConverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ namespace dcmqi {
class ParaMapConverter : public ConverterBase {

public:
static DcmDataset* itkimage2paramap(const ImageType::Pointer &parametricMapImage, DcmDataset* dcmDataset,
static DcmDataset* itkimage2paramap(const ImageType::Pointer &parametricMapImage, vector<DcmDataset*> dcmDatasets,
const string &metaData);

static pair <ImageType::Pointer, string> paramap2itkimage(DcmDataset *pmapDataset);
Expand Down
14 changes: 9 additions & 5 deletions libsrc/ParaMapConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ using namespace std;

namespace dcmqi {

DcmDataset* ParaMapConverter::itkimage2paramap(const ImageType::Pointer &parametricMapImage, DcmDataset* dcmDataset,
DcmDataset* ParaMapConverter::itkimage2paramap(const ImageType::Pointer &parametricMapImage, vector<DcmDataset*> dcmDatasets,
const string &metaData) {

MinMaxCalculatorType::Pointer calculator = MinMaxCalculatorType::New();
Expand Down Expand Up @@ -50,8 +50,12 @@ namespace dcmqi {

DPMParametricMapIOD* pMapDoc = OFget<DPMParametricMapIOD>(&obj);

if (dcmDataset != NULL)
CHECK_COND(pMapDoc->import(*dcmDataset, OFTrue, OFTrue, OFFalse, OFTrue));
DcmDataset* srcDataset = NULL;
if(dcmDatasets.size()){
srcDataset = dcmDatasets[0];
}
if (srcDataset)
CHECK_COND(pMapDoc->import(*srcDataset, OFTrue, OFTrue, OFFalse, OFTrue));

/* Initialize dimension module */
char dimUID[128];
Expand Down Expand Up @@ -232,9 +236,9 @@ namespace dcmqi {

{
string bodyPartAssigned = metaInfo.getBodyPartExamined();
if(dcmDataset != NULL && bodyPartAssigned.empty()) {
if(srcDataset != NULL && bodyPartAssigned.empty()) {
OFString bodyPartStr;
if(dcmDataset->findAndGetOFString(DCM_BodyPartExamined, bodyPartStr).good()) {
if(srcDataset->findAndGetOFString(DCM_BodyPartExamined, bodyPartStr).good()) {
if (!bodyPartStr.empty())
bodyPartAssigned = bodyPartStr.c_str();
}
Expand Down

0 comments on commit 38f83cf

Please sign in to comment.