Skip to content

Commit

Permalink
BUG: Fix filtering for query
Browse files Browse the repository at this point in the history
  • Loading branch information
Punzo committed Apr 16, 2024
1 parent 1951313 commit 04491eb
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 22 deletions.
36 changes: 15 additions & 21 deletions Libs/DICOM/Core/ctkDICOMQuery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,6 @@ bool ctkDICOMQuery::query(ctkDICOMDatabase& database)

// Make clear we define our search values in ISO Latin 1 (default would be ASCII)
d->QueryDcmDataset->putAndInsertOFStringArray(DCM_SpecificCharacterSet, "ISO_IR 100");

d->QueryDcmDataset->putAndInsertString (DCM_QueryRetrieveLevel, "STUDY");

QString seriesDescription = this->applyFilters();
Expand Down Expand Up @@ -523,10 +522,9 @@ bool ctkDICOMQuery::queryPatients()

// Make clear we define our search values in ISO Latin 1 (default would be ASCII)
d->QueryDcmDataset->putAndInsertOFStringArray(DCM_SpecificCharacterSet, "ISO_IR 100");
d->QueryDcmDataset->putAndInsertString(DCM_QueryRetrieveLevel, "STUDY");

d->QueryDcmDataset->putAndInsertString(DCM_QueryRetrieveLevel, "PATIENT");

QString seriesDescription = this->applyFilters();
this->applyFilters();
if (d->Canceled)
{
return false;
Expand Down Expand Up @@ -654,7 +652,7 @@ bool ctkDICOMQuery::queryStudies(const QString& patientID)

d->QueryDcmDataset->putAndInsertString(DCM_QueryRetrieveLevel, "STUDY");

QString seriesDescription = this->applyFilters();
this->applyFilters();
if (d->Canceled)
{
return false;
Expand Down Expand Up @@ -768,16 +766,14 @@ bool ctkDICOMQuery::querySeries(const QString& patientID,
d->QueryDcmDataset->insertEmptyElement(DCM_Modality);
d->QueryDcmDataset->insertEmptyElement(DCM_NumberOfSeriesRelatedInstances); // Number of images in the series

QString seriesDescription = this->applyFilters();
QString seriesDescription = this->applyFilters(false);
if (d->Canceled)
{
return false;
}

/* Add user-defined filters */
d->QueryDcmDataset->putAndInsertOFStringArray(DCM_SeriesDescription, seriesDescription.toLatin1().data());

// Now search each within each Study that was identified
d->QueryDcmDataset->putAndInsertString(DCM_QueryRetrieveLevel, "SERIES");

Uint16 presentationContext = 0;
Expand Down Expand Up @@ -888,16 +884,14 @@ bool ctkDICOMQuery::queryInstances(const QString& patientID,
d->QueryDcmDataset->insertEmptyElement(DCM_Rows);
d->QueryDcmDataset->insertEmptyElement(DCM_Columns);

QString seriesDescription = this->applyFilters();
QString seriesDescription = this->applyFilters(false);
if (d->Canceled)
{
return false;
}

/* Add user-defined filters */
d->QueryDcmDataset->putAndInsertOFStringArray(DCM_SeriesDescription, seriesDescription.toLatin1().data());

// Now search each within each Study that was identified
d->QueryDcmDataset->putAndInsertString(DCM_QueryRetrieveLevel, "IMAGE");

// Check for any accepted presentation context for FIND in study root (don't care about transfer syntax)
Expand Down Expand Up @@ -1049,7 +1043,7 @@ bool ctkDICOMQuery::initializeSCU()
}

//----------------------------------------------------------------------------
QString ctkDICOMQuery::applyFilters()
QString ctkDICOMQuery::applyFilters(bool filterModalitiesInStudy)
{
Q_D(ctkDICOMQuery);

Expand All @@ -1060,22 +1054,22 @@ QString ctkDICOMQuery::applyFilters()
QString seriesDescription;
foreach(QString key, d->Filters.keys())
{
if ( key == QString("Name") && !d->Filters[key].toString().isEmpty())
if (key == QString("Name") && !d->Filters[key].toString().isEmpty())
{
// make the filter a wildcard in dicom style
d->QueryDcmDataset->putAndInsertString( DCM_PatientName,
d->QueryDcmDataset->putAndInsertString(DCM_PatientName,
(QString("*") + d->Filters[key].toString() + QString("*")).toLatin1().data());
}
else if ( key == QString("Study") && !d->Filters[key].toString().isEmpty())
else if (key == QString("Study") && !d->Filters[key].toString().isEmpty())
{
// make the filter a wildcard in dicom style
d->QueryDcmDataset->putAndInsertString( DCM_StudyDescription,
d->QueryDcmDataset->putAndInsertString(DCM_StudyDescription,
(QString("*") + d->Filters[key].toString() + QString("*")).toLatin1().data());
}
else if ( key == QString("ID") && !d->Filters[key].toString().isEmpty())
else if (key == QString("ID") && !d->Filters[key].toString().isEmpty())
{
// make the filter a wildcard in dicom style
d->QueryDcmDataset->putAndInsertString( DCM_PatientID,
d->QueryDcmDataset->putAndInsertString(DCM_PatientID,
(QString("*") + d->Filters[key].toString() + QString("*")).toLatin1().data());
}
else if (key == QString("AccessionNumber") && !d->Filters[key].toString().isEmpty())
Expand All @@ -1084,7 +1078,7 @@ QString ctkDICOMQuery::applyFilters()
d->QueryDcmDataset->putAndInsertString(DCM_AccessionNumber,
(QString("*") + d->Filters[key].toString() + QString("*")).toLatin1().data());
}
else if ( key == QString("Modalities") && !d->Filters[key].toString().isEmpty())
else if (filterModalitiesInStudy && key == QString("Modalities") && d->Filters[key].toStringList().count() != 0)
{
// make the filter be an "OR" of modalities using backslash (dicom-style)
QString modalitySearch("");
Expand All @@ -1094,10 +1088,10 @@ QString ctkDICOMQuery::applyFilters()
}
modalitySearch.chop(1); // remove final backslash
logger.debug("modalityInStudySearch " + modalitySearch);
d->QueryDcmDataset->putAndInsertString( DCM_ModalitiesInStudy, modalitySearch.toLatin1().data() );
d->QueryDcmDataset->putAndInsertString(DCM_ModalitiesInStudy, modalitySearch.toLatin1().data());
}
// Remember Series Description for later series query if we go through the keys now
else if ( key == QString("Series") && !d->Filters[key].toString().isEmpty())
else if (key == QString("Series") && !d->Filters[key].toString().isEmpty())
{
// make the filter a wildcard in dicom style
seriesDescription = "*" + d->Filters[key].toString() + "*";
Expand Down
2 changes: 1 addition & 1 deletion Libs/DICOM/Core/ctkDICOMQuery.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public Q_SLOTS:
Q_INVOKABLE void releaseAssociation();

protected:
QString applyFilters();
QString applyFilters(bool filterModalitiesInStudy = true);
bool initializeSCU();

QScopedPointer<ctkDICOMQueryPrivate> d_ptr;
Expand Down

0 comments on commit 04491eb

Please sign in to comment.