From b6b50f30ff86f764a5c9ae49a253bf0fc69f5c97 Mon Sep 17 00:00:00 2001 From: Tomi Karjalainen Date: Thu, 7 Nov 2019 15:05:28 +0200 Subject: [PATCH 1/6] Add files via upload --- aivo/aivo_import_table.xlsx | Bin 0 -> 9119 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 aivo/aivo_import_table.xlsx diff --git a/aivo/aivo_import_table.xlsx b/aivo/aivo_import_table.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..632dd5c95dd294524786b50a8ffda95b6fbc5ec4 GIT binary patch literal 9119 zcmeHNg;!k3(jQy`1c%_RK>`G~;0}WYcXwuR4G?r7xJw`qoFEAroWTRZ-DPoi2=LAB zd;4}byWd~%Ue7tV&z!!$x_#?b^{=a{)f5pB@d3yHQ~&@#4KO>*wlRVO0OAk<06YLH zyuPHflbfZJo3W<1izV2Q-OJH|>H{J?Q!W4=cK`p{f3XJ2lLl3~II*R#b`(A9Et_uqE;c?D(p2zc2W5oebI3I62k@NA!GE$AAR& zwQCuX@^N(c?$fssJxc)T=^o|clZwB1W^5c|l?h05t?yFjky?GFP)=e)Kq&fVJ$tTK z8)vzv5u;SESfFpdV?{-K35S26WE^{a6mP=Lmf6?nY@JOW5klj;K06ab-0M!2CmbF@(wC6BeQ-XQj6PQ~XgDf4u9PGbd|L2bX z#Xk6_S1(UcR_)@%2s@Jd5#Dz-xfq8nq3HQa?klxsz#I96r?oNpbfk-IjAYoFBq0d0 zfh_?)2Id!qV|M$fFV}d=A-MQLv~`{pVX3#S?kFq_pcEO`@>M8~$K=K2WxA|_H?4W`oSQZHncYk-U?BEGj1{kkVG@$`mO|UyAsJxlx7p$x;R~CxACUq<_^qT6L4S8(?mmKYc!U zeq^=L-#fVs`_g|m8J2=*bX5cZU;zaHcnZ4%W-@;^mU1ma=PZ7Fe`DK6gwwAfLwrmH zB*ZeLCHm5~y#D26oE_*UQ)%C%fRA@Z++B3GrCJ#t(3zQOviH76jh8#&hSPdi1~C$s z%pVvLb(=XX>2K%p@4>YlI5jduw^6k|0=$U0#O3ROrCR$h(O&T#sfW%p}B%2Q&Rir@aC6(vDDz!vx-uaG)Z z>WQ`jntQyzN77kn4U5s|lF8Rp8%Pv{$glRVt>{tBC+$A@6neA!VhRdhUzBBJR-efP zcUCAq9MR#2cf$JzRgTnfnewe8jmNw!;g!Cub;!ezxx;&(G!guI!D`KD?t4( zO=5D7DXH+%=ef4PBat|b{ts4^Rv2&!|C&NXPN=yfv)V0OWy|gpLc2z zhKEAV+J~wVeM!lDpAZ`{pg?@%bvINImjg1>I&if$`NN9ou?j&A} zEa=*FJaGDXopX;VxZLnbEBSj1)3B*S$Tn-^%hE{N<6YBdcdmf01BZJWmc@cTG=wAm zD>?6h*Z6{49U=^*f0DF1L5s&ykNa--xzusEU;R*q|is@e+g zm9|*f!)F04X0pk`_xaJ!lhZ^dyrr$*ZhlUvr7vD^JL`MOR5|&-Dh6Pnq%DSr@(#Bp#C40J18=eZ9 z(=yo|VITXe@Sf#IH;9kUk6>QfD7mB{QCv=wPCwld0HwHEGx{CST2R`AO2BQZy#ESHGd;wqX)B9LI{^N3uWouJ1 z1zW0TVLKkofB7ER&D+5e{OdAZpf&F_&xzqrSrv$VemLN<{v6GLNLd2`sm@ef$fPog zjZwn=1sy$DaDQ2LR%Pu&7yE&tlKRBzrkaw^q(ac;H=R#fVfhej+Cl|G*V_K$>2R7f zQwwq}0s_5i49c|b*Ee^bCGIF4hxO3{h}Z*GUV8?gsh}zP3?(fim>MqX_OvAklMWG% z82QN;sRdN7#43>m2CEdN)PsR=@e{&_8MzZRdG9J4R}M!^P3Z=^7iDZEr{UEd^U>IV zq{_2bAc%);*~3rXPDtT(^}Y znpIS*J^VraC<%d!8n_(XojRae!Vkn1y%Zg{R`+7h z?e_2o@(ZFGM%%`*>%0ol@gPr&*JtntCAz*kR>!W)qiR!VVZv^ zvbR|Bq%YPmOzf_L+T=~R!iZ0A==v_7KfR>f-*f?r~$<+QhbILdb62v5`RE zA*}l;*aGy~pd!kfIGj&R)^{6IzgRz$lXTR=6ltG@8(%2NE3nSetKfXcQx$29VoNl( zXw@Az^p)!~nGOpD>kbE>bVO;~?y?;V?@auDrmKzQc@{e0#F5B*zZw?{b;R@$^vr8f*VXK5jOaj+Pw1U0?j_2K%~05K=z; zHlkZG46x^qm+P_gODo?U5*O(#vXjVa>-K@#+*}FGqdHzFj{(S%l$FU!^cLw1`${{a>QeI%5g|HhnEWV-L zia%(XA-Y$tllDDfFBy5rQW_!aNA(I~+JtMPU^6vee=cg;eavKqK;M#P)zugA5}46U z%dbnT>GP`ByJ{pNLbufq$*Jc~O>q$TO56~Wo?1Sc2P%?R!#JH?q|s@+cJ zeSLkTHAuKLVr=-ik-RiEbUIfvuquoaqiIF@N#!eMQG>4VY^x&cz3E(hWBsma#RDU? z`g40VDS1#s7<*`~ooC}5fko%`JG>=~kXJ1U%-?}=m}UFw8cI4ee4BdFhg_n7H}L9o z@@xIw7^)+vH4P9ZffeXH{WvPFa~LjzNrNUcrh?XWrD)JYA#GG0Cs#qTp-H3;srsdt z8MI%i?gwk`Bp($=j)?EW@y=Ozn@HgK_Dz>@O=B&Kq7w?ehQ{G!tnuUhJ<*bJ+r#nh z3E$2H<4Gs9?Z?evYTM(9;6>Hi0s%*>|LN&YBGIz{#g=L;`P@7idD<~`WcBf!X)*DvG4gBVNWA?ayFxkOYKuGf^_u!@OqJy?m{GWqh5Q|3 z8g12*(d1=cB_lScMYz_Ksv^%1u`5F&#_1(NCiLp;UnI>U20JaO-p-v4Ejd2xe0FR8{H@|Ig5eh= zuiDTt*0Js=457RUilFVWMhG!?yokq4jG8cbPAQ=e8o+=>EgkO}B2VNOJ1Zn5B1xuJ z^J1YMt*-OlilzZ+!!9FRh%LL9cq11kg8I+33YI${%>BJv z$P|gQTyR4owWwgoznP`!ll=}$dF3ViCglcXoOv2)n=|2SoBUo3s;+ga58Wt1cF(9T>o13}f%d_|reUb)7(|P~5d;qgQrTsC4u?sZGnu?k5%6WS zTksM$V!FRa)-e9?9H8)o10y5F>Yv;t31%``Zb=1wM!TYXZtr80v(WC6P!68*)&d(% zUO(QIT8$ftR$30*r=RKdTwGqfvP*CF3mRZJI^E7uZLZ$rrcOE>MC$%3;pvaqJQ|I{ zSv(JHVr;a78>YF=c$xNmA&Hi4-IYO%k!vn?1Vc~Kavabi;?D^j34 zG0+%G0^i8`tC7o}P^BCOW4h0fE=%<%)F6X85bQS7BCUNn7RwMPJgJ zqd%b!r_1;xa+jpTshM$bQ^mSz%r?1t+qv78wn!JS(MG#{j^P~R3?^EAE;N*Kr`yw% z9zMaP+Gy5D3gX_4d5U8%O~cp_#K5320u^$)skK9`XQAb>zrouk?wa;OZls;iC;Fh# z;PFg8$LZSBH02plO}JE&ph2R_0P>6YG~XmBn=xBpGA7R`*#}3~*Ke>z_0}`QSt&DJ zvE79Fytq1OZNnCcfjKIaL8}^{Tpmihm&wcNX308RC}Uz<5CpgQa0+yEI9O5MMZSTA zfOdyo1Z7qc#Bbhsu9*zjOgBf32_(Iv6@;jHd`Pp%>3kXa>D#C(DLMTICGG=q|%Aa`K5$tS|eUp1b(-J%#M++ku7V zNh=i3AYmVuK>i~2Z8Zt!R9dFnG19&yUK7YdqHYZ8a(e*VAjv|2!|^Bu67_-*U`f+)T&m539&^be`J43Fx03*{|M7(v1*h|__&1@6KihL zNo|i0y%tojk7`G68IZ4AjFPM%R9sJbpL~GNuxU&0N_s{!JUde}b8(8dD z{{#Ra{v-AS+gMt!4{BNK*Jb&ZjIVo{zFca`^{g{@)UoGy^KRtkK#W>j5 zbRW+Rl5;UDJ#53lJQNH*Oc!nEPWIGQXz*M+9kzG~wYbMiXHO+Qnz4&|SnIBxCjI7{ zoj2W`J^I0SI^CGV#o7gYz|pj{&@1^!nW3zWp`vp%fa@kA4HgdQ=}T8uzyD!&PPKfU zLNjPhGA0g;2#Wu>*|_mT8sTU)`AIYvl8p>5Q(X}s4@S{;$y4;l#2x?B}HK)6)`{khWUBYfld z?HOD=qC>z|!t%%kuL?pl20EA1$^1){H>y4psmzHJ$M7VyN`Bf5#btS=)i?zn>_m9H z2@}JSg%=0yGD&m&wi(N8i|93A0Z5JYmA(nIY5XruXv6!vR#J!s?_=369L>_JmZdG$xuhtOHcE-Vn# zogfGjk;&4@O5;?9+7{7JM$;q>{SdWHfJ0dt5rA`29Yu_fbEO5Xin!L4j*g1>{*r)| z;6f3zKyxyjM6RUV*q-WRQ$Sfz68fDE0<+eoFKlG42sTp3>5)_$_PyI(yv0hTZzC%X z)1S($%gi>^Ej!?3wJyqm&c*SVK=quAbL1d|^}0B-hz+9;|NLOirDQsb^(=QQVZ2Y| z4wiWNduFCCFe>B;EN(Q0MTq$Sjt*^1L6#O8ZXjDH>)(Pz2lZDfP)>|y+LLe=Pu@@j z_zA10a?OC@Wcg-C?HD{Wl$qs30$hn93U1o((Y?}~F7noN zuH@i*T51jls*>phX2(q~85m=J8=KT!1G3TV$lKRFL0&Obl1mnVl8Ntff6vg6acQPf z(77;NUfu)bXj+?7m$b%~vTlf>i$20xnK&cAK!eiuZ!G3^W86kRaG5Z&tdgIlm@psm z2w*R8G56By&31y{(JLe7J#*>fy`!tm>FI_C+Ot1%fKY%4ws@H=(xLUO)ORI0c|+#) zB*xoYA7^bEBbxeRXrygJyalH5mm zYMM^|Nlg1<7@-Z|;PU9>fwp}e3gv3no$D~>tXWa%HfedH%vJ;)bCfukwqR*v`=db* z9}_6Ywu2>~TGrRa254Yp(OkHo<5g3Lyhq=_6!#^+d3bc{F2ij9nh+l>@3KwxDMssC zc>dx_#))bjoUr^jYk50&hj14g=O+{zK`JE5xQo;Z!8a?!ENZzeU3Apf(|a8(o*uax zGAi`%XqOiBfVIVB>Ul0Fuz> zqgaXQbQd6Jug1@?*O(1gb`DSDLJuCIA1Cmx4YMC`uz{#@cY?B;?mnKz?7$cD{lW}% zDwT>{ADQz$_xqBre)l77Xj2QPdSo275v0V4eM8g5_`cx!AM-k$M!KkRun|%iw_^X< z_)J|~{%3nIqx*NuN>Fx&rMSY55N;_k7D)vhffzyMW^%93tIXgMJgij;>yLBFf|U zr&a4lCuTk7VkkL`L_ZWCVr8@XC|QJ5LP5YN_!hL$SMev2zv zpx$OFVKbjSIjhLdzI|0Nb_A1Of?f=L7spg*8QFoR!pG>shQA;_^M>MQ34i6$Kk%@e9Vr0tH&*=_{@0c8&u~eKKf(XKE~+Ua!M-j4 QfDZe;fe|+v^{@Z_4|5vF+W-In literal 0 HcmV?d00001 From 611b6d0bdb49c3b3e0a67b983420f8844cdd5da1 Mon Sep 17 00:00:00 2001 From: Tomi Karjalainen Date: Thu, 7 Nov 2019 15:16:37 +0200 Subject: [PATCH 2/6] Add files via upload --- aivo/aivo_import_table.xlsx | Bin 9119 -> 9096 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/aivo/aivo_import_table.xlsx b/aivo/aivo_import_table.xlsx index 632dd5c95dd294524786b50a8ffda95b6fbc5ec4..7f08fdc0e64d3d30d63e1fde4e4bd58c4f1d7b10 100644 GIT binary patch delta 2535 zcmY*bc{tPy7apduBwI$=ca5DJHHK))n6g%OjnEkD$U4@+FhygF{H)oAv=9-pWXPIP zQI<&|WKRa=TAD0h_ul7z&-a~w&hxzQ`R|UhcuW9;q6azMC}h1;Fn zYQ>HB)+C8J7DG1n-ebaew={&IcJM31n3qibZ+H3XQpP#L#ZZh!Gkt+U+ zgXO5R?A@oL)(fbqbL>rRBY7?l7&^j}?nqP{3ERBdyci;2V+EK^ z2wU-iT}!?*>pAw#Jfwj!Xp(ixzH(rND*@Y8WI>O3>p2-G>~<@9+yFuU>2&oJerclI zOn~%*ou8*m>pR7nyHl451;DnI0yo(uSNB-f{h}+S!qk9o(^UB`w=nAZEMTmc?FXkkJNUsyi zSJNoAt$%`?f1%CemO?{SyJ9v2tsZj51yXN=31TG*0hhlD!6-t2%sXXrmVL%!r!2%E z_YfS(f)AX#zd>les`Dn>G{i^QJA~)>5Ck8j7grj}$2Ro{7kqS)&Y9F9R$T~!(fc;E z0_Z+WfU7zwqf)xhXFDHWbp9E>&BLbua>)zbeq9DL@+>jeH&p1?83Wa}Kd}#H+YVR< z$DUT3A0{=Y;b*8Az#uGfvX37G+yz7HB96o!=3_f{#@_L_=InStAQ2EyBPT{Gup7TK zruAEABP7bMqEv;8- zLbCMz*cDmPwA)$>x#*vMt^Sf(guyQZ4{g{(t8P%$;YU$``c?AL=ETp1S@wo zBemOJ_icv4Bt(6^P-Xo>VqK)Osv2^o(^o1b^SDg2%dMe$Mc*0HvPtu|wQ&P&)uG2gs!yI?go~cO03}Cp2U!1{JsonszOX*%RJCo#D9;lp9sV2CoI#IL1a4AAe|HJeM zzKLB+WZZCT>K5Vzq}TkY0A?`u1#Mr zZ{WK)EHRsBCsh0J5~|Wstt$QL5Lk38gKp_N%7OWgk{*`)EZ#)c9zAnodf)UM?J2K* zXixJ=e%4q3O)zaA{Fmyu&qY~naj=0vCID4Tf|PO2tXoSUevN!kGPn9LQsC}sqQEXB zQp4?JgX2Aux8@^z+a7|bdr})x8*O)Avzh1FuPm?YETCA)db+k2 z0wP_isC$-fdEq)ctH+2hk`?x zB7^12oO71kn=e*ho&gV&8EB)#(CI;%-dWYA2NSyCL9fU>N289Kj9L4c)pK`Pr5H@b zVhxk|Bzv*~lj6fk1iY{40S?~|oGHEziQ_&d;ulvgN%2a9Mj^*E?ZZGFe~eI(oM|TL z^=f#m_5K|4QA&YnLSbs*R$#Ah2Qe_fzf~f|Vi?z7pDef`w7a#lK4EL|z%Q(a%{G2I zQ{T0t$;Ug>d^PWv>nT8t5O)FFLcjNOT_mh6L&h%@wtKF(h`zS`XIktfdbKEvGGa;ayoHFe#yjd#N3adbLKs4pes6D1sE12JSNF#fT203**= z=OPsahWs6=fN5DPUe6$z3d7kojx$Ki?#>=l}o! delta 2532 zcmVKtr0{{Tr2LJ#M0001ZY%h0ja%*C5Z)+}iZEUPnU2mK? z6n$T5{{!;7gUvT6q#77T8>w4GX*PYV95BHOVAhz-L{b0yUNgfaX{uG4cEs4&*BqaF z@45Erhh5iN_gsxa_9>z#1X;WBoMrJqWMQ|4mvxnMa!@E(zVzyd}5u+REw;Zjk>6W z=2eP97|JbwF`=d*n?ws%N(pt5eRh=dg|aGMv#HfrAmo1q9u@{c?D%FS2xHZ1u6m|< zE_)3+JoxpinwzonMuNhvOaAX96oP4t7q<;irUCe8SUZMViXMNRn5;B=#^VTpxQ;?BK|A9h`e>r|`pKU1YvVkhuYp-*FDkI!~6X z#jtK{n9^5@m3MFt~F&QmC|=dU@_6I7@v&Uu`ec5|3LPS*R0L!Mp~UvjxNaX)E&6*vaJaqD#@2jr~lp+AUj+hz%xm9AxCFdtD|KnSH~!{_Ebp5<0-tptn5OMKo3!iJ&1-kiXorL>jgz zXhIhe@v=)g0gn=(ShA3**OU}lQ82#W#9WYN2>U+bE(xrofFBQjeG?{qUx^g4Kyb;| z$_8d9%elJ!ku!2gaAKESs8_av1q1VNo(V~0TnO`q(XK-`vFS_2`$3y=gnoU*=PFU~C5_CO9b3A^=$eB%2 z{rqC|Am8|wBFkqQ(m+v&fsv)5V45#R+4+{U2f5re8 z0yw7#Z+#POkqY`zSW6=54G({_mD)l`xHv1iCc98Q@xw>THd_U6fjd>mc=dWqWdM?e zRBTU&33v#c@Yjl%zIvcIa?EniC`Wb=SxYL_f@vyb1v{yDWCG?K*=jhgbT!z6Nyzqn z&-Jm_oCS_4WdVC;!Tqk=Z$Z+{e@VdRBz=3>HWSD>%>=B;1h*&$ls#Pz_VSGkauTpP z$)H6F&^OZ*z?w2NKFv|S7OaWfc&!#r> zu@R(pE*BFvlGM(LruFT>MwHsgX`0_H-3qdEIg7Gq_gh{rY(%LYBkdLie>JMaXIT!~ z_X%tSs+~Lwzv*6_tnsBy_Le9zn+Sfe;Nu5ElL^tI1RiVR+QtbTQ)A~EoGyXZD51CS zXYRz=L&FYo#B~*ci-?;l!Yd+fs|de{xT_+%MZ}_t=oJwks)&9O@v({+6cP7T#IT6? zR7H%6h|e_@D;4!i4Wv}nWrrF_sjOdXAf>u~tAUgX`&a`hRrY%gq*U6c8c3-F-(l@OF|&^}s@q+!IwTvNr+HLwuP-+b zs$&6iutvgBosiYuTwe{$($!hwQ7t0rNo%$X2H;&xNR>In96;(b&ze(4aJ(Q&SoK}s z-|GOLe^h5iOj#SHq4{xV=ED&ZaTmS8FFG&vC5 zGAYL+TG_&LjwMY5p&4+OUp73Vf6WSPXbz9IXmo}tZSw;EsQ z=cUPqqO(Nz*H=z%#)-!!0nb2O>Hk1s{<0 zm#sR0;20`UpuNK+A^6wp!76ulpi@RpCH=k*oepuwY{7eRaPOQPj7`%d&9sXV@)P{F zdVKDx#!|Pt;(&@waLO$(Z){N-C8GysKUl@22A$!N*egpGP=_G@C(dX(9}$m$ zBEu)2r1$}okpmR7Iv$Dx1uCSB3Qv>CAyNTrlN=&C0c?|3A|@L)L;mAv0{{TG3jhEZ z0000000000000000PB;OA}brVe~N<(0RRAB0ssIM0000000000000000Ev^{A}1Tp ugt>}F0RRAT0ssIJ0000000000000000LGIbBR&B`lV2kv1_>bm0000;6ru|N From b72bcec07ae10ba1ded325d2c3ea79a47e82e71d Mon Sep 17 00:00:00 2001 From: Tomi Karjalainen Date: Fri, 8 Nov 2019 14:55:12 +0200 Subject: [PATCH 3/6] Add files via upload --- aivo/aivo_import.m | 85 +++++++++++++++++++++++----------------- aivo/aivo_import_check.m | 55 ++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 37 deletions(-) create mode 100644 aivo/aivo_import_check.m diff --git a/aivo/aivo_import.m b/aivo/aivo_import.m index bc51457..1115733 100644 --- a/aivo/aivo_import.m +++ b/aivo/aivo_import.m @@ -1,49 +1,60 @@ -function aivo_import(spreadsheet) +function T = aivo_import(spreadsheet) T = readtable(spreadsheet); -N = size(T,1); -%% Extract birthdate and gender from the patient_id - -birthday = cell(N,1); -gender = cell(N,1); - -for i = 1:N - pid = T.patient_id{i}; - birthday{i} = aivo_extract_birthday(pid); - gender{i} = aivo_extract_gender(pid); +num_studies = size(T,1); +num_columns = size(T,2); + +column_names = T.Properties.VariableNames; + +%% First modify the table so that it better satisfies the requirements + +for i = 1:num_columns + current_column = column_names{i}; + column_values = T.(current_column); + if(strcmp(current_column,'injection_time')) + column_values = cellstr(datestr(column_values,13)); + elseif(ismember(current_column,{'dc' 'weight' 'height' 'dose' 'start_time' 'glucose' 'hct'})) + if(iscell(column_values)) + column_values = str2double(column_values); + end + end + for j = 1:num_studies + switch current_column + case {'patient_id' 'ac_number' 'study_date' 'project' 'group_name' 'description' 'scanner' 'tracer' 'mri_code' 'notes' 'injection_time'} + val = column_values{j}; + updated_val = aivo_import_check(val,current_column,j); + column_values{j} = updated_val; + case {'dc' 'weight' 'height' 'dose' 'start_time' 'glucose' 'hct'} + val = column_values(j); + updated_val = aivo_import_check(val,current_column,j); + column_values(j) = updated_val; + end + end + T.(current_column) = column_values; end -T.gender = gender; -T.birthday = birthday; -T.age = (datenum(T.study_date) - datenum(datetime(T.birthday,'format','yyyy-MM-dd')))/365; -T.study_date = char(T.study_date); -T.pet = ones(N,1); - -%% +%% Insert new studies to the study_table table +% Inserting new rows to study_table will automatically trigger insertion of +% rows also to patient, lab, study and magia tables -fields = T.Properties.VariableNames; -pet_fields = {'image_id' 'ac' 'study_code' 'study_date' 'project' 'group_name' 'description' 'scanner' 'tracer' 'frames' 'start_time' 'mri' 'plasma' 'dynamic' 'dc' 'weight' 'height' 'dose' 'notes' 'type' 'source' 'injection_time' 'gender' 'age'}; -patient_fields = {'patient_id' 'study_date' 'gender' 'birthday' 'age' 'pet'}; -pet_idx = ismember(fields,pet_fields); -patient_idx = ismember(fields,patient_fields); +ac = [T.ac_number;T.mri_code]; +image_id = ac; +pet = [ones(num_studies,1);zeros(num_studies,1)]; +mri = [zeros(num_studies,1);ones(num_studies,1)]; +t = table(image_id,ac,pet,mri); -T_pet = T(:,pet_idx); -T_patient = T(:,patient_idx); +% insert(conn,'megabase.aivo2.study_table',t.Properties.VariableNames,t); -conn = aivo_connect(); +project_columns = {'image_id','project','group_name','description'}; +project_T = T(:,ismember(T.Properties.VariableNames,project_columns)); +% insert(conn,'megabase.aivo2.project',project_T.Properties.VariableNames,project_T); -insert(conn,'megabase.aivo.pet',pet_fields,T_pet); -N = size(T,1); - -image_id_idx = strcmp(fields,'image_id'); - -for i = 1:N - id = table2array(T(i,image_id_idx)); - whereclause = sprintf('WHERE patient.image_id = ''%s''',id{1}); - update(conn,'megabase.aivo.patient',patient_fields,T_patient,whereclause); -end +%% Update the contents of the other tables -close(conn); +% for i = 1:num_columns +% field = column_names{i}; +% aivo_set_info(T.ac_number,field,T.(field)); +% end end \ No newline at end of file diff --git a/aivo/aivo_import_check.m b/aivo/aivo_import_check.m new file mode 100644 index 0000000..79c0f4c --- /dev/null +++ b/aivo/aivo_import_check.m @@ -0,0 +1,55 @@ +function updated_val = aivo_import_check(val,column,row) + +switch column + case 'patient_id' + d = str2double(val(1:2)); + mo = str2double(val(3:4)); + if(d <= 0 || d > 31 || mo <= 0 || mo > 12 || length(val) ~= 11) + error('Invalid patient_id on row %.0f',row); + else + updated_val = val; + end + case 'ac_number' + if(length(val) ~= 7) + error('Invalid ac_number on row %.0f. The AC number is supposed to have 7 characters.',row); + else + updated_val = lower(val); + end + case 'study_date' + h = strsplit(val,'-'); + y = str2double(h{1}); + mo = str2double(h{2}); + d = str2double(h{3}); + if(y < 1989 || d > 31 || mo <= 0 || mo > 12) + error('Invalid study_date on row %.0f',row); + else + updated_val = lower(val); + end + case 'tracer' + if(~strcmp(val(1),'[')) + error('Invalid tracer name on row %.0f. Please use the following notation: [18f]fdg',row); + else + updated_val = lower(val); + end + case 'mri_code' + if(length(val) ~= 7) + error('Invalid mri_code on row %.0f. The AC number is supposed to have 7 characters.',row); + else + updated_val = lower(val); + end + case 'injection_time' + idx = regexp(val,' '); + val(idx) = []; + updated_val = val; + case 'group_name' + idx = regexp(val,' '); + val(idx) = '_'; + updated_val = lower(val); + case {'project' 'description' 'scanner'} + idx = regexp(val,' '); + val(idx) = '-'; + updated_val = lower(val); + otherwise + updated_val = val; + +end From b4fadf310c6e883a9292b69f311c0f5263b1e3e8 Mon Sep 17 00:00:00 2001 From: Tomi Karjalainen Date: Thu, 14 Nov 2019 09:40:11 +0200 Subject: [PATCH 4/6] Add files via upload --- aivo/aivo_import_table.xlsx | Bin 9096 -> 9835 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/aivo/aivo_import_table.xlsx b/aivo/aivo_import_table.xlsx index 7f08fdc0e64d3d30d63e1fde4e4bd58c4f1d7b10..13448e075d4b761aeb59eefe953c05dffa1b0ab2 100644 GIT binary patch delta 4055 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 delta 3332 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 From eaa126829ac25a84cb5326ab714b1ddfa1ca1fae Mon Sep 17 00:00:00 2001 From: Tomi Karjalainen Date: Tue, 19 Nov 2019 13:14:33 +0200 Subject: [PATCH 5/6] Add files via upload --- aivo/aivo_get_info.m | 3 + aivo/aivo_import.m | 78 ++++++++++++++++-------- aivo/aivo_import_check.m | 22 ++++--- aivo/aivo_read_magia_specs.m | 115 ++++++++++++++++------------------- 4 files changed, 122 insertions(+), 96 deletions(-) diff --git a/aivo/aivo_get_info.m b/aivo/aivo_get_info.m index 5cb5269..64d2e8a 100644 --- a/aivo/aivo_get_info.m +++ b/aivo/aivo_get_info.m @@ -91,6 +91,9 @@ warning('Could not find a value for every requested subject. Please make sure the image_ids are not misspelled'); end +if(numeric) + value = cell2mat(value); +end value = value(sort_idx); end \ No newline at end of file diff --git a/aivo/aivo_import.m b/aivo/aivo_import.m index 1115733..bff15ff 100644 --- a/aivo/aivo_import.m +++ b/aivo/aivo_import.m @@ -1,20 +1,30 @@ function T = aivo_import(spreadsheet) -T = readtable(spreadsheet); +T = readtable(spreadsheet,'DateTimeType','text'); -num_studies = size(T,1); -num_columns = size(T,2); +%% Exclude columns that consists of NaNs + +column_names = T.Properties.VariableNames; + +for i = 1:size(T,2) + field = column_names{i}; + val = T.(field); + if(~iscell(val) && ~isdatetime(val) && all(isnan(val))) + T.(field) = []; + end +end column_names = T.Properties.VariableNames; +num_studies = size(T,1); +num_columns = size(T,2); + %% First modify the table so that it better satisfies the requirements for i = 1:num_columns current_column = column_names{i}; column_values = T.(current_column); - if(strcmp(current_column,'injection_time')) - column_values = cellstr(datestr(column_values,13)); - elseif(ismember(current_column,{'dc' 'weight' 'height' 'dose' 'start_time' 'glucose' 'hct'})) + if(ismember(current_column,{'dc' 'weight' 'height' 'dose' 'start_time' 'glucose' 'hct'})) if(iscell(column_values)) column_values = str2double(column_values); end @@ -22,39 +32,59 @@ for j = 1:num_studies switch current_column case {'patient_id' 'ac_number' 'study_date' 'project' 'group_name' 'description' 'scanner' 'tracer' 'mri_code' 'notes' 'injection_time'} - val = column_values{j}; - updated_val = aivo_import_check(val,current_column,j); - column_values{j} = updated_val; + val = column_values{j} + if(~isempty(val)) + updated_val = aivo_import_check(val,current_column,j); + column_values{j} = updated_val; + end case {'dc' 'weight' 'height' 'dose' 'start_time' 'glucose' 'hct'} val = column_values(j); - updated_val = aivo_import_check(val,current_column,j); - column_values(j) = updated_val; + if(~isempty(val)) + updated_val = aivo_import_check(val,current_column,j); + column_values(j) = updated_val; + end end end T.(current_column) = column_values; end - +return %% Insert new studies to the study_table table % Inserting new rows to study_table will automatically trigger insertion of % rows also to patient, lab, study and magia tables -ac = [T.ac_number;T.mri_code]; -image_id = ac; -pet = [ones(num_studies,1);zeros(num_studies,1)]; -mri = [zeros(num_studies,1);ones(num_studies,1)]; +if(ismember('mri_code',column_names)) + ac = [T.ac_number;T.mri_code]; + image_id = ac; + pet = [ones(num_studies,1);zeros(num_studies,1)]; + mri = [zeros(num_studies,1);ones(num_studies,1)]; +else + ac = T.ac_number; + image_id = ac; + pet = ones(num_studies,1); + mri = zeros(num_studies,1); +end t = table(image_id,ac,pet,mri); -% insert(conn,'megabase.aivo2.study_table',t.Properties.VariableNames,t); +image_id = T.ac_number; +empty_idx = cellfun(@isempty,image_id); +project = T.project; +description = T.description; +group_name = T.group_name; -project_columns = {'image_id','project','group_name','description'}; -project_T = T(:,ismember(T.Properties.VariableNames,project_columns)); -% insert(conn,'megabase.aivo2.project',project_T.Properties.VariableNames,project_T); +project_T = table(image_id,project,description,group_name); + +conn = aivo_connect; +insert(conn,'megabase.aivo2.study_code',t.Properties.VariableNames,t); +insert(conn,'megabase.aivo2.project',{'image_id' 'project' 'description' 'group_name'},project_T); +close(conn); %% Update the contents of the other tables -% for i = 1:num_columns -% field = column_names{i}; -% aivo_set_info(T.ac_number,field,T.(field)); -% end +remaining_columns = {'patient_id' 'study_date' 'scanner' 'tracer' 'mri_code' 'notes' 'injection_time' 'dc' 'weight' 'height' 'dose' 'start_time' 'glucose' 'hct'}; + +for i = 1:length(remaining_columns) + field = remaining_columns{i}; + aivo_set_info(T.ac_number,field,T.(field)); +end end \ No newline at end of file diff --git a/aivo/aivo_import_check.m b/aivo/aivo_import_check.m index 79c0f4c..28a8ed8 100644 --- a/aivo/aivo_import_check.m +++ b/aivo/aivo_import_check.m @@ -16,14 +16,20 @@ updated_val = lower(val); end case 'study_date' - h = strsplit(val,'-'); - y = str2double(h{1}); - mo = str2double(h{2}); - d = str2double(h{3}); - if(y < 1989 || d > 31 || mo <= 0 || mo > 12) - error('Invalid study_date on row %.0f',row); - else - updated_val = lower(val); + try + val = char(datetime(val,'format','yyyy-MM-dd')); + h = strsplit(val,'-'); + y = str2double(h{1}); + mo = str2double(h{2}); + d = str2double(h{3}); + if(y < 1989 || d > 31 || mo <= 0 || mo > 12) + error('Invalid study_date on row %.0f',row); + else + updated_val = lower(val); + end + catch + + end case 'tracer' if(~strcmp(val(1),'[')) diff --git a/aivo/aivo_read_magia_specs.m b/aivo/aivo_read_magia_specs.m index c05ee10..1fedb86 100644 --- a/aivo/aivo_read_magia_specs.m +++ b/aivo/aivo_read_magia_specs.m @@ -1,71 +1,58 @@ function specs = aivo_read_magia_specs(image_id) -%%% specs.study -% mandatory -specs.study.tracer = char(aivo_get_info(image_id,'tracer')); -if(strcmp(specs.study.tracer,'null')) - error('%s: The tracer has not been specified. Please use aivo_set_info to specify the tracer.',image_id); -end -specs.study.frames = parse_frames_string(char(aivo_get_info(image_id,'frames'))); -if(strcmp(specs.study.frames,'null')) - error('%s: The frames have not been specified. Please use aivo_set_info to specify the frames',image_id); -end -% optional -specs.study.weight = aivo_get_info(image_id,'weight'); -specs.study.dose = aivo_get_info(image_id,'dose'); -specs.study.scanner = char(aivo_get_info(image_id,'scanner')); -specs.study.mri_code = char(aivo_get_info(image_id,'mri_code')); -specs.study.glucose = aivo_get_info(image_id,'glucose'); - - -%%% specs.magia -% mandatory -specs.magia.model = char(aivo_get_info(image_id,'model')); -if(strcmp(specs.magia.model,'null')) - error('%s: The model has not been specified. Please use aivo_set_info to specify the model.',image_id); -end -specs.magia.input_type = char(aivo_get_info(image_id,'input_type')); -if(strcmp(specs.magia.input_type,'null')) - error('%s: The field ''input_type'' has not been specified. Please use aivo_set_info to specify the ''input_type'' either as ''ref'', ''plasma'', ''plasma&blood'', or ''sca_ref''. ',image_id); -end -specs.magia.roi_type = char(aivo_get_info(image_id,'roi_type')); -if(strcmp(specs.magia.roi_type,'null')) - error('%s: The field ''magia.roi_type'' has not been specified. Please use aivo_set_info to specify the field either as ''freesurfer'' or ''atlas''.',image_id); -end -specs.magia.dc = aivo_get_info(image_id,'dc'); -if(strcmp(specs.magia.dc,'null')) - error('%s: The field ''magia.dc'' has not been specified. Please use aivo_set_info to specify the field either as 1 (decay-corrected to injection time) or 0 (not decay-corrected to injection time).',image_id); -end -specs.magia.rc = aivo_get_info(image_id,'rc'); - -specs.magia.fwhm_pre = aivo_get_info(image_id,'fwhm_pre'); -specs.magia.fwhm_post = aivo_get_info(image_id,'fwhm_post'); -specs.magia.fwhm_roi = aivo_get_info(image_id,'fwhm_roi'); -specs.magia.cpi = aivo_get_info(image_id,'cpi'); -if(strcmp(specs.magia.cpi,'null')) - error('%s: The field ''magia.cpi'' has not been specified. Please use aivo_set_info to specify the field either as 1 (calculate parametric images) or 0 (do not calculate parametric images).',image_id); -end - -specs.magia.cut_time = aivo_get_info(image_id,'cut_time'); -specs.magia.gu = aivo_get_info(image_id,'gu'); - -% optional - -if(specs.magia.cpi) - specs.magia.norm_method = char(aivo_get_info(image_id,'norm_method')); - if(strcmp(specs.magia.norm_method,'pet')) - specs.magia.template = char(aivo_get_info(image_id,'template')); +if(iscell(image_id)) + N = length(image_id); + specs = cell(N,1); + conn = aivo_connect(); + for i = 1:N + specs{i} = aivo_read_magia_specs(image_id{i}); end +else + conn = aivo_connect(); + + q = sprintf('SELECT * FROM megabase.aivo2.magia WHERE image_id = ''%s''',image_id); + curs = exec(conn,q); + curs = fetch(curs); + value = curs.Data; + close(curs); + + magia_cols = columns(conn,'megabase','aivo2','magia'); + [magia_cols,idx] = setdiff(magia_cols,'image_id'); + value = value(idx); + + n_cols = length(magia_cols); + + for i = 1:n_cols + col = magia_cols{i}; + specs.magia.(col) = value{i}; + end + + q = sprintf('SELECT tracer,frames,dose,scanner,mri_code FROM megabase.aivo2.study WHERE image_id = ''%s''',image_id); + curs = exec(conn,q); + curs = fetch(curs); + value = curs.Data; + close(curs); + + study_cols = {'tracer' 'frames' 'dose' 'scanner' 'mri_code'}; + [study_cols,idx] = setdiff(study_cols,'image_id'); + value = value(idx); + + n_cols = length(study_cols); + + for i = 1:n_cols + col = study_cols{i}; + if(strcmp(col,'frames')) + specs.study.(col) = parse_frames_string(value{i}); + else + specs.study.(col) = value{i}; + end + end + + specs.study.glucose = aivo_get_info(image_id,'glucose'); + specs.study.weight = aivo_get_info(image_id,'weight'); + end -if(strcmp(specs.magia.roi_type,'freesurfer')) - specs.magia.roi_set = char(aivo_get_info(image_id,'roi_set')); -elseif(strcmp(specs.magia.roi_type,'atlas')) - specs.magia.mni_roi_mask_dir = char(aivo_get_info(image_id,'mni_roi_mask_dir')); -end - -if(strcmp(specs.magia.input_type,'sca_ref')) - specs.magia.classfile = char(aivo_get_info(image_id,'classfile')); -end +close(conn); end \ No newline at end of file From 37a59484500053550d0bc698980a645b9860da0e Mon Sep 17 00:00:00 2001 From: buccimtpc <35525053+buccimtpc@users.noreply.github.com> Date: Wed, 4 Dec 2019 18:57:23 +0200 Subject: [PATCH 6/6] Add files via upload With this I managed to import the aivo table for Baribrain FDG --- aivo/aivo_import.m | 72 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/aivo/aivo_import.m b/aivo/aivo_import.m index bff15ff..866e420 100644 --- a/aivo/aivo_import.m +++ b/aivo/aivo_import.m @@ -32,7 +32,7 @@ for j = 1:num_studies switch current_column case {'patient_id' 'ac_number' 'study_date' 'project' 'group_name' 'description' 'scanner' 'tracer' 'mri_code' 'notes' 'injection_time'} - val = column_values{j} + val = column_values{j}; if(~isempty(val)) updated_val = aivo_import_check(val,current_column,j); column_values{j} = updated_val; @@ -47,7 +47,7 @@ end T.(current_column) = column_values; end -return + %% Insert new studies to the study_table table % Inserting new rows to study_table will automatically trigger insertion of % rows also to patient, lab, study and magia tables @@ -68,23 +68,73 @@ image_id = T.ac_number; empty_idx = cellfun(@isempty,image_id); project = T.project; -description = T.description; group_name = T.group_name; +description = T.description; -project_T = table(image_id,project,description,group_name); -conn = aivo_connect; -insert(conn,'megabase.aivo2.study_code',t.Properties.VariableNames,t); -insert(conn,'megabase.aivo2.project',{'image_id' 'project' 'description' 'group_name'},project_T); -close(conn); +project_T = table(image_id,project,group_name,description); + +image_id = T.ac_number; + +N = size(T,1); + +for i = 1:N + + disp(['Processing subject ' num2str(i) ' of ' num2str(N)]) + + conn = aivo_connect; + refresh(conn); + id = T.ac_number(i); + found = aivo_check_id(conn,'study_code',id); + if found + whereclause = sprintf('WHERE image_id = ''%s''',id{1}); + update(conn,'megabase.aivo2.study_code',t.Properties.VariableNames,t(i,:),whereclause); + else + insert(conn,'megabase.aivo2.study_code',t.Properties.VariableNames,t(i,:)); + end + found = aivo_check_id(conn,'project',id); + if found + whereclause = sprintf('WHERE image_id = ''%s''',id{1}); + update(conn,'megabase.aivo2.project',{'image_id' 'project' 'group_name' 'description'},project_T(i,:),whereclause); + else + insert(conn,'megabase.aivo2.project',{'image_id' 'project' 'group_name' 'description'},project_T(i,:)); + end + +close(conn); +end + %% Update the contents of the other tables -remaining_columns = {'patient_id' 'study_date' 'scanner' 'tracer' 'mri_code' 'notes' 'injection_time' 'dc' 'weight' 'height' 'dose' 'start_time' 'glucose' 'hct'}; +remaining_columns = {'patient_id' 'study_date' 'scanner' 'tracer' 'mri_code' 'injection_time' 'dc' 'weight' 'height' 'dose' 'scan_start_time'};% 'glucose' 'hct'}; -for i = 1:length(remaining_columns) +for i = 1:length(remaining_columns) + field = remaining_columns{i}; + + disp(['Writing: ' field ', ' num2str(i) ' of ' num2str(length(remaining_columns)) ' columns']) + aivo_set_info(T.ac_number,field,T.(field)); end -end \ No newline at end of file +end + +function refresh(conn) + +refresh_cmd = 'REFRESH MATERIALIZED VIEW aivo2.materia'; +curs = exec(conn,refresh_cmd); +close(curs); + +end + +function found = aivo_check_id(conn,table,id) + +check_cmd = ['do $$ BEGIN IF (SELECT image_id FROM aivo2.' table ' WHERE image_id = ''' id{1} ''') IS NULL THEN RAISE Exception ''ERROR''; END IF; END $$']; +curs = exec(conn,check_cmd); +if ~strcmp(curs.Message(1:5),'ERROR') + found = 1; +else + found = 0; +end + +end