Browse Source

ENH changes to query/retrieve apps to support communication with dcmqrscp

Steve Pieper 14 years ago
parent
commit
15dc4c6995

+ 15 - 0
Applications/ctkDICOMQuery/ctkDICOMQueryMain.cpp

@@ -18,6 +18,21 @@
  
 =========================================================================*/
 
+
+/* Notes:
+ *
+ * This program is a test driver for the DcmScu class and puts the results
+ * in an sqlite database.  This command will query a public dicom server:
+ *
+ * ../CTK-build/bin/ctkDICOMQuery test.db FINDSCU MI2B2 mi2b2.slicer.org 11112
+ *
+ * you can get a similar
+ * functionality with this command line:
+ *
+ * findscu --verbose -aec MI2B2 -P -k "0010,0010=F*" mi2b2.slicer.org 11112 patqry.dcm | grep Patients
+ *
+ */
+
 // Qt includes
 #include <QApplication>
 #include <QTextStream>

+ 7 - 5
Applications/ctkDICOMRetrieve/ctkDICOMRetrieveMain.cpp

@@ -35,7 +35,7 @@
 void print_usage()
 {
   std::cerr << "Usage:\n";
-  std::cerr << "  ctkDICOMRetrieve SeriesUID OutputDirectory callingAETitle callingPort calledAETitle host calledPort\n";
+  std::cerr << "  ctkDICOMRetrieve StudyUID OutputDirectory callingAETitle callingPort calledAETitle host calledPort moveDestinationAETitle\n";
   return;
 }
 
@@ -49,7 +49,7 @@ int main(int argc, char** argv)
   ctkLogger logger ( "org.commontk.dicom.DICOMRetieveApp" );
   logger.setDebug();
 
-  if (argc < 8)
+  if (argc < 9)
   {
     print_usage();
     return EXIT_FAILURE;
@@ -58,7 +58,7 @@ int main(int argc, char** argv)
   QCoreApplication app(argc, argv);
   QTextStream out(stdout);
 
-  QString SeriesUID ( argv[1] );
+  QString StudyUID ( argv[1] );
   QDir OutputDirectory ( argv[2] );
   QString CallingAETitle ( argv[3] ); 
   bool ok;
@@ -79,6 +79,7 @@ int main(int argc, char** argv)
     print_usage();
     return EXIT_FAILURE;
     }
+  QString MoveDestinationAETitle ( argv[8] ); 
 
   ctkDICOMRetrieve retrieve;
   retrieve.setCallingAETitle ( CallingAETitle );
@@ -86,8 +87,9 @@ int main(int argc, char** argv)
   retrieve.setCalledAETitle ( CalledAETitle );
   retrieve.setCalledPort ( CalledPort );
   retrieve.setHost ( Host );
+  retrieve.setMoveDestinationAETitle ( MoveDestinationAETitle );
 
