Beispiel #1
0
def pmsignature_main(args):
    import paplot.pmsignature as pmsignature

    # config
    [config,
     conf_file] = tools.load_config(tools.win_to_unix(args.config_file))

    input_list = tools.get_inputlist(tools.win_to_unix(args.input))
    if len(input_list) == 0:
        print("input no file.")
        return

    # dirs
    output_html_dir = prep.create_dirs(tools.win_to_unix(args.output_dir),
                                       args.project_name, config)

    for input_file in input_list:
        params_in = {
            "dir": output_html_dir,
            "data": input_file,
            "project": args.project_name,
            "title": args.title,
            "ellipsis": args.ellipsis,
        }
        params_out = pmsignature.output_html(params_in, config)

        if params_out is None:
            continue

        if params_out == {}:
            prep.create_index(config,
                              tools.win_to_unix(args.output_dir),
                              "",
                              args.project_name,
                              args.title,
                              overview=args.overview,
                              sub_text="",
                              composite=True,
                              remarks=args.remarks)
            continue

        sig_num_sift = 0
        if tools.config_getboolean(config, "result_format_pmsignature",
                                   "background"):
            sig_num_sift = 1

        prep.create_index(config,
                          tools.win_to_unix(args.output_dir),
                          params_out["html"],
                          args.project_name,
                          args.title,
                          overview=args.overview,
                          sub_text="#sig %d" %
                          (params_out["sig_num"] + sig_num_sift),
                          composite=True,
                          remarks=args.remarks)
Beispiel #2
0
def create_html(dataset, params, config):
    import os
    import paplot.subcode.tools as tools
    import paplot.prep as prep

    html_div_template = "<div style='float: left;' id='div_pm{id}'></div>\n"
    html_add_template = "msig_draw.add_div('div_pm{id}');\n"

    div_text = ""
    add_text = ""
    for i in range(dataset["sig_num"]):
        div_text += html_div_template.format(id=i)
        add_text += html_add_template.format(id=i)

    integral_text = ""
    if dataset["intergral"] is True:
        integral_text = html_integral_template

    f_template = open(
        os.path.dirname(os.path.abspath(__file__)) +
        "/templates/graph_pmsignature.html")
    html_template = f_template.read()
    f_template.close()

    sig_num_sift = 0
    if tools.config_getboolean(config, "result_format_pmsignature",
                               "background"):
        sig_num_sift = 1

    f_html = open(params["dir"] + "/" + dataset["html"], "w")
    f_html.write(
        html_template.format(
            project=params["project"],
            title="%s(#sig %d)" %
            (params["title"], dataset["sig_num"] + sig_num_sift),
            data_js=dataset["js"],
            version=prep.version_text(),
            date=tools.now_string(),
            divs=div_text,
            add_divs=add_text,
            integral=integral_text,
            style="../style/%s" % os.path.basename(
                tools.config_getpath(config, "style", "path", "default.js")),
        ))
    f_html.close()
