Kaynağa Gözat

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 14 yıl önce
ebeveyn
işleme
e6e3570c25
1 değiştirilmiş dosya ile 21 ekleme ve 4 silme
  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 */ );
           }
           }
         }
         }