docs: def read_text(self, file_handle):
          """Parse the TEXT segment of the FCS file.
  
          The TEXT segment contains meta data associated with the FCS file.
          Converting all meta keywords to lower case.
          """
          header = self.annotation['__header__']  # For convenience
  
          #####
          # Read in the TEXT segment of the FCS file
          # There are some differences in how the
          file_handle.seek(header['text start'], 0)
          raw_text = file_handle.read(header['text end'] - header['text start'] + 1)
          try:
              raw_text = raw_text.decode(self._encoding)
          except UnicodeDecodeError as e:
              # Catching the exception and logging it in this way kills the traceback, but
              # we can worry about this later.
              logger.warning(u'Encountered an illegal utf-8 byte in the header.\n Illegal utf-8 '
                             u'characters will be ignored.\n{}'.format(e))
              raw_text = raw_text.decode(self._encoding, errors='ignore')
  
          text = self._extract_text_dict(raw_text)
  
          ##
          # Extract channel names and convert some of the channel properties
          # and other fields into numeric data types (from string)
          # Note: do not use regular expressions for manipulations here.
          # Regular expressions are too heavy in terms of computation time.
          pars = int(text['$PAR'])
          if '$P0B' in text.keys():  # Checking whether channel number count starts from 0 or from 1
              self.channel_numbers = range(0, pars)  # Channel number count starts from 0
          else:
              self.channel_numbers = range(1, pars + 1)  # Channel numbers start from 1
  
          # Extract parameter names
          try:
              names_n = tuple([text['$P{0}N'.format(i)] for i in self.channel_numbers])
          except KeyError:
              names_n = []
  
          try:
              names_s = tuple([text['$P{0}S'.format(i)] for i in self.channel_numbers])
          except KeyError:
              names_s = []
  
          self.channel_names_s = names_s
          self.channel_names_n = names_n
  
          # Convert some of the fields into integer values
          keys_encoding_bits = ['$P{0}B'.format(i) for i in self.channel_numbers]
  
          add_keys_to_convert_to_int = ['$NEXTDATA', '$PAR', '$TOT']
  
          keys_to_convert_to_int = keys_encoding_bits + add_keys_to_convert_to_int
  
          for key in keys_to_convert_to_int:
              value = text[key]
              text[key] = int(value)
  
          self.annotation.update(text)
  
          # Update data start segments if needed
  
          if self._data_start == 0:
              self._data_start = int(text['$BEGINDATA'])
          if self._data_end == 0:
              self._data_end = int(text['$ENDDATA'])