Beispiel #3
0
def load_subdata(ids, sec, config):
    import os
    import paplot.subcode.tools as tools
    import paplot.convert as convert
    import paplot.color as color

    input_file = tools.config_getpath(config, sec, "path", default = "")
    if os.path.exists(input_file) == False:
        print ("[ERROR] file is not exist. %s" % input_file)
        return None

    sept = tools.config_getstr(config, sec, "sept").replace("\\t", "\t").replace("\\n", "\n").replace("\\r", "\r")
    mode = tools.config_getstr(config, sec, "mode")
    comment = tools.config_getstr(config, sec, "comment")
    title = tools.config_getstr(config, sec, "title")
    
    label = []
    item = []
    colors_n_di = {}
    colors_h_di = {}
    for name_set in tools.config_getstr(config, sec, "name_set").split(","):
        name_set_split = convert.text_to_list(name_set, ":")
        for i in range(len(name_set_split)):
            text = name_set_split[i]
            if i == 0:
                item.append(text)
                if len(name_set_split) == 1:
                    label.append(text)
            elif i == 1:
                label.append(text)
            elif i == 2:
                colors_n_di[name_set_split[0]] = color.name_to_value(text)
            elif i == 3:
                colors_h_di[name_set_split[0]] = color.name_to_value(text)
    
    # fill in undefined items
    colors_n_di = color.create_color_dict(item, colors_n_di, color.osaka_subway_colors) 
    colors_h_di2 = {}
    for key in colors_n_di:
        if key in colors_h_di: continue
        colors_h_di2[key] = color.saturation_down(colors_n_di[key])
    
    # dict to value
    colors_n = []
    for key in item:
        colors_n.append(colors_n_di[key])
    
    if mode == "range":
        item.remove(item[0])
    
    header = []
    if tools.config_getboolean(config, sec, "header") == True:
        pos_value = -1
        pos_id = -1
    else:
        pos_value = tools.config_getint(config, sec, "col_value")-1
        pos_id = tools.config_getint(config, sec, "col_ID")-1
        header = ["",""]
    
    # copy id_list for find check
    unlookup = []
    for iid in ids:
        unlookup.append(iid)
        
    # read
    data_text = ""
    values = []
    for line in open(input_file):
        line = line.strip()
        if len(line.replace(sept, "")) == 0:
            continue
        
        if comment != "" and line.find(comment) == 0:
            continue
        
        if len(header) == 0:
            header = convert.text_to_list(line,sept)
            try:
                colname = tools.config_getstr(config, sec, "col_value")
                pos_value = header.index(colname)
                colname = tools.config_getstr(config, sec, "col_ID")
                pos_id = header.index(colname)
            except Exception as e:
                print(e.message)
                return None
                
            continue
        
        cols = convert.text_to_list(line,sept)
        if (cols[pos_id] in ids) == False: continue
        else: unlookup.remove(cols[pos_id])

        id_pos = ids.index(cols[pos_id])
        
        if mode == "fix":
            if cols[pos_value] in item:
                data_text += subdata_data_template.format(id = id_pos, item = item.index(cols[pos_value]))
            else:
                print("[" + sec + "] name_set: data is undefined." + cols[pos_value] + "\n")
                continue
        elif mode == "range" or mode == "gradient":
            try:
                values.append(float(cols[pos_value]))
            except Exception as e:
                print(colname + ": data type is invalid.\n" + e.message)
                continue
            
            data_text += subdata_data_template.format(id = id_pos, item = cols[pos_value])

    if len(unlookup) > 0:
        print("[WARNING] can't find IDs subplot data.")
        print(unlookup)
        
    if mode == "gradient" and len(values) > 0:
        item[0] = min(values)
        item[1] = max(values)
        
    return [data_text, item, colors_n, label, title] 
