code: def _init_id2gos(assoc_fn):  ##, no_top=False):
          
          assoc = cx.defaultdict(set)
          ## top_terms = set(['GO:0008150', 'GO:0003674', 'GO:0005575']) # BP, MF, CC
          for row in open(assoc_fn, 'r'):
              atoms = row.split()
              if len(atoms) == 2:
                  gene_id, go_terms = atoms
              elif len(atoms) > 2 and row.count('\t') == 1:
                  gene_id, go_terms = row.split("\t")
              else:
                  continue
              gos = set(go_terms.split(";"))
              ## if no_top:
              ##     gos = gos.difference(top_terms)
              assoc[gene_id] |= gos
          return assoc
docs: Reads a gene id go term association file. The format of the file
          is as follows:
  
          AAR1	GO:0005575;GO:0003674;GO:0006970;GO:0006970;GO:0040029
          AAR2	GO:0005575;GO:0003674;GO:0040029;GO:0009845
          ACD5	GO:0005575;GO:0003674;GO:0008219
          ACL1	GO:0005575;GO:0003674;GO:0009965;GO:0010073
          ACL2	GO:0005575;GO:0003674;GO:0009826
          ACL3	GO:0005575;GO:0003674;GO:0009826;GO:0009965
  
          Also, the following format is accepted (gene ids are repeated):
  
          AAR1	GO:0005575
          AAR1    GO:0003674
          AAR1    GO:0006970
          AAR2	GO:0005575
          AAR2    GO:0003674
          AAR2    GO:0040029
  
          :param assoc_fn: file name of the association
          :return: dictionary having keys: gene id, values set of GO terms