Files
Simple_Drawing/chart/tools.py
2021-09-25 14:55:47 +08:00

476 lines
16 KiB
Python

import os
import random
import time
import pandas as pd
from Bio import SeqIO
from Bio.SeqUtils import GC
from Simple_Drawing.settings import BASE_DIR
tools_path = os.path.join(BASE_DIR, "tools_sofa")
url_ = "http://127.0.0.1:8000"
def random_color():
color_list = ["#009688", '#5FB878', '#393D49',
'#1E9FFF', '#FFB800', '#FF5722',
'#01AAED', '#2F4056']
return random.choice(color_list)
# 保存单个文件
def keep_file(file_data, file_path, file_name=None, ui=0):
if file_name is not None:
file_path = os.path.join(file_path, file_name)
if ui:
with open(file_path, 'w') as f:
f.write(file_data)
else:
with open(file_path, 'wb+') as f:
for chunk1 in file_data.chunks():
f.write(chunk1)
# 保存多个文件
def keep_files(na, c):
cmd = '''
cd %s/file_keep/%s
mkdir morefile
''' % (BASE_DIR, c)
os.system(cmd)
for file in na:
with open('%s' % os.path.join(f'{BASE_DIR}/file_keep/{c}/morefile/', file.name), 'wb') as f:
for i in file.chunks():
f.write(i)
f.close()
# 返回唯一文件编号
def generate_id():
a = time.asctime(time.localtime(time.time()))
b = a[-15:] + str(random.randint(0, 1000))
c = b.replace(" ", "")
c = c.replace(":", "0")
return c
# 给出文件路径
def path_out(sort, name=generate_id(), show=None, out=None):
if show == 1:
return os.path.join(BASE_DIR, "static", "img_eg", "show_chart", name)
if out == 1:
return os.path.join(BASE_DIR, 'file_keep', sort, "img", name)
return os.path.join(BASE_DIR, 'file_keep', sort, "file", name), name
# 选出需要的列
def pick_col(file_path, col, sep=","):
midwest = pd.read_csv(file_path, sep=sep)
col = set(midwest[col])
return col
# 返回页数
def return_pages(su: int) -> int:
if su % 12 != 0:
return (su // 12) + 1
else:
return su // 12
class ChartParameter(object):
def __init__(self, data):
if 'name' in data:
self.name = data['name']
if 'html_name' in data:
self.html_name = data['html_name']
if 'value' in data:
self.value = data['value']
if 'astrict' in data:
self.astrict = data['astrict']
if 'input_type' in data:
self.input_type = data['input_type']
if 'Basics' in data:
self.Basics = data['Basics']
if 'Senior' in data:
self.Senior = data['Senior']
self.colors_dict = {}
def html_out_Basics(self):
code = ""
for title in self.Basics:
code += f"""
<dd style="overflow: hidden">
<div class="color">
<label style="" class="label_meg"><b>{title}&nbsp;&nbsp;</b></label>
</div>
</dd>
"""
for d in self.Basics[title]:
parameter = ChartParameter(d)
if parameter.input_type == "text":
parameter.input_type = f"""
<input {parameter.astrict} type="text" id="{parameter.name}" lay-verify="required" value="{parameter.value}"
autocomplete="off" class="layui-input"
style="height: 25px; width:80px;margin-top: 6px">
"""
if parameter.input_type == "number":
parameter.input_type = f"""
<input {parameter.astrict} type="number" id="{parameter.name}" lay-verify="required" value="{parameter.value}"
autocomplete="off" class="layui-input" min="0" max="999"
style="height: 25px; width:80px;margin-top: 6px">
"""
if parameter.input_type == "date":
parameter.input_type = f"""
<input {parameter.astrict} type="date" id="{parameter.name}" lay-verify="required" value="{parameter.value}"
autocomplete="off" class="layui-input"
style="height: 25px; width:80px;margin-top: 6px">
"""
if parameter.input_type == "color_name":
self.colors_dict[f"{parameter.name}"] = "color_name"
parameter.input_type = f"""
<div style="margin-left: 30px;">
<div id="{parameter.name}" style="margin-left: 30px; display: inline-block"></div>
</div>
"""
if parameter.input_type == "rgb":
self.colors_dict[f"{parameter.name}"] = "rgb"
f"""
<div style="margin-left: 30px;">
<div id="{parameter.name}" style="margin-left: 30px; display: inline-block"></div>
</div>
"""
self.colors += 1
if parameter.input_type == "palettes":
parameter.input_type = f"""
<select {parameter.astrict} id="{parameter.name}" lay-verify="required" value="{parameter.value}" autocomplete="off"
class="layui-input" style="height: 25px; width:80px;margin-top: 6px">
<option value="YlOrRd">YlOrRd</option>
<option value="YlOrBr">YlOrBr</option>
<option value="YlGnBu">YlGnBu</option>
<option value="Reds">Reds</option>
<option value="RdPu">RdPu</option>
<option value="Purples">Purples</option>
<option value="PuRd">PuRd</option>
<option value="PuBuGn">PuBuGn</option>
<option value="PuBu">PuBu</option>
<option value="OrRd">OrRd</option>
<option value="Oranges">Oranges</option>
<option value="Greys">Greys</option>
<option value="Greens">Greens</option>
<option value="GnBu">GnBu</option>
<option value="BuPn">BuPn</option>
<option value="BuGn">BuGn</option>
<option value="Blues">Blues</option>
<option value="Set3">Set3</option>
<option value="Set2">Set2</option>
<option value="Set1">Set1</option>
<option value="Pastel2">Pastel2</option>
<option value="Pastel1">Pastel1</option>
<option value="Paired">Paired</option>
<option value="Dark2">Dark2</option>
<option value="Accent">Accent</option>
<option value="Spectral">Spectral</option>
<option value="RdYlGn">RdYlGn</option>
<option value="RdYlBn">RdYlBn</option>
<option value="RdGy">RdGy</option>
<option value="RdBu">RdBu</option>
<option value="PuOr">PuOr</option>
<option value="PRGn">PRGn</option>
<option value="PiYG">PiYG</option>
<option value="BrBG">BrBG</option>
</select>
"""
if parameter.input_type == "add":
parameter.input_type = f"""
<select {parameter.astrict} id="{parameter.name}" lay-verify="required" value="{parameter.value}" autocomplete="off"
class="layui-input" style="height: 25px; width:80px;margin-top: 6px">
<option value="TRUE">YES</option>
<option value="FALSE">NO</option>
</select>
"""
if parameter.input_type == "position":
parameter.input_type = f"""
<select {parameter.astrict} id="{parameter.name}" lay-verify="required" value="{parameter.value}" autocomplete="off"
class="layui-input" style="height: 25px; width:80px;margin-top: 6px">
<option value="right">Right</option>
<option value="left">Left</option>
<option value="top">Top</option>
<option value="bottom">Bottom</option>
</select>
"""
code += f"""
<dd style="overflow: hidden">
<div class="color">
<label class="label_meg">{parameter.html_name}&nbsp;&nbsp;</label>
<div class="layui-input-inline" style="float: right">
{parameter.input_type}
</div>
</div>
</dd>
"""
return code
def html_out_Senior(self):
code = ""
for title in self.Senior:
code += f"""
<dd style="overflow: hidden">
<div class="color">
<label style="" class="label_meg"><b>{title}&nbsp;&nbsp;</b></label>
</div>
</dd>
"""
for d in self.Senior[title]:
parameter = ChartParameter(d)
if parameter.input_type == "text":
parameter.input_type = f"""
<input {parameter.astrict} type="text" id="{parameter.name}" lay-verify="required" value="{parameter.value}"
autocomplete="off" class="layui-input"
style="height: 25px; width:80px;margin-top: 6px">
"""
if parameter.input_type == "number":
parameter.input_type = f"""
<input {parameter.astrict} type="number" id="{parameter.name}" lay-verify="required" value="{parameter.value}"
autocomplete="off" class="layui-input" min="0" max="999"
style="height: 25px; width:80px;margin-top: 6px">
"""
if parameter.input_type == "date":
parameter.input_type = f"""
<input {parameter.astrict} type="date" id="{parameter.name}" lay-verify="required" value="{parameter.value}"
autocomplete="off" class="layui-input
style="height: 25px; width:80px;margin-top: 6px">
"""
if parameter.input_type == "color_name":
self.colors_dict[f"{parameter.name}"] = "color_name"
parameter.input_type = f"""
<div style="margin-left: 30px;">
<div id="{parameter.name}" style="margin-left: 30px; display: inline-block"></div>
</div>
"""
if parameter.input_type == "rgb":
self.colors_dict[f"{parameter.name}"] = "rgb"
f"""
<div style="margin-left: 30px;">
<div id="{parameter.name}" style="margin-left: 30px; display: inline-block"></div>
</div>
"""
if parameter.input_type == "palettes":
parameter.input_type = f"""
<select {parameter.astrict} id="{parameter.name}" lay-verify="required" value="{parameter.value}" autocomplete="off"
class="layui-input" style="height: 25px; width:80px;margin-top: 6px">
<option value="YlOrRd">YlOrRd</option>
<option value="YlOrBr">YlOrBr</option>
<option value="YlGnBu">YlGnBu</option>
<option value="Reds">Reds</option>
<option value="RdPu">RdPu</option>
<option value="Purples">Purples</option>
<option value="PuRd">PuRd</option>
<option value="PuBuGn">PuBuGn</option>
<option value="PuBu">PuBu</option>
<option value="OrRd">OrRd</option>
<option value="Oranges">Oranges</option>
<option value="Greys">Greys</option>
<option value="Greens">Greens</option>
<option value="GnBu">GnBu</option>
<option value="BuPn">BuPn</option>
<option value="BuGn">BuGn</option>
<option value="Blues">Blues</option>
<option value="Set3">Set3</option>
<option value="Set2">Set2</option>
<option value="Set1">Set1</option>
<option value="Pastel2">Pastel2</option>
<option value="Pastel1">Pastel1</option>
<option value="Paired">Paired</option>
<option value="Dark2">Dark2</option>
<option value="Accent">Accent</option>
<option value="Spectral">Spectral</option>
<option value="RdYlGn">RdYlGn</option>
<option value="RdYlBn">RdYlBn</option>
<option value="RdGy">RdGy</option>
<option value="RdBu">RdBu</option>
<option value="PuOr">PuOr</option>
<option value="PRGn">PRGn</option>
<option value="PiYG">PiYG</option>
<option value="BrBG">BrBG</option>
</select>
"""
if parameter.input_type == "add":
parameter.input_type = f"""
<select {parameter.astrict} id="{parameter.name}" lay-verify="required" value="{parameter.value}" autocomplete="off"
class="layui-input" style="height: 25px; width:80px;margin-top: 6px">
<option value="TRUE">YES</option>
<option value="FALSE">NO</option>
</select>
"""
if parameter.input_type == "position":
parameter.input_type = f"""
<select {parameter.astrict} id="{parameter.name}" lay-verify="required" value="{parameter.value}" autocomplete="off"
class="layui-input" style="height: 25px; width:80px;margin-top: 6px">
<option value="right">Right</option>
<option value="left">Left</option>
<option value="top">Top</option>
<option value="bottom">Bottom</option>
</select>
"""
code += f"""
<dd style="overflow: hidden">
<div class="color">
<label class="label_meg">{parameter.html_name}&nbsp;&nbsp;</label>
<div class="layui-input-inline" style="float: right">
{parameter.input_type}
</div>
</div>
</dd>
"""
return code
def js_out(self):
code = ""
for title in self.Basics:
for d in self.Basics[title]:
parameter = ChartParameter(d)
if parameter.input_type in ["rgb", "hex", 'color_name']:
code += f"""{parameter.name}:{parameter.name},
"""
else:
code += f"""{parameter.name}: (document.getElementById("{parameter.name}").value),
"""
print(parameter.input_type)
for title in self.Senior:
for d in self.Senior[title]:
parameter = ChartParameter(d)
print(parameter.input_type)
if parameter.input_type in ["rgb", "hex", 'color_name']:
code += f"""{parameter.name}:{parameter.name},
"""
else:
code += f"""{parameter.name}: (document.getElementById("{parameter.name}").value),
"""
return code
def color_js(self):
code = ""
for i in self.colors_dict.keys():
if self.colors_dict[i] == "rgb":
fl = "rgb"
else:
fl = "hex"
code += """
layui.use('colorpicker', function()
{
var $ = layui.$
, colorpicker = layui.colorpicker;
colorpicker.render({
elem: '#%s'
, color: '%s' //设置默认色
, size: "xs"
, format: '%s'
, change: function (color) {
%s = color
}
});
})
""" % (i, random_color(), fl, i)
return code
Treemap = {
"Basics": {
"title": [
{"name": "title", "value": "title", "astrict": "", "input_type": "text", "html_name": "Title"},
{"name": "title_font_size", "value": "12", "astrict": "", "input_type": "number", "html_name": "Title Size"}
],
"data": [
{"name": "group_by_column", "value": "group_by_column", "astrict": "", "input_type": "text",
"html_name": "Group By Column"},
{"name": "data_column", "value": "data_column", "astrict": "", "input_type": "text",
"html_name": "Data Column"}
]
},
"Senior": {
}
}
class Basics(object):
def __init__(self, file_path, args):
self.args = args
self.file_path = file_path
self.out_file = []
self.f = SeqIO.parse(file_path, "fasta") # 读取多条序列
def Sequence_cleaning(self):
f = self.f
temp = []
for i in f:
temp.append(f">{i.id}\n{str(i.seq)}")
self.out_file.append(["Sequence_cleaning", temp])
def Sequence_length(self):
f = self.f
temp = []
for i in f:
temp.append(f"{i.id}\t{len(i)}")
self.out_file.append(["Sequence_length", temp])
def GC_content(self):
f = self.f
temp = []
for i in f:
CONTENT = GC(str(i.seq))
temp.append(f"{i.id}\t{CONTENT}")
self.out_file.append(["GC_content", temp])
def Sequence_flip(self):
f = self.f
temp = []
for i in f:
temp.append(f">{i.id}\n{str(i.reverse_complement().seq)}")
self.out_file.append(["Sequence_flip", temp])
def Reverse_complementarity(self):
f = self.f
temp = []
for i in f:
temp.append(f">{i.id}\n{str(i.complement().seq)}")
self.out_file.append(["Reverse_complementarity", temp])
# def Codon_preference(self):
# f = self.f
# temp = []
# for i in f:
# temp.append(f">{i.id}\n{str(i.complement().seq)}")
# self.out_file.append({"Reverse_complementarity": temp})
def run(self):
for i in self.args.keys():
if self.args[i] == "YES":
eval(f"self.{self.args[i]}")()
data = ""
for i in self.out_file:
for j in i:
data += f"\n{'-' * 15}\n{j[0]}\n"
data += "\n".join(i[1])
with open(self.file_path, "w") as f:
f.write(data)
return data