Example #1
0
def test_dict_to_archive(tmp_path):
    subdir = tmp_path / "tmp"
    subdir.mkdir()
    (subdir / "labels.csv").touch()
    (subdir / "img.nii.gz").touch()
    archive_spec = {
        "empty_data":
        subdir,
        "empty_data_path.txt":
        str(subdir),
        Path("data", "labels.csv"):
        "a,b,c",
        Path("data", "img.nii.gz"):
        generate_fake_fmri()[0],
        Path("a", "b", "c"): (100).to_bytes(length=1,
                                            byteorder="big",
                                            signed=False),
    }
    targz = _testing.dict_to_archive(archive_spec)
    extract_dir = tmp_path / "extract"
    extract_dir.mkdir()
    archive_path = tmp_path / "archive"
    with archive_path.open("wb") as f:
        f.write(targz)
    with tarfile.open(str(archive_path)) as tarf:
        tarf.extractall(str(extract_dir))
    img = image.load_img(str(extract_dir / "data" / "img.nii.gz"))
    assert img.shape == (10, 11, 12, 17)
    with (extract_dir / "a" / "b" / "c").open("rb") as f:
        assert int.from_bytes(f.read(), byteorder="big", signed=False) == 100
    with open(str(extract_dir / "empty_data" / "labels.csv")) as f:
        assert f.read() == ""
    zip_archive = _testing.dict_to_archive(
        {
            "readme.txt": "hello",
            "archive": targz
        }, "zip")
    with archive_path.open("wb") as f:
        f.write(zip_archive)
    with zipfile.ZipFile(str(archive_path)) as zipf:
        with zipf.open("archive", "r") as f:
            assert f.read() == targz
    from_list = _testing.list_to_archive(archive_spec.keys())
    with archive_path.open("wb") as f:
        f.write(from_list)
    with tarfile.open(str(archive_path)) as tarf:
        assert sorted(map(Path, tarf.getnames())) == sorted(
            list(map(Path, archive_spec.keys())) +
            [Path("."), Path("a"),
             Path("a", "b"),
             Path("data")])
Example #2
0
def _destrieux_data():
    data = {"destrieux2009.rst": "readme"}
    for lat in ["_lateralized", ""]:
        lat_data = {
            "destrieux2009_rois_labels{}.csv".format(lat): "name,index",
            "destrieux2009_rois{}.nii.gz".format(lat): "",
        }
        data.update(lat_data)
    return dict_to_archive(data)
Example #3
0
def _destrieux_data():
    """Function mocking the download of the destrieux atlas."""
    data = {"destrieux2009.rst": "readme"}
    atlas = np.random.randint(0, 10, (10, 10, 10))
    atlas_img = nibabel.Nifti1Image(atlas, np.eye(4))
    labels = "\n".join([f"{idx},label {idx}" for idx in range(10)])
    labels = "index,name\n" + labels
    for lat in ["_lateralized", ""]:
        lat_data = {
            "destrieux2009_rois_labels{}.csv".format(lat): labels,
            "destrieux2009_rois{}.nii.gz".format(lat): atlas_img,
        }
        data.update(lat_data)
    return dict_to_archive(data)
Example #4
0
def _make_oasis_data(dartel=True):
    n_subjects = 457
    prefix = "mwrc" if dartel else "mwc"
    ids = pd.DataFrame({
        "ID": list(map("OAS1_{:04}".format, range(n_subjects)))
    }).to_csv(index=False, sep="\t")
    data = {"oasis_cross-sectional.csv": ids, "data_usage_agreement.txt": ""}
    path_pattern = str(
        Path(
            "OAS1_{subj:04}_MR1",
            "{prefix}{kind}OAS1_{subj:04}_MR1_mpr_anon_fslswapdim_bet.nii.gz"))
    for i in range(457):
        for kind in [1, 2]:
            data[path_pattern.format(subj=i, kind=kind, prefix=prefix)] = ""
    return dict_to_archive(data)
