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; }
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; }
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; }
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; }
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; }