docstr: Download files to folder and check their md5 checksums.
  
  To see all available datasets, please type "list" in data_names.
  
  Parameters
  ----------
  data_names : variable string
      Any number of Nifti1, bvals or bvecs files.
  out_dir : string, optional
      Output directory. (default current directory)
docstr_tok: ["Download","files","to","folder","and","check","their","md5","checksums",".","To","see","all","available","datasets",",","please","type","``","list","''","in","data_names",".","Parameters","--","--","--","--","--","data_names",":","variable","string","Any","number","of","Nifti1",",","bvals","or","bvecs","files",".","out_dir",":","string",",","optional","Output","directory",".","(","default","current","directory",")"]
code: def run(self, data_names, out_dir=""):
      """Download files to folder and check their md5 checksums.
  
      To see all available datasets, please type "list" in data_names.
  
      Parameters
      ----------
      data_names : variable string
          Any number of Nifti1, bvals or bvecs files.
      out_dir : string, optional
          Output directory. (default current directory)
  
      """
      if out_dir:
          dipy_home = os.environ.get("DIPY_HOME", None)
          os.environ["DIPY_HOME"] = out_dir
  
      available_data = FetchFlow.get_fetcher_datanames()
  
      data_names = [name.lower() for name in data_names]
  
      if "all" in data_names:
          for name, fetcher_function in available_data.items():
              logging.info("------------------------------------------")
              logging.info("Fetching at {0}".format(name))
              logging.info("------------------------------------------")
              fetcher_function()
  
      elif "list" in data_names:
          logging.info(
              "Please, select between the following data names:"
              " {0}".format(", ".join(available_data.keys()))
          )
  
      else:
          skipped_names = []
          for data_name in data_names:
              if data_name not in available_data.keys():
                  skipped_names.append(data_name)
                  continue
  
              logging.info("------------------------------------------")
              logging.info("Fetching at {0}".format(data_name))
              logging.info("------------------------------------------")
              available_data[data_name]()
  
          nb_success = len(data_names) - len(skipped_names)
          print("\n")
          logging.info(
              "Fetched {0} / {1} Files ".format(
                  nb_success, len(data_names)
              )
          )
          if skipped_names:
              logging.warn(
                  "Skipped data name(s):"
                  " {0}".format(" ".join(skipped_names))
              )
              logging.warn(
                  "Please, select between the following data"
                  " names: {0}".format(", ".join(available_data.keys()))
              )
  
      if out_dir:
          if dipy_home:
              os.environ["DIPY_HOME"] = dipy_home
          else:
              os.environ.pop("DIPY_HOME", None)
  
          # We load the module again so that if we run another one of these
          # in the same process, we don't have the env variable pointing
          # to the wrong place
          self.load_module("dipy.data.fetcher")
  
imports: import importlib
  import os
  import sys
  import logging
  from inspect import getmembers, isfunction
  import warnings
  import trx.trx_file_memmap
  import numpy
  from dipy.io.image import load_nifti, save_nifti
  from dipy.io.streamline import load_tractogram, save_tractogram
  from dipy.reconst.shm import convert_sh_descoteaux_tournier
  from dipy.tracking.streamlinespeed import length
  from dipy.utils.tractogram import concatenate_tractogram
  from dipy.workflows.workflow import Workflow
label_desc: Use image node_id 4 for calling the FetchFlow obj's underlying member method code with example usage: obj.run(data_names, out_dir) without return types