docs: def get_dssp_df_on_file(pdb_file, outfile=None, outdir=None, outext='_dssp.df', force_rerun=False):
      """Run DSSP directly on a structure file with the Biopython method Bio.PDB.DSSP.dssp_dict_from_pdb_file
  
      Avoids errors like: PDBException: Structure/DSSP mismatch at <Residue MSE het=  resseq=19 icode= >
      by not matching information to the structure file (DSSP fills in the ID "X" for unknown residues)
  
      Args:
          pdb_file: Path to PDB file
          outfile: Name of output file
          outdir: Path to output directory
          outext: Extension of output file
          force_rerun: If DSSP should be rerun if the outfile exists
  
      Returns:
          DataFrame: DSSP results summarized
  
      """
      # TODO: function unfinished
      # Create the output file name
      outfile = ssbio.utils.outfile_maker(inname=pdb_file, outname=outfile, outdir=outdir, outext=outext)
  
      if ssbio.utils.force_rerun(flag=force_rerun, outfile=outfile):
          try:
              d = dssp_dict_from_pdb_file(pdb_file)
          except Exception('DSSP failed to produce an output'):
              log.error('{}: unable to run DSSP'.format(pdb_file))
              return pd.DataFrame()
  
          appender = []
          # TODO: WARNING: d is slightly different than when using function get_dssp_df
          for k in d[1]:
              to_append = []
              y = d[0][k]
              chain = k[0]
              residue = k[1]
              het = residue[0]
              resnum = residue[1]
              icode = residue[2]
              to_append.extend([chain, resnum, icode])
              to_append.extend(y)
              appender.append(to_append)
  
          cols = ['chain', 'resnum', 'icode',
                  'dssp_index', 'aa', 'ss', 'exposure_rsa', 'phi', 'psi',
                  'NH_O_1_relidx', 'NH_O_1_energy', 'O_NH_1_relidx',
                  'O_NH_1_energy', 'NH_O_2_relidx', 'NH_O_2_energy',
                  'O_NH_2_relidx', 'O_NH_2_energy']
  
          df = pd.DataFrame.from_records(appender, columns=cols)
  
          # Adding additional columns
          df = df[df['aa'].isin(list(aa1))]
          df['aa_three'] = df['aa'].apply(one_to_three)
          df['max_acc'] = df['aa_three'].map(residue_max_acc['Sander'].get)
          df[['exposure_rsa', 'max_acc']] = df[['exposure_rsa', 'max_acc']].astype(float)
          df['exposure_asa'] = df['exposure_rsa'] * df['max_acc']
  
          df.to_csv(outfile)
      else:
          log.debug('{}: already ran DSSP and force_rerun={}, loading results'.format(outfile, force_rerun))
          df = pd.read_csv(outfile, index_col=0)
  
      return df