Beispiel #4
0
def convert_tojs(params, config):
    import os
    import json
    import paplot.subcode.tools as tools
    import paplot.convert as convert
    import paplot.color as color

    # data read
    try:
        json_data = json.load(open(params["data"]))
    except Exception as e:
        print("failure open data %s, %s" % (params["data"], e.message))
        return None

    key_id_list = tools.config_getstr(config, "result_format_pmsignature",
                                      "key_id")
    key_ref = tools.config_getstr(config, "result_format_pmsignature",
                                  "key_ref")
    key_alt = tools.config_getstr(config, "result_format_pmsignature",
                                  "key_alt")
    key_strand = tools.config_getstr(config, "result_format_pmsignature",
                                     "key_strand")
    key_mutations = tools.config_getstr(config, "result_format_pmsignature",
                                        "key_mutation")
    key_mutation_count = tools.config_getstr(config,
                                             "result_format_pmsignature",
                                             "key_mutation_count")

    sig_num = len(json_data[key_ref])

    if sig_num == 0:
        print("no data %s" % params["data"])
        return {}

    # signature names
    signature_list = []
    for s in range(sig_num):
        signature_list.append("Signature %d" % (s + 1))

    # each signature colors
    sig_color_list = color.create_color_array(sig_num, color.r_set2)

    # use background?
    if tools.config_getboolean(config, "result_format_pmsignature",
                               "background"):
        signature_list.append("Background ")
        sig_color_list.append(color.r_set2_gray)

    # Id list
    id_txt = ""
    if key_id_list in json_data:
        id_txt = convert.list_to_text(json_data[key_id_list])

    # mutations
    mutations_txt = ""
    if key_mutations in json_data:
        for m in json_data[key_mutations]:
            mutations_txt += "[%d,%d,%f]," % (m[0], m[1], m[2])

    # signature
    dataset_ref = ""
    for sig in json_data[key_ref]:
        tmp = ""
        for sub in sig:
            tmp += "[" + ",".join(map(str, sub)) + "],"
        dataset_ref += ("[" + tmp + "],")

    dataset_alt = ""
    for sig in json_data[key_alt]:
        tmp = ""
        for sub in sig:
            tmp += "[" + ",".join(map(str, sub)) + "],"
        dataset_alt += ("[" + tmp + "],")

    dataset_strand = ""
    for sig in json_data[key_strand]:
        dataset_strand += "[" + ",".join(map(str, sig)) + "],"

    # tooltips
    # for ref
    keys_di = {
        "a": "",
        "c": "",
        "g": "",
        "t": "",
        "ca": "",
        "cg": "",
        "ct": "",
        "ta": "",
        "tc": "",
        "tg": "",
        "plus": "",
        "minus": "",
        "id": "",
        "sig": ""
    }

    tooltip_refs_txt = ""
    for r in range(len(json_data[key_ref][0])):
        tooltip_refs_txt += js_tooltip_ref_template.format(
            index=r,
            tooltip_format=convert.pyformat_to_jstooltip_text(
                keys_di, config, "pmsignature", "", "tooltip_format_ref"))

    mutation_count_txt = ""
    if (key_mutation_count != "") and (key_mutation_count in json_data.keys()):
        for v in json_data[key_mutation_count]:
            mutation_count_txt += "%d," % v

    # output
    sig_num_sift = 0
    if tools.config_getboolean(config, "result_format_pmsignature",
                               "background"):
        sig_num_sift = 1
    ellipsis = "%s%d" % (params["ellipsis"], (sig_num + sig_num_sift))

    js_file = "data_%s.js" % ellipsis
    html_file = "graph_%s.html" % ellipsis

    f = open(params["dir"] + "/" + js_file, "w")
    f.write(js_header + js_dataset.format(
        Ids=id_txt,
        color_A=tools.config_getstr(config, "pmsignature", "color_A",
                                    "#06B838"),
        color_C=tools.config_getstr(config, "pmsignature", "color_C",
                                    "#609CFF"),
        color_G=tools.config_getstr(config, "pmsignature", "color_G",
                                    "#B69D02"),
        color_T=tools.config_getstr(config, "pmsignature", "color_T",
                                    "#F6766D"),
        color_plus=tools.config_getstr(config, "pmsignature", "color_plus",
                                       "#00BEC3"),
        color_minus=tools.config_getstr(config, "pmsignature", "color_minus",
                                        "#F263E2"),
        signatures=convert.list_to_text(signature_list),
        colors=convert.list_to_text(sig_color_list),
        mutations=mutations_txt,
        dataset_ref=dataset_ref,
        dataset_alt=dataset_alt,
        dataset_strand=dataset_strand,
        tooltip_ref=tooltip_refs_txt,
        tooltip_alt=convert.pyformat_to_jstooltip_text(
            keys_di, config, "pmsignature", "", "tooltip_format_alt"),
        tooltip_strand=convert.pyformat_to_jstooltip_text(
            keys_di, config, "pmsignature", "", "tooltip_format_strand"),
        mutation_title=convert.pyformat_to_jstooltip_text(
            keys_di, config, "pmsignature", "",
            "tooltip_format_mutation_title"),
        mutation_partial=convert.pyformat_to_jstooltip_text(
            keys_di, config, "pmsignature", "",
            "tooltip_format_mutation_partial"),
        mutation_count=mutation_count_txt,
    ))

    f_template = open(
        os.path.dirname(os.path.abspath(__file__)) +
        "/templates/data_pmsignature.js")
    js_function = f_template.read()
    f_template.close()
    f.write(js_function)
    f.write(js_footer)

    f.close()

    integral = True
    if key_id_list == "" or key_mutations == "" or key_mutation_count == "":
        integral = False

    return {
        "sig_num": sig_num,
        "js": js_file,
        "html": html_file,
        "intergral": integral,
    }
