DcmDirectoryRecord* DicomdirLoader::find_study(const std::string &studyinstanceuid, class DcmDicomDir &dir) { DcmDirectoryRecord *patRec; DcmDirectoryRecord *studyRec; OFCondition ret; DcmDirectoryRecord &root = dir.getRootRecord(); for ( patRec = root.nextSub(NULL); patRec != NULL; patRec = root.nextSub(patRec) ) { if ( patRec->getRecordType() == ERT_Patient ) { for ( studyRec = patRec->nextSub(NULL); studyRec; studyRec = patRec->nextSub(studyRec) ) { if ( studyRec->getRecordType()==ERT_Study ) { OFString uid; if ( studyRec->findAndGetOFString(DCM_StudyInstanceUID, uid)==EC_Normal ) { if ( studyinstanceuid == uid.c_str() ) return studyRec; } } } } } return NULL; }
static void open_dicomdir_series_result(const Glib::ustring &dicomdir, DcmDirectoryRecord *patRec, DcmDirectoryRecord *studyRec, const sigc::slot< void, const Glib::RefPtr< ImagePool::Series >& >& resultslot) { DcmDirectoryRecord *seriesRec; DcmDirectoryRecord *sopRec; assert(studyRec->getRecordType()==ERT_Study); seriesRec = studyRec->nextSub(NULL); while ( seriesRec ) { DcmDataset series; DcmElement *el; if ( seriesRec->findAndCopyElement(DCM_SpecificCharacterSet, el) == ECC_Normal ) series.insert(el); if ( seriesRec->findAndCopyElement(DCM_SeriesDescription, el) == ECC_Normal ) series.insert(el); if ( seriesRec->findAndCopyElement(DCM_SeriesInstanceUID, el) == ECC_Normal ) series.insert(el); if ( seriesRec->findAndCopyElement(DCM_Modality, el) == ECC_Normal ) series.insert(el); if ( seriesRec->findAndCopyElement(DCM_SeriesDate, el) == ECC_Normal ) series.insert(el); if ( seriesRec->findAndCopyElement(DCM_SeriesTime, el) == ECC_Normal ) series.insert(el); if ( studyRec->findAndCopyElement(DCM_StudyDescription, el) == ECC_Normal ) series.insert(el); if ( studyRec->findAndCopyElement(DCM_StationName, el) == ECC_Normal ) series.insert(el); // Count Related SOP Instances int nSop=0; sopRec = seriesRec->nextSub(NULL); while (sopRec) { nSop++; sopRec = seriesRec->nextSub(sopRec); } series.putAndInsertUint16(DCM_NumberOfSeriesRelatedInstances, nSop); resultslot(create_query_series(&series)); seriesRec = studyRec->nextSub(seriesRec); } }
void open_dicomdir_series(const std::string& studyinstanceuid, const Glib::ustring& dicomdir, const sigc::slot< void, const Glib::RefPtr< ImagePool::Series >& >& resultslot) { DcmDicomDir dir(dicomdir.c_str()); DcmDirectoryRecord *patRec; DcmDirectoryRecord *studyRec; DcmDirectoryRecord *seriesRec; OFCondition ret; if ( dir.error() != ECC_Normal ) { std::cout << "DICOMDIR Error: " << ret.text() << std::endl; return; } DcmDirectoryRecord &root = dir.getRootRecord(); for ( patRec = root.nextSub(NULL); patRec!=NULL; patRec = root.nextSub(patRec) ) { switch ( patRec->getRecordType() ) { case ERT_Patient: for ( studyRec=patRec->nextSub(NULL); studyRec; studyRec = patRec->nextSub(studyRec) ) { if ( studyRec->getRecordType()==ERT_Study ) { OFString uid; if ( studyRec->findAndGetOFString(DCM_StudyInstanceUID, uid)==ECC_Normal ) { if ( studyinstanceuid == uid.c_str() ) { open_dicomdir_series_result(dicomdir, patRec, studyRec, resultslot); return; } } } } break; case ERT_HangingProtocol: // FALLTHROUGH case ERT_Private: break; default: break; } } std::cout << "WARNING: study[" << studyinstanceuid << "] not found in DICOMDIR\n"; }
/** * Reads a dicomdir and signals every found study */ void open_dicomdir( const Glib::ustring &dicomdir, const sigc::slot< void, const Glib::RefPtr< ImagePool::Study >& >& resultslot) { DcmDicomDir dir(dicomdir.c_str()); OFCondition ret; if ( (ret=dir.error()) != ECC_Normal ) { std::cout << "DICOMDIR Error: " << ret.text() << std::endl; return; } DcmDirectoryRecord root = dir.getRootRecord(); DcmDirectoryRecord *rec = root.nextSub(NULL); std::cout << "Reading DICOMDIR from [" << dicomdir << "]\n"; while ( rec != NULL ) { switch ( rec->getRecordType() ) { case ERT_Patient: open_dicomdir_patient(dicomdir, rec, resultslot); break; case ERT_HangingProtocol: // FALLTHROUGH case ERT_Private: break; default: std::cout << "WARNING: Bad DICOMDIR Record type[" << rec->getRecordType() << "] found\n"; } rec = root.nextSub(rec); } /* // Leggo il root record, � un paziente ? { case ERT_root = 0, case ERT_Curve = 1, case ERT_FilmBox = 2, case ERT_FilmSession = 3, case ERT_Image = 4, case ERT_ImageBox = 5, case ERT_Interpretation = 6, ERT_ModalityLut = 7, ERT_Mrdr = 8, ERT_Overlay = 9, ERT_Patient = 10, ERT_PrintQueue = 11, ERT_Private = 12, ERT_Results = 13, ERT_Series = 14, ERT_Study = 15, ERT_StudyComponent = 16, ERT_Topic = 17, ERT_Visit = 18, ERT_VoiLut = 19, ERT_StructReport = 20, ERT_Presentation = 21, ERT_Waveform = 22, ERT_RTDose = 23, ERT_RTStructureSet = 24, ERT_RTPlan = 25, ERT_RTTreatRecord = 26, ERT_StoredPrint = 27, ERT_KeyObjectDoc = 28, ERT_Registration = 29, ERT_Fiducial = 30, ERT_RawData = 31, ERT_Spectroscopy = 32, ERT_EncapDoc = 33, ERT_ValueMap = 34, ERT_HangingProtocol = 35 */ }
// Loads all dicom file in m_FileList // Initializes m_Cache // returns true if viewable files found, otherwise false bool DicomdirLoader::scan_study(const std::string &studyinstanceuid, class DcmDirectoryRecord *studyRec, const Glib::ustring &dicomdir) { DcmDirectoryRecord *seriesRec; DcmDirectoryRecord *sopRec; std::string path; std::string file; assert(studyRec->getRecordType()==ERT_Study); path = Glib::path_get_dirname(dicomdir); seriesRec = studyRec->nextSub(NULL); while ( seriesRec ) { OFString modality; if ( seriesRec->findAndGetOFString(DCM_Modality, modality) == EC_Normal ) { OFString seriesinstanceuid; if ( seriesRec->findAndGetOFString(DCM_SeriesInstanceUID, seriesinstanceuid) != EC_Normal ) { seriesRec = studyRec->nextSub(seriesRec); continue; } if ( ImageModalities.find(modality.c_str()) != std::string::npos ) { // Load Series... OFString fileID; int vm; int i; DcmElement *el; for (sopRec = seriesRec->nextSub(NULL); sopRec; sopRec = seriesRec->nextSub(sopRec) ) { switch ( sopRec->getRecordType() ) { case ERT_Image: case ERT_StoredPrint: if ( sopRec->findAndGetElement(DCM_ReferencedFileID, el, true)!=EC_Normal ) { sopRec = seriesRec->nextSub(sopRec); continue; } vm = el->getVM(); file = ""; for ( i=0; i<vm; i++ ) { el->getOFString(fileID, i); file = file + "/" + fileID.c_str(); } if ( file.size() > 0 ) { std::cout << "Loading DICOMDIR file [" << path.c_str() << file.c_str() << "]" << std::endl; m_filelist->push_back(path + file); std::string SeriesUID = seriesinstanceuid.c_str(); m_cache[studyinstanceuid].m_instancecount++; m_cache[studyinstanceuid].m_seriesuid.insert(SeriesUID); m_cache[studyinstanceuid].m_seriescount = m_cache[studyinstanceuid].m_seriesuid.size(); } break; default: break; } } } } seriesRec = studyRec->nextSub(seriesRec); } return true; }
//------------------------------------------------------------------------------ void ctkDICOMIndexer::addFromDICOMDIR(ctkDICOMDatabase& ctkDICOMDatabase, const QString& directoryName, const QString& destinationDirectoryName ) { logger.debug( "############## addFromDICOMDIR ####################" ); int fileNumber = 0; std::string dcmFilePath = directoryName.toStdString() + "/DICOMDIR"; const char* dcmDirFilePath = dcmFilePath.c_str(); // currently it is not supported to have multiple // parallel directory imports so the second call blocks // d->DirectoryImportWatcher.waitForFinished(); const std::string src_directory(directoryName.toStdString()); DcmDicomDir* dicomDir = new DcmDicomDir(dcmDirFilePath); DcmDirectoryRecord* rootRecord = &(dicomDir->getRootRecord()); DcmDirectoryRecord* patientRecord = NULL; DcmDirectoryRecord* studyRecord = NULL; DcmDirectoryRecord* seriesRecord = NULL; DcmDirectoryRecord* fileRecord = NULL; QString finalFilePath=destinationDirectoryName + "/dicom"; ////QDir destinationDir; ////QFile currentFile; ////Values to fill database //OFString patientsName, patientID, patientsBirthDate, patientsBirthTime, patientsSex, // patientComments, patientsAge; //OFString studyInstanceUID, studyID, studyDate, studyTime, // accessionNumber, modalitiesInStudy, institutionName, performingPhysiciansName, referringPhysician, studyDescription; //OFString seriesInstanceUID, seriesDate, seriesTime, // seriesDescription, bodyPartExamined, frameOfReferenceUID, // contrastAgent, scanningSequence; //OFString instanceNumber, sopInstanceUID, referencedFileName ; //Sint32 seriesNumber = 0, acquisitionNumber = 0, echoNumber = 0, temporalPosition = 0; ////The patient UID is a unique number within the database, generated by the sqlite autoincrement ////Thus, this is _not_ the DICOM Patient ID. ////int patientUID(-1); ////int nrOfFiles(0); if(rootRecord != NULL) { //DcmDataset *patientDataset; while (((patientRecord = rootRecord->nextSub(patientRecord)) != NULL)) { //if (patientRecord->findAndGetOFString(DCM_PatientName, patientsName).good()) { // logger.debug( "Reading new Patients:" ); // logger.debug( "Patient's Name: " + QString(patientsName.c_str()) ); // patientDataset = new DcmDataset(); // patientRecord->findAndGetOFString(DCM_PatientID, patientID); // patientRecord->findAndGetOFString(DCM_PatientBirthDate, patientsBirthDate); // patientRecord->findAndGetOFString(DCM_PatientBirthTime, patientsBirthTime); // patientRecord->findAndGetOFString(DCM_PatientSex, patientsSex); // patientRecord->findAndGetOFString(DCM_PatientAge, patientsAge); // patientRecord->findAndGetOFString(DCM_PatientComments, patientComments); // patientDataset->putAndInsertOFStringArray(DCM_PatientName, patientsName); // patientDataset->putAndInsertOFStringArray(DCM_PatientID, patientID); // patientDataset->putAndInsertOFStringArray(DCM_PatientBirthDate, patientsBirthDate); // patientDataset->putAndInsertOFStringArray(DCM_PatientBirthTime, patientsBirthTime); // patientDataset->putAndInsertOFStringArray(DCM_PatientSex, patientsSex); // patientDataset->putAndInsertOFStringArray(DCM_PatientAge, patientsAge); // patientDataset->putAndInsertOFStringArray(DCM_PatientComments, patientComments); //} while (((studyRecord = patientRecord->nextSub(studyRecord)) != NULL)) { //if (studyRecord->findAndGetOFString(DCM_StudyInstanceUID, studyInstanceUID).good()) { // logger.debug( "Reading new Studys:" ); // logger.debug( "Studies Name: " + QString(studyInstanceUID.c_str()) ); // studyRecord->findAndGetOFString(DCM_StudyID, studyID); // studyRecord->findAndGetOFString(DCM_StudyDate, studyDate); // studyRecord->findAndGetOFString(DCM_StudyTime, studyTime); // studyRecord->findAndGetOFString(DCM_AccessionNumber, accessionNumber); // studyRecord->findAndGetOFString(DCM_ModalitiesInStudy, modalitiesInStudy); // studyRecord->findAndGetOFString(DCM_InstitutionName, institutionName); // studyRecord->findAndGetOFString(DCM_PerformingPhysicianName, performingPhysiciansName); // studyRecord->findAndGetOFString(DCM_ReferringPhysicianName, referringPhysician); // studyRecord->findAndGetOFString(DCM_StudyDescription, studyDescription); // patientDataset->putAndInsertOFStringArray(DCM_StudyInstanceUID, studyInstanceUID); // patientDataset->putAndInsertOFStringArray(DCM_StudyID, studyID); // patientDataset->putAndInsertOFStringArray(DCM_StudyDate, studyDate); // patientDataset->putAndInsertOFStringArray(DCM_StudyTime, studyTime); // patientDataset->putAndInsertOFStringArray(DCM_AccessionNumber, accessionNumber); // patientDataset->putAndInsertOFStringArray(DCM_ModalitiesInStudy, modalitiesInStudy); // patientDataset->putAndInsertOFStringArray(DCM_InstitutionName, institutionName); // patientDataset->putAndInsertOFStringArray(DCM_PerformingPhysicianName, performingPhysiciansName); // patientDataset->putAndInsertOFStringArray(DCM_ReferringPhysicianName, referringPhysician); // patientDataset->putAndInsertOFStringArray(DCM_StudyDescription, studyDescription); while (((seriesRecord = studyRecord->nextSub(seriesRecord)) != NULL)) { //if (seriesRecord->findAndGetOFString(DCM_SeriesInstanceUID, seriesInstanceUID).good()) { // logger.debug( "Reading new Series:" ); // logger.debug( "Series Instance Name: " + QString(seriesInstanceUID.c_str()) ); // seriesRecord->findAndGetOFString(DCM_SeriesDate, seriesDate); // seriesRecord->findAndGetOFString(DCM_SeriesTime, seriesTime); // seriesRecord->findAndGetOFString(DCM_SeriesDescription, seriesDescription); // seriesRecord->findAndGetOFString(DCM_BodyPartExamined, bodyPartExamined); // seriesRecord->findAndGetOFString(DCM_FrameOfReferenceUID, frameOfReferenceUID); // seriesRecord->findAndGetOFString(DCM_ContrastBolusAgent, contrastAgent); // seriesRecord->findAndGetOFString(DCM_ScanningSequence, scanningSequence); // seriesRecord->findAndGetSint32(DCM_SeriesNumber, seriesNumber); // seriesRecord->findAndGetSint32(DCM_AcquisitionNumber, acquisitionNumber); // seriesRecord->findAndGetSint32(DCM_EchoNumbers, echoNumber); // seriesRecord->findAndGetSint32(DCM_TemporalPositionIdentifier, temporalPosition); // patientDataset->putAndInsertOFStringArray(DCM_SeriesInstanceUID, seriesInstanceUID); // patientDataset->putAndInsertOFStringArray(DCM_SeriesDate, seriesDate); // patientDataset->putAndInsertOFStringArray(DCM_SeriesTime, seriesTime); // patientDataset->putAndInsertOFStringArray(DCM_SeriesDescription, seriesDescription); // patientDataset->putAndInsertOFStringArray(DCM_BodyPartExamined, bodyPartExamined); // patientDataset->putAndInsertOFStringArray(DCM_FrameOfReferenceUID, frameOfReferenceUID); // patientDataset->putAndInsertOFStringArray(DCM_ContrastBolusAgent, contrastAgent); // patientDataset->putAndInsertOFStringArray(DCM_ScanningSequence, scanningSequence); // patientDataset->putAndInsertSint16(DCM_SeriesNumber, seriesNumber); // patientDataset->putAndInsertSint16(DCM_AcquisitionNumber, acquisitionNumber); // patientDataset->putAndInsertSint16(DCM_EchoNumbers, echoNumber); // patientDataset->putAndInsertSint16(DCM_TemporalPositionIdentifier, temporalPosition); //} while (((fileRecord = seriesRecord->nextSub(fileRecord)) != NULL)) { //if (fileRecord->findAndGetOFStringArray(DCM_ReferencedSOPInstanceUIDInFile, sopInstanceUID).good()) { // fileRecord->findAndGetOFString(DCM_ReferencedFileID,referencedFileName); // patientDataset->putAndInsertOFStringArray(DCM_ReferencedSOPInstanceUIDInFile, sopInstanceUID); // patientDataset->putAndInsertOFStringArray(DCM_ReferencedFileID, referencedFileName); // const char* filename = fileRecord->getRecordsOriginFile(); // if(filename) // { // this->addFile(); // } //} emit indexingFileNumber(++fileNumber); //TODO insert Record into Database Info: the database.insert() interface must change. //it must be possible to add records and dataset //suggestion: change the interface to dcmItem } } } } emit foundFilesToIndex(fileNumber); } QString filePath((*iter).c_str()); d->FilesToIndex << filePath; ++iter; }