コード例 #1
0
def create_report(args):

    variants_file = args.sites

    if variants_file.endswith(".vcf") or variants_file.endswith(".vcf.gz"):
        table = VariantTable(variants_file, args.info_columns,
                             args.info_columns_prefixes, args.sample_columns)

    elif variants_file.endswith(".bed") or variants_file.endswith(".bed.gz"):
        if args.type is not None and args.type == "junction":
            table = JunctionBedTable(variants_file, args.info_columns)
        else:
            table = BedTable(variants_file)

    table_json = table.to_JSON()

    session_dict = {}

    # Create file readers for tracks.  This is done outside the loop so initialization happens onc
    trackreaders = []
    if args.tracks is not None:
        for track in args.tracks:
            reader = utils.getreader(track)
            trackreaders.append({"track": track, "reader": reader})

    trackconfigs = []
    if args.track_config is not None:
        for trackobj in args.track_config:
            with open(trackobj) as f:
                data = json.load(f)
                for config in data:
                    reader = utils.getreader(config["url"])
                    trackconfigs.append({"config": config, "reader": reader})

    # loop through variants creating an igv.js session for each one
    flanking = 0
    if args.flanking is not None:
        flanking = float(args.flanking)

    for tuple in table.features:

        feature = tuple[0]
        unique_id = tuple[1]
        if hasattr(feature, "session_id"):
            session_id = feature.session_id
        else:
            session_id = str(unique_id)

        if session_id not in session_dict:

            # Define a genomic region around the variant
            if hasattr(feature, "viewport"):
                region = parse_region(feature.viewport)
                chr = region["chr"]
                start = region["start"]
                end = region["end"]
            else:
                chr = feature.chr
                start = int(math.floor(feature.start - flanking / 2))
                end = int(math.ceil(feature.end + flanking / 2))
                region = {"chr": chr, "start": start, "end": end}

            # Fasta
            data = fasta.get_data(args.fasta, region)
            fa = '>' + chr + ':' + str(start) + '-' + str(end) + '\n' + data
            fasta_uri = datauri.get_data_uri(fa)
            fastaJson = {
                "fastaURL": fasta_uri,
            }

            # Ideogram
            if (args.ideogram):
                ideo_string = ideogram.get_data(args.ideogram, region)
                ideo_uri = datauri.get_data_uri(ideo_string)
                fastaJson["cytobandURL"] = ideo_uri

            # Initial locus, +/- 20 bases
            if (hasattr(feature, "viewport")):
                initial_locus = feature.viewport
            else:
                position = int(math.floor(
                    (feature.start + feature.end) /
                    2)) + 1  # center of region in 1-based coordinates
                initial_locus = chr + ":" + str(position -
                                                20) + "-" + str(position + 20)
            session_json = {
                "locus": initial_locus,
                "reference": fastaJson,
                "tracks": []
            }

            for tr in trackreaders:

                track = tr["track"]
                reader = tr["reader"]
                trackobj = tracks.get_track_json_dict(track)
                data = reader.slice(region)
                trackobj["url"] = datauri.get_data_uri(data)
                if (trackobj["type"] == "alignment"):
                    trackobj["height"] = 500

                    # Sort TODO -- do this only for SNV
                    # if (trackObj["type"]) == "alignment":
                    #     trackObj["sort"] = {
                    #         "option": "NUCLEOTIDE",
                    #         "locus": chr + ":" + str(variant.pos - 1)
                    #     }

                session_json["tracks"].append(trackobj)

            for tc in trackconfigs:
                trackobj = tc["config"]
                if "name" not in trackobj:
                    trackobj["name"] = trackobj["url"]
                reader = tc["reader"]
                data = reader.slice(region)
                trackobj["url"] = datauri.get_data_uri(data)
                session_json["tracks"].append(trackobj)

            # Build the session data URI

            session_string = json.dumps(session_json)

            session_uri = datauri.get_data_uri(session_string)

            session_dict[session_id] = session_uri

    session_dict = json.dumps(session_dict)

    template_file = args.template
    if None == template_file:
        if 'junction' == args.type:
            template_file = os.path.dirname(
                sys.modules['igv_reports'].__file__
            ) + '/templates/junction_template.html'
        else:
            template_file = os.path.dirname(
                sys.modules['igv_reports'].__file__
            ) + '/templates/variant_template.html'

    output_file = args.output

    standalone = args.standalone
    with open(template_file, "r") as f:
        data = f.readlines()

        with open(output_file, "w") as o:

            for i, line in enumerate(data):

                if args.title is not None and line.startswith("<!--title-->"):
                    o.write("<h1>" + args.title + "</h1>")

                if standalone:
                    if line.strip().startswith("<script") and ".js\"" in line:
                        inline_script(line, o, "js")
                        continue
                    elif line.strip().startswith(
                            "<link") and line.strip().endswith("css\">"):
                        inline_script(line, o, "css")
                        continue
                j = line.find('"@TABLE_JSON@"')
                if j >= 0:
                    line = line.replace('"@TABLE_JSON@"', table_json)

                j = line.find('"@SESSION_DICTIONARY@"')
                if j >= 0:
                    line = line.replace('"@SESSION_DICTIONARY@"', session_dict)

                o.write(line)
