code: def _process_phenotype_cvterm(self):
          
  
          line_counter = 0
          raw = '/'.join((self.rawdir, 'phenotype_cvterm'))
          LOG.info("processing phenotype cvterm mappings")
  
          with open(raw, 'r') as f:
              f.readline()  # read the header row; skip
              filereader = csv.reader(f, delimiter='\t', quotechar='\"')
              for line in filereader:
                  line_counter += 1
  
                  (phenotype_cvterm_id, phenotype_id, cvterm_id, rank) = line
  
                  # 4532	8507	60793	0
                  # 4533	8513	60830	0
  
                  # add the internal genotype to pub mapping
                  phenotype_key = phenotype_id
                  cvterm_key = cvterm_id
                  phenotype_id = self.idhash['phenotype'][phenotype_key]
                  if cvterm_key in self.idhash['cvterm']:
                      cvterm_id = self.idhash['cvterm'][cvterm_key]
                      if phenotype_key not in self.phenocv:
                          self.phenocv[phenotype_id] = set()
                      self.phenocv[phenotype_id].add(cvterm_id)
                  else:
                      LOG.info("Not storing the cvterm info for %s", cvterm_key)
  
          return
docs: These are the qualifiers for the phenotype location itself.
          But are just the qualifiers.
          The actual "observable" part of the phenotype is only in
          the phenotype table. These get added to a lookup variable used to
          augment a phenotype association statement.
          :return: