docs: def get_interpretations3(self):
          """
          Used instead of update_pmag_tables in data model 3.0 to fetch
          interpretations from contribution objects
          """
          if "specimen" not in self.spec_data.columns or \
             "meas_step_min" not in self.spec_data.columns or \
             "meas_step_max" not in self.spec_data.columns or \
             "meas_step_unit" not in self.spec_data.columns or \
             "method_codes" not in self.spec_data.columns:
                 return
          if "dir_comp" in self.spec_data.columns:
              fnames = 'dir_comp'
          elif "dir_comp_name" in self.spec_data.columns:
              fnames = 'dir_comp_name'
          else:
              fnames = 'dir_comp'
              self.spec_data['dir_comp'] = 'Fit 1'
              #print("No specimen interpretation name found in specimens.txt")
              #return
          if "result_quality" not in self.spec_data.columns:
              self.spec_data["result_quality"] = "g"
          if "dir_tilt_correction" not in self.spec_data.columns:
              self.spec_data["dir_tilt_correction"] = ""
          fdict = self.spec_data[['specimen', fnames, 'meas_step_min', 'meas_step_max', 'meas_step_unit',
                                  'dir_tilt_correction', 'method_codes', 'result_quality']].to_dict("records")
          for i in range(len(fdict)):
              spec = fdict[i]['specimen']
              if spec not in self.specimens:
                  print(("-E- specimen %s does not exist in measurement data" % (spec)))
                  continue
              fname = fdict[i][fnames]
              if fname == None or (spec in list(self.pmag_results_data['specimens'].keys()) and fname in [x.name for x in self.pmag_results_data['specimens'][spec]]):
                  continue
              if fdict[i]['meas_step_unit'] == "K":
                  fmin = int(float(fdict[i]['meas_step_min'])-273)
                  fmax = int(float(fdict[i]['meas_step_max'])-273)
                  if fmin == 0:
                      fmin = str(fmin)
                  else:
                      fmin = str(fmin)+"C"
                  if fmax == 0:
                      fmax = str(fmax)
                  else:
                      fmax = str(fmax)+"C"
              elif fdict[i]['meas_step_unit'] == "T":
                  fmin = float(fdict[i]['meas_step_min'])*1000
                  fmax = float(fdict[i]['meas_step_max'])*1000
                  if fmin == 0:
                      fmin = str(int(fmin))
                  else:
                      fmin = str(fmin)+"mT"
                  if fmax == 0:
                      fmax = str(int(fmax))
                  else:
                      fmax = str(fmax)+"mT"
              else:
                  fmin = fdict[i]['meas_step_min']
                  fmax = fdict[i]['meas_step_max']
  
              PCA_types = ["DE-BFL", "DE-BFL-A", "DE-BFL-O", "DE-FM", "DE-BFP"]
              PCA_type_list = [x for x in str(fdict[i]['method_codes']).split(
                  ':') if x.strip() in PCA_types]
              if len(PCA_type_list) > 0:
                  PCA_type = PCA_type_list[0].strip()
              else:
                  PCA_type = "DE-BFL"
  
              fit = self.add_fit(spec, fname, fmin, fmax, PCA_type)
  
              if fdict[i]['result_quality'] == 'b':
                  self.bad_fits.append(fit)