Repository: nilearn/nilearn

Issue:
Ensure  `fetch_atlas_*` functions returns one atlas map only
<!--Provide a brief description what you would like changes and why.-->
Some of the possibly older multiscale atlas fetcher is slightly inconsistent with how the later implemented ones
For example, `nilearn.dataset.fetch_atlas_basc_multiscale_2015` would return all resolutions:
https://github.com/nilearn/nilearn/blob/2fd6665664f27dfbf1f10aeeba660adc9b560361/nilearn/datasets/atlas.py#L965-L972

Craddock returns all atlas construction methods
https://github.com/nilearn/nilearn/blob/1607b52458c28953a87bbe6f42448b7b4e30a72f/nilearn/datasets/atlas.py#L142-L148

For some latter implemented ones - Difumo would require resolution to be specified:
https://github.com/nilearn/nilearn/blob/1607b52458c28953a87bbe6f42448b7b4e30a72f/nilearn/datasets/atlas.py#L46-L58

Julich needs atlas name:
https://github.com/nilearn/nilearn/blob/1607b52458c28953a87bbe6f42448b7b4e30a72f/nilearn/datasets/atlas.py#L363-L370

<!--Please fill in the following information, to the best of your ability.-->
### Benefits to the change
Improve consistency. Ensuring `fetch_atlas_*` functions only return one atlas map would be more intuitive. 
I hope the atlas path will be under the label `maps`, so it's consistent amongst atlas fetchers.

### Pseudocode for the new behavior, if applicable

Using `nilearn.dataset.fetch_atlas_basc_multiscale_2015` as an example:
```python
>> parcellations = fetch_atlas_basc_multiscale_2015(resolution=None)  # old behaviour
>> parcellations.keys()
dict_keys(['scale007', 'scale012', 'scale020', 'scale036', 'scale064', 'scale122', 'scale197', 'scale325', 'scale444', 'description'])
>>parcellations.scale007
'/path/to/nilearn_data/basc_multiscale_2015/template_cambridge_basc_multiscale_nii_sym/template_cambridge_basc_multiscale_sym_scale007.nii.gz'


>> parcellation = fetch_atlas_basc_multiscale_2015(resolution=7) 
>> parcellation.keys()
dict_keys(['maps', 'description'])
>> parcellations.map
'/path/to/nilearn_data/basc_multiscale_2015/template_cambridge_basc_multiscale_nii_sym/template_cambridge_basc_multiscale_sym_scale007.nii.gz'
```
Are there any other older atlas fetcher that I am missing here?
Happy to do the PR!


Discussion:
I think it makes sense as it would increase consistency across fetchers.
Happy to review the PR! :)
Indeed ! A related point is that the terminology is a bit noisy, where we alternatively talk about 'scale', 'dimension', 'resolution'. Having a more unified terminology would help too.
Thx !
> Indeed ! A related point is that the terminology is a bit noisy, where we alternatively talk about 'scale', 'dimension', 'resolution'. Having a more unified terminology would help too. Thx !

Good point, especially given the contribution guideline now has some explicit requirements for atlas fetchers:
https://nilearn.github.io/stable/development.html#how-to-contribute-an-atlas
@bthirion I can work on this
Thx @achamma723, that would be great!

Resolving patch:
diff --git a/nilearn/datasets/atlas.py b/nilearn/datasets/atlas.py
--- a/nilearn/datasets/atlas.py
+++ b/nilearn/datasets/atlas.py
@@ -12,7 +12,6 @@
 import nibabel as nb
 import numpy as np
 import pandas as pd
-from numpy.lib import recfunctions
 import re
 from sklearn.utils import Bunch
 
