docs: def merge_required_files(dirnames, out_dir):
      """Merges the required files from each of the directories.
  
      :param dirnames: the list of directories to merge data from.
      :param out_dir: the name of the output directory.
  
      :type dirnames: list
      :type out_dir: str
  
      """
      # The list of files to merge
      fn_to_merge = ("steps_summary.tex", "excluded_markers.txt",
                     "excluded_samples.txt")
  
      # Merging the files
      for fn in fn_to_merge:
          o_fn = os.path.join(out_dir, fn)
          with open(o_fn, "w") as o_file:
              for dn in dirnames:
                  i_fn = os.path.join(dn, fn)
                  with open(i_fn, "r") as i_file:
                      o_file.write(i_file.read())
  
      # Merging the result summary file
      o_fn = os.path.join(out_dir, "results_summary.txt")
      with open(o_fn, "w") as o_file:
          for i, dn in enumerate(dirnames):
              i_fn = os.path.join(dn, "results_summary.txt")
              with open(i_fn, "r") as i_file:
                  if i != 0:
                      # We skip the first 4 lines (file descriptions)
                      [i_file.readline() for i in range(4)]
                  o_file.write(i_file.read())
  
      # Merging the graphic paths file
      graphic_paths = set()
      for dn in dirnames:
          fn = os.path.join(dn, "graphic_paths.txt")
          if os.path.isfile(fn):
              with open(fn, "r") as i_file:
                  graphic_paths.update({
                      os.path.join(dn, path)
                      for path in i_file.read().splitlines()
                  })
      if len(graphic_paths) > 0:
          with open(os.path.join(out_dir, "graphic_paths.txt"), "w") as o_file:
              for path in sorted(graphic_paths):
                  print >>o_file, os.path.relpath(path, out_dir)