void MultiFileScanning()
  {
    mitk::DICOMTagPath instanceUID(0x0008, 0x0018);

    scanner->SetInputFiles(ctFiles);
    scanner->AddTagPath(instanceUID);

    scanner->Scan();

    mitk::DICOMDatasetAccessingImageFrameList frames = scanner->GetFrameInfoList();
    CPPUNIT_ASSERT_MESSAGE("Testing DICOMDCMTKTagScanner::GetFrameInfoList()", frames.size() == 4);

    mitk::DICOMDatasetAccess::FindingsListType findings = frames[0]->GetTagValueAsString(instanceUID);
    CPPUNIT_ASSERT_MESSAGE("Testing DICOMDCMTKTagScanner::GetFrameInfoList()", findings.size() == 1);
    CPPUNIT_ASSERT_MESSAGE("Testing validity of instance uid finding of frame 0", findings.front().isValid);
    CPPUNIT_ASSERT_MESSAGE("Testing path of instance uid finding of frame 0", findings.front().path == instanceUID);
    CPPUNIT_ASSERT_MESSAGE("Testing value of instance uid finding of frame 0", findings.front().value == "1.2.276.0.99.1.4.8323329.3795.1303917947.940051");

    findings = frames[1]->GetTagValueAsString(instanceUID);
    CPPUNIT_ASSERT_MESSAGE("Testing DICOMDCMTKTagScanner::GetFrameInfoList()", findings.size() == 1);
    CPPUNIT_ASSERT_MESSAGE("Testing validity of instance uid finding of frame 1", findings.front().isValid);
    CPPUNIT_ASSERT_MESSAGE("Testing path of instance uid finding of frame 1", findings.front().path == instanceUID);
    CPPUNIT_ASSERT_MESSAGE("Testing value of instance uid finding of frame 1", findings.front().value == "1.2.276.0.99.1.4.8323329.3795.1303917947.940052");

    findings = frames[2]->GetTagValueAsString(instanceUID);
    CPPUNIT_ASSERT_MESSAGE("Testing DICOMDCMTKTagScanner::GetFrameInfoList()", findings.size() == 1);
    CPPUNIT_ASSERT_MESSAGE("Testing validity of instance uid finding of frame 2", findings.front().isValid);
    CPPUNIT_ASSERT_MESSAGE("Testing path of instance uid finding of frame 2", findings.front().path == instanceUID);
    CPPUNIT_ASSERT_MESSAGE("Testing value of instance uid finding of frame 2", findings.front().value == "1.2.276.0.99.1.4.8323329.3795.1303917947.940053");

    findings = frames[3]->GetTagValueAsString(instanceUID);
    CPPUNIT_ASSERT_MESSAGE("Testing DICOMDCMTKTagScanner::GetFrameInfoList()", findings.size() == 1);
    CPPUNIT_ASSERT_MESSAGE("Testing validity of instance uid finding of frame 3", findings.front().isValid);
    CPPUNIT_ASSERT_MESSAGE("Testing path of instance uid finding of frame 3", findings.front().path == instanceUID);
    CPPUNIT_ASSERT_MESSAGE("Testing value of instance uid finding of frame 3", findings.front().value == "1.2.276.0.99.1.4.8323329.3795.1303917947.940055");
  }
