Esempio n. 1
0
def importFromDICOMWeb(dicomWebEndpoint, studyInstanceUID, seriesInstanceUID=None, accessToken=None):
  """
  Downloads and imports DICOM series from a DICOMweb instance.
  Example usage:
    from DICOMLib import DICOMUtils

    loadedUIDs = DICOMUtils.importFromDICOMWeb(dicomWebEndpoint="https://yourdicomweburl/dicomWebEndpoint",
                                             studyInstanceUID="2.16.840.1.113669.632.20.1211.10000509338")
                                             accessToken="YOUR_ACCESS_TOKEN")
  :param dicomWebEndpoint: Endpoint URL for retrieving the study/series from DICOMweb
  :param studyInstanceUID: UID for the study to be downloaded
  :param seriesInstanceUID: UID for the series to be downloaded. If not specified, all series will be downloaded from the study
  :param accessToken: Optional access token for the query
  :return: List of imported study UIDs
  """

  from dicomweb_client.api import DICOMwebClient
  import random

  if accessToken is None:
    client = DICOMwebClient(url = dicomWebEndpoint)
  else:
    client = DICOMwebClient(
              url = dicomWebEndpoint,
              headers = { "Authorization": "Bearer {}".format(accessToken) },
              )

  seriesList = client.search_for_series(study_instance_uid=studyInstanceUID)
  seriesInstanceUIDs = []
  if not seriesInstanceUID is None:
    seriesInstanceUIDs = [seriesInstanceUID]
  else:
    for series in seriesList:
      currentSeriesInstanceUID = series['0020000E']['Value'][0]
      seriesInstanceUIDs.append(currentSeriesInstanceUID)

  fileNumber = 0
  for currentSeriesInstanceUID in seriesInstanceUIDs:
    instances = client.retrieve_series(
      study_instance_uid=studyInstanceUID,
      series_instance_uid=currentSeriesInstanceUID)

    outputDirectoryBase = slicer.dicomDatabase.databaseDirectory + "/DICOMweb"
    if not os.access(outputDirectoryBase, os.F_OK):
      os.makedirs(outputDirectoryBase)
    outputDirectoryBase += "/" + qt.QDateTime.currentDateTime().toString("yyyyMMdd-hhmmss")
    outputDirectory = qt.QTemporaryDir(outputDirectoryBase)  # Add unique substring to directory
    outputDirectory.setAutoRemove(False)
    outputDirectoryPath = outputDirectory.path()

    for instance in instances:
      filename = outputDirectoryPath + "/" + str(fileNumber) + ".dcm"
      instance.save_as(filename)
      fileNumber += 1
      slicer.app.processEvents()
    importDicom(outputDirectoryPath)

  return seriesInstanceUIDs
Esempio n. 2
0
def _retrieve_series(args):
    '''Retrieves all Instances of a given Series and either writes them to
    standard output or to files on disk.
    '''
    client = DICOMwebClient(args.url,
                            username=args.username,
                            password=args.password,
                            ca_bundle=args.ca_bundle,
                            cert=args.cert)
    instances = client.retrieve_series(
        args.study_instance_uid,
        args.series_instance_uid,
        media_types=args.media_types,
    )
    for inst in instances:
        sop_instance_uid = inst.SOPInstanceUID
        if args.save:
            _save_instance(inst, args.output_dir, sop_instance_uid)
        else:
            _print_instance(inst)
Esempio n. 3
0
def importFromDICOMWeb(dicomWebEndpoint,
                       studyInstanceUID,
                       seriesInstanceUID=None,
                       accessToken=None):
    """
  Downloads and imports DICOM series from a DICOMweb instance.
  Example usage:
    from DICOMLib import DICOMUtils

    loadedUIDs = DICOMUtils.importFromDICOMWeb(dicomWebEndpoint="https://yourdicomweburl/dicomWebEndpoint",
                                             studyInstanceUID="2.16.840.1.113669.632.20.1211.10000509338")
                                             accessToken="YOUR_ACCESS_TOKEN")
  :param dicomWebEndpoint: Endpoint URL for retrieving the study/series from DICOMweb
  :param studyInstanceUID: UID for the study to be downloaded
  :param seriesInstanceUID: UID for the series to be downloaded. If not specified, all series will be downloaded from the study
  :param accessToken: Optional access token for the query
  :return: List of imported study UIDs
  """

    from dicomweb_client.api import DICOMwebClient
    import random

    progressDialog = slicer.util.createProgressDialog(
        parent=slicer.util.mainWindow(), value=0, maximum=100)
    progressDialog.labelText = f'Retrieving series list...'
    slicer.app.processEvents()

    if accessToken is None:
        client = DICOMwebClient(url=dicomWebEndpoint,
                                callback=progressCallback)
    else:
        client = DICOMwebClient(
            url=dicomWebEndpoint,
            headers={"Authorization": f"Bearer {accessToken}"},
        )

    seriesList = client.search_for_series(study_instance_uid=studyInstanceUID)
    seriesInstanceUIDs = []
    if not seriesInstanceUID is None:
        seriesInstanceUIDs = [seriesInstanceUID]
    else:
        for series in seriesList:
            currentSeriesInstanceUID = series['0020000E']['Value'][0]
            seriesInstanceUIDs.append(currentSeriesInstanceUID)

    fileNumber = 0
    cancelled = False
    for seriesIndex, currentSeriesInstanceUID in enumerate(seriesInstanceUIDs):
        progressDialog.labelText = f'Retrieving series {seriesIndex+1} of {len(seriesInstanceUIDs)}...'
        slicer.app.processEvents()
        instances = client.retrieve_series(
            study_instance_uid=studyInstanceUID,
            series_instance_uid=currentSeriesInstanceUID)

        progressDialog.setValue(
            int(100 * seriesIndex / len(seriesInstanceUIDs)))
        slicer.app.processEvents()
        cancelled = progressDialog.wasCanceled
        if cancelled:
            break

        outputDirectoryBase = slicer.dicomDatabase.databaseDirectory + "/DICOMweb"
        if not os.access(outputDirectoryBase, os.F_OK):
            os.makedirs(outputDirectoryBase)
        outputDirectoryBase += "/" + qt.QDateTime.currentDateTime().toString(
            "yyyyMMdd-hhmmss")
        outputDirectory = qt.QTemporaryDir(
            outputDirectoryBase)  # Add unique substring to directory
        outputDirectory.setAutoRemove(False)
        outputDirectoryPath = outputDirectory.path()

        for instanceIndex, instance in enumerate(instances):
            filename = outputDirectoryPath + "/" + str(fileNumber) + ".dcm"
            instance.save_as(filename)
            fileNumber += 1

        importDicom(outputDirectoryPath)
        if cancelled:
            break

    progressDialog.close()
    return seriesInstanceUIDs