Exemple #1
0
def test_sync_with_empty_database(prepare_environment: Any) -> None:
    """Test for configuration synchronization with empty database."""
    configuration = yaml.load("""
        datasets:
          - key: KIDNEYS
            name: Kidneys
            tasks:
              - KIDNEYS_SEGMENTATION

        tasks:
          - key: KIDNEYS_SEGMENTATION
            name: Kidneys segmentation
            image_path: assets/icon/kidneys_dataset_icon.svg
            description: This is a test task
            label_examples: ['assets/example_1', 'assets/example_2']
            tags:
              - key: LEFT_KIDNEY
                name: Left Kidney
                tools:
                  - CHAIN
                  - BRUSH
              - key: RIGHT_KIDNEY
                name: Right Kidney
                tools:
                  - CHAIN
    """)
    script.sync_configuration(configuration)

    # Check if Datasets were synchronized properly
    datasets = DatasetsRepository.get_all_datasets(include_disabled=True)
    assert len(datasets) == 1
    kidneys = DatasetsRepository.get_dataset_by_key('KIDNEYS')
    assert kidneys.name == 'Kidneys'
    assert not kidneys.disabled
    assert {task.key for task in kidneys.tasks} == {'KIDNEYS_SEGMENTATION'}

    # Check if Tasks were synchronized properly
    tasks = TasksRepository.get_all_tasks(include_disabled=True)
    assert len(tasks) == 1
    kidneys_segmentation = TasksRepository.get_task_by_key('KIDNEYS_SEGMENTATION')
    assert kidneys_segmentation.name == 'Kidneys segmentation'
    assert kidneys_segmentation.image_path == 'assets/icon/kidneys_dataset_icon.svg'
    assert kidneys_segmentation.description == 'This is a test task'
    assert kidneys_segmentation.label_examples == ['assets/example_1', 'assets/example_2']
    assert not kidneys_segmentation.disabled
    assert len(kidneys_segmentation.available_tags) == 2
    assert {tag.key for tag in kidneys_segmentation.available_tags} == {'LEFT_KIDNEY', 'RIGHT_KIDNEY'}

    # Check if Label Tags were synchronized properly
    tags = LabelTagsRepository.get_all_tags(include_disabled=True)
    assert len(tags) == 2
    left_kidney = LabelTagsRepository.get_label_tag_by_key('LEFT_KIDNEY')
    assert left_kidney.name == 'Left Kidney'
    assert not left_kidney.disabled
    assert {tool.name for tool in left_kidney.tools} == {'CHAIN', 'BRUSH'}
    right_kidney = LabelTagsRepository.get_label_tag_by_key('RIGHT_KIDNEY')
    assert right_kidney.name == 'Right Kidney'
    assert not right_kidney.disabled
    assert {tool.name for tool in right_kidney.tools} == {'CHAIN'}
def _sync_datasets(configuration: Dict) -> None:
    """Synchronize Datasets from configuration file with database entries.

    Example DataSets in the configuration file:
    ```
    datasets:
      - name: Kidneys
        key: KIDNEYS
        tasks:
          - KIDNEYS_SEGMENTATION
    ```

    :param configuration: content of YAML configuration file
    """
    datasets = configuration.get('datasets', []) or []
    configuration_datasets_keys = {dataset['key'] for dataset in datasets}
    database_datasets_keys = {dataset.key for dataset in DatasetsRepository.get_all_datasets(include_disabled=True)}

    datasets_to_add = configuration_datasets_keys - database_datasets_keys
    datasets_to_disable = database_datasets_keys - configuration_datasets_keys
    datasets_to_enable = database_datasets_keys & configuration_datasets_keys

    for dataset_key in datasets_to_add:
        dataset = next(dataset for dataset in datasets if dataset['key'] == dataset_key)
        DatasetsRepository.add_new_dataset(dataset['key'], dataset['name'])
        logger.info('New DataSet added: %s', dataset['key'])

    for dataset_key in datasets_to_enable:
        dataset = next(dataset for dataset in datasets if dataset['key'] == dataset_key)
        DatasetsRepository.enable(dataset['key'])
        DatasetsRepository.update(dataset['key'], dataset['name'])
        logger.info('DataSet enabled: %s', dataset['key'])

    for dataset_key in datasets_to_disable:
        DatasetsRepository.disable(dataset_key)
        logger.info('DataSet disabled: %s', dataset_key)
