Skip to content

Instantly share code, notes, and snippets.

@dermotbalson
Created January 6, 2016 06:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dermotbalson/a401997a8e3237ff4a7e to your computer and use it in GitHub Desktop.
Save dermotbalson/a401997a8e3237ff4a7e to your computer and use it in GitHub Desktop.
Gedmatch1
--# Main
-- Gedmatch
displayMode(FULLSCREEN)
function setup()
ReadData()
maxSeries=25
step=20
charts={image(WIDTH,HEIGHT),image(WIDTH,HEIGHT)}
CHR=1
kit1="F446284"
CreateChart(kit1,CHR)
end
function draw()
background(0)
for i=1,#charts do
sprite(charts[1],WIDTH/2,HEIGHT/2)
end
end
function CreateChart(k1,c,k2) --k is kit,c is chromosome number
--collate data
c=tostring(c)
local rows={}
local d=data[k1]
title="Matches for "..k1.." on chromosome "..c
local total={}
for i=1,#d.matches do
local dm=d.matches[i]
if dm.chr==c then
local kk=dm.kit
rows[kk]=rows[kk] or {}
rows[kk].total=(rows[kk].total or 0) + dm.cm
rows[kk].matches=rows[kk].matches or {}
table.insert(rows[kk].matches,i)
end
end
local s={}
for i,r in pairs(rows) do
table.insert(s,{i,r.total})
end
table.sort(s,function(a,b) return a[2]>b[2] end)
--create chart
local X1,X2=125,WIDTH-25
local b=bases[tonumber(c)]
setContext(charts[1])
background(219, 217, 221, 255)
fontSize(24)
fill(0)
textMode(LEFT)
text(title,10,HEIGHT-30)
fontSize(16)
numSeries=math.min(maxSeries,#s)
seriesY={}
for i=1,numSeries do
local ss=s[i][1]
local m=rows[ss].matches[1]
local h=HEIGHT-40-i*step
fill(0)
text(d.matches[m].kit.." ("..math.floor(d.matches[m].cm)..")",10,h)
local x1=X1+(X2-X1)*d.matches[m].start/b
local x2=X1+(X2-X1)*d.matches[m].finish/b
seriesY[i]={h+step/2,d.matches[m].kit,x1,x2}
fill(91, 143, 186, 255)
rect(x1,h+0.15*step,x2-x1,step*0.7)
stroke(91, 143, 186, 255)
strokeWidth(1)
line(X1,h+step/2,X2-X1,h+step/2)
end
--add 2nd chart overlay if required
if kit2 then
fill(255, 0, 0, 255)
local d2=data[k2]
for i=1,#seriesY do
local h=HEIGHT-40-i*step
local k=seriesY[i][2]
if k==kit2 then
rect(seriesY[i][3],h+0.15*step,seriesY[i][4]-seriesY[i][3],step*0.7)
else
local d2=data[k2]
for j=1,#d2.matches do
local dd2=d2.matches[j]
if dd2.chr==c and dd2.kit==k then
local x1=X1+(X2-X1)*dd2.start/b
local x2=X1+(X2-X1)*dd2.finish/b
print(k2,x1,x2)
rect(x1,h+0.4*step,x2-x1,step*0.2)
end
end
end
end
end
--draw navigation buttons
leftChr,rightChr=vec2(WIDTH*0.5,HEIGHT-15),vec2(WIDTH*0.5+40,HEIGHT-15)
navSize=20
sprite("Tyrian Remastered:Arrow Left",leftChr.x,leftChr.y,navSize)
sprite("Tyrian Remastered:Arrow Right",rightChr.x,rightChr.y,navSize)
setContext()
end
function touched(t)
if t.state==ENDED then
if vec2(t.x,t.y):dist(leftChr)<navSize then
CHR=CHR-1
if CHR==0 then CHR=23 end
elseif vec2(t.x,t.y):dist(rightChr)<navSize then
CHR=CHR+1
if CHR>23 then CHR=1 end
else
for i=1,#seriesY do
if math.abs(t.y-seriesY[i][1])<step/2 then
kit2=seriesY[i][2]
break
end
end
end
CreateChart(kit1,CHR,kit2)
end
end
--# Data
data={}
url="https://www.dropbox.com/s/f9n4u28w37jvof4/GedmatchAllM.csv?dl=1"
bases={249250621,243199373,198022430,191154276,180915260,171115067,159138663,146364022,141213431,
135534747,135006516,133851895,115169878,107349540,102531392,90354753,81195210,78077248,
59128983,63025520,48129895,51304566,155270560,59373566}
function DownloadData()
print("Downloading data...")
http.request(url,SaveData)
end
function SaveData(data,status)
if status==200 then print("Status=OK") else print("Status code unknown="..status) end
saveProjectData("GedmatchAll",data)
end
function ReadData()
local txt=readProjectData("GedmatchAll")
local rows=Split(txt,"\n")
table.remove(rows,1) --remove header row
--print("Records read: "..#rows)
--put data into tables
for i=1,#rows do
local t=Split(rows[i],",")
local k=t[1]
if not data[k] then
data[k]={}
data[k].kit=t[1]
data[k].name=t[2]
data[k].email=t[3]
data[k].matches={}
data[k].kits={}
data[k].chr={}
end
local d=data[k]
table.insert(d.matches,{kit=t[4],chr=t[7],start=t[8],finish=t[9],cm=t[10]})
d.kits=d.kits or {}
if t[4]==nil then break end
d.kits[t[4]]=#d.matches
d.chr=d.chr or {}
d.chr[t[7]]=#d.matches
--table.insert(d.kits,{t[4]=#d.matches})
--table.insert(d.chr,{t[7],#d.matches})
end
print("Data loaded")
--TestData("F446284")
--TestMatches("F446284")
end
function Split(txt,delimiter)
local tbl={}
for match in (txt..delimiter):gmatch("(.-)"..delimiter) do
table.insert(tbl,match)
end
return tbl
end
function TestData(n)
local d=data[n] print(d)
local txt="Test for record "..n
txt=txt.."\n".."-----------"
txt=txt.."\n".."kit = "..d.kit
txt=txt.."\n".."name = "..d.name
txt=txt.."\n".."email = "..d.email
txt=txt.."\n".."Matches ----------"
print(txt) txt=""
for i=1, #d.matches do
txt="Match "..i.."...."
--txt=txt.."\n".."kit = "..d.kits[i]
--txt=txt.."\n".."chr = "..d.chr[i]
txt=txt.."\n".."kit = "..d.matches[i].kit
txt=txt.."\n".."chr = "..d.matches[i].chr
txt=txt.."\n".."start = "..d.matches[i].start
txt=txt.."\n".."end = "..d.matches[i].finish
txt=txt.."\n".."cM = "..d.matches[i].cm
print(txt)
end
end
function TestMatches(k)
local d=data[k]
print("Testing matches for "..d.kit.."\n--------------------")
for i=1,#d.matches do
print(i,d.matches[i][1])
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment