docs: def _read_frequency_data(self):
          """
          Parses frequencies, enthalpy, entropy, and mode vectors.
          """
          temp_dict = read_pattern(
              self.text, {
                  "frequencies":
                  r"\s*Frequency:\s+([\d\-\.]+)(?:\s+([\d\-\.]+)(?:\s+([\d\-\.]+))*)*",
                  "IR_intens":
                  r"\s*IR Intens:\s+([\d\-\.]+)(?:\s+([\d\-\.]+)(?:\s+([\d\-\.]+))*)*",
                  "IR_active":
                  r"\s*IR Active:\s+([YESNO]+)(?:\s+([YESNO]+)(?:\s+([YESNO]+))*)*",
                  "ZPE":
                  r"\s*Zero point vibrational energy:\s+([\d\-\.]+)\s+kcal/mol",
                  "trans_enthalpy":
                  r"\s*Translational Enthalpy:\s+([\d\-\.]+)\s+kcal/mol",
                  "rot_enthalpy":
                  r"\s*Rotational Enthalpy:\s+([\d\-\.]+)\s+kcal/mol",
                  "vib_enthalpy":
                  r"\s*Vibrational Enthalpy:\s+([\d\-\.]+)\s+kcal/mol",
                  "gas_constant":
                  r"\s*gas constant \(RT\):\s+([\d\-\.]+)\s+kcal/mol",
                  "trans_entropy":
                  r"\s*Translational Entropy:\s+([\d\-\.]+)\s+cal/mol\.K",
                  "rot_entropy":
                  r"\s*Rotational Entropy:\s+([\d\-\.]+)\s+cal/mol\.K",
                  "vib_entropy":
                  r"\s*Vibrational Entropy:\s+([\d\-\.]+)\s+cal/mol\.K",
                  "total_enthalpy":
                  r"\s*Total Enthalpy:\s+([\d\-\.]+)\s+kcal/mol",
                  "total_entropy":
                  r"\s*Total Entropy:\s+([\d\-\.]+)\s+cal/mol\.K"
              })
  
          keys = ["ZPE", "trans_enthalpy", "rot_enthalpy", "vib_enthalpy", "gas_constant", "trans_entropy", "rot_entropy", "vib_entropy", "total_enthalpy", "total_entropy"]
  
          for key in keys:
              if temp_dict.get(key) == None:
                  self.data[key] = None
              else:
                  self.data[key] = float(temp_dict.get(key)[0][0])
  
          if temp_dict.get('frequencies') == None:
              self.data['frequencies'] = None
              self.data['IR_intens'] = None
              self.data['IR_active'] = None
          else:
              temp_freqs = [
                  value for entry in temp_dict.get('frequencies')
                  for value in entry
              ]
              temp_intens = [
                  value for entry in temp_dict.get('IR_intens')
                  for value in entry
              ]
              active = [
                  value for entry in temp_dict.get('IR_active')
                  for value in entry
              ]
              self.data['IR_active'] = active
  
              freqs = np.zeros(len(temp_freqs) - temp_freqs.count('None'))
              for ii, entry in enumerate(temp_freqs):
                  if entry != 'None':
                      freqs[ii] = float(entry)
              self.data['frequencies'] = freqs
  
              intens = np.zeros(len(temp_intens) - temp_intens.count('None'))
              for ii, entry in enumerate(temp_intens):
                  if entry != 'None':
                      intens[ii] = float(entry)
              self.data['IR_intens'] = intens
  
              header_pattern = r"\s*Raman Active:\s+[YESNO]+\s+(?:[YESNO]+\s+)*X\s+Y\s+Z\s+(?:X\s+Y\s+Z\s+)*"
              table_pattern = r"\s*[a-zA-Z][a-zA-Z\s]\s*([\d\-\.]+)\s*([\d\-\.]+)\s*([\d\-\.]+)\s*(?:([\d\-\.]+)\s*([\d\-\.]+)\s*([\d\-\.]+)\s*(?:([\d\-\.]+)\s*([\d\-\.]+)\s*([\d\-\.]+))*)*"
              footer_pattern = r"TransDip\s+[\d\-\.]+\s*[\d\-\.]+\s*[\d\-\.]+\s*(?:[\d\-\.]+\s*[\d\-\.]+\s*[\d\-\.]+\s*)*"
              temp_freq_mode_vecs = read_table_pattern(
                  self.text, header_pattern, table_pattern, footer_pattern)
              freq_mode_vecs = np.zeros(
                  shape=(len(freqs), len(temp_freq_mode_vecs[0]), 3))
  
              for ii, triple_FMV in enumerate(temp_freq_mode_vecs):
                  for jj, line in enumerate(triple_FMV):
                      for kk, entry in enumerate(line):
                          if entry != 'None':
                              freq_mode_vecs[int(ii * 3 + math.floor(kk / 3)),
                                             jj, kk % 3] = float(entry)
  
              self.data["frequency_mode_vectors"] = freq_mode_vecs