Ejemplo n.º 1
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
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;
}