code: def run(vrn_info, calls_by_name, somatic_info, do_plots=True, handle_failures=True):
      
      if "seq2c" in calls_by_name:
          cnv_info = calls_by_name["seq2c"]
      elif "cnvkit" in calls_by_name:
          cnv_info = calls_by_name["cnvkit"]
      else:
          raise ValueError("BubbleTree only currently support CNVkit and Seq2c: %s" % ", ".join(calls_by_name.keys()))
      work_dir = _cur_workdir(somatic_info.tumor_data)
      class OutWriter:
          def __init__(self, out_handle):
              self.writer = csv.writer(out_handle)
          def write_header(self):
              self.writer.writerow(["chrom", "start", "end", "freq"])
          def write_row(self, rec, stats):
              self.writer.writerow([_to_ucsc_style(rec.chrom), rec.start, rec.stop, stats["tumor"]["freq"]])
      vcf_csv = prep_vrn_file(vrn_info["vrn_file"], vrn_info["variantcaller"],
                              work_dir, somatic_info, OutWriter, cnv_info["cns"])
      cnv_csv = _prep_cnv_file(cnv_info["cns"], cnv_info["variantcaller"], work_dir,
                               somatic_info.tumor_data)
      wide_lrr = cnv_info["variantcaller"] == "cnvkit" and somatic_info.normal_bam is None
      return _run_bubbletree(vcf_csv, cnv_csv, somatic_info.tumor_data, wide_lrr, do_plots,
                             handle_failures)
docs: Run BubbleTree given variant calls, CNVs and somatic