Exemple #3
0
def test_sync_with_changed_dataset_and_reused_task(prepare_environment: Any) -> None:
    """Test for changing DataSet and reusing Task."""
    configuration = yaml.load("""
        datasets:
          - key: KIDNEYS
            name: Kidneys
            tasks:
              - FIND_NODULES

        tasks:
          - key: FIND_NODULES
            name: Find nodules
            image_path: assets/icon/kidneys_dataset_icon.svg
            description: This is a test task
            label_examples: ['assets/example_1', 'assets/example_2']
            tags:
              - key: NODULE
                name: Nodule
                tools:
                  - BRUSH
    """)
    script.sync_configuration(configuration)

    # Check if Datasets were synchronized properly
    datasets = DatasetsRepository.get_all_datasets(include_disabled=True)
    assert len(datasets) == 1
    kidneys = DatasetsRepository.get_dataset_by_key('KIDNEYS')
    assert kidneys.name == 'Kidneys'
    assert not kidneys.disabled
    assert {task.key for task in kidneys.tasks} == {'FIND_NODULES'}

    # Now, let's change Tools for Kidneys Segmentation
    configuration = yaml.load("""
        datasets:
          - key: LUNGS
            name: Lungs
            tasks:
              - FIND_NODULES

        tasks:
          - key: FIND_NODULES
            name: Find nodules
            image_path: assets/icon/kidneys_dataset_icon.svg
            description: This is a test task with updated description
            label_examples: ['assets/example_1', 'assets/example_2']
            tags:
              - key: NODULE
                name: Nodule
                tools:
                  - BRUSH
    """)
    script.sync_configuration(configuration)

    # Check if Datasets were synchronized properly
    datasets = DatasetsRepository.get_all_datasets(include_disabled=True)
    assert len(datasets) == 2
    kidneys = DatasetsRepository.get_dataset_by_key('KIDNEYS')
    assert kidneys.name == 'Kidneys'
    assert kidneys.disabled
    assert {task.key for task in kidneys.tasks} == set()
    lungs = DatasetsRepository.get_dataset_by_key('LUNGS')
    assert lungs.name == 'Lungs'
    assert not lungs.disabled
    assert {task.key for task in lungs.tasks} == {'FIND_NODULES'}
