code: def _run_theta(cnv_info, data, work_dir, run_n3=True):
      
      out = {"caller": "theta"}
      max_normal = "0.9"
      opts = ["-m", max_normal]
      n2_result = _safe_run_theta(cnv_info["theta_input"], os.path.join(work_dir, "n2"), ".n2.results",
                                  ["-n", "2"] + opts, data)
      if n2_result:
          out["estimate"] = n2_result
          if run_n3:
              n2_bounds = "%s.withBounds" % os.path.splitext(n2_result)[0]
              n3_result = _safe_run_theta(n2_bounds, os.path.join(work_dir, "n3"), ".n3.results",
                                          ["-n", "3", "--RESULTS", n2_result] + opts,
                                          data)
              if n3_result:
                  best_result = _select_model(n2_bounds, n2_result, n3_result,
                                              os.path.join(work_dir, "n3"), data)
                  out["estimate"] = best_result
                  out["cnvs"] = _merge_theta_calls(n2_bounds, best_result, cnv_info["vrn_file"], data)
      return out
docs: Run theta, calculating subpopulations and normal contamination.