code: def extract_landmarks(gtf, landmarks=ALL_LANDMARKS):
      
      if isinstance(gtf, str):
          _logger.info("Reading gtf file..")
          gtf = read_gtf(gtf)
          _logger.info("Done")
  
      _logger.info("Running landmark extractors..")
      # landmarks to a dictionary with a function
      assert isinstance(landmarks, (list, tuple, set, dict))
      if isinstance(landmarks, dict):
          landmarks = {k: _get_fun(v) for k, v in landmarks.items()}
      else:
          landmarks = {_to_string(fn_str): _get_fun(fn_str)
                       for fn_str in landmarks}
  
      r = {k: _validate_pos(v(gtf)) for k, v in landmarks.items()}
      _logger.info("Done!")
      return r
docs: Given an gene annotation GFF/GTF file,
  
      # Arguments
          gtf: File path or a loaded `pd.DataFrame` with columns:
      seqname, feature, start, end, strand
          landmarks: list or a dictionary of landmark extractors (function or name)
  
      # Note
          When landmark extractor names are used, they have to be implemented in
      the module `concise.preprocessing.position`
  
      # Returns
          Dictionary of pd.DataFrames with landmark positions
      (columns: seqname, position, strand)