Beispiel #5
0
def convert_tojs(params, config):

    import json
    import math
    import itertools
    import paplot.subcode.tools as tools
    import paplot.convert as convert
    import paplot.color as color
    
    # data read
    try:
        jsonData = json.load(open(params["data"]))
    except Exception as e:
        print ("failure open data %s, %s" % (params["data"], e.message))
        return None
    
    key_Ids = tools.config_getstr(config, "result_format_signature", "key_id")
    key_signature = tools.config_getstr(config, "result_format_signature", "key_signature")
    key_mutations = tools.config_getstr(config, "result_format_signature", "key_mutation")
    key_mutation_count = tools.config_getstr(config, "result_format_signature", "key_mutation_count")
    
    sig_num = len(jsonData[key_signature])
    
    if sig_num == 0:
        print ("no data %s" % params["data"])
        return {}
                    
    # signature names
    signature_list = []
    for s in range(sig_num):
        signature_list.append("Signature %d" % (s+1))
    
    # each signature colors
    sig_color_list = color.create_color_array(sig_num, color.r_set2)
    
    # use background?
    if tools.config_getboolean(config, "result_format_signature", "background"):
        signature_list.append("Background ")
        sig_color_list.append(color.r_set2_gray)
        
    # axis-y max
    sig_y_max = tools.config_getint(config, "signature", "signature_y_max")
    if (sig_y_max < 0):
        for sig in jsonData[key_signature]:
            for sub in sig:
                m = max(sub)
                if sig_y_max < m:
                    sig_y_max = m
                    
    # route list
    sub_num = len(jsonData[key_signature][0][0])
    log = math.log(sub_num, 4)
    if log % 1 > 0:
        print ("substitution's list length is invalid (%d, not number 4^N)" % sub_num)
        return None

    route_id = []
    route_list = []
    for p in itertools.product(("A","C","G","T"), repeat = int(log)):
        route_id.append("".join(p))
        route_list.append(p)
        
    # substruction
    sub_di = [
        {"name":"C > A", "ref":"C", "color":tools.config_getstr(config, "signature", "alt_color_CtoA")},
        {"name":"C > G", "ref":"C", "color":tools.config_getstr(config, "signature", "alt_color_CtoG")},
        {"name":"C > T", "ref":"C", "color":tools.config_getstr(config, "signature", "alt_color_CtoT")},
        {"name":"T > A", "ref":"T", "color":tools.config_getstr(config, "signature", "alt_color_TtoA")},
        {"name":"T > C", "ref":"T", "color":tools.config_getstr(config, "signature", "alt_color_TtoC")},
        {"name":"T > G", "ref":"T", "color":tools.config_getstr(config, "signature", "alt_color_TtoG")},
    ]
    
    substruction = ""
    for sub in sub_di:
        route = []
        for r in route_list:
            route.append("p".join(r[0:int(log/2)]) + "p" + sub["ref"] + "p" + "p".join(r[int(log/2):]))
        
        substruction += js_substruction_template.format(name = sub["name"], color = sub["color"], route = convert.list_to_text(route))
    
    # Id list
    id_txt = ""
    if key_Ids in jsonData:
        id_txt = convert.list_to_text(jsonData[key_Ids])
            
    # mutations
    mutations_txt = ""
    if key_mutations in jsonData:
        for m in jsonData[key_mutations]:
            mutations_txt += "[%d,%d,%f]," % (m[0],m[1],m[2])
    
    # signature
    dataset_sig = ""
    for sig in jsonData[key_signature]:
        tmp = ""
        for sub in sig:
            tmp += "[" + ",".join(map(str, sub)) + "],"
        dataset_sig += ("[" + tmp + "],")
        
    mutation_count_txt = ""
    if (key_mutation_count != "") and (key_mutation_count in jsonData.keys()):
        for v in jsonData[key_mutation_count]:
            mutation_count_txt += "%d," % v
    
    # output
    sig_num_sift = 0
    if tools.config_getboolean(config, "result_format_signature", "background"):
        sig_num_sift = 1
    ellipsis = "%s%d" % (params["ellipsis"], (sig_num + sig_num_sift))
    
    js_file = "data_%s.js" % ellipsis
    html_file = "graph_%s.html" % ellipsis
    
    keys_di = {"sig":"", "route":"", "id":""}
    f = open(params["dir"] + "/" + js_file, "w")
    f.write(js_header \
        + js_dataset.format(Ids = id_txt, \
            signatures = convert.list_to_text(signature_list), \
            colors = convert.list_to_text(sig_color_list), \
            dataset_sig_max = sig_y_max, \
            mutations = mutations_txt, \
            dataset_sig = dataset_sig, \
            route_id = convert.list_to_text(route_id), \
            substruction = substruction, \
            signature_title = convert.pyformat_to_jstooltip_text(keys_di, config, "signature", "", "tooltip_format_signature_title"), \
            signature_partial = convert.pyformat_to_jstooltip_text(keys_di, config, "signature", "", "tooltip_format_signature_partial"), \
            mutation_title = convert.pyformat_to_jstooltip_text(keys_di, config, "signature", "", "tooltip_format_mutation_title"), \
            mutation_partial = convert.pyformat_to_jstooltip_text(keys_di, config, "signature", "", "tooltip_format_mutation_partial"), \
            mutation_count = mutation_count_txt, \
            )
        + js_function)
    f.close()

    integral = True
    if key_Ids == "" or key_mutations == "" or key_mutation_count == "":
        integral = False
    
    return {"sig_num": sig_num,
            "js": js_file,
            "html": html_file,
            "intergral": integral,
            } 