Example #5
0
def test_fetch_atlas_difumo(tmp_path, request_mocker):
    resolutions = [2, 3]  # Valid resolution values
    dimensions = [64, 128, 256, 512, 1024]  # Valid dimension values
    dimension_urls = ['wjum7', 'n3vba', 'vza2y', 'a23gw', 'jpdum']
    url_mapping = {k: v for k, v in zip(dimensions, dimension_urls)}
    url_count = 2

    for dim in dimensions:
        url_count += 1
        url = "*osf.io/{0}/*".format(url_mapping[dim])
        labels = pd.DataFrame({
            "Component": [_ for _ in range(1, dim + 1)],
            "Difumo_names": ["" for _ in range(dim)],
            "Yeo_networks7": ["" for _ in range(dim)],
            "Yeo_networks17": ["" for _ in range(dim)],
            "GM": ["" for _ in range(dim)],
            "WM": ["" for _ in range(dim)],
            "CSF": ["" for _ in range(dim)]
        })
        root = Path("{0}".format(dim))
        archive = {
            root / "labels_{0}_dictionary.csv".format(dim):
            labels.to_csv(index=False),
            root / "maps.nii.gz":
            "",
            root / "3mm" / "resampled_maps.nii.gz":
            ""
        }
        request_mocker.url_mapping[url] = dict_to_archive(archive, "zip")

        for res in resolutions:
            dataset = atlas.fetch_atlas_difumo(data_dir=str(tmp_path),
                                               dimension=dim,
                                               resolution_mm=res,
                                               verbose=0)
            assert len(dataset.keys()) == 3
            assert len(dataset.labels) == dim
            assert isinstance(dataset.maps, str)
            assert request_mocker.url_count == url_count
            assert dataset.description != ''

    with pytest.raises(ValueError):
        atlas.fetch_atlas_difumo(data_dir=str(tmp_path),
                                 dimension=42,
                                 resolution_mm=3)
        atlas.fetch_atlas_difumo(data_dir=str(tmp_path),
                                 dimension=128,
                                 resolution_mm=3.14)
Example #6
0
def test_fetch_atlas_msdl(tmp_path, request_mocker):
    labels = pd.DataFrame(
        {"x": [1.5, 1.2], "y": [1.5, 1.3],
         "z": [1.5, 1.4], "name": ["Aud", "DMN"], "net_name": ["Aud", "DMN"]})
    root = Path("MSDL_rois")
    archive = {root / "msdl_rois_labels.csv": labels.to_csv(index=False),
               root / "msdl_rois.nii": "",
               root / "README.txt": ""}
    request_mocker.url_mapping["*MSDL_rois.zip"] = dict_to_archive(
        archive, "zip")
    dataset = atlas.fetch_atlas_msdl(data_dir=tmp_path, verbose=0)
    assert isinstance(dataset.labels, list)
    assert isinstance(dataset.region_coords, list)
    assert isinstance(dataset.networks, list)
    assert isinstance(dataset.maps, str)
    assert request_mocker.url_count == 1
    assert dataset.description != ''
Example #7
0
def _adhd_metadata():
    sub1 = [3902469, 7774305, 3699991]
    sub2 = [2014113, 4275075, 1019436,
            3154996, 3884955, 27034,
            4134561, 27018, 6115230,
            27037, 8409791, 27011]
    sub3 = [3007585, 8697774, 9750701,
            10064, 21019, 10042,
            10128, 2497695, 4164316,
            1552181, 4046678, 23012]
    sub4 = [1679142, 1206380, 23008,
            4016887, 1418396, 2950754,
            3994098, 3520880, 1517058,
            9744150, 1562298, 3205761, 3624598]
    subs = pd.DataFrame({"Subject": sub1 + sub2 + sub3 + sub4})
    return dict_to_archive(
        {"ADHD200_40subs_motion_parameters_and_phenotypics.csv":
         subs.to_csv(index=False)})
Example #8
0
def test_fetch_atlas_aal(tmp_path, request_mocker):
    metadata = (b"<?xml version='1.0' encoding='us-ascii'?>"
                b"<metadata></metadata>")
    archive_root = Path("aal", "atlas")
    aal_data = dict_to_archive({
        archive_root / "AAL.xml": metadata,
        archive_root / "AAL.nii": ""
    })

    request_mocker.url_mapping["*AAL_files*"] = aal_data
    dataset = atlas.fetch_atlas_aal(data_dir=tmp_path, verbose=0)
    assert isinstance(dataset.maps, str)
    assert isinstance(dataset.labels, list)
    assert isinstance(dataset.indices, list)
    assert request_mocker.url_count == 1

    with pytest.raises(ValueError,
                       match='The version of AAL requested "FLS33"'):
        atlas.fetch_atlas_aal(version="FLS33", data_dir=tmp_path, verbose=0)

    assert dataset.description != ''
def make_fake_data():
    n_voxels, n_components, n_studies, n_terms = 23, 8, 12, 9
    rng = np.random.default_rng(0)
    difumo_maps = rng.random((n_components, n_voxels))
    difumo_maps[rng.binomial(1, 0.3, size=difumo_maps.shape).astype(int)] = 0
    difumo_inverse_covariance = np.linalg.pinv(difumo_maps.dot(difumo_maps.T))
    difumo_maps = sparse.csr_matrix(difumo_maps)
    projections = rng.random((n_studies, n_components))
    term_projections = rng.random((n_terms, n_components))
    articles_info = pd.DataFrame({"pmid": np.arange(n_studies) + 100})
    articles_info["title"] = [
        f"title {pmid}" for pmid in articles_info["pmid"]
    ]
    articles_info["pubmed_url"] = [
        f"url {pmid}" for pmid in articles_info["pmid"]
    ]
    mask = np.zeros(4 * 3 * 5, dtype=int)
    mask[:n_voxels] = 1
    mask = mask.reshape((4, 3, 5))
    mask_img = nibabel.Nifti1Image(mask, np.eye(4))
    doc_freq = pd.DataFrame({
        "term": ["term_{i}" for i in range(n_terms)],
        "document_frequency": np.arange(n_terms),
    })
    with tempfile.TemporaryDirectory() as temp_dir:
        temp_dir = Path(temp_dir)
        sparse.save_npz(temp_dir / "difumo_maps.npz", difumo_maps)
        np.save(
            temp_dir / "difumo_inverse_covariance.npy",
            difumo_inverse_covariance,
        )
        np.save(temp_dir / "projections.npy", projections)
        np.save(temp_dir / "term_projections.npy", term_projections)
        articles_info.to_csv(temp_dir / "articles-info.csv", index=False)
        mask_img.to_filename(str(temp_dir / "mask.nii.gz"))
        doc_freq.to_csv(str(temp_dir / "document_frequencies.csv"),
                        index=False)
        archive = _testing.dict_to_archive(
            {"neuroquery_image_search_data": temp_dir})
    return archive
Example #10
0
def test_fetch_atlas_aal(version, archive_format, url_key, aal_archive_root,
                         tmp_path, request_mocker):
    metadata = "A\tB\tC\n"
    if version == 'SPM12':
        metadata = (b"<?xml version='1.0' encoding='us-ascii'?>"
                    b"<metadata><label><index>1</index>"
                    b"<name>A</name></label></metadata>")
    label_file = "AAL.xml" if version == 'SPM12' else "ROI_MNI_V4.txt"
    atlas_file = "AAL.nii" if version == 'SPM12' else "ROI_MNI_V4.nii"
    aal_data = dict_to_archive(
        {aal_archive_root / label_file: metadata,
         aal_archive_root / atlas_file: ""},
        archive_format=archive_format
    )
    request_mocker.url_mapping[f"*{url_key}*"] = aal_data
    dataset = atlas.fetch_atlas_aal(
        version=version, data_dir=tmp_path, verbose=0
    )
    assert isinstance(dataset.maps, str)
    assert isinstance(dataset.labels, list)
    assert isinstance(dataset.indices, list)
    assert request_mocker.url_count == 1
    assert dataset.description != ''