瀏覽代碼

Fix for missing studies after query

Issue was that series level query results did not contain
the study level parameters (patient name and id) that
are needed for inserting into the database.

Now we keep track of the study level dataset so we can
add the data back into the series level result.
Steve Pieper 13 年之前
父節點
當前提交
e6e3570c25
共有 1 個文件被更改,包括 21 次插入4 次删除
  1. 21 4
      Libs/DICOM/Core/ctkDICOMQuery.cpp

+ 21 - 4
Libs/DICOM/Core/ctkDICOMQuery.cpp

@@ -87,7 +87,7 @@ public:
   ~ctkDICOMQueryPrivate();
   ~ctkDICOMQueryPrivate();
 
 
   /// Add a StudyInstanceUID to be queried
   /// Add a StudyInstanceUID to be queried
-  void addStudyInstanceUID(const QString& StudyInstanceUID );
+  void addStudyInstanceUIDAndDataset(const QString& StudyInstanceUID, DcmDataset* dataset );
 
 
   QString                 CallingAETitle;
   QString                 CallingAETitle;
   QString                 CalledAETitle;
   QString                 CalledAETitle;
@@ -97,6 +97,7 @@ public:
   ctkDICOMQuerySCUPrivate SCU;
   ctkDICOMQuerySCUPrivate SCU;
   DcmDataset*             Query;
   DcmDataset*             Query;
   QStringList             StudyInstanceUIDList;
   QStringList             StudyInstanceUIDList;
+  QList<DcmDataset*>       StudyDatasetList;
 };
 };
 
 
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
@@ -116,9 +117,10 @@ ctkDICOMQueryPrivate::~ctkDICOMQueryPrivate()
 }
 }
 
 
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
-void ctkDICOMQueryPrivate::addStudyInstanceUID( const QString& s )
+void ctkDICOMQueryPrivate::addStudyInstanceUIDAndDataset( const QString& s, DcmDataset* dataset )
 {
 {
   this->StudyInstanceUIDList.append ( s );
   this->StudyInstanceUIDList.append ( s );
+  this->StudyDatasetList.append ( dataset );
 }
 }
 
 
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
@@ -219,6 +221,10 @@ QStringList ctkDICOMQuery::studyInstanceUIDQueried()const
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
 bool ctkDICOMQuery::query(ctkDICOMDatabase& database )
 bool ctkDICOMQuery::query(ctkDICOMDatabase& database )
 {
 {
+  //// turn on logging if needed for debug:
+  //dcmtk::log4cplus::Logger log = dcmtk::log4cplus::Logger::getRoot();
+  //log.setLogLevel(OFLogger::DEBUG_LOG_LEVEL);
+
   // ctkDICOMDatabase::setDatabase ( database );
   // ctkDICOMDatabase::setDatabase ( database );
   Q_D(ctkDICOMQuery);
   Q_D(ctkDICOMQuery);
   // In the following, we emit progress(int) after progress(QString), this
   // In the following, we emit progress(int) after progress(QString), this
@@ -392,7 +398,7 @@ bool ctkDICOMQuery::query(ctkDICOMDatabase& database )
       database.insert ( dataset, false /* do not store to disk*/, false /* no thumbnail*/);
       database.insert ( dataset, false /* do not store to disk*/, false /* no thumbnail*/);
       OFString StudyInstanceUID;
       OFString StudyInstanceUID;
       dataset->findAndGetOFString ( DCM_StudyInstanceUID, StudyInstanceUID );
       dataset->findAndGetOFString ( DCM_StudyInstanceUID, StudyInstanceUID );
-      d->addStudyInstanceUID ( StudyInstanceUID.c_str() );
+      d->addStudyInstanceUIDAndDataset ( StudyInstanceUID.c_str(), dataset );
       }
       }
     }
     }
 
 
@@ -412,9 +418,16 @@ bool ctkDICOMQuery::query(ctkDICOMDatabase& database )
   // Now search each within each Study that was identified
   // Now search each within each Study that was identified
   d->Query->putAndInsertString ( DCM_QueryRetrieveLevel, "SERIES" );
   d->Query->putAndInsertString ( DCM_QueryRetrieveLevel, "SERIES" );
   float progressRatio = 25. / d->StudyInstanceUIDList.count();
   float progressRatio = 25. / d->StudyInstanceUIDList.count();
-  int i = 0;
+  int i = 0; 
+
+  QListIterator<DcmDataset*> datasetIterator(d->StudyDatasetList);
   foreach ( QString StudyInstanceUID, d->StudyInstanceUIDList )
   foreach ( QString StudyInstanceUID, d->StudyInstanceUIDList )
     {
     {
+    DcmDataset *studyDataset = datasetIterator.next();
+    DcmElement *patientName, *patientID;
+    studyDataset->findAndGetElement(DCM_PatientName, patientName);
+    studyDataset->findAndGetElement(DCM_PatientID, patientID);
+
     logger.debug ( "Starting Series C-FIND for Study: " + StudyInstanceUID );
     logger.debug ( "Starting Series C-FIND for Study: " + StudyInstanceUID );
     emit progress(QString("Starting Series C-FIND for Study: ") + StudyInstanceUID);
     emit progress(QString("Starting Series C-FIND for Study: ") + StudyInstanceUID);
     emit progress(50 + (progressRatio * i++));
     emit progress(50 + (progressRatio * i++));
@@ -429,6 +442,10 @@ bool ctkDICOMQuery::query(ctkDICOMDatabase& database )
         DcmDataset *dataset = (*it)->m_dataset;
         DcmDataset *dataset = (*it)->m_dataset;
         if ( dataset != NULL )
         if ( dataset != NULL )
           {
           {
+          // add the patient elements not provided for the series level query
+          dataset->insert( patientName, true );
+          dataset->insert( patientID, true );
+          // insert series dataset 
           database.insert ( dataset, false /* do not store */, false /* no thumbnail */ );
           database.insert ( dataset, false /* do not store */, false /* no thumbnail */ );
           }
           }
         }
         }