Created
January 6, 2016 06:15
-
-
Save dermotbalson/a401997a8e3237ff4a7e to your computer and use it in GitHub Desktop.
Gedmatch1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--# 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