Exemple #4
0
def test_sync_with_changed_task_in_dataset(mocker: Any, prepare_environment: Any) -> None:
    """Test for adding and removing Task in DataSet."""
    configuration = yaml.load("""
        datasets:
          - key: KIDNEYS
            name: Kidneys
            tasks:
              - KIDNEYS_SEGMENTATION

        tasks:
          - key: KIDNEYS_SEGMENTATION
            name: Kidneys segmentation
            image_path: assets/icon/kidneys_dataset_icon.svg
            description: This is a test task
            label_examples: ['assets/example_1', 'assets/example_2']
            tags:
              - key: LEFT_KIDNEY
                name: Left Kidney
                tools:
                  - CHAIN
                  - BRUSH
    """)
    script.sync_configuration(configuration)

    # Check if Datasets were synchronized properly
    datasets = DatasetsRepository.get_all_datasets(include_disabled=True)
    assert len(datasets) == 1

    # Check if Tasks were synchronized properly
    tasks = TasksRepository.get_all_tasks(include_disabled=True)
    assert len(tasks) == 1
    kidneys_segmentation = TasksRepository.get_task_by_key('KIDNEYS_SEGMENTATION')
    assert kidneys_segmentation.name == 'Kidneys segmentation'
    assert not kidneys_segmentation.disabled

    # Now, let's change Tasks for Kidneys
    configuration = yaml.load("""
        datasets:
          - key: KIDNEYS
            name: Kidneys
            tasks:
             - KIDNEYS_SEGMENTATION

        tasks:
          - key: FIND_NODULES
            name: Find nodules
            image_path: assets/icon/kidneys_dataset_icon.svg
            description: This is a test task
            label_examples: ['assets/example_1', 'assets/example_2']
            tags:
              - key: NODULE
                name: Nodule
                tools:
                  - BRUSH
    """)
    script.sync_configuration(configuration)

    # Check if Datasets were synchronized properly
    datasets = DatasetsRepository.get_all_datasets(include_disabled=True)
    assert len(datasets) == 1

    # Check if Tasks were synchronized properly
    tasks = TasksRepository.get_all_tasks(include_disabled=True)
    assert len(tasks) == 2
    kidneys_segmentation = TasksRepository.get_task_by_key('KIDNEYS_SEGMENTATION')
    assert kidneys_segmentation.name == 'Kidneys segmentation'
    assert kidneys_segmentation.disabled
    find_nodules = TasksRepository.get_task_by_key('FIND_NODULES')
    assert find_nodules.name == 'Find nodules'
    assert not find_nodules.disabled

    # Now, let's change let's get back to older Tasks (with different values) for Kidneys
    configuration = yaml.load("""
        datasets:
          - key: KIDNEYS
            name: Kidneys
            tasks:
             - KIDNEYS_SEGMENTATION

        tasks:
          - key: KIDNEYS_SEGMENTATION
            name: New Kidneys segmentation
            image_path: assets/icon/kidneys_dataset_icon.svg
            description: This is a test task
            label_examples: ['assets/example_1', 'assets/example_2']
            tags:
              - key: NEW_LEFT_KIDNEY
                name: New Left Kidney
                tools:
                  - RECTANGLE
    """)
    script.sync_configuration(configuration)

    # Check if Datasets were synchronized properly
    datasets = DatasetsRepository.get_all_datasets(include_disabled=True)
    assert len(datasets) == 1

    # Check if Tasks were synchronized properly
    tasks = TasksRepository.get_all_tasks(include_disabled=True)
    assert len(tasks) == 2
    find_nodules = TasksRepository.get_task_by_key('FIND_NODULES')
    assert find_nodules.name == 'Find nodules'
    assert find_nodules.disabled
    kidneys_segmentation = TasksRepository.get_task_by_key('KIDNEYS_SEGMENTATION')
    assert kidneys_segmentation.name == 'New Kidneys segmentation'
    assert kidneys_segmentation.image_path == 'assets/icon/kidneys_dataset_icon.svg'
    assert kidneys_segmentation.description == 'This is a test task'
    assert kidneys_segmentation.label_examples == ['assets/example_1', 'assets/example_2']
    assert not kidneys_segmentation.disabled
    assert len(kidneys_segmentation.available_tags) == 1
    assert {tag.key for tag in kidneys_segmentation.available_tags} == {'NEW_LEFT_KIDNEY'}

    # Check if Label Tags were synchronized properly
    tags = LabelTagsRepository.get_all_tags(include_disabled=True)
    assert len(tags) == 3
    left_kidney = LabelTagsRepository.get_label_tag_by_key('LEFT_KIDNEY')
    assert left_kidney.disabled
    nodule = LabelTagsRepository.get_label_tag_by_key('NODULE')
    assert nodule.disabled
    new_left_kidney = LabelTagsRepository.get_label_tag_by_key('NEW_LEFT_KIDNEY')
    assert not new_left_kidney.disabled

    # Now, let's change let's get back to the original Tasks for Kidneys
    mocked_logger = mocker.patch.object(script, 'logger')
    configuration = yaml.load("""
        datasets:
          - key: KIDNEYS
            name: Kidneys
            tasks:
             - KIDNEYS_SEGMENTATION

        tasks:
          - key: KIDNEYS_SEGMENTATION
            name: Kidneys segmentation
            image_path: assets/icon/kidneys_dataset_icon.svg
            description: This is a test task
            label_examples: ['assets/example_1', 'assets/example_2']
            tags:
              - key: LEFT_KIDNEY
                name: Left Kidney
                tools:
                  - CHAIN
                  - BRUSH
    """)
    script.sync_configuration(configuration)

    # Check if user was warned about possible data inconsistency
    mocked_logger.warning.assert_called_once_with(
        'Reusing previously existing Label Tag (%s)! This may cause data inconsistency! '
        'Make sure you know what you are doing and clear database entries if necessary!',
        'LEFT_KIDNEY',
    )

    # Check if Label Tags were synchronized properly
    tags = LabelTagsRepository.get_all_tags(include_disabled=True)
    assert len(tags) == 3
    left_kidney = LabelTagsRepository.get_label_tag_by_key('LEFT_KIDNEY')
    assert not left_kidney.disabled
    nodule = LabelTagsRepository.get_label_tag_by_key('NODULE')
    assert nodule.disabled
    new_left_kidney = LabelTagsRepository.get_label_tag_by_key('NEW_LEFT_KIDNEY')
    assert new_left_kidney.disabled
Exemple #5
0
def get_available_datasets() -> List[Dataset]:
    """Fetch list of all available Datasets.

    :return: list of Datasets
    """
    return DatasetsRepository.get_all_datasets()
        'active': user.active,
        'role': user.role.name,
    })
print('\nSaving Roles and Users to file: {}.'.format(ROLES_AND_USERS_FILE))
with open(ROLES_AND_USERS_FILE, 'w') as json_file:
    json.dump(_users_and_roles, json_file)

# Backup all Scans and its Labels with DICOM files
_scans = {
    'datasets': [],
    'label_tags': [],
    'scans': [],
}  # type: Dict[str, List[Dict]]

print('\nFetching Datasets...')
for dataset in DatasetsRepository.get_all_datasets():
    print('Saving Dataset: {}'.format(dataset.key))
    _scans['datasets'].append({
        'id': dataset.id,
        'key': dataset.key,
        'name': dataset.name,
    })
print('\nFetching Label Tags...')
for label_tag in LabelTagsRepository.get_all_tags():
    print('Saving Label Tag: {}'.format(label_tag.key))
    _scans['label_tags'].append({
        'id': label_tag.id,
        'key': label_tag.key,
        'name': label_tag.name,
    })
print('\nSaving all DICOMs to directory...')