forked from naumenko-sa/cre
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cre.vcfanno.lua
142 lines (128 loc) · 3.48 KB
/
cre.vcfanno.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
-- from bcbio/genomes/Hsapiens/GRCh37/configs/vcfanno/gemini.lua
function mean(vals)
local sum=0
for i=1,#vals do
sum = sum + vals[i]
end
return sum / #vals
end
function loc(chrom, start, stop)
return chrom .. ":" .. start .. "-" .. stop
end
CLINVAR_LOOKUP = {}
CLINVAR_LOOKUP['0'] = 'unknown'
CLINVAR_LOOKUP['1'] = 'germline'
CLINVAR_LOOKUP['2'] = 'somatic'
CLINVAR_LOOKUP['4'] = 'inherited'
CLINVAR_LOOKUP['8'] = 'paternal'
CLINVAR_LOOKUP['16'] = 'maternal'
CLINVAR_LOOKUP['32'] = 'de-novo'
CLINVAR_LOOKUP['64'] = 'biparental'
CLINVAR_LOOKUP['128'] = 'uniparental'
CLINVAR_LOOKUP['256'] = 'not-tested'
CLINVAR_LOOKUP['512'] = 'tested-inconclusive'
CLINVAR_LOOKUP['1073741824'] = 'other'
CLINVAR_SIG = {}
CLINVAR_SIG['0'] = 'uncertain'
CLINVAR_SIG['1'] = 'not-provided'
CLINVAR_SIG['2'] = 'benign'
CLINVAR_SIG['3'] = 'likely-benign'
CLINVAR_SIG['4'] = 'likely-pathogenic'
CLINVAR_SIG['5'] = 'pathogenic'
CLINVAR_SIG['6'] = 'drug-response'
CLINVAR_SIG['7'] = 'histocompatibility'
CLINVAR_SIG['255'] = 'other'
CLINVAR_SIG['.'] = '.'
function intotbl(ud)
local tbl = {}
for i=1,#ud do
tbl[i] = ud[i]
end
return tbl
end
-- from lua-users wiki
function split(str, sep)
local sep, fields = sep or ":", {}
local pattern = string.format("([^%s]+)", sep)
str:gsub(pattern, function(c) fields[#fields+1] = c end)
return fields
end
function contains(str, tok)
return string.find(str, tok) ~= nil
end
function div2(a, b)
if(a == 0) then return "0.0" end
return string.format("%.9f", (a + 0) / b)
end
function ratio(vals)
vals = vals[1] -- get 2 values per element. ref and alt counts.
if vals[2] == 0 then return "0.0" end
return string.format("%.9f", vals[2] / (vals[1] + vals[2]))
end
function clinvar_sig(vals)
local t = type(vals)
-- just a single-value
if(t == "string" or t == "number") and not contains(vals, "|") then
return CLINVAR_SIG[vals]
elseif t ~= "table" then
if not contains(t, "userdata") then
if t == "string" then
vals = split(vals, ",")
else
vals = {vals}
end
else
vals = intotbl(vals)
end
end
local ret = {}
for i=1,#vals do
if not contains(vals[i], "|") then
ret[#ret+1] = CLINVAR_SIG[vals[i]]
else
local invals = split(vals[i], "|")
local inret = {}
for j=1,#invals do
inret[#inret+1] = CLINVAR_SIG[invals[j]]
end
ret[#ret+1] = join(inret, "|")
end
end
return join(ret, ",")
end
join = table.concat
function check_clinvar_aaf(clinvar_sig, max_aaf_all, aaf_cutoff)
-- didn't find an aaf for this so can't be common
if max_aaf_all == nil or clinvar_sig == nil then
return false
end
if type(clinvar_sig) ~= "string" then
clinvar_sig = join(clinvar_sig, ",")
end
if false == contains(clinvar_sig, "pathogenic") then
return false
end
if type(max_aaf_all) ~= "table" then
return max_aaf_all > aaf_cutoff
end
for i, aaf in pairs(max_aaf_all) do
if aaf > aaf_cutoff then
return true
end
end
return false
end
function setid(...)
local t = {...}
local res = {}
local seen = {}
for i, v in pairs(t) do
if v ~= "." and v ~= nil and v ~= "" then
if seen[v] == nil then
res[#res+1] = string.gsub(v, ",", ";")
seen[v] = true
end
end
end
return table.concat(res, ";")
end