コード例 #2
0
ファイル: report.py プロジェクト: baiyuanxiang/igv-reports
def create_report(args):

    variants_file = args.sites

    if variants_file.endswith(".vcf") or variants_file.endswith(".vcf.gz"):
        table = VariantTable(variants_file, args.species, args.info_columns,
                             args.info_columns_prefixes, args.sample_columns)

    elif variants_file.endswith(".bed") or variants_file.endswith(".bed.gz"):
        table = BedTable(variants_file)

    table_json = table.to_JSON()

    session_dict = {}

    # Create file readers for tracks.  This is done outside the loop so initialization happens onc
    trackreaders = []
    if args.tracks is not None:
        for track in args.tracks:
            reader = utils.getreader(track)
            trackreaders.append({"track": track, "reader": reader})

    # loop through variants creating an igv.js session for each one
    for tuple in table.features:

        feature = tuple[0]
        unique_id = tuple[1]

        # Define a genomic region around the variant
        chr = feature.chr
        position = int(math.floor(
            (feature.start + feature.end) /
            2)) + 1  # center of region in 1-based coordinates
        start = int(math.floor(feature.start - int(args.flanking) / 2))
        end = int(math.ceil(feature.end + int(args.flanking) / 2))
        region = {"chr": chr, "start": start, "end": end}

        # Fasta
        data = fasta.get_data(args.fasta, region)
        fa = '>' + chr + ':' + str(start) + '-' + str(end) + '\n' + data
        fasta_uri = datauri.get_data_uri(fa)
        fastaJson = {
            "fastaURL": fasta_uri,
        }

        # Ideogram
        if (args.ideogram):
            ideo_string = ideogram.get_data(args.ideogram, region)
            ideo_uri = datauri.get_data_uri(ideo_string)
            fastaJson["cytobandURL"] = ideo_uri

        # Initial locus, +/- 20 bases
        initial_locus = chr + ":" + str(position - 20) + "-" + str(position +
                                                                   20)
        session_json = {
            "locus": initial_locus,
            "reference": fastaJson,
            "tracks": []
        }

        for tr in trackreaders:

            track = tr["track"]
            reader = tr["reader"]
            trackObj = tracks.get_track_json_dict(track)
            data = reader.slice(region)
            trackObj["url"] = datauri.get_data_uri(data)
            if (trackObj["type"] == "alignment"):
                trackObj["height"] = 500

                # Sort TODO -- do this only for SNV
                # if (trackObj["type"]) == "alignment":
                #     trackObj["sort"] = {
                #         "option": "NUCLEOTIDE",
                #         "locus": chr + ":" + str(variant.pos - 1)
                #     }

            session_json["tracks"].append(trackObj)

        # Build the session data URI

        session_string = json.dumps(session_json)

        session_uri = datauri.get_data_uri(session_string)

        session_dict[str(unique_id)] = session_uri

    session_dict = json.dumps(session_dict)

    template_file = args.template
    if None == template_file:
        template_file = os.path.dirname(sys.modules['igv_reports'].__file__
                                        ) + '/templates/variant_template.html'

    output_file = args.output

    standalone = args.standalone
    with open(template_file, "r") as f:
        data = f.readlines()

        with open(output_file, "w") as o:

            for i, line in enumerate(data):

                if standalone and "<script" in line and line.find(".js") > 0:
                    inline_script(line, o)

                else:
                    j = line.find('"@TABLE_JSON@"')
                    if j >= 0:
                        line = line.replace('"@TABLE_JSON@"', table_json)

                    j = line.find('"@SESSION_DICTIONARY@"')
                    if j >= 0:
                        line = line.replace('"@SESSION_DICTIONARY@"',
                                            session_dict)

                    o.write(line)