docs: def load_from_file(cfg_file):
      """Load the configuration from a file
  
  
      Parameters
      ----------
      cfg_file: str
          Path to configuration file
  
  
      Returns
      -------
      cfg : CaseInsensitiveDict
          Dictionary with configuration parameters
      """
      path = pathlib.Path(cfg_file).resolve()
      with path.open('r') as f:
          code = f.readlines()
  
      cfg = CaseInsensitiveDict()
      for line in code:
          # We deal with comments and empty lines
          # We need to check line length first and then we look for
          # a hash.
          line = line.split("#")[0].strip()
          if len(line) != 0:
              if line.startswith("[") and line.endswith("]"):
                  section = line[1:-1].lower()
                  if section not in cfg:
                      cfg[section] = CaseInsensitiveDict()
                  continue
              var, val = line.split("=", 1)
              var = var.strip().lower()
              val = val.strip("' ").strip('" ').strip()
              # convert parameter value to correct type
              if (section in dfn.config_funcs and
                      var in dfn.config_funcs[section]):
                  # standard parameter with known type
                  val = dfn.config_funcs[section][var](val)
              else:
                  # unknown parameter (e.g. plotting in Shape-Out), guess type
                  var, val = keyval_str2typ(var, val)
              if len(var) != 0 and len(str(val)) != 0:
                  cfg[section][var] = val
      return cfg