docs: def process_common_disease_file(self, raw, unpadded_doids, limit=None):
          """
          Make disaese-phenotype associations.
          Some identifiers need clean up:
          * DOIDs are listed as DOID-DOID: --> DOID:
          * DOIDs may be unnecessarily zero-padded.
          these are remapped to their non-padded equivalent.
  
          :param raw:
          :param unpadded_doids:
          :param limit:
          :return:
  
          """
          if self.test_mode:
              graph = self.testgraph
          else:
              graph = self.graph
  
          assoc_count = 0
          replace_id_flag = False
          col = self.small_files['columns']
  
          with open(raw, 'r', encoding="utf8") as tsvfile:
              reader = csv.reader(tsvfile, delimiter='\t', quotechar='\"')
              header = tsvfile.readline()
              if header != col:
                  LOG.error("HEADER: has changed in %s.", raw)
                  raise ValueError(col - header)
  
              disease_id = None
              for row in reader:
                  row = [str(x).strip() for x in row]
  
                  did = row[col.index('Disease ID')]
                  # genotype = row[col.index('Genotype')]
                  phenotype_id = row[col.index('Phenotype ID')]
                  age_of_onset_id = row[col.index('Age of Onset ID')]
                  eid = row[col.index('Evidence ID')]
                  frequency = row[col.index('Frequency')]
                  negation_id = row[col.index('Negation ID')]
                  description = row[col.index('Description')]
                  pub_ids = row[col.index('Pub')]
  
                  disease_id = re.sub(r'DO(ID)?[-\:](DOID:)?', 'DOID:', did)
                  disease_id = re.sub(r'MESH-', 'MESH:', disease_id)
  
                  if not re.search(r'(DOID\:|MESH\:\w)\d+', disease_id):
                      LOG.warning("Invalid id format: %s", disease_id)
  
                  # figure out if the doid should be unpadded,
                  # then use the unpadded version instead
                  if re.match(r'DOID', disease_id):
                      unpadded_num = re.sub(r'DOID:', '', disease_id)
                      unpadded_num = unpadded_num.lstrip('0')
                      if unpadded_num in unpadded_doids:
                          fixed_id = 'DOID:' + unpadded_num
                          replace_id_flag = True
                          disease_id = fixed_id.strip()
  
                  if self.test_mode and disease_id not in self.test_ids:
                      # since these are broken up into disease-by-disease,
                      # just skip the whole file
                      return 0
  
                  if negation_id != '':
                      continue  # TODO add negative associations
  
                  if disease_id != '' and phenotype_id != '':
                      assoc = D2PAssoc(
                          graph, self.name, disease_id, phenotype_id.strip())
                      if age_of_onset_id != '':
                          assoc.onset = age_of_onset_id
                      if frequency != '':
                          assoc.frequency = frequency
                      eco_id = self.localtt[eid]
                      if eco_id is None:
                          eco_id = self.localtt['ITM']
  
                      assoc.add_evidence(eco_id)
                      # TODO add sex? - not in dataset yet
                      if description != '':
                          assoc.set_description(description)
                      if pub_ids != '':
                          for pub in pub_ids.split(';'):
                              pub = re.sub(r'  *', '', pub)  # fixed now but just in case
  
                              # there have been several malformed PMIDs curies
                              if pub[:4] != 'http' and \
                                      graph.curie_regexp.fullmatch(pub) is None:
                                  LOG.warning(
                                      'Record %s has a malformed Pub %s', did, pub)
                                  continue
  
                              if re.search(
                                      r'(DOID|MESH)', pub) or re.search(
                                          r'Disease name contained', description):
                                  # skip "pubs" that are derived from
                                  # the classes themselves
                                  continue
                              assoc.add_source(pub.strip())
                      # TODO assigned by?
  
                      assoc.add_association_to_graph()
                      assoc_count += 1
  
                  if not self.test_mode and limit is not None\
                          and reader.line_num > limit:
                      break
  
              if replace_id_flag:
                  LOG.info("replaced DOID with unpadded version")
                  self.replaced_id_count += 1
              LOG.info(
                  "Added %d associations for %s.", assoc_count, disease_id)
          return assoc_count