code: def _read_gaf_nts(self, fin_gaf, hdr_only, allow_missing_symbol):
          
          nts = []
          ver = None
          hdrobj = GafHdr()
          datobj = None
          # pylint: disable=not-callable
          ntobj_make = None
          get_gafvals = None
          lnum = -1
          line = ''
          try:
              with open(fin_gaf) as ifstrm:
                  for lnum, line in enumerate(ifstrm, 1):
                      # Read data
                      if get_gafvals:
                          # print(lnum, line)
                          gafvals = get_gafvals(line)
                          if gafvals:
                              nts.append(ntobj_make(gafvals))
                          else:
                              datobj.ignored.append((lnum, line))
                      # Read header
                      elif datobj is None:
                          if line[0] == '!':
                              if ver is None and line[1:13] == 'gaf-version:':
                                  ver = line[13:].strip()
                              hdrobj.chkaddhdr(line)
                          else:
                              self.hdr = hdrobj.get_hdr()
                              if hdr_only:
                                  return nts
                              datobj = GafData(ver, allow_missing_symbol)
                              get_gafvals = datobj.get_gafvals
                              ntobj_make = datobj.get_ntobj()._make
          except Exception as inst:
              import traceback
              traceback.print_exc()
              sys.stderr.write("\n  **FATAL-gaf: {MSG}\n\n".format(MSG=str(inst)))
              sys.stderr.write("**FATAL-gaf: {FIN}[{LNUM}]:\n{L}".format(FIN=fin_gaf, L=line, LNUM=lnum))
              if datobj is not None:
                  datobj.prt_line_detail(sys.stdout, line)
              sys.exit(1)
          self.datobj = datobj
          return nts
docs: Read GAF file. Store annotation data in a list of namedtuples.