-  logger.info ( "SeriesUID: " + SeriesUID + "\n" 
+  logger.info ( "StudyUID: " + StudyUID + "\n" 
                 + "OutputDirectory: " + OutputDirectory.absolutePath() + "\n"
                 + "CallingAETitle: " + CallingAETitle + "\n"
                 + "CallingPort: " + QString::number ( CallingPort ) + "\n"
@@ -99,7 +101,7 @@ int main(int argc, char** argv)
   logger.info ( "Starting to retrieve" );
   try
     {
-    retrieve.retrieveSeries ( SeriesUID, OutputDirectory );
+    retrieve.retrieveStudy ( StudyUID, OutputDirectory );
     }
   catch (std::exception e)
     {

+ 1 - 0
CMakeLists.txt

@@ -544,6 +544,7 @@ FOREACH(app ${CTK_APPLICATIONS_SUBDIRS})
     ADD_SUBDIRECTORY(Applications/${app})
   ENDIF()
 ENDFOREACH()
+ADD_SUBDIRECTORY(Applications/Testing)
 
 #-----------------------------------------------------------------------------
 # Add general purpose subdirectories

+ 26 - 1
Libs/DICOM/Core/ctkDICOMRetrieve.cpp

@@ -74,6 +74,7 @@ public:
   int CalledPort;
   DcmSCU SCU;
   DcmDataset* parameters;
+  QString MoveDestinationAETitle;
 
   // do the retrieve, handling both series and study retrieves
   enum RetrieveType { RetrieveSeries, RetrieveStudy };
@@ -119,8 +120,9 @@ void ctkDICOMRetrievePrivate::retrieve ( QString UID, QDir directory, RetrieveTy
   scu.setPeerAETitle ( OFString(CalledAETitle.toStdString().c_str()) );
   scu.setPeerHostName ( OFString(Host.toStdString().c_str()) );
   scu.setPeerPort ( CalledPort );
+  scu.setMoveDestinationAETitle ( OFString(MoveDestinationAETitle.toStdString().c_str()) );
 
-  logger.error ( "Setting Transfer Syntaxes" );
+  logger.info ( "Setting Transfer Syntaxes" );
   OFList<OFString> transferSyntaxes;
   transferSyntaxes.push_back ( UID_LittleEndianExplicitTransferSyntax );
   transferSyntaxes.push_back ( UID_BigEndianExplicitTransferSyntax );
@@ -140,6 +142,8 @@ void ctkDICOMRetrievePrivate::retrieve ( QString UID, QDir directory, RetrieveTy
     logger.error ( "Error negotiating association" );
     return;
     }
+
+  logger.debug ( "Setting Parameters" );
   // Clear the query
   unsigned long elements = this->parameters->card();
   // Clean it out
@@ -158,21 +162,29 @@ void ctkDICOMRetrievePrivate::retrieve ( QString UID, QDir directory, RetrieveTy
     this->parameters->putAndInsertString ( DCM_StudyInstanceUID, UID.toStdString().c_str() );  
     }
 
+  logger.debug ( "Sending Move Request" );
   MOVEResponses *responses = new MOVEResponses();
   OFCondition status = scu.sendMOVERequest ( 0, this->parameters, responses );
   if ( status.good() )
     {
     logger.debug ( "Find succeded" );
 
+    logger.debug ( "Making Output Directory" );
     // Try to create the directory
     directory.mkpath ( directory.absolutePath() );
 
+    if ( responses->begin() == responses->end() )
+      {
+      logger.error ( "No responses!" );
+      }
+
     // Write the responses out to disk
     for ( OFListIterator(FINDResponse*) it = responses->begin(); it != responses->end(); it++ )
       {
       DcmDataset *dataset = (*it)->m_dataset;
       if ( dataset != NULL )
         {
+        logger.debug ( "Got a valid dataset" );
         // Save in correct directory
         E_TransferSyntax output_transfersyntax = dataset->getOriginalXfer();
         dataset->chooseRepresentation( output_transfersyntax, NULL );
@@ -297,6 +309,19 @@ int ctkDICOMRetrieve::calledPort()
 }
 
 //------------------------------------------------------------------------------
+void ctkDICOMRetrieve::setMoveDestinationAETitle ( QString moveDestinationAETitle )
+{
+  Q_D(ctkDICOMRetrieve);
+  d->MoveDestinationAETitle = moveDestinationAETitle;
+}
+//------------------------------------------------------------------------------
+const QString& ctkDICOMRetrieve::moveDestinationAETitle()
+{
+  Q_D(ctkDICOMRetrieve);
+  return d->MoveDestinationAETitle;
+}
+
+//------------------------------------------------------------------------------
 void ctkDICOMRetrieve::retrieveSeries ( QString seriesInstanceUID, QDir directory ) {
   Q_D(ctkDICOMRetrieve);
   logger.info ( "Starting retrieveSeries" );

+ 2 - 0
Libs/DICOM/Core/ctkDICOMRetrieve.h

@@ -47,6 +47,8 @@ public:
   int callingPort();
   void setCalledPort ( int port );
   int calledPort();
+  void setMoveDestinationAETitle ( QString moveDestinationAETitle );
+  const QString& moveDestinationAETitle();
 
   // Could be a slot...
   void retrieveSeries ( QString seriesInstanceUID, QDir directory );

+ 14 - 0
Utilities/CMake/FindDCMTK.cmake

@@ -293,10 +293,24 @@ FIND_PROGRAM(DCMTK_DCMDRLE_EXECUTABLE dcmdrle
   NO_DEFAULT_PATH
   )
 
+FIND_PROGRAM(DCMTK_DCMQRSCP_EXECUTABLE dcmqrscp
+  PATHS
+    ${DCMTK_DIR}/bin
+  NO_DEFAULT_PATH
+  )
+
+FIND_PROGRAM(DCMTK_STORESCU_EXECUTABLE storescu
+  PATHS
+    ${DCMTK_DIR}/bin
+  NO_DEFAULT_PATH
+  )
+
 MARK_AS_ADVANCED(
   DCMTK_DCMDUMP_EXECUTABLE
   DCMTK_DCMDJPEG_EXECUTABLE
   DCMTK_DCMDRLE_EXECUTABLE
+  DCMTK_DCMQRSCP_EXECUTABLE
+  DCMTK_STORESCU_EXECUTABLE
   DCMTK_config_INCLUDE_DIR
   DCMTK_dcmdata_INCLUDE_DIR
   DCMTK_dcmdata_LIBRARY