code: def parse_line(self, line_str):
          
          line_str = line_str.rstrip()
          if not line_str:
              return None  # empty line, EOF
          arr = self._split_line(line_str)
          # CHROM
          chrom = arr[0]
          # POS
          pos = int(arr[1])
          # IDS
          if arr[2] == ".":
              ids = []
          else:
              ids = arr[2].split(";")
          # REF
          ref = arr[3]
          # ALT
          alts = []
          if arr[4] != ".":
              for alt in arr[4].split(","):
                  alts.append(process_alt(self.header, ref, alt))
          # QUAL
          if arr[5] == ".":
              qual = None
          else:
              try:
                  qual = int(arr[5])
              except ValueError:  # try as float
                  qual = float(arr[5])
          # FILTER
          if arr[6] == ".":
              filt = []
          else:
              filt = arr[6].split(";")
          self._check_filters(filt, "FILTER")
          # INFO
          info = self._parse_info(arr[7], len(alts))
          if len(arr) == 9:
              raise exceptions.IncorrectVCFFormat("Expected 8 or 10+ columns, got 9!")
          elif len(arr) == 8:
              format_ = None
              calls = None
          else:
              # FORMAT
              format_ = arr[8].split(":")
              # sample/call columns
              calls = self._handle_calls(alts, format_, arr[8], arr)
          return record.Record(chrom, pos, ids, ref, alts, qual, filt, info, format_, calls)
docs: Parse line from file (including trailing line break) and return
          resulting Record