docs: def run_ppm_server(pdb_file, outfile, force_rerun=False):
      """Run the PPM server from OPM to predict transmembrane residues.
  
      Args:
          pdb_file (str): Path to PDB file
          outfile (str): Path to output HTML results file
          force_rerun (bool): Flag to rerun PPM if HTML results file already exists
  
      Returns:
          dict: Dictionary of information from the PPM run, including a link to download the membrane protein file
  
      """
      if ssbio.utils.force_rerun(outfile=outfile, flag=force_rerun):
          url = 'http://sunshine.phar.umich.edu/upload_file.php'
          files = {'userfile': open(pdb_file, 'rb')}
          r = requests.post(url, files=files)
          info = r.text
  
          # Save results in raw HTML format
          with open(outfile, 'w') as f:
              f.write(info)
  
      else:
          # Utilize existing saved results
          with open(outfile, 'r') as f:
              info = f.read()
  
      # Clean up the HTML stuff
      t = info.replace('\n', '')
      tt = t.replace('\r', '')
      ttt = tt.replace('\t', '')
  
      soup = BeautifulSoup(ttt, "lxml")
      # Find all tables in the HTML code
      tables = soup.find_all("table", attrs={"class": "data"})
  
      info_dict = {}
  
      # There are multiple tables with information
      table_index = 0
      for t in tables:
          data_index = 0
  
          # "row1" contains data
          for data in t.find_all('tr', attrs={"class": "row1"}):
              data_list = list(data.strings)
  
              if table_index == 0:
                  info_dict['Depth/Hydrophobic Thickness'] = data_list[0]
                  info_dict['deltaG_transfer'] = data_list[2]
                  info_dict['Tilt Angle'] = data_list[3]
  
              if table_index == 1 and data_index == 0:
                  info_dict['Embedded_residues_Tilt'] = data_list[0]
                  info_dict['Embedded_residues'] = data_list[1]
  
              if table_index == 1 and data_index == 1:
                  info_dict['Transmembrane_secondary_structure_segments_Tilt'] = data_list[0]
                  info_dict['Transmembrane_secondary_structure_segments'] = data_list[1]
  
              if table_index == 2:
                  info_dict['Output Messages'] = data_list[1]
  
              if table_index == 3:
                  baseurl = 'http://sunshine.phar.umich.edu/'
                  a = data.find('a', href=True)
                  download_url = baseurl + a['href'].replace('./', '')
                  info_dict['Output file download link'] = download_url
  
              data_index += 1
          table_index += 1
  
      return info_dict