Beispiel #6
0
def load_subdata(ids, sec, config):
    import os
    import paplot.subcode.tools as tools
    import paplot.convert as convert
    import paplot.color as color

    input_file = tools.config_getpath(config, sec, "path", default = "../../example/sample_summary.csv")
    if os.path.exists(input_file) == False:
        print ("[ERROR] file is not exist. %s" % input_file)
        return None

    sept = tools.config_getstr(config, sec, "sept")
    mode = tools.config_getstr(config, sec, "mode")
    comment = tools.config_getstr(config, sec, "comment")
    title = tools.config_getstr(config, sec, "title")
    
    label = []
    item = []
    colors_n_di = {}
    colors_h_di = {}
    for name_set in tools.config_getstr(config, sec, "name_set").split(","):
        name_set_split = convert.text_to_list(name_set, ":")
        for i in range(len(name_set_split)):
            text = name_set_split[i]
            if i == 0:
                item.append(text)
                if len(name_set_split) == 1:
                    label.append(text)
            elif i == 1:
                label.append(text)
            elif i == 2:
                colors_n_di[name_set_split[0]] = color.name_to_value(text)
            elif i == 3:
                colors_h_di[name_set_split[0]] = color.name_to_value(text)
    
    # fill in undefined items
    colors_n_di = color.create_color_dict(item, colors_n_di, color.osaka_subway_colors) 
    colors_h_di2 = {}
    for key in colors_n_di:
        if colors_h_di.has_key(key): continue
        colors_h_di2[key] = color.Saturation_down(colors_n_di[key])
    
    # dict to value
    colors_n = []
    for key in item:
        colors_n.append(colors_n_di[key])
    
    if mode == "range":
        item.remove(item[0])
    
    header = []
    if tools.config_getboolean(config, sec, "header") == True:
        pos_value = -1
        pos_ID = -1
    else:
        pos_value = tools.config_getint(config, sec, "col_value")
        pos_ID = tools.config_getint(config, sec, "col_ID")
        header = ["",""]
    
    # copy Ids for find check
    unlookup = []
    for iid in ids:
        unlookup.append(iid)
        
    # read
    data_text = ""
    values = []
    for line in open(input_file):
        line = line.strip()
        if len(line.replace(sept, "")) == 0:
            continue
        
        if comment != "" and line.find(comment) == 0:
            continue
        
        if len(header) == 0:
            header = convert.text_to_list(line,sept)
            try:
                colname = tools.config_getstr(config, sec, "col_value")
                pos_value = header.index(colname)
                colname = tools.config_getstr(config, sec, "col_ID")
                pos_ID = header.index(colname)
            except Exception as e:
                print(e.message)
                return None
                
            continue
        
        cols = convert.text_to_list(line,sept)
        if (cols[pos_ID] in ids) == False: continue
        else: unlookup.remove(cols[pos_ID])

        id_pos = ids.index(cols[pos_ID])
        
        if mode == "fix":
            if cols[pos_value] in item:
                data_text += subdata_data_template.format(id = id_pos, item = item.index(cols[pos_value]))
            else:
                print("[" + sec + "] name_set: data is undefined." + cols[pos_value] + "\n")
                continue
        elif mode == "range":
            try:
                values.append(float(cols[pos_value]))
            except Exception as e:
                print(colname + ": data type is invalid.\n" + e.message)
                continue
            
            data_text += subdata_data_template.format(id = id_pos, item = cols[pos_value])
            
        elif mode == "gradient":
            try:
                values.append(float(cols[pos_value]))
            except Exception as e:
                print(colname + ": data type is invalid.\n" + e.message)
                continue
            
            data_text += subdata_data_template.format(id = id_pos, item = cols[pos_value])
    
    if len(unlookup) > 0:
        print("[WARNING] can't find IDs subplot data.")
        print(unlookup)
        
    if mode == "gradient" and len(values) > 0:
        item[0] = min(values)
        item[1] = max(values)
        
    return [data_text, item, colors_n, label, title]