Esempio n. 1
0
    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;
    }
Esempio n. 2
0
    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);
        }
    }
Esempio n. 3
0
    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";
    }
Esempio n. 4
0
    /**
     * 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
        */
    }
Esempio n. 5
0
    // 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;
    }
Esempio n. 6
0
//------------------------------------------------------------------------------
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;
  }