int ctkDICOMDatabaseTest2( int argc, char * argv [] )
{
  QCoreApplication app(argc, argv);

  if (argc < 2)
    {
    std::cerr << "ctkDICOMDatabaseTest2: missing dicom filePath argument";
    std::cerr << std::endl;
    return EXIT_FAILURE;
    }

  QString dicomFilePath(argv[1]);

  ctkDICOMDatabase database;
  QDir databaseDirectory = QDir::temp();
  databaseDirectory.remove("ctkDICOMDatabase.sql");
  databaseDirectory.remove("ctkDICOMTagCache.sql");

  QFileInfo databaseFile(databaseDirectory, QString("database.test"));
  database.openDatabase(databaseFile.absoluteFilePath());

  if (!database.lastError().isEmpty())
    {
    std::cerr << "ctkDICOMDatabase::openDatabase() failed: "
              << qPrintable(database.lastError()) << std::endl;
    return EXIT_FAILURE;
    }

  if (!database.database().isValid())
    {
    std::cerr << "ctkDICOMDatabase::openDatabase() failed: "
              << "invalid sql database" << std::endl;
    return EXIT_FAILURE;
    }

  if (database.isInMemory())
    {
    std::cerr << "ctkDICOMDatabase::openDatabase() failed: "
              << "database should not be in memory" << std::endl;
    return EXIT_FAILURE;
    }

  bool res = database.initializeDatabase();

  if (!res)
    {
    std::cerr << "ctkDICOMDatabase::initializeDatabase() failed." << std::endl;
    return EXIT_FAILURE;
    }

  //
  // Test that the tag interface works to parse ascii
  //
  QString tag("0008,103e");
  unsigned short group, element;
  if ( !database.tagToGroupElement(tag, group, element) )
    {
    std::cerr << "ctkDICOMDatabase: could not parse tag" << std::endl;
    return EXIT_FAILURE;
    }

  if ( group != 0x8 || element != 0x103e )
    {
    std::cerr << "ctkDICOMDatabase: expected: " << "0008,103e" << std::endl;
    std::cerr << "ctkDICOMDatabase: got: " << group << " " << element << std::endl;
    std::cerr << "ctkDICOMDatabase: parsed tag does not match group/element" << std::endl;
    return EXIT_FAILURE;
    }

  if ( database.groupElementToTag(group, element) != tag )
    {
    std::cerr << "ctkDICOMDatabase: could not convert a uints to tag string" << std::endl;
    return EXIT_FAILURE;
    }


  //
  // Basic test:
  // - insert the file specified on the command line
  // - ask for tag values and compare to known results
  //
  database.insert(dicomFilePath, false, false);
  QString instanceUID("1.2.840.113619.2.135.3596.6358736.4843.1115808177.83");

  QString foundFile = database.fileForInstance(instanceUID);

  if (foundFile != dicomFilePath)
    {
    std::cerr << "ctkDICOMDatabase: didn't get back the original file path" << std::endl;
    return EXIT_FAILURE;
    }

  QString foundInstance = database.instanceForFile(dicomFilePath);

  if (foundInstance != instanceUID)
    {
    std::cerr << "ctkDICOMDatabase: didn't get back the original instance uid" << std::endl;
    return EXIT_FAILURE;
    }


  //
  // Test the tag cache
  //

  if (database.tagCacheExists())
    {
    std::cerr << "ctkDICOMDatabase: tag cache should not exist in fresh database" << std::endl;
    return EXIT_FAILURE;
    }

  if (!database.initializeTagCache())
    {
    std::cerr << "ctkDICOMDatabase: could not initialize tag cache" << std::endl;
    return EXIT_FAILURE;
    }

  if (!database.tagCacheExists())
    {
    std::cerr << "ctkDICOMDatabase: tag cache should exist but is not detected" << std::endl;
    return EXIT_FAILURE;
    }


  if (database.cachedTag(instanceUID, tag) != QString(""))
    {
    std::cerr << "ctkDICOMDatabase: tag cache should return empty string for unknown instance tag" << std::endl;
    return EXIT_FAILURE;
    }

  QString knownSeriesDescription("3D Cor T1 FAST IR-prepped GRE");

  if (!database.cacheTag(instanceUID, tag, knownSeriesDescription))
    {
    std::cerr << "ctkDICOMDatabase: could not insert instance tag" << std::endl;
    return EXIT_FAILURE;
    }

  if (database.cachedTag(instanceUID, tag) != knownSeriesDescription)
    {
    std::cerr << "ctkDICOMDatabase: could not retrieve cached tag" << std::endl;
    return EXIT_FAILURE;
    }


  QString foundSeriesDescription = database.instanceValue(instanceUID, tag);

  if (foundSeriesDescription != knownSeriesDescription)
    {
    std::cerr << "ctkDICOMDatabase: invalid element value returned" << std::endl;
    return EXIT_FAILURE;
    }

  // now update the database
  database.updateSchema();

  // and repeat the above checks
  foundFile = database.fileForInstance(instanceUID);

  if (foundFile != dicomFilePath)
    {
    std::cerr << "ctkDICOMDatabase: didn't get back the original file path" << std::endl;
    return EXIT_FAILURE;
    }

  foundSeriesDescription = database.instanceValue(instanceUID, tag);

  if (foundSeriesDescription != knownSeriesDescription)
    {
    std::cerr << "ctkDICOMDatabase: invalid element value returned" << std::endl;
    return EXIT_FAILURE;
    }

  database.closeDatabase();
  database.initializeDatabase();

  return EXIT_SUCCESS;
}
Example #3
0
int ctkDICOMDatabaseTest6( int argc, char * argv [] )
{
  QCoreApplication app(argc, argv);

  if (argc < 2)
    {
    std::cerr << "ctkDICOMDatabaseTest6: missing dicom filePath argument";
    std::cerr << std::endl;
    return EXIT_FAILURE;
    }

  QString dicomFilePath(argv[1]);

  ctkDICOMDatabase database;
  QDir databaseDirectory = QDir::temp();
  databaseDirectory.remove("ctkDICOMDatabase.sql");
  databaseDirectory.remove("ctkDICOMTagCache.sql");

  QFileInfo databaseFile(databaseDirectory, QString("database.test"));
  database.openDatabase(databaseFile.absoluteFilePath());

  bool res = database.initializeDatabase();

  if (!res)
    {
    std::cerr << "ctkDICOMDatabase::initializeDatabase() failed." << std::endl;
    return EXIT_FAILURE;
    }

  //
  // Basic test:
  // - insert the file specified on the command line
  // - ask for name and descriptions and compare to known results
  //
  QString instanceUID("1.2.840.113619.2.135.3596.6358736.4843.1115808177.83");


  //
  // Test the pre load values feature of the database
  //

  QString preInsertDescription = database.descriptionForSeries(instanceUID);
  if (!preInsertDescription.isEmpty())
    {
      std::cerr
        << "ctkDICOMDatabase: db should return empty string for unknown "
        << " instance series description, instead got: "
        << preInsertDescription.toStdString() << std::endl;
    return EXIT_FAILURE;
    }

  database.insert(dicomFilePath, false, false);

  QString filePath = database.fileForInstance(instanceUID);
  std::cerr << "Instance file " << filePath.toStdString() << std::endl;

  // check for descriptions
  QHash<QString,QString> descriptions (database.descriptionsForFile(filePath));
  std::cout << "\tPatient Name: "
            <<  descriptions["PatientsName"].toStdString()
            << "\n\tStudy Desciption: "
            <<  descriptions["StudyDescription"].toStdString()
            << "\n\tSeries Desciption: "
            <<  descriptions["SeriesDescription"].toStdString()
            << std::endl;

  // check for known series description
  QString knownSeriesDescription("3D Cor T1 FAST IR-prepped GRE");

  QString seriesUID = database.seriesForFile(filePath);
  QString seriesDescription = database.descriptionForSeries(seriesUID);

  if (seriesDescription != knownSeriesDescription)
    {
    std::cerr << "ctkDICOMDatabase: database should return series description of '"
              << knownSeriesDescription.toStdString()
              << "', instead returned '" << seriesDescription.toStdString()
              << "'\n\tinstanceUID = "
              << instanceUID.toStdString()
              << "\n\tseriesUID = "
              << seriesUID.toStdString()
              << std::endl;
    return EXIT_FAILURE;
    }

  // get the study and patient uids
  QString patientUID, studyUID;
  studyUID = database.studyForSeries(seriesUID);
  patientUID = database.patientForStudy(studyUID);

  // check for empty study description
  QString studyDescription = database.descriptionForStudy(studyUID);

  if (!studyDescription.isEmpty())
    {
    std::cerr << "ctkDICOMDatabase: database should return empty study"
              << " description for studyUID of "
              << studyUID.toStdString() << ", instead returned '"
              << studyDescription.toStdString() << "'"
              << std::endl;
    return EXIT_FAILURE;
    }

  // check for known patient name
  QString knownPatientName("Facial Expression");
  QString patientName = database.nameForPatient(patientUID);
  if (patientName != knownPatientName)
    {
    std::cerr << "ctkDICOMDatabase: database should return known patient name '"
              << knownPatientName.toStdString()
              << "' for patient UID of "
              << patientUID.toStdString() << ", instead returned '"
              << patientName.toStdString() << "'"
              << std::endl;
    return EXIT_FAILURE;
    }

  database.closeDatabase();

  std::cerr << "Database is in " << databaseDirectory.path().toStdString() << std::endl;

  return EXIT_SUCCESS;
}
Example #4
0
CONDITION
MLMPPS::handleNSetDataSet(DUL_PRESENTATIONCONTEXT* ctx,
			  MSG_N_SET_REQ** message,
			  MSG_N_SET_RESP* response,
			  DUL_ASSOCIATESERVICEPARAMETERS* params,
			  MString& directoryName)
{
  MLogClient logClient;
  logClient.log(MLogClient::MLOG_VERBOSE,
		params->callingAPTitle,
		"MLMPPS::handleNSetDataSet",
		__LINE__,
		"MPPS N-Set dataset received");

  //::DCM_DumpElements(&(*message)->dataSet, 1);

  MFileOperations f;

  MString instanceUID((*message)->instanceUID);

  MString slash("/");
  MString callingAPTitle(params->callingAPTitle);

  MString newDirectory = mStorageDir + slash + params->callingAPTitle
    + slash + instanceUID;

  f.createDirectory(newDirectory);

  f.createDirectory(newDirectory);
  MString s = f.uniqueFile(newDirectory, "set");
  char* s1 = s.strData();

  ::DCM_WriteFile(&(*message)->dataSet,
		  DCM_ORDERLITTLEENDIAN,
		  s1 );

  logClient.log(MLogClient::MLOG_VERBOSE,
		params->callingAPTitle,
		"MLMPPS::handleNSetDataSet",
		__LINE__,
		"MPPS N-Set data set written to " + s);

  char mppsPath[512];
  newDirectory.safeExport(mppsPath, sizeof(mppsPath));
  strcat (mppsPath, "/mpps.dcm"); 

  MPPSAssistant assistant;

  int rslt;

  rslt = assistant.validateNSetDataSet(mppsPath, s1);
  rslt = assistant.mergeNSetDataSet(mppsPath, s1);

  logClient.log(MLogClient::MLOG_VERBOSE,
		params->callingAPTitle,
		"MLMPPS::handleNSetDataSet",
		__LINE__,
		MString("MPPS status updated ") + mppsPath);

  delete [] s1;

  response->dataSetType = DCM_CMDDATANULL;
  response->conditionalFields = 0;
  ::strcpy(response->classUID, (*message)->classUID);
  ::strcpy(response->instanceUID, (*message)->instanceUID);
  response->status = MSG_K_SUCCESS;
  return SRV_NORMAL;
}
Example #5
0
int ctkDICOMDatabaseTest5( int argc, char * argv [] )
{
  QCoreApplication app(argc, argv);

  if (argc < 2)
    {
    std::cerr << "ctkDICOMDatabaseTest2: missing dicom filePath argument";
    std::cerr << std::endl;
    return EXIT_FAILURE;
    }

  QString dicomFilePath(argv[1]);

  ctkDICOMDatabase database;
  QDir databaseDirectory = QDir::temp();
  databaseDirectory.remove("ctkDICOMDatabase.sql");
  databaseDirectory.remove("ctkDICOMTagCache.sql");

  QFileInfo databaseFile(databaseDirectory, QString("database.test"));
  database.openDatabase(databaseFile.absoluteFilePath());

  bool res = database.initializeDatabase();

  if (!res)
    {
    std::cerr << "ctkDICOMDatabase::initializeDatabase() failed." << std::endl;
    return EXIT_FAILURE;
    }
  std::cerr << "Database is in " << databaseDirectory.path().toStdString() << std::endl;


  //
  // First, copy the passed file to two temp directories
  //
  databaseDirectory.rmdir("firstInsert");
  databaseDirectory.rmdir("secondInsert");
  databaseDirectory.mkdir("firstInsert");
  databaseDirectory.mkdir("secondInsert");
  QString firstDestination = QDir::cleanPath(databaseDirectory.absolutePath() + QDir::separator() + "firstInsert" + QDir::separator() + "file.dcm");
  QString secondDestination = QDir::cleanPath(databaseDirectory.absolutePath() + QDir::separator() + "secondInsert" + QDir::separator() + "file.dcm");
  QFile::copy(dicomFilePath, firstDestination);
  std::cerr << "copied to: " << firstDestination.toStdString() << std::endl;
  QFile::copy(dicomFilePath, secondDestination);
  std::cerr << "copied to: " << secondDestination.toStdString() << std::endl;

  //
  // Insert the first instance
  //
  database.insert(firstDestination, false, false);

  //
  // Now delete the first instance and try inserting the second
  //
  QFile::remove(firstDestination);
  database.insert(secondDestination, false, false);

  //
  // At this point, the file associated with the instance UID should be
  // the secondDestination - it's an error if not.
  //
  QString instanceUID("1.2.840.113619.2.135.3596.6358736.4843.1115808177.83");
  QString filePathInDatabase = database.fileForInstance(instanceUID);

  if (filePathInDatabase != secondDestination)
    {
    std::cerr << "ctkDICOMDatabase thinks instance is in " << filePathInDatabase.toStdString() << std::endl;
    std::cerr << "But we just inserted it from " << secondDestination.toStdString() << std::endl;
    return EXIT_FAILURE;
    }

  //
  // Close and clean up
  //
  database.closeDatabase();


  return EXIT_SUCCESS;
}
Example #6
0
CONDITION
MLMPPS::handleNCreateDataSet(DUL_PRESENTATIONCONTEXT* ctx,
			       MSG_N_CREATE_REQ** message,
			       MSG_N_CREATE_RESP* response,
			       DUL_ASSOCIATESERVICEPARAMETERS* params,
			       MString& directoryName)
{
  MLogClient logClient;
  logClient.log(MLogClient::MLOG_VERBOSE,
		params->callingAPTitle,
		"MLMPPS::handleNCreateDataSetCommand",
		__LINE__,
		"MPPS N-Create dataset received");

  //::DCM_DumpElements(&(*message)->dataSet, 1);

  MFileOperations f;

  MString instanceUID((*message)->instanceUID);
  if (instanceUID == "") {
    logClient.log(MLogClient::MLOG_ERROR,
		params->callingAPTitle,
		"MLMPPS::handleNCreateDataSetCommand",
		__LINE__,
		"Zero-length instance UID received with N-Create message");

  }

  MString slash("/");
  MString callingAPTitle(params->callingAPTitle);

  MString newDirectory = mStorageDir + slash + params->callingAPTitle
    + slash + instanceUID;

  f.createDirectory(newDirectory);
  MString s = f.uniqueFile(newDirectory, "crt");

  char* s1 = s.strData();

  ::DCM_WriteFile(&(*message)->dataSet,
		  DCM_ORDERLITTLEENDIAN,
		  s1 );

  logClient.log(MLogClient::MLOG_CONVERSATION,
		params->callingAPTitle,
		"MLMPPS::handleNCreateDataSetCommand",
		__LINE__,
		"N-Create stored in " + s);

  delete [] s1;

  char mppsPath[512];
  newDirectory.safeExport(mppsPath, sizeof(mppsPath));

  strcat (mppsPath, "/mpps.dcm"); 
   ::DCM_WriteFile(&(*message)->dataSet,
 		  DCM_ORDERLITTLEENDIAN,
 		  mppsPath);

  logClient.log(MLogClient::MLOG_CONVERSATION,
		params->callingAPTitle,
		"MLMPPS::handleNCreateDataSetCommand",
		__LINE__,
		MString("MPPS status stored in ") + mppsPath);

  response->dataSetType = DCM_CMDDATANULL;
  response->conditionalFields = 0;
  response->status = MSG_K_SUCCESS;
  return SRV_NORMAL;
}