@@ -36,7 +35,8 @@ def fetch_atlas_difumo(dimension=64, resolution_mm=2, data_dir=None,
 
     Dictionaries of Functional Modes, or “DiFuMo”, can serve as
     :term:`probabilistic atlases<Probabilistic atlas>` to extract
-    functional signals with different dimensionalities (64, 128, 256, 512, and 1024).
+    functional signals with different dimensionalities (64, 128,
+    256, 512, and 1024).
     These modes are optimized to represent well raw :term:`BOLD` timeseries,
     over a with range of experimental conditions.
     See :footcite:`Dadi2020`.
@@ -139,13 +139,12 @@ def fetch_atlas_difumo(dimension=64, resolution_mm=2, data_dir=None,
 
     fdescr = _get_dataset_descr(dataset_name)
 
-    params = dict(description=fdescr, maps=files_[1], labels=labels)
-
-    return Bunch(**params)
+    return Bunch(description=fdescr, maps=files_[1], labels=labels)
 
 
 @fill_doc
-def fetch_atlas_craddock_2012(data_dir=None, url=None, resume=True, verbose=1):
+def fetch_atlas_craddock_2012(data_dir=None, url=None, resume=True,
+                              verbose=1, homogeneity=None, grp_mean=True):
     """Download and return file names for the Craddock 2012 parcellation.
 
     This function returns a :term:`probabilistic atlas<Probabilistic atlas>`.
@@ -163,6 +162,11 @@ def fetch_atlas_craddock_2012(data_dir=None, url=None, resume=True, verbose=1):
     %(url)s
     %(resume)s
     %(verbose)s
+    homogeneity: :obj:`str`, optional
+        The choice of the homogeneity ('spatial' or 'temporal' or 'random')
+    grp_mean: :obj:`bool`, optional
+        The choice of the parcellation (with group_mean or without)
+        Default=True.
 
     Returns
     -------
@@ -181,6 +185,14 @@ def fetch_atlas_craddock_2012(data_dir=None, url=None, resume=True, verbose=1):
               parcellation obtained with random clustering.
             - 'description': :obj:`str`, general description of the dataset.
 
+    Warns
+    -----
+    FutureWarning
+        If an homogeneity input is provided, the current behavior
+        (returning multiple maps) is deprecated.
+        Starting in version 0.13, one map will be returned depending on
+        the homogeneity value.
+
     References
     ----------
     .. footbibliography::
@@ -192,25 +204,45 @@ def fetch_atlas_craddock_2012(data_dir=None, url=None, resume=True, verbose=1):
     opts = {'uncompress': True}
 
     dataset_name = "craddock_2012"
+
     keys = ("scorr_mean", "tcorr_mean",
             "scorr_2level", "tcorr_2level",
             "random")
     filenames = [
-            ("scorr05_mean_all.nii.gz", url, opts),
-            ("tcorr05_mean_all.nii.gz", url, opts),
-            ("scorr05_2level_all.nii.gz", url, opts),
-            ("tcorr05_2level_all.nii.gz", url, opts),
-            ("random_all.nii.gz", url, opts)
+        ("scorr05_mean_all.nii.gz", url, opts),
+        ("tcorr05_mean_all.nii.gz", url, opts),
+        ("scorr05_2level_all.nii.gz", url, opts),
+        ("tcorr05_2level_all.nii.gz", url, opts),
+        ("random_all.nii.gz", url, opts)
     ]
 
     data_dir = _get_dataset_dir(dataset_name, data_dir=data_dir,
                                 verbose=verbose)
+
     sub_files = _fetch_files(data_dir, filenames, resume=resume,
                              verbose=verbose)
 
     fdescr = _get_dataset_descr(dataset_name)
 
-    params = dict([('description', fdescr)] + list(zip(keys, sub_files)))
+    if homogeneity:
+        if homogeneity in ['spatial', 'temporal']:
+            if grp_mean:
+                filename = [(homogeneity[0] + "corr05_mean_all.nii.gz",
+                            url, opts)]
+            else:
+                filename = [(homogeneity[0]
+                            + "corr05_2level_all.nii.gz", url, opts)]
+        else:
+            filename = [("random_all.nii.gz", url, opts)]
+        data = _fetch_files(data_dir, filename, resume=resume, verbose=verbose)
+        params = dict(map=data[0], description=fdescr)
+    else:
+        params = dict([('description', fdescr)] + list(zip(keys, sub_files)))
+        warnings.warn(category=FutureWarning,
+                      message="The default behavior of the function will "
+                              "be deprecated and replaced in release 0.13 "
+                              "to use the new parameters homogeneity "
+                              "and grp_mean.")
 
     return Bunch(**params)
 
@@ -531,11 +563,12 @@ def fetch_atlas_juelich(atlas_name, data_dir=None,
     if is_probabilistic and symmetric_split:
         raise ValueError("Region splitting not supported for probabilistic "
                          "atlases")
-    atlas_img, atlas_filename, names, _ = _get_atlas_data_and_labels("Juelich",
-                                                     atlas_name,
-                                                     data_dir=data_dir,
-                                                     resume=resume,
-                                                     verbose=verbose)
+    atlas_img, atlas_filename, names, _ = \
+        _get_atlas_data_and_labels("Juelich",
+                                   atlas_name,
+                                   data_dir=data_dir,
+                                   resume=resume,
+                                   verbose=verbose)
     atlas_niimg = check_niimg(atlas_img)
     atlas_data = get_data(atlas_niimg)
 
@@ -811,8 +844,9 @@ def fetch_coords_power_2011(legacy_format=True):
 
 
 @fill_doc
-def fetch_atlas_smith_2009(data_dir=None, mirror='origin', url=None,
-                           resume=True, verbose=1):
+def fetch_atlas_smith_2009(data_dir=None, url=None, resume=True,
+                           verbose=1, mirror='origin', dimension=None,
+                           resting=True):
     """Download and load the Smith :term:`ICA` and BrainMap
     :term:`Probabilistic atlas` (2009).
 
@@ -821,13 +855,19 @@ def fetch_atlas_smith_2009(data_dir=None, mirror='origin', url=None,
     Parameters
     ----------
     %(data_dir)s
+    %(url)s
+    %(resume)s
+    %(verbose)s
     mirror : :obj:`str`, optional
         By default, the dataset is downloaded from the original website of the
         atlas. Specifying "nitrc" will force download from a mirror, with
         potentially higher bandwidth. Default='origin'.
-    %(url)s
-    %(resume)s
-    %(verbose)s
+    dimension: :obj:`int`, optional
+        Number of dimensions in the dictionary. Valid resolutions
+        available are {10, 20, 70}.
+    resting: :obj:`bool`, optional
+        Either to fetch the resting-:term:`fMRI` or BrainMap components
+        Default=True.
 
     Returns
     -------
@@ -856,6 +896,14 @@ def fetch_atlas_smith_2009(data_dir=None, mirror='origin', url=None,
               The shape of the image is ``(91, 109, 91, 70)``.
             - 'description': :obj:`str`, description of the atlas.
 
+    Warns
+    -----
+    FutureWarning
+        If a dimension input is provided, the current behavior
+        (returning multiple maps) is deprecated.
+        Starting in version 0.13, one map will be returned depending on
+        the dimension value.
+
     References
     ----------
     .. footbibliography::
@@ -871,42 +919,55 @@ def fetch_atlas_smith_2009(data_dir=None, mirror='origin', url=None,
             url = "http://www.fmrib.ox.ac.uk/datasets/brainmap+rsns/"
         elif mirror == 'nitrc':
             url = [
-                    'https://www.nitrc.org/frs/download.php/7730/',
-                    'https://www.nitrc.org/frs/download.php/7729/',
-                    'https://www.nitrc.org/frs/download.php/7731/',
-                    'https://www.nitrc.org/frs/download.php/7726/',
-                    'https://www.nitrc.org/frs/download.php/7728/',
-                    'https://www.nitrc.org/frs/download.php/7727/',
+                'https://www.nitrc.org/frs/download.php/7730/',
+                'https://www.nitrc.org/frs/download.php/7729/',
+                'https://www.nitrc.org/frs/download.php/7731/',
+                'https://www.nitrc.org/frs/download.php/7726/',
+                'https://www.nitrc.org/frs/download.php/7728/',
+                'https://www.nitrc.org/frs/download.php/7727/',
             ]
         else:
             raise ValueError('Unknown mirror "%s". Mirror must be "origin" '
-                'or "nitrc"' % str(mirror))
+                             'or "nitrc"' % str(mirror))
 
-    files = [
-            'rsn20.nii.gz',
-            'PNAS_Smith09_rsn10.nii.gz',
-            'rsn70.nii.gz',
-            'bm20.nii.gz',
-            'PNAS_Smith09_bm10.nii.gz',
-            'bm70.nii.gz'
-    ]
+    files = {
+        'rsn20': 'rsn20.nii.gz',
+        'rsn10': 'PNAS_Smith09_rsn10.nii.gz',
+        'rsn70': 'rsn70.nii.gz',
+        'bm20': 'bm20.nii.gz',
+        'bm10': 'PNAS_Smith09_bm10.nii.gz',
+        'bm70': 'bm70.nii.gz'
+    }
 
     if isinstance(url, str):
         url = [url] * len(files)
 
-    files = [(f, u + f, {}) for f, u in zip(files, url)]
-
     dataset_name = 'smith_2009'
     data_dir = _get_dataset_dir(dataset_name, data_dir=data_dir,
                                 verbose=verbose)
-    files_ = _fetch_files(data_dir, files, resume=resume,
-                          verbose=verbose)
 
     fdescr = _get_dataset_descr(dataset_name)
 
-    keys = ['rsn20', 'rsn10', 'rsn70', 'bm20', 'bm10', 'bm70']
-    params = dict(zip(keys, files_))
-    params['description'] = fdescr
+    if dimension:
+        key = f"{'rsn' if resting else 'bm'}{dimension}"
+        key_index = list(files).index(key)
+
+        file = [(files[key], url[key_index] + files[key], {})]
+        data = _fetch_files(data_dir, file, resume=resume,
+                            verbose=verbose)
+        params = Bunch(map=data[0], description=fdescr)
+    else:
+        keys = list(files.keys())
+        files = [(f, u + f, {}) for f, u in zip(files.values(), url)]
+        files_ = _fetch_files(data_dir, files, resume=resume,
+                              verbose=verbose)
+        params = dict(zip(keys, files_))
+        params['description'] = fdescr
+        warnings.warn(category=FutureWarning,
+                      message="The default behavior of the function will "
+                              "be deprecated and replaced in release 0.13 "
+                              "to use the new parameters dimension and "
+                              "resting.")
 
     return Bunch(**params)
 
@@ -996,7 +1057,7 @@ def fetch_atlas_yeo_2011(data_dir=None, url=None, resume=True, verbose=1):
                  for f in basenames]
 
     data_dir = _get_dataset_dir(dataset_name, data_dir=data_dir,
-            verbose=verbose)
+                                verbose=verbose)
     sub_files = _fetch_files(data_dir, filenames, resume=resume,
                              verbose=verbose)
 
@@ -1139,8 +1200,9 @@ def fetch_atlas_aal(version='SPM12', data_dir=None, url=None, resume=True,
 
 
 @fill_doc
-def fetch_atlas_basc_multiscale_2015(version='sym', data_dir=None, url=None,
-                                     resume=True, verbose=1):
+def fetch_atlas_basc_multiscale_2015(data_dir=None, url=None, resume=True,
+                                     verbose=1, resolution=None,
+                                     version='sym'):
     """Downloads and loads multiscale functional brain parcellations.
 
     This :term:`Deterministic atlas` includes group brain parcellations
@@ -1148,11 +1210,11 @@ def fetch_atlas_basc_multiscale_2015(version='sym', data_dir=None, url=None,
     :term:`functional magnetic resonance images<fMRI>` from about 200 young
     healthy subjects.
 
-    Multiple scales (number of networks) are available, among
+    Multiple resolutions (number of networks) are available, among
     7, 12, 20, 36, 64, 122, 197, 325, 444. The brain parcellations
     have been generated using a method called bootstrap analysis of
     stable clusters called as BASC :footcite:`Bellec2010`,
-    and the scales have been selected using a data-driven method
+    and the resolutions have been selected using a data-driven method
     called MSTEPS :footcite:`Bellec2013`.
 
     Note that two versions of the template are available, 'sym' or 'asym'.
@@ -1169,14 +1231,17 @@ def fetch_atlas_basc_multiscale_2015(version='sym', data_dir=None, url=None,
 
     Parameters
     ----------
-    version : {'sym', 'asym'}, optional
-        Available versions are 'sym' or 'asym'. By default all scales of
-        brain parcellations of version 'sym' will be returned.
-        Default='sym'.
     %(data_dir)s
     %(url)s
     %(resume)s
     %(verbose)s
+    resolution: :ob:`int`, optional
+        Number of networks in the dictionary. Valid resolutions
+        available are {7, 12, 20, 36, 64, 122, 197, 325, 444}
+    version : {'sym', 'asym'}, optional
+        Available versions are 'sym' or 'asym'. By default all scales of
+        brain parcellations of version 'sym' will be returned.
+        Default='sym'.
 
     Returns
     -------
@@ -1190,6 +1255,14 @@ def fetch_atlas_basc_multiscale_2015(version='sym', data_dir=None, url=None,
           values from 0 to the selected number of networks (scale).
         - "description": :obj:`str`, details about the data release.
 
+    Warns
+    -----
+    FutureWarning
+        If a resolution input is provided, the current behavior
+        (returning multiple maps) is deprecated.
+        Starting in version 0.13, one map will be returned depending on
+        the resolution value.
+
     References
     ----------
     .. footbibliography::
@@ -1206,32 +1279,47 @@ def fetch_atlas_basc_multiscale_2015(version='sym', data_dir=None, url=None,
                          'does not exist. Please choose one among them %s.' %
                          (version, str(versions)))
 
-    keys = ['scale007', 'scale012', 'scale020', 'scale036', 'scale064',
-            'scale122', 'scale197', 'scale325', 'scale444']
-
     if version == 'sym':
         url = "https://ndownloader.figshare.com/files/1861819"
     elif version == 'asym':
         url = "https://ndownloader.figshare.com/files/1861820"
     opts = {'uncompress': True}
 
+    keys = ['scale007', 'scale012', 'scale020', 'scale036', 'scale064',
+            'scale122', 'scale197', 'scale325', 'scale444']
+
     dataset_name = "basc_multiscale_2015"
     data_dir = _get_dataset_dir(dataset_name, data_dir=data_dir,
                                 verbose=verbose)
 
     folder_name = 'template_cambridge_basc_multiscale_nii_' + version
-    basenames = ['template_cambridge_basc_multiscale_' + version +
-                 '_' + key + '.nii.gz' for key in keys]
-
-    filenames = [(os.path.join(folder_name, basename), url, opts)
-                 for basename in basenames]
-    data = _fetch_files(data_dir, filenames, resume=resume, verbose=verbose)
+    fdescr = _get_dataset_descr(dataset_name)
 
-    descr = _get_dataset_descr(dataset_name)
+    if resolution:
+        basename = 'template_cambridge_basc_multiscale_' + version + \
+            f'_scale{resolution:03}' + '.nii.gz'
 
-    params = dict(zip(keys, data))
-    params['description'] = descr
+        filename = [(os.path.join(folder_name, basename), url, opts)]
 
+        data = _fetch_files(data_dir, filename, resume=resume, verbose=verbose)
+        params = Bunch(map=data[0], description=fdescr)
+    else:
+        basenames = ['template_cambridge_basc_multiscale_' + version +
+                     '_' + key + '.nii.gz' for key in keys]
+        filenames = [(os.path.join(folder_name, basename), url, opts)
+                     for basename in basenames]
+        data = _fetch_files(data_dir, filenames, resume=resume,
+                            verbose=verbose)
+
+        descr = _get_dataset_descr(dataset_name)
+
+        params = dict(zip(keys, data))
+        params['description'] = descr
+        warnings.warn(category=FutureWarning,
+                      message="The default behavior of the function will "
+                              "be deprecated and replaced in release 0.13 "
+                              "to use the new parameters resolution and "
+                              "and version.")
     return Bunch(**params)
 
 
@@ -1548,7 +1636,7 @@ def fetch_atlas_surf_destrieux(data_dir=None, url=None,
     annot_left = nb.freesurfer.read_annot(annots[0])
     annot_right = nb.freesurfer.read_annot(annots[1])
 
-    return Bunch(labels=annot_left[2],  map_left=annot_left[0],
+    return Bunch(labels=annot_left[2], map_left=annot_left[0],
                  map_right=annot_right[0], description=fdescr)
 
 
@@ -1727,8 +1815,8 @@ def fetch_atlas_pauli_2017(version='prob', data_dir=None, verbose=1):
         url_maps = 'https://osf.io/5mqfx/download'
         filename = 'pauli_2017_det.nii.gz'
     else:
-        raise NotImplementedError('{} is no valid version for '.format(version) + \
-                                  'the Pauli atlas')
+        raise NotImplementedError(f'{version} is no valid version for '
+                                  + 'the Pauli atlas')
 
     url_labels = 'https://osf.io/6qrcb/download'
     dataset_name = 'pauli_2017'
@@ -1738,10 +1826,10 @@ def fetch_atlas_pauli_2017(version='prob', data_dir=None, verbose=1):
 
     files = [(filename,
               url_maps,
-              {'move':filename}),
+              {'move': filename}),
              ('labels.txt',
               url_labels,
-              {'move':'labels.txt'})]
+              {'move': 'labels.txt'})]
     atlas_file, labels = _fetch_files(data_dir, files)
 
     labels = np.loadtxt(labels, dtype=str)[:, 1].tolist()
@@ -1849,7 +1937,8 @@ def fetch_atlas_schaefer_2018(n_rois=400, yeo_networks=7, resolution_mm=1,
                          "options: {}".format(n_rois, valid_n_rois))
     if yeo_networks not in valid_yeo_networks:
         raise ValueError("Requested yeo_networks={} not available. Valid "
-                         "options: {}".format(yeo_networks,valid_yeo_networks))
+                         "options: {}".format(yeo_networks,
+                                              valid_yeo_networks))
     if resolution_mm not in valid_resolution_mm:
         raise ValueError("Requested resolution_mm={} not available. Valid "
                          "options: {}".format(resolution_mm,


Test patch:
diff --git a/nilearn/datasets/tests/test_atlas.py b/nilearn/datasets/tests/test_atlas.py
--- a/nilearn/datasets/tests/test_atlas.py
+++ b/nilearn/datasets/tests/test_atlas.py
@@ -263,6 +263,25 @@ def test_fetch_atlas_craddock_2012(tmp_path, request_mocker):
     local_archive = Path(
         __file__).parent / "data" / "craddock_2011_parcellations.tar.gz"
     request_mocker.url_mapping["*craddock*"] = local_archive
+    bunch = atlas.fetch_atlas_craddock_2012(data_dir=tmp_path,
+                                            verbose=0, homogeneity='spatial')
+    bunch_rand = atlas.fetch_atlas_craddock_2012(data_dir=tmp_path,
+                                                 verbose=0,
+                                                 homogeneity='random')
+    bunch_no_mean = atlas.fetch_atlas_craddock_2012(data_dir=tmp_path,
+                                                    verbose=0,
+                                                    grp_mean=False,
+                                                    homogeneity='spatial')
+    assert request_mocker.url_count == 1
+    assert bunch['map'] == str(tmp_path / 'craddock_2012'
+                               / 'scorr05_mean_all.nii.gz')
+    assert bunch_rand['map'] == str(tmp_path / 'craddock_2012'
+                                    / 'random_all.nii.gz')
+    assert bunch_no_mean['map'] == str(tmp_path / 'craddock_2012'
+                                       / 'scorr05_2level_all.nii.gz')
+    assert bunch.description != ''
+
+    # Old code
     bunch = atlas.fetch_atlas_craddock_2012(data_dir=tmp_path,
                                             verbose=0)
 
@@ -283,6 +302,13 @@ def test_fetch_atlas_craddock_2012(tmp_path, request_mocker):
 
 
 def test_fetch_atlas_smith_2009(tmp_path, request_mocker):
+    bunch = atlas.fetch_atlas_smith_2009(data_dir=tmp_path, verbose=0,
+                                         dimension=20)
+    assert bunch['map'] == str(tmp_path / 'smith_2009' / 'rsn20.nii.gz')
+    assert len(bunch.keys()) == 2
+    assert bunch.description != ''
+
+    # Old code
     bunch = atlas.fetch_atlas_smith_2009(data_dir=tmp_path, verbose=0)
 
     keys = ("rsn20", "rsn10", "rsn70",
@@ -412,7 +438,8 @@ def test_fetch_atlas_difumo(tmp_path, request_mocker):
              "CSF": ["" for _ in range(dim)]}
         )
         root = Path("{0}".format(dim))
-        archive = {root / "labels_{0}_dictionary.csv".format(dim): labels.to_csv(index=False),
+        archive = {root / "labels_{0}_dictionary.csv".format(dim):
+                          labels.to_csv(index=False),
                    root / "2mm" / "maps.nii.gz": "",
                    root / "3mm" / "maps.nii.gz": ""}
         request_mocker.url_mapping[url] = dict_to_archive(archive, "zip")
@@ -481,6 +508,40 @@ def test_fetch_atlas_aal_version_error(tmp_path, request_mocker):
 
 
 def test_fetch_atlas_basc_multiscale_2015(tmp_path, request_mocker):
+    # default version='sym',
+    data_sym = atlas.fetch_atlas_basc_multiscale_2015(data_dir=tmp_path,
+                                                      verbose=0, resolution=7)
+    # version='asym'
+    data_asym = atlas.fetch_atlas_basc_multiscale_2015(version='asym',
+                                                       verbose=0,
+                                                       data_dir=tmp_path,
+                                                       resolution=7)
+
+    dataset_name = 'basc_multiscale_2015'
+    name_sym = 'template_cambridge_basc_multiscale_nii_sym'
+    basename_sym = 'template_cambridge_basc_multiscale_sym_scale007.nii.gz'
+
+    assert data_sym['map'] == str(tmp_path / dataset_name / name_sym
+                                  / basename_sym)
+
+    name_asym = 'template_cambridge_basc_multiscale_nii_asym'
+    basename_asym = 'template_cambridge_basc_multiscale_asym_scale007.nii.gz'
+    assert data_asym['map'] == str(tmp_path / dataset_name / name_asym
+                                   / basename_asym)
+
+    assert len(data_sym) == 2
+    with pytest.raises(
+            ValueError,
+            match='The version of Brain parcellations requested "aym"'):
+        atlas.fetch_atlas_basc_multiscale_2015(version="aym",
+                                               data_dir=tmp_path,
+                                               verbose=0)
+
+    assert request_mocker.url_count == 2
+    assert data_sym.description != ''
+    assert data_asym.description != ''
+
+    # Old code
     # default version='sym',
     data_sym = atlas.fetch_atlas_basc_multiscale_2015(data_dir=tmp_path,
                                                       verbose=0)
@@ -556,9 +617,9 @@ def test_fetch_atlas_surf_destrieux(tmp_path, request_mocker, verbose=0):
     # Create mock annots
     for hemi in ('left', 'right'):
         nibabel.freesurfer.write_annot(
-                os.path.join(data_dir,
-                             '%s.aparc.a2009s.annot' % hemi),
-                np.arange(4), np.zeros((4, 5)), 5 * ['a'],)
+            os.path.join(data_dir,
+                         '%s.aparc.a2009s.annot' % hemi),
+            np.arange(4), np.zeros((4, 5)), 5 * ['a'],)
 
     bunch = atlas.fetch_atlas_surf_destrieux(data_dir=tmp_path, verbose=0)
     # Our